tp-react-elements 1.3.11 → 1.3.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -175,23 +175,41 @@ Refer to our Storybook documentation for detailed API documentation and examples
175
175
  npm run storybook
176
176
  ```
177
177
 
178
- - **Docs → Paginated Grid** — full API: grid height, header wrap (`headerMinHeight` / `headerMaxHeight`), `headerBgColor`, filters, troubleshooting
179
- - **Components → PaginatedGrid → Sample Grids** — mock grids (no API): header wrap test, compact layout, viewport fill
178
+ - **Docs → Paginated Grid** — API reference plus **four copy-paste examples** (embedded panel, wrapped headers, typography, invoice filters)
179
+ - **Components → PaginatedGrid → Sample Grids** — mock grids (no API): header wrap, compact layout, viewport fill
180
180
  - **Components → PaginatedGrid → Example Grid** — live invoice API demo
181
181
 
182
- Example header styling:
182
+ **Example — compact embedded grid with smaller fonts:**
183
+
184
+ ```tsx
185
+ <GenericPaginatedGrid
186
+ tableHeight="calc(100vh - 240px)"
187
+ autoFillViewport={false}
188
+ uiDensity="compact"
189
+ headerBgColor="#f5f5f5"
190
+ headerMaxHeight={64}
191
+ headerFontSize={11}
192
+ bodyFontSize={10}
193
+ {...gridProps}
194
+ />
195
+ ```
196
+
197
+ **Example — wrapped header “Department / Business Unit”:**
183
198
 
184
199
  ```tsx
185
200
  <GenericPaginatedGrid
186
201
  headerBgColor="#e8eaf6"
187
202
  headerMinHeight="48px"
188
203
  headerMaxHeight="96px"
189
- tableHeight="calc(100vh - 200px)"
190
- autoFillViewport={false}
204
+ headerFontSize={12}
205
+ bodyFontSize={12}
206
+ layoutMode="grid"
191
207
  {...gridProps}
192
208
  />
193
209
  ```
194
210
 
211
+ Full examples: Storybook **Docs → Paginated Grid → Examples**.
212
+
195
213
  ## 🏗️ Best Practices for Code Structure and Organization
196
214
 
197
215
  ### Component Organization
@@ -1,3 +1,3 @@
1
- var Month = {};
1
+ var InputRangeField = {};
2
2
 
3
- export { Month as __exports };
3
+ export { InputRangeField as __exports };
@@ -1,3 +1,3 @@
1
- var InputRangeField = {};
1
+ var Month = {};
2
2
 
3
- export { InputRangeField as __exports };
3
+ export { Month as __exports };
@@ -1,3 +1,3 @@
1
- var Calendar = {};
1
+ var DateRange = {};
2
2
 
3
- export { Calendar as __exports };
3
+ export { DateRange as __exports };
@@ -1,3 +1,3 @@
1
- var DateRangePicker = {};
1
+ var DefinedRange = {};
2
2
 
3
- export { DateRangePicker as __exports };
3
+ export { DefinedRange as __exports };
@@ -1,3 +1,3 @@
1
- var DateRange = {};
1
+ var DateRangePicker = {};
2
2
 
3
- export { DateRange as __exports };
3
+ export { DateRangePicker as __exports };
@@ -1,3 +1,3 @@
1
- var DefinedRange = {};
1
+ var Calendar = {};
2
2
 
3
- export { DefinedRange as __exports };
3
+ export { Calendar as __exports };
@@ -19,6 +19,10 @@ export interface GridUiDensityOptions {
19
19
  filterChipMinHeight?: number;
20
20
  filterLabelFontSize?: number;
21
21
  toolbarIconFontSize?: number | string;
22
+ /** Header column title font size (px number). */
23
+ headerFontSize?: number;
24
+ /** Body cell data font size (px number). */
25
+ bodyFontSize?: number;
22
26
  /** MRT built-in toolbar control density (show/hide columns, density toggle, etc.). */
23
27
  mrtDensity?: 'comfortable' | 'compact' | 'spacious';
24
28
  }
@@ -102,6 +106,16 @@ export interface GenericPaginatedGridProps<TData extends object> {
102
106
  * Omit to allow text to use the full `headerMaxHeight` (recommended for tall headers).
103
107
  */
104
108
  headerMaxLines?: number;
109
+ /**
110
+ * Font size for header column titles (CSS length or px number).
111
+ * Default: `12px` (`11px` when `uiDensity="compact"`). Overridden by `uiDensityOptions.headerFontSize`.
112
+ */
113
+ headerFontSize?: string | number;
114
+ /**
115
+ * Font size for body/data cells (CSS length or px number).
116
+ * Default: `12px` (`11px` compact). Overridden by `uiDensityOptions.bodyFontSize`.
117
+ */
118
+ bodyFontSize?: string | number;
105
119
  /**
106
120
  * Maximum number of filter chips that can be visible at once.
107
121
  * Prevents the filter bar from wrapping to a second row on typical screens.
@@ -109,5 +123,5 @@ export interface GenericPaginatedGridProps<TData extends object> {
109
123
  */
110
124
  maxVisibleFilters?: number;
111
125
  }
112
- declare function GenericPaginatedGrid<TData extends object>({ columns, fetchPage, queryKey, serverFilterDefs, defaultFilters, defaultVisibleFilterIds, batchSize, exportFilename, tableHeight, tableMinHeight, tableMaxHeight, autoFillViewport, layoutMode, uiDensity, uiDensityOptions, pageSizeOptions, headerBgColor, headerMinHeight, headerMaxHeight, headerMaxLines, maxVisibleFilters, }: GenericPaginatedGridProps<TData>): import("react/jsx-runtime").JSX.Element;
126
+ declare function GenericPaginatedGrid<TData extends object>({ columns, fetchPage, queryKey, serverFilterDefs, defaultFilters, defaultVisibleFilterIds, batchSize, exportFilename, tableHeight, tableMinHeight, tableMaxHeight, autoFillViewport, layoutMode, uiDensity, uiDensityOptions, pageSizeOptions, headerBgColor, headerMinHeight, headerMaxHeight, headerMaxLines, headerFontSize, bodyFontSize, maxVisibleFilters, }: GenericPaginatedGridProps<TData>): import("react/jsx-runtime").JSX.Element;
113
127
  export default GenericPaginatedGrid;
@@ -21,6 +21,8 @@ const UI_DENSITY_PRESETS = {
21
21
  filterChipMinHeight: 30,
22
22
  filterLabelFontSize: 12,
23
23
  toolbarIconFontSize: 'small',
24
+ headerFontSize: 12,
25
+ bodyFontSize: 12,
24
26
  mrtDensity: 'comfortable',
25
27
  },
26
28
  compact: {
@@ -32,6 +34,8 @@ const UI_DENSITY_PRESETS = {
32
34
  filterChipMinHeight: 26,
33
35
  filterLabelFontSize: 11,
34
36
  toolbarIconFontSize: 'inherit',
37
+ headerFontSize: 11,
38
+ bodyFontSize: 11,
35
39
  mrtDensity: 'compact',
36
40
  },
37
41
  };
@@ -44,7 +48,13 @@ const toCssSize = (value, fallback) => {
44
48
  * Header overrides applied via GlobalStyles (literal prop values).
45
49
  * MRT sets `backgroundColor: 'inherit'` and fixed density padding — must use !important.
46
50
  */
47
- const buildHeaderGlobalStyles = (headerMin, headerMax, headerBgColor) => {
51
+ const buildBodyGlobalStyles = (bodyFont) => ({
52
+ '.tp-gpg-root .MuiTableBody-root .MuiTableCell-root': {
53
+ fontSize: `${bodyFont} !important`,
54
+ lineHeight: 1.35,
55
+ },
56
+ });
57
+ const buildHeaderGlobalStyles = (headerMin, headerMax, headerFont, headerBgColor) => {
48
58
  const headCell = {
49
59
  height: `${headerMax} !important`,
50
60
  minHeight: `${headerMin} !important`,
@@ -69,7 +79,10 @@ const buildHeaderGlobalStyles = (headerMin, headerMax, headerBgColor) => {
69
79
  alignItems: 'stretch !important',
70
80
  ...(headerBgColor ? { backgroundColor: headerBgColor } : {}),
71
81
  },
72
- '.tp-gpg-root .MuiTableHead-root .MuiTableCell-head': headCell,
82
+ '.tp-gpg-root .MuiTableHead-root .MuiTableCell-head': {
83
+ ...headCell,
84
+ fontSize: `${headerFont} !important`,
85
+ },
73
86
  '.tp-gpg-root .MuiTableHead-root .Mui-TableHeadCell-Content': {
74
87
  height: '100% !important',
75
88
  width: '100% !important',
@@ -92,6 +105,7 @@ const buildHeaderGlobalStyles = (headerMin, headerMax, headerBgColor) => {
92
105
  overflowWrap: 'anywhere !important',
93
106
  width: '100% !important',
94
107
  maxWidth: '100% !important',
108
+ fontSize: `${headerFont} !important`,
95
109
  display: 'block !important',
96
110
  WebkitLineClamp: 'unset !important',
97
111
  WebkitBoxOrient: 'unset !important',
@@ -101,11 +115,12 @@ const buildHeaderGlobalStyles = (headerMin, headerMax, headerBgColor) => {
101
115
  wordBreak: 'break-word !important',
102
116
  overflowWrap: 'anywhere !important',
103
117
  width: '100% !important',
118
+ fontSize: `${headerFont} !important`,
104
119
  },
105
120
  };
106
121
  };
107
122
  /** Per-cell sx merged into MRT (via muiTableHeadCellProps). */
108
- const buildHeaderCellSx = (align, headerMin, headerMax, headerBgColor, headerMaxLines) => {
123
+ const buildHeaderCellSx = (align, headerMin, headerMax, headerFont, headerBgColor, headerMaxLines) => {
109
124
  const textAlign = align;
110
125
  const flexJustify = align === 'right' ? 'flex-end' : align === 'center' ? 'center' : 'flex-start';
111
126
  const wrapperClamp = headerMaxLines != null && headerMaxLines > 0
@@ -127,6 +142,7 @@ const buildHeaderCellSx = (align, headerMin, headerMax, headerBgColor, headerMax
127
142
  height: `${headerMax} !important`,
128
143
  minHeight: `${headerMin} !important`,
129
144
  maxHeight: `${headerMax} !important`,
145
+ fontSize: headerFont,
130
146
  boxSizing: 'border-box',
131
147
  borderRight: '1px solid rgba(224,224,224,1)',
132
148
  borderBottom: '2px solid rgba(0,0,0,0.15)',
@@ -153,6 +169,7 @@ const buildHeaderCellSx = (align, headerMin, headerMax, headerBgColor, headerMax
153
169
  wordBreak: 'break-word',
154
170
  overflowWrap: 'anywhere',
155
171
  lineHeight: 1.25,
172
+ fontSize: headerFont,
156
173
  width: '100%',
157
174
  textAlign,
158
175
  ...wrapperClamp,
@@ -160,6 +177,7 @@ const buildHeaderCellSx = (align, headerMin, headerMax, headerBgColor, headerMax
160
177
  '& .MuiTableSortLabel-root': {
161
178
  whiteSpace: 'normal',
162
179
  wordBreak: 'break-word',
180
+ fontSize: headerFont,
163
181
  width: '100%',
164
182
  margin: 0,
165
183
  },
@@ -203,11 +221,22 @@ const PaginationFooter = ({ pageIndex, pageSize, totalRecords, isFetching, isLoa
203
221
  }, children: pageIndex + 1 }), jsx(Tooltip, { title: "Next page", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: onNext, disabled: !canNext, sx: { p: 0.5 }, children: jsx(ChevronRightIcon, { sx: { fontSize: density.footerIconSize } }) }) }) }), jsx(Tooltip, { title: "Last page", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: onLast, disabled: !canNext, sx: { p: 0.5 }, children: jsx(LastPageIcon, { sx: { fontSize: density.footerIconSize } }) }) }) })] })] }));
204
222
  };
205
223
  // ─── GenericPaginatedGrid ─────────────────────────────────────────────────────
206
- function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs, defaultFilters, defaultVisibleFilterIds, batchSize = 10000, exportFilename = 'export', tableHeight, tableMinHeight = '300px', tableMaxHeight, autoFillViewport = true, layoutMode = 'grid', uiDensity = 'default', uiDensityOptions, pageSizeOptions = [1000, 5000, 10000], headerBgColor, headerMinHeight, headerMaxHeight, headerMaxLines, maxVisibleFilters = 4, }) {
224
+ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs, defaultFilters, defaultVisibleFilterIds, batchSize = 10000, exportFilename = 'export', tableHeight, tableMinHeight = '300px', tableMaxHeight, autoFillViewport = true, layoutMode = 'grid', uiDensity = 'default', uiDensityOptions, pageSizeOptions = [1000, 5000, 10000], headerBgColor, headerMinHeight, headerMaxHeight, headerMaxLines, headerFontSize, bodyFontSize, maxVisibleFilters = 4, }) {
207
225
  const densityTokens = useMemo(() => ({ ...UI_DENSITY_PRESETS[uiDensity], ...uiDensityOptions }), [uiDensity, uiDensityOptions]);
208
226
  const resolvedHeaderMinHeight = toCssSize(headerMinHeight, uiDensity === 'compact' ? '34px' : '40px');
209
227
  const resolvedHeaderMaxHeight = toCssSize(headerMaxHeight, uiDensity === 'compact' ? '56px' : '72px');
210
- const headerGlobalStyleOverrides = useMemo(() => buildHeaderGlobalStyles(resolvedHeaderMinHeight, resolvedHeaderMaxHeight, headerBgColor), [resolvedHeaderMinHeight, resolvedHeaderMaxHeight, headerBgColor]);
228
+ const resolvedHeaderFontSize = toCssSize(headerFontSize ?? densityTokens.headerFontSize, uiDensity === 'compact' ? '11px' : '12px');
229
+ const resolvedBodyFontSize = toCssSize(bodyFontSize ?? densityTokens.bodyFontSize, uiDensity === 'compact' ? '11px' : '12px');
230
+ const tableStyleOverrides = useMemo(() => ({
231
+ ...buildHeaderGlobalStyles(resolvedHeaderMinHeight, resolvedHeaderMaxHeight, resolvedHeaderFontSize, headerBgColor),
232
+ ...buildBodyGlobalStyles(resolvedBodyFontSize),
233
+ }), [
234
+ resolvedHeaderMinHeight,
235
+ resolvedHeaderMaxHeight,
236
+ resolvedHeaderFontSize,
237
+ resolvedBodyFontSize,
238
+ headerBgColor,
239
+ ]);
211
240
  const defaultVisible = defaultVisibleFilterIds
212
241
  ?? (serverFilterDefs.length > 0 ? [serverFilterDefs[0].id] : []);
213
242
  // ── State ──────────────────────────────────────────────────────────────────
@@ -474,16 +503,32 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
474
503
  return {
475
504
  align,
476
505
  sx: [
477
- buildHeaderCellSx(align, resolvedHeaderMinHeight, resolvedHeaderMaxHeight, headerBgColor, headerMaxLines),
506
+ buildHeaderCellSx(align, resolvedHeaderMinHeight, resolvedHeaderMaxHeight, resolvedHeaderFontSize, headerBgColor, headerMaxLines),
478
507
  ...(colSx ? [colSx] : []),
479
508
  ],
480
509
  };
481
510
  },
482
- muiTableBodyCellProps: {
483
- sx: {
484
- whiteSpace: 'nowrap',
485
- borderRight: '1px solid rgba(224,224,224,1)',
486
- },
511
+ muiTableBodyCellProps: ({ column }) => {
512
+ const colProps = column.columnDef.muiTableBodyCellProps;
513
+ let colSx;
514
+ if (typeof colProps === 'function') {
515
+ const resolved = colProps({ column });
516
+ colSx = resolved?.sx;
517
+ }
518
+ else if (colProps) {
519
+ colSx = colProps.sx;
520
+ }
521
+ return {
522
+ sx: [
523
+ {
524
+ whiteSpace: 'nowrap',
525
+ fontSize: resolvedBodyFontSize,
526
+ lineHeight: 1.35,
527
+ borderRight: '1px solid rgba(224,224,224,1)',
528
+ },
529
+ ...(colSx ? [colSx] : []),
530
+ ],
531
+ };
487
532
  },
488
533
  muiToolbarAlertBannerProps: isError
489
534
  ? { color: 'error', children: 'Failed to load data. Please try again.' }
@@ -505,7 +550,7 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
505
550
  '.tp-gpg-root button[aria-label="Move"]': { display: 'none !important' },
506
551
  '.tp-gpg-root [data-column-id="mrt-row-spacer"]': { display: 'none !important' },
507
552
  '.tp-gpg-root .Mui-TableHeadCell-ColumnSpacer': { display: 'none !important' },
508
- ...headerGlobalStyleOverrides,
553
+ ...tableStyleOverrides,
509
554
  } }), isLoading && jsx(OverlayLoader, { message: "Loading data\u2026" }), !isLoading && isFetching && jsx(OverlayLoader, { message: "Updating data\u2026" }), jsx(Box, { sx: { flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column', overflow: 'hidden' }, children: jsx(MaterialReactTable, { table: table }) })] }));
510
555
  }
511
556
 
@@ -1,4 +1,4 @@
1
- import { __exports as Calendar } from '../../../../../_virtual/index.esm4.js';
1
+ import { __exports as Calendar } from '../../../../../_virtual/index.esm7.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireDayCell } from '../DayCell/index.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as DateRange } from '../../../../../_virtual/index.esm6.js';
1
+ import { __exports as DateRange } from '../../../../../_virtual/index.esm4.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireCalendar } from '../Calendar/index.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as DateRangePicker } from '../../../../../_virtual/index.esm5.js';
1
+ import { __exports as DateRangePicker } from '../../../../../_virtual/index.esm6.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireDateRange } from '../DateRange/index.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as DefinedRange } from '../../../../../_virtual/index.esm7.js';
1
+ import { __exports as DefinedRange } from '../../../../../_virtual/index.esm5.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireStyles } from '../../styles.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as InputRangeField } from '../../../../../_virtual/index.esm14.js';
1
+ import { __exports as InputRangeField } from '../../../../../_virtual/index.esm12.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import { __exports as Month } from '../../../../../_virtual/index.esm12.js';
1
+ import { __exports as Month } from '../../../../../_virtual/index.esm14.js';
2
2
  import React__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireDayCell } from '../DayCell/index.esm.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tp-react-elements",
3
- "version": "1.3.11",
3
+ "version": "1.3.12",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "React form components library built with React Hook Form and Yup",