tp-react-elements 1.3.14 → 1.3.16

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.
@@ -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 Month = {};
1
+ var DateInput = {};
2
2
 
3
- export { Month as __exports };
3
+ export { DateInput as __exports };
@@ -1,3 +1,3 @@
1
- var DateInput = {};
1
+ var InputRangeField = {};
2
2
 
3
- export { DateInput as __exports };
3
+ export { InputRangeField as __exports };
@@ -1,3 +1,3 @@
1
- var DefinedRange = {};
1
+ var Calendar = {};
2
2
 
3
- export { DefinedRange as __exports };
3
+ export { Calendar as __exports };
@@ -1,3 +1,3 @@
1
- var DateRangePicker = {};
1
+ var DateRange = {};
2
2
 
3
- export { DateRangePicker as __exports };
3
+ export { DateRange as __exports };
@@ -1,3 +1,3 @@
1
- var Calendar = {};
1
+ var DateRangePicker = {};
2
2
 
3
- export { Calendar as __exports };
3
+ export { DateRangePicker as __exports };
@@ -1,3 +1,3 @@
1
- var DateRange = {};
1
+ var DefinedRange = {};
2
2
 
3
- export { DateRange as __exports };
3
+ export { DefinedRange as __exports };
@@ -15,6 +15,15 @@ import type { MRT_ColumnFiltersState } from 'material-react-table';
15
15
  * `filterValues[filterKey]` (e.g. `"Pending,Shipped"`).
16
16
  * Your `fetchPage` function should split on `","` to build the
17
17
  * correct server query.
18
+ *
19
+ * Every variant accepts an optional **`defaultVisible`** flag.
20
+ * Set it to `true` on any filter that should appear in the chip bar on first
21
+ * render — without needing `defaultVisibleFilterIds` on the grid:
22
+ *
23
+ * ```ts
24
+ * { type: 'dateRange', id: 'dateRange', label: 'Date Range',
25
+ * fromKey: 'From', toKey: 'To', defaultVisible: true }
26
+ * ```
18
27
  */
19
28
  export type ServerFilterDef = {
20
29
  type: 'dateRange';
@@ -22,12 +31,16 @@ export type ServerFilterDef = {
22
31
  label: string;
23
32
  fromKey: string;
24
33
  toKey: string;
34
+ /** Show this chip in the filter bar on first render. Default: `false`. */
35
+ defaultVisible?: boolean;
25
36
  } | {
26
37
  type: 'text';
27
38
  id: string;
28
39
  label: string;
29
40
  filterKey: string;
30
41
  placeholder?: string;
42
+ /** Show this chip in the filter bar on first render. Default: `false`. */
43
+ defaultVisible?: boolean;
31
44
  } | {
32
45
  type: 'dropdown';
33
46
  id: string;
@@ -37,6 +50,8 @@ export type ServerFilterDef = {
37
50
  label: string;
38
51
  value: string;
39
52
  }[];
53
+ /** Show this chip in the filter bar on first render. Default: `false`. */
54
+ defaultVisible?: boolean;
40
55
  } | {
41
56
  /**
42
57
  * Like `dropdown` but adds a search input at the top of the popover so users
@@ -51,6 +66,8 @@ export type ServerFilterDef = {
51
66
  value: string;
52
67
  }[];
53
68
  placeholder?: string;
69
+ /** Show this chip in the filter bar on first render. Default: `false`. */
70
+ defaultVisible?: boolean;
54
71
  } | {
55
72
  /**
56
73
  * Single-date picker chip — applied client-side against the MRT column
@@ -60,6 +77,8 @@ export type ServerFilterDef = {
60
77
  id: string;
61
78
  label: string;
62
79
  columnKey: string;
80
+ /** Show this chip in the filter bar on first render. Default: `false`. */
81
+ defaultVisible?: boolean;
63
82
  } | {
64
83
  /**
65
84
  * Multi-select checkbox chip — users can pick **multiple** values at once.
@@ -75,6 +94,8 @@ export type ServerFilterDef = {
75
94
  label: string;
76
95
  value: string;
77
96
  }[];
97
+ /** Show this chip in the filter bar on first render. Default: `false`. */
98
+ defaultVisible?: boolean;
78
99
  };
79
100
  interface AvailableColumn {
80
101
  id: string;
@@ -1,4 +1,5 @@
1
1
  import type { TPColumnDef } from './types';
2
+ import { type TableCellProps } from '@mui/material';
2
3
  import { type ServerFilterDef } from './DynamicFilterBar';
3
4
  export type { ServerFilterDef };
4
5
  export type { TPColumnDef } from './types';
@@ -46,7 +47,11 @@ export interface GenericPaginatedGridProps<TData extends object> {
46
47
  serverFilterDefs: ServerFilterDef[];
47
48
  /** Initial key → value map for every server filter. */
48
49
  defaultFilters: Record<string, string>;
49
- /** Which chip IDs are visible on first render. Defaults to first entry. */
50
+ /**
51
+ * Explicit list of chip IDs visible on first render.
52
+ * When omitted the grid derives visible chips from `defaultVisible: true`
53
+ * on each `ServerFilterDef` entry, falling back to the first chip.
54
+ */
50
55
  defaultVisibleFilterIds?: string[];
51
56
  /** Number of rows fetched per API call. Default: 10 000. */
52
57
  batchSize?: number;
@@ -122,6 +127,42 @@ export interface GenericPaginatedGridProps<TData extends object> {
122
127
  * Default: 4.
123
128
  */
124
129
  maxVisibleFilters?: number;
130
+ /**
131
+ * Grid-level body cell props — applied to **every** data cell and merged with
132
+ * any column-level `muiTableBodyCellProps` (column takes precedence for non-sx
133
+ * props; `sx` objects are combined as a MUI sx array so neither is lost).
134
+ *
135
+ * Use this to set `title`, `className`, padding, etc. once at the grid level
136
+ * instead of repeating the same props on every column:
137
+ *
138
+ * ```tsx
139
+ * muiTableBodyCellProps={({ cell }) => ({
140
+ * title: cell.getValue(), // hover tooltip on every cell
141
+ * className: 'body_cell',
142
+ * })}
143
+ * ```
144
+ *
145
+ * Individual columns can still add layout-only overrides (e.g. `align: 'right'`
146
+ * for numeric columns) without losing the global `title`/`className`.
147
+ */
148
+ muiTableBodyCellProps?: TableCellProps | ((params: {
149
+ cell: any;
150
+ column: any;
151
+ row: any;
152
+ table: any;
153
+ }) => TableCellProps);
154
+ /**
155
+ * Grid-level head cell props — applied to **every** header cell and merged
156
+ * with any column-level `muiTableHeadCellProps` (column takes precedence).
157
+ *
158
+ * ```tsx
159
+ * muiTableHeadCellProps={{ className: 'Header_cell' }}
160
+ * ```
161
+ */
162
+ muiTableHeadCellProps?: TableCellProps | ((params: {
163
+ column: any;
164
+ table: any;
165
+ }) => TableCellProps);
125
166
  }
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;
167
+ 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, muiTableBodyCellProps: gridBodyCellProps, muiTableHeadCellProps: gridHeadCellProps, }: GenericPaginatedGridProps<TData>): import("react/jsx-runtime").JSX.Element;
127
168
  export default GenericPaginatedGrid;
@@ -221,7 +221,7 @@ const PaginationFooter = ({ pageIndex, pageSize, totalRecords, isFetching, isLoa
221
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 } }) }) }) })] })] }));
222
222
  };
223
223
  // ─── GenericPaginatedGrid ─────────────────────────────────────────────────────
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, }) {
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, muiTableBodyCellProps: gridBodyCellProps, muiTableHeadCellProps: gridHeadCellProps, }) {
225
225
  const densityTokens = useMemo(() => ({ ...UI_DENSITY_PRESETS[uiDensity], ...uiDensityOptions }), [uiDensity, uiDensityOptions]);
226
226
  const resolvedHeaderMinHeight = toCssSize(headerMinHeight, uiDensity === 'compact' ? '34px' : '40px');
227
227
  const resolvedHeaderMaxHeight = toCssSize(headerMaxHeight, uiDensity === 'compact' ? '56px' : '72px');
@@ -237,8 +237,36 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
237
237
  resolvedBodyFontSize,
238
238
  headerBgColor,
239
239
  ]);
240
+ // Priority:
241
+ // 1. explicit defaultVisibleFilterIds prop (override)
242
+ // 2. server filters + column filters that have defaultVisible: true
243
+ // 3. first server filter only (original fallback)
240
244
  const defaultVisible = defaultVisibleFilterIds
241
- ?? (serverFilterDefs.length > 0 ? [serverFilterDefs[0].id] : []);
245
+ ?? (() => {
246
+ // Server-side chips with defaultVisible: true
247
+ const markedServer = serverFilterDefs
248
+ .filter((d) => d.defaultVisible)
249
+ .map((d) => d.id);
250
+ // Column filter chips with defaultVisible: true.
251
+ // Mirror the same exclusion rules used by availableColumns:
252
+ // • must have an accessorKey
253
+ // • must not have enableColumnFilter: false
254
+ // • must not be managed by a server-side 'date' filter def
255
+ const serverManagedColKeys = new Set(serverFilterDefs
256
+ .filter((d) => d.type === 'date')
257
+ .map((d) => d.columnKey));
258
+ const markedCols = columns
259
+ .filter((c) => 'accessorKey' in c &&
260
+ c.accessorKey &&
261
+ c.defaultVisible &&
262
+ c.enableColumnFilter !== false &&
263
+ !serverManagedColKeys.has(c.accessorKey))
264
+ .map((c) => c.accessorKey);
265
+ const marked = [...markedServer, ...markedCols];
266
+ return marked.length > 0
267
+ ? marked
268
+ : serverFilterDefs.length > 0 ? [serverFilterDefs[0].id] : [];
269
+ })();
242
270
  // ── State ──────────────────────────────────────────────────────────────────
243
271
  const [filterValues, setFilterValues] = useState(defaultFilters);
244
272
  const [visibleFilterIds, setVisibleFilterIds] = useState(defaultVisible);
@@ -494,45 +522,55 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
494
522
  ...(headerBgColor ? { backgroundColor: headerBgColor } : {}),
495
523
  },
496
524
  },
497
- muiTableHeadCellProps: ({ column }) => {
498
- const colProps = column.columnDef.muiTableHeadCellProps;
499
- let align = 'left';
500
- let colSx;
501
- if (typeof colProps === 'function') {
502
- const resolved = colProps({ column });
503
- align = resolved?.align ?? 'left';
504
- colSx = resolved?.sx;
505
- }
506
- else if (colProps) {
507
- align = colProps.align ?? 'left';
508
- colSx = colProps.sx;
509
- }
525
+ muiTableHeadCellProps: (params) => {
526
+ const { column, table } = params;
527
+ // ── Resolve column-level props ────────────────────────────────────────
528
+ const colDef = column.columnDef.muiTableHeadCellProps;
529
+ const colResolved = typeof colDef === 'function' ? (colDef({ column, table }) ?? {}) : colDef ?? {};
530
+ // ── Resolve grid-level props ──────────────────────────────────────────
531
+ const gridResolved = typeof gridHeadCellProps === 'function'
532
+ ? (gridHeadCellProps({ column, table }) ?? {})
533
+ : gridHeadCellProps ?? {};
534
+ // Column align overrides grid align; default 'left'
535
+ const align = (colResolved.align ?? gridResolved.align ?? 'left');
536
+ const { sx: gridSx, align: _ga, ...gridRest } = gridResolved;
537
+ const { sx: colSx, align: _ca, ...colRest } = colResolved;
510
538
  return {
539
+ ...gridRest, // grid-level props (className, etc.)
540
+ ...colRest, // column-level overrides
511
541
  align,
512
542
  sx: [
513
543
  buildHeaderCellSx(align, resolvedHeaderMinHeight, resolvedHeaderMaxHeight, resolvedHeaderFontSize, headerBgColor, headerMaxLines),
544
+ ...(gridSx ? [gridSx] : []),
514
545
  ...(colSx ? [colSx] : []),
515
546
  ],
516
547
  };
517
548
  },
518
- muiTableBodyCellProps: ({ column }) => {
519
- const colProps = column.columnDef.muiTableBodyCellProps;
520
- let colSx;
521
- if (typeof colProps === 'function') {
522
- const resolved = colProps({ column });
523
- colSx = resolved?.sx;
524
- }
525
- else if (colProps) {
526
- colSx = colProps.sx;
527
- }
549
+ muiTableBodyCellProps: (params) => {
550
+ const { cell, column, row, table } = params;
551
+ // ── Resolve column-level props ────────────────────────────────────────
552
+ const colDef = column.columnDef.muiTableBodyCellProps;
553
+ const colResolved = typeof colDef === 'function' ? (colDef({ cell, column, row, table }) ?? {}) : colDef ?? {};
554
+ // ── Resolve grid-level props ──────────────────────────────────────────
555
+ const gridResolved = typeof gridBodyCellProps === 'function'
556
+ ? (gridBodyCellProps({ cell, column, row, table }) ?? {})
557
+ : gridBodyCellProps ?? {};
558
+ const { sx: gridSx, ...gridRest } = gridResolved;
559
+ const { sx: colSx, ...colRest } = colResolved;
528
560
  return {
561
+ ...gridRest, // grid-level props (title, className, etc.)
562
+ ...colRest, // column-level overrides (align, etc.)
529
563
  sx: [
564
+ // 1. base styles — always applied
530
565
  {
531
566
  whiteSpace: 'nowrap',
532
567
  fontSize: resolvedBodyFontSize,
533
568
  lineHeight: 1.35,
534
569
  borderRight: '1px solid rgba(224,224,224,1)',
535
570
  },
571
+ // 2. grid-level sx additions
572
+ ...(gridSx ? [gridSx] : []),
573
+ // 3. column-level sx overrides (minWidth, maxWidth, textAlign, etc.)
536
574
  ...(colSx ? [colSx] : []),
537
575
  ],
538
576
  };
@@ -45,9 +45,11 @@ export declare const orderColumns: TPColumnDef<OrderRow>[];
45
45
  /**
46
46
  * Server filter definitions for the Orders demo grid.
47
47
  *
48
- * `multiSelect` chips for Status and Category send comma-separated values
49
- * in `filterValues` (e.g. `status: "Pending,Shipped"`).
50
- * `fetchOrderPage` splits on `","` to apply the server-side filter.
48
+ * `multiSelect` chips send comma-separated values in `filterValues`
49
+ * (e.g. `status: "Pending,Shipped"`). `fetchOrderPage` splits on `","`.
50
+ *
51
+ * `defaultVisible: true` — chip appears in the filter bar on first render
52
+ * without needing `defaultVisibleFilterIds` on the grid component.
51
53
  */
52
54
  export declare const orderFilterDefs: ServerFilterDef[];
53
55
  export declare const orderDefaultFilters: Record<string, string>;
@@ -55,6 +55,26 @@ export type TPColumnDef<TData extends object = object, TValue = any> = MRT_Colum
55
55
  value: string | number;
56
56
  disable?: boolean;
57
57
  }[];
58
+ /**
59
+ * Show this column's filter chip in the filter bar on first render.
60
+ *
61
+ * - Requires `filterType` to be set (or the column must not have
62
+ * `enableColumnFilter: false`).
63
+ * - Works exactly like `defaultVisible` on `ServerFilterDef` — the chip
64
+ * appears without needing `defaultVisibleFilterIds` on the grid.
65
+ * - Default: `false` (chip hidden until user adds from Manage Filters).
66
+ *
67
+ * ```ts
68
+ * {
69
+ * accessorKey: 'status',
70
+ * header: 'Status',
71
+ * filterType: 'multi-select',
72
+ * options: [...],
73
+ * defaultVisible: true, // ← chip shown on load
74
+ * }
75
+ * ```
76
+ */
77
+ defaultVisible?: boolean;
58
78
  };
59
79
  export interface InvoiceDetail {
60
80
  Data_from: string;
@@ -1,4 +1,4 @@
1
- import { __exports as Calendar } from '../../../../../_virtual/index.esm6.js';
1
+ import { __exports as Calendar } 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 requireDayCell } from '../DayCell/index.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as DateInput } from '../../../../../_virtual/index.esm14.js';
1
+ import { __exports as DateInput } from '../../../../../_virtual/index.esm13.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 requireClassnames } from '../../../../classnames/index.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as DateRange } from '../../../../../_virtual/index.esm7.js';
1
+ import { __exports as DateRange } 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 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.esm4.js';
1
+ import { __exports as DefinedRange } 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 requireStyles } from '../../styles.esm.js';
@@ -1,4 +1,4 @@
1
- import { __exports as InputRangeField } from '../../../../../_virtual/index.esm12.js';
1
+ import { __exports as InputRangeField } 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
 
@@ -1,4 +1,4 @@
1
- import { __exports as Month } from '../../../../../_virtual/index.esm13.js';
1
+ import { __exports as Month } 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
  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.14",
3
+ "version": "1.3.16",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "React form components library built with React Hook Form and Yup",