tp-react-elements 1.3.3 → 1.3.6
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/dist/_virtual/index.esm12.js +2 -2
- package/dist/_virtual/index.esm13.js +2 -2
- package/dist/_virtual/index.esm14.js +2 -2
- package/dist/_virtual/index.esm4.js +2 -2
- package/dist/_virtual/index.esm5.js +2 -2
- package/dist/_virtual/index.esm6.js +2 -2
- package/dist/_virtual/index.esm7.js +2 -2
- package/dist/components/PaginatedGrid/DynamicFilterBar.d.ts +6 -4
- package/dist/components/PaginatedGrid/DynamicFilterBar.esm.js +77 -50
- package/dist/components/PaginatedGrid/GenericPaginatedGrid.d.ts +17 -4
- package/dist/components/PaginatedGrid/GenericPaginatedGrid.esm.js +50 -14
- package/dist/components/PaginatedGrid/columns.d.ts +2 -21
- package/dist/components/PaginatedGrid/types.d.ts +61 -0
- package/dist/node_modules/react-date-range/dist/components/Calendar/index.esm.js +1 -1
- package/dist/node_modules/react-date-range/dist/components/DateInput/index.esm.js +1 -1
- package/dist/node_modules/react-date-range/dist/components/DateRange/index.esm.js +1 -1
- package/dist/node_modules/react-date-range/dist/components/DateRangePicker/index.esm.js +1 -1
- package/dist/node_modules/react-date-range/dist/components/DefinedRange/index.esm.js +1 -1
- package/dist/node_modules/react-date-range/dist/components/InputRangeField/index.esm.js +1 -1
- package/dist/node_modules/react-date-range/dist/components/Month/index.esm.js +1 -1
- package/dist/utils/rdrStyles.esm.js +116 -116
- package/package.json +1 -1
- package/scripts/install-deps.js +1 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var
|
|
1
|
+
var InputRangeField = {};
|
|
2
2
|
|
|
3
|
-
export {
|
|
3
|
+
export { InputRangeField as __exports };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var
|
|
1
|
+
var DateInput = {};
|
|
2
2
|
|
|
3
|
-
export {
|
|
3
|
+
export { DateInput as __exports };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var
|
|
1
|
+
var Month = {};
|
|
2
2
|
|
|
3
|
-
export {
|
|
3
|
+
export { Month as __exports };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var
|
|
1
|
+
var DefinedRange = {};
|
|
2
2
|
|
|
3
|
-
export {
|
|
3
|
+
export { DefinedRange as __exports };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var
|
|
1
|
+
var DateRangePicker = {};
|
|
2
2
|
|
|
3
|
-
export {
|
|
3
|
+
export { DateRangePicker as __exports };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var
|
|
1
|
+
var DateRange = {};
|
|
2
2
|
|
|
3
|
-
export {
|
|
3
|
+
export { DateRange as __exports };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var
|
|
1
|
+
var Calendar = {};
|
|
2
2
|
|
|
3
|
-
export {
|
|
3
|
+
export { Calendar as __exports };
|
|
@@ -61,11 +61,11 @@ interface AvailableColumn {
|
|
|
61
61
|
label: string;
|
|
62
62
|
/**
|
|
63
63
|
* Filter chip variant used in the "Column Filters" section of Manage Filters.
|
|
64
|
-
*
|
|
64
|
+
* Sourced from the `filterType` prop on the column's `TPColumnDef`.
|
|
65
65
|
* Defaults to `'text'` when omitted.
|
|
66
66
|
*/
|
|
67
|
-
filterType?: 'text' | 'date' | '
|
|
68
|
-
/** Options for
|
|
67
|
+
filterType?: 'text' | 'date' | 'select' | 'searchable-select' | 'number';
|
|
68
|
+
/** Options for `'select'` / `'searchable-select'` chip variants. */
|
|
69
69
|
filterOptions?: {
|
|
70
70
|
label: string;
|
|
71
71
|
value: string;
|
|
@@ -80,6 +80,8 @@ export interface DynamicFilterBarProps {
|
|
|
80
80
|
columnFilters: MRT_ColumnFiltersState;
|
|
81
81
|
onColumnFilterChange: (f: MRT_ColumnFiltersState) => void;
|
|
82
82
|
availableColumns: AvailableColumn[];
|
|
83
|
+
/** Maximum number of chips that may be visible at once. Default: 4. */
|
|
84
|
+
maxVisibleFilters?: number;
|
|
83
85
|
}
|
|
84
|
-
declare const DynamicFilterBar: ({ serverFilterDefs, visibleFilterIds, onToggleFilter, filterValues, onFilterValuesChange, columnFilters, onColumnFilterChange, availableColumns, }: DynamicFilterBarProps) => import("react/jsx-runtime").JSX.Element;
|
|
86
|
+
declare const DynamicFilterBar: ({ serverFilterDefs, visibleFilterIds, onToggleFilter, filterValues, onFilterValuesChange, columnFilters, onColumnFilterChange, availableColumns, maxVisibleFilters, }: DynamicFilterBarProps) => import("react/jsx-runtime").JSX.Element;
|
|
85
87
|
export default DynamicFilterBar;
|
|
@@ -9,7 +9,7 @@ import { DatePicker } from '@mui/x-date-pickers/DatePicker';
|
|
|
9
9
|
import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
|
|
10
10
|
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
|
|
11
11
|
import SingleSelectNonAutoComplete from '../FormComponents/Select/SingleSelectNonAutoComplete.esm.js';
|
|
12
|
-
import { Box, Typography, Button, Popover, TextField, Stack, InputAdornment, List, ListItemButton, ListItemText,
|
|
12
|
+
import { Box, Typography, Tooltip, Button, Popover, TextField, Stack, InputAdornment, List, ListItemButton, ListItemText, Divider } from '@mui/material';
|
|
13
13
|
import CalendarTodayIcon from '@mui/icons-material/CalendarToday';
|
|
14
14
|
import TuneIcon from '@mui/icons-material/Tune';
|
|
15
15
|
import CloseIcon from '@mui/icons-material/Close';
|
|
@@ -22,6 +22,7 @@ import SearchIcon from '@mui/icons-material/Search';
|
|
|
22
22
|
// that DatepickerWrapperV2 passes to onChangeFn
|
|
23
23
|
dayjs.extend(customParseFormat);
|
|
24
24
|
// ─── Type pill metadata ───────────────────────────────────────────────────────
|
|
25
|
+
// Server-side filter pills (used in SERVER FILTERS section of Manage Filters)
|
|
25
26
|
const TYPE_PILL = {
|
|
26
27
|
dateRange: { label: 'Range', color: '#1565c0', bg: '#e3f2fd' },
|
|
27
28
|
date: { label: 'Date', color: '#00695c', bg: '#e0f2f1' },
|
|
@@ -29,6 +30,14 @@ const TYPE_PILL = {
|
|
|
29
30
|
dropdown: { label: 'Select', color: '#6a1b9a', bg: '#f3e5f5' },
|
|
30
31
|
searchableDropdown: { label: 'Search', color: '#bf360c', bg: '#fbe9e7' },
|
|
31
32
|
};
|
|
33
|
+
// Column filter type pills (used in COLUMN FILTERS section of Manage Filters)
|
|
34
|
+
const COLUMN_TYPE_PILL = {
|
|
35
|
+
text: { label: 'Text', color: '#2e7d32', bg: '#e8f5e9' },
|
|
36
|
+
date: { label: 'Date', color: '#00695c', bg: '#e0f2f1' },
|
|
37
|
+
select: { label: 'Select', color: '#bf360c', bg: '#fbe9e7' },
|
|
38
|
+
'searchable-select': { label: 'Search', color: '#bf360c', bg: '#fbe9e7' },
|
|
39
|
+
number: { label: 'Number', color: '#e65100', bg: '#fff3e0' },
|
|
40
|
+
};
|
|
32
41
|
// ─── Chip shared style ────────────────────────────────────────────────────────
|
|
33
42
|
const chipSx = (active) => ({
|
|
34
43
|
borderRadius: 5,
|
|
@@ -41,8 +50,24 @@ const chipSx = (active) => ({
|
|
|
41
50
|
whiteSpace: 'nowrap',
|
|
42
51
|
px: 1.5,
|
|
43
52
|
minHeight: 30,
|
|
53
|
+
// Cap chip width so long option labels don't break the filter bar layout
|
|
54
|
+
maxWidth: 260,
|
|
55
|
+
overflow: 'hidden',
|
|
44
56
|
'&:hover': { borderColor: 'primary.main', bgcolor: 'rgba(25,118,210,0.08)' },
|
|
45
57
|
});
|
|
58
|
+
// ─── ChipLabel — renders button text with ellipsis when it overflows ──────────
|
|
59
|
+
//
|
|
60
|
+
// MUI Button is a flex container: the text child must have `min-width: 0`
|
|
61
|
+
// (overrides the default `min-width: auto`) so it can shrink past its natural
|
|
62
|
+
// size and trigger `text-overflow: ellipsis`.
|
|
63
|
+
const ChipLabel = ({ text }) => (jsx(Box, { component: "span", sx: {
|
|
64
|
+
overflow: 'hidden',
|
|
65
|
+
textOverflow: 'ellipsis',
|
|
66
|
+
whiteSpace: 'nowrap',
|
|
67
|
+
display: 'block',
|
|
68
|
+
minWidth: 0,
|
|
69
|
+
flex: '1 1 0',
|
|
70
|
+
}, children: text }));
|
|
46
71
|
// ─── Date helper ──────────────────────────────────────────────────────────────
|
|
47
72
|
const fmtDate = (iso) => {
|
|
48
73
|
if (!iso)
|
|
@@ -95,13 +120,14 @@ const DateRangeChip = ({ label, fromDate, toDate, onApply, onRemove }) => {
|
|
|
95
120
|
setAnchor(null);
|
|
96
121
|
}
|
|
97
122
|
};
|
|
98
|
-
return (jsxs(Fragment, { children: [jsx(Button, { variant: "outlined", size: "small", onClick: openPicker, startIcon: jsx(CalendarTodayIcon, { sx: { fontSize: 13 } }), endIcon: jsx(CloseIcon, { sx: { fontSize: '12px !important' }, onClick: (e) => { e.stopPropagation(); onRemove(); } }), sx: chipSx(active), children: chipLabel }), jsxs(Popover, { open: Boolean(anchor), anchorEl: anchor, onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, PaperProps: { sx: { mt: 0.75, borderRadius: 2, boxShadow: 6, overflow: 'hidden' } }, children: [jsx(distExports.DateRange, { editableDateInputs: false, onChange: handleRangeChange, moveRangeOnFirstSelection: false, ranges: selRange, months: 2, direction: "horizontal", showDateDisplay: false, dateDisplayFormat: "dd/MM/yyyy", rangeColors: ['#1976d2'] }), active && (jsx(Box, { sx: { display: 'flex', justifyContent: 'flex-end', px: 2, pb: 1.5 }, children: jsx(Button, { size: "small", color: "inherit", onClick: () => { onApply('', ''); setAnchor(null); }, children: "Clear" }) }))] })] }));
|
|
123
|
+
return (jsxs(Fragment, { children: [jsx(Tooltip, { title: active ? chipLabel : '', placement: "top", arrow: true, children: jsx(Button, { variant: "outlined", size: "small", onClick: openPicker, startIcon: jsx(CalendarTodayIcon, { sx: { fontSize: 13 } }), endIcon: jsx(CloseIcon, { sx: { fontSize: '12px !important' }, onClick: (e) => { e.stopPropagation(); onRemove(); } }), sx: chipSx(active), children: jsx(ChipLabel, { text: chipLabel }) }) }), jsxs(Popover, { open: Boolean(anchor), anchorEl: anchor, onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, PaperProps: { sx: { mt: 0.75, borderRadius: 2, boxShadow: 6, overflow: 'hidden' } }, children: [jsx(distExports.DateRange, { editableDateInputs: false, onChange: handleRangeChange, moveRangeOnFirstSelection: false, ranges: selRange, months: 2, direction: "horizontal", showDateDisplay: false, dateDisplayFormat: "dd/MM/yyyy", rangeColors: ['#1976d2'] }), active && (jsx(Box, { sx: { display: 'flex', justifyContent: 'flex-end', px: 2, pb: 1.5 }, children: jsx(Button, { size: "small", color: "inherit", onClick: () => { onApply('', ''); setAnchor(null); }, children: "Clear" }) }))] })] }));
|
|
99
124
|
};
|
|
100
125
|
const TextFilterChip = ({ label, value, onApply, onRemove, placeholder }) => {
|
|
101
126
|
const [anchor, setAnchor] = useState(null);
|
|
102
127
|
const [draft, setDraft] = useState('');
|
|
103
128
|
const active = Boolean(value);
|
|
104
|
-
|
|
129
|
+
const chipText = active ? `${label}: ${value}` : label;
|
|
130
|
+
return (jsxs(Fragment, { children: [jsx(Tooltip, { title: active ? chipText : '', placement: "top", arrow: true, children: jsx(Button, { variant: "outlined", size: "small", onClick: (e) => { setDraft(value); setAnchor(e.currentTarget); }, endIcon: jsx(CloseIcon, { sx: { fontSize: '12px !important' }, onClick: (e) => { e.stopPropagation(); onRemove(); } }), sx: chipSx(active), children: jsx(ChipLabel, { text: chipText }) }) }), jsx(Popover, { open: Boolean(anchor), anchorEl: anchor, onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, PaperProps: { sx: { mt: 0.75, borderRadius: 2, boxShadow: 6, minWidth: 240 } }, children: jsxs(Box, { sx: { p: 2 }, children: [jsx(Typography, { variant: "caption", fontWeight: 600, color: "text.secondary", display: "block", mb: 1.5, children: label }), jsx(TextField, { value: draft, onChange: (e) => setDraft(e.target.value), placeholder: placeholder, size: "small", fullWidth: true, autoFocus: true, onKeyDown: (e) => {
|
|
105
131
|
if (e.key === 'Enter') {
|
|
106
132
|
onApply(draft);
|
|
107
133
|
setAnchor(null);
|
|
@@ -129,11 +155,12 @@ const DatePickerChip = ({ label, value, onApply, onRemove }) => {
|
|
|
129
155
|
}
|
|
130
156
|
setOpen(false);
|
|
131
157
|
};
|
|
158
|
+
const chipText = active ? `${label}: ${fmtDate(value)}` : label;
|
|
132
159
|
return (
|
|
133
160
|
// LocalizationProvider must wrap DatePicker — scoped here so it only
|
|
134
161
|
// loads when the chip is actually used (DatePickerChip is tree-shaken
|
|
135
162
|
// if the 'date' filter type is never included in serverFilterDefs).
|
|
136
|
-
jsxs(LocalizationProvider, { dateAdapter: AdapterDayjs, children: [jsx(Button, { variant: "outlined", size: "small", onClick: handleChipClick, startIcon: jsx(CalendarTodayIcon, { sx: { fontSize: 13 } }), endIcon: jsx(CloseIcon, { sx: { fontSize: '12px !important' }, onClick: (e) => { e.stopPropagation(); onRemove(); } }), sx: chipSx(active), children:
|
|
163
|
+
jsxs(LocalizationProvider, { dateAdapter: AdapterDayjs, children: [jsx(Tooltip, { title: active ? chipText : '', placement: "top", arrow: true, children: jsx(Button, { variant: "outlined", size: "small", onClick: handleChipClick, startIcon: jsx(CalendarTodayIcon, { sx: { fontSize: 13 } }), endIcon: jsx(CloseIcon, { sx: { fontSize: '12px !important' }, onClick: (e) => { e.stopPropagation(); onRemove(); } }), sx: chipSx(active), children: jsx(ChipLabel, { text: chipText }) }) }), jsx(DatePicker, { value: dayjsValue, open: open, onClose: () => setOpen(false), onChange: handleChange, slotProps: {
|
|
137
164
|
textField: { sx: { display: 'none' }, size: 'small' },
|
|
138
165
|
popper: {
|
|
139
166
|
anchorEl,
|
|
@@ -171,7 +198,8 @@ const DropdownFilterChip = ({ label, value, options, onApply, onRemove }) => {
|
|
|
171
198
|
...options.map((o) => ({ label: o.label, value: o.value })),
|
|
172
199
|
],
|
|
173
200
|
};
|
|
174
|
-
|
|
201
|
+
const chipText = active ? `${label}: ${selectedLabel}` : label;
|
|
202
|
+
return (jsxs(Fragment, { children: [jsx(Tooltip, { title: active ? chipText : '', placement: "top", arrow: true, children: jsx(Button, { variant: "outlined", size: "small", onClick: (e) => setAnchor(e.currentTarget), startIcon: jsx(ArrowDropDownIcon, { sx: { fontSize: '15px !important', mr: -0.5 } }), endIcon: jsx(CloseIcon, { sx: { fontSize: '12px !important' }, onClick: (e) => { e.stopPropagation(); onRemove(); } }), sx: chipSx(active), children: jsx(ChipLabel, { text: chipText }) }) }), jsx(Popover, { open: Boolean(anchor), anchorEl: anchor, onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, PaperProps: { sx: { mt: 0.75, borderRadius: 2, boxShadow: 6, p: 1.5, minWidth: 240 } }, children: jsx(SingleSelectNonAutoComplete, { props: {
|
|
175
203
|
item,
|
|
176
204
|
register,
|
|
177
205
|
control,
|
|
@@ -199,7 +227,8 @@ const SearchableSelectChip = ({ label, value, options, onApply, onRemove, placeh
|
|
|
199
227
|
const filtered = search
|
|
200
228
|
? options.filter((o) => o.label.toLowerCase().includes(search.toLowerCase()))
|
|
201
229
|
: options;
|
|
202
|
-
|
|
230
|
+
const chipText = active ? `${label}: ${selectedLabel}` : label;
|
|
231
|
+
return (jsxs(Fragment, { children: [jsx(Tooltip, { title: active ? chipText : '', placement: "top", arrow: true, children: jsx(Button, { variant: "outlined", size: "small", onClick: open, startIcon: jsx(SearchIcon, { sx: { fontSize: '14px !important', mr: -0.25 } }), endIcon: jsx(CloseIcon, { sx: { fontSize: '12px !important' }, onClick: (e) => { e.stopPropagation(); onRemove(); } }), sx: chipSx(active), children: jsx(ChipLabel, { text: chipText }) }) }), jsxs(Popover, { open: Boolean(anchor), anchorEl: anchor, onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, PaperProps: {
|
|
203
232
|
sx: { mt: 0.75, borderRadius: 2, boxShadow: 6, width: 280, display: 'flex', flexDirection: 'column' },
|
|
204
233
|
}, children: [jsx(Box, { sx: { px: 1.5, pt: 1.5, pb: 0.75 }, children: jsx(TextField, { size: "small", fullWidth: true, autoFocus: true, placeholder: placeholder, value: search, onChange: (e) => setSearch(e.target.value), onKeyDown: (e) => { if (e.key === 'Escape')
|
|
205
234
|
setAnchor(null); }, InputProps: {
|
|
@@ -217,55 +246,53 @@ const SearchableSelectChip = ({ label, value, options, onApply, onRemove, placeh
|
|
|
217
246
|
} }), isSelected && (jsx(CheckIcon, { sx: { fontSize: 15, color: 'primary.main', flexShrink: 0 } }))] }, opt.value));
|
|
218
247
|
}))] })] })] }));
|
|
219
248
|
};
|
|
220
|
-
const ManageFiltersButton = ({ serverFilterDefs, visibleIds, availableColumns, onToggle, }) => {
|
|
249
|
+
const ManageFiltersButton = ({ serverFilterDefs, visibleIds, availableColumns, onToggle, maxVisible = 4, }) => {
|
|
221
250
|
const [anchor, setAnchor] = useState(null);
|
|
251
|
+
const atLimit = visibleIds.length >= maxVisible;
|
|
252
|
+
// Shared pill box renderer
|
|
253
|
+
const PillBox = ({ bg, color, label }) => (jsx(Box, { component: "span", sx: {
|
|
254
|
+
mr: 1.25, flexShrink: 0,
|
|
255
|
+
fontSize: 10, fontWeight: 700,
|
|
256
|
+
px: 0.75, py: '2px',
|
|
257
|
+
borderRadius: '4px',
|
|
258
|
+
bgcolor: bg,
|
|
259
|
+
color,
|
|
260
|
+
textTransform: 'uppercase',
|
|
261
|
+
letterSpacing: 0.4,
|
|
262
|
+
lineHeight: 1.6,
|
|
263
|
+
}, children: label }));
|
|
222
264
|
return (jsxs(Fragment, { children: [jsx(Tooltip, { title: "Add or remove filter chips", children: jsx(Button, { size: "small", variant: "outlined", startIcon: jsx(TuneIcon, { sx: { fontSize: 14 } }), onClick: (e) => setAnchor(e.currentTarget), sx: {
|
|
223
265
|
borderRadius: 5, textTransform: 'none', fontSize: 12,
|
|
224
266
|
borderColor: 'divider', color: 'text.secondary',
|
|
225
267
|
px: 1.5, minHeight: 30,
|
|
226
268
|
'&:hover': { borderColor: 'primary.main', color: 'primary.main' },
|
|
227
|
-
}, children: "Manage Filters" }) }),
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
return (jsxs(ListItemButton, { onClick: () => onToggle(col.id), sx: { px: 2, py: 0.4 }, children: [jsx(Box, { component: "span", sx: {
|
|
253
|
-
mr: 1.25, flexShrink: 0,
|
|
254
|
-
fontSize: 10, fontWeight: 700,
|
|
255
|
-
px: 0.75, py: '2px',
|
|
256
|
-
borderRadius: '4px',
|
|
257
|
-
bgcolor: pill.bg,
|
|
258
|
-
color: pill.color,
|
|
259
|
-
textTransform: 'uppercase',
|
|
260
|
-
letterSpacing: 0.4,
|
|
261
|
-
lineHeight: 1.6,
|
|
262
|
-
}, children: pill.label }), jsx(ListItemText, { primary: col.label, primaryTypographyProps: {
|
|
263
|
-
fontSize: 13,
|
|
264
|
-
color: selected ? 'primary.main' : 'text.primary',
|
|
265
|
-
} }), selected && jsx(CheckIcon, { sx: { fontSize: 16, color: 'primary.main', flexShrink: 0 } })] }, col.id));
|
|
266
|
-
}) })] }))] }) })] }));
|
|
269
|
+
}, children: "Manage Filters" }) }), jsxs(Popover, { open: Boolean(anchor), anchorEl: anchor, onClose: () => setAnchor(null), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, PaperProps: { sx: { mt: 0.75, borderRadius: 2, boxShadow: 6, width: 280, overflow: 'hidden' } }, children: [atLimit && (jsx(Box, { sx: {
|
|
270
|
+
px: 2, py: 0.75,
|
|
271
|
+
bgcolor: 'rgba(25,118,210,0.07)',
|
|
272
|
+
borderBottom: '1px solid rgba(25,118,210,0.2)',
|
|
273
|
+
display: 'flex',
|
|
274
|
+
alignItems: 'center',
|
|
275
|
+
gap: 0.75,
|
|
276
|
+
}, children: jsxs(Typography, { sx: { fontSize: 11, color: 'primary.main', fontWeight: 600, lineHeight: 1.4 }, children: [visibleIds.length, "/", maxVisible, " filters active \u2014 remove one to add another"] }) })), jsxs(Box, { sx: { maxHeight: 360, overflowY: 'auto', py: 1 }, children: [serverFilterDefs.length > 0 && (jsxs(Fragment, { children: [jsx(Typography, { variant: "caption", fontWeight: 700, color: "text.disabled", sx: { px: 2, pb: 0.5, display: 'block', textTransform: 'uppercase', letterSpacing: 0.5 }, children: "Server Filters" }), jsx(List, { dense: true, disablePadding: true, children: serverFilterDefs.map((def) => {
|
|
277
|
+
const selected = visibleIds.includes(def.id);
|
|
278
|
+
const blocked = atLimit && !selected; // at cap and not yet shown → disabled
|
|
279
|
+
const pill = TYPE_PILL[def.type];
|
|
280
|
+
return (jsx(Tooltip, { title: blocked ? `Maximum ${maxVisible} filters allowed` : '', placement: "right", arrow: true, children: jsx("span", { style: { display: 'block' }, children: jsxs(ListItemButton, { onClick: () => !blocked && onToggle(def.id), disabled: blocked, sx: { px: 2, py: 0.5, opacity: blocked ? 0.45 : 1 }, children: [jsx(PillBox, { bg: pill.bg, color: pill.color, label: pill.label }), jsx(ListItemText, { primary: def.label, primaryTypographyProps: {
|
|
281
|
+
fontSize: 13,
|
|
282
|
+
color: selected ? 'primary.main' : 'text.primary',
|
|
283
|
+
} }), selected && jsx(CheckIcon, { sx: { fontSize: 16, color: 'primary.main', flexShrink: 0 } })] }) }) }, def.id));
|
|
284
|
+
}) })] })), availableColumns.length > 0 && (jsxs(Fragment, { children: [jsx(Divider, { sx: { my: 1 } }), jsx(Typography, { variant: "caption", fontWeight: 700, color: "text.disabled", sx: { px: 2, pb: 0.5, display: 'block', textTransform: 'uppercase', letterSpacing: 0.5 }, children: "Column Filters" }), jsx(List, { dense: true, disablePadding: true, children: availableColumns.map((col) => {
|
|
285
|
+
const selected = visibleIds.includes(col.id);
|
|
286
|
+
const blocked = atLimit && !selected;
|
|
287
|
+
const pill = COLUMN_TYPE_PILL[col.filterType ?? 'text'] ??
|
|
288
|
+
COLUMN_TYPE_PILL.text;
|
|
289
|
+
return (jsx(Tooltip, { title: blocked ? `Maximum ${maxVisible} filters allowed` : '', placement: "right", arrow: true, children: jsx("span", { style: { display: 'block' }, children: jsxs(ListItemButton, { onClick: () => !blocked && onToggle(col.id), disabled: blocked, sx: { px: 2, py: 0.4, opacity: blocked ? 0.45 : 1 }, children: [jsx(PillBox, { bg: pill.bg, color: pill.color, label: pill.label }), jsx(ListItemText, { primary: col.label, primaryTypographyProps: {
|
|
290
|
+
fontSize: 13,
|
|
291
|
+
color: selected ? 'primary.main' : 'text.primary',
|
|
292
|
+
} }), selected && jsx(CheckIcon, { sx: { fontSize: 16, color: 'primary.main', flexShrink: 0 } })] }) }) }, col.id));
|
|
293
|
+
}) })] }))] })] })] }));
|
|
267
294
|
};
|
|
268
|
-
const DynamicFilterBar = ({ serverFilterDefs, visibleFilterIds, onToggleFilter, filterValues, onFilterValuesChange, columnFilters, onColumnFilterChange, availableColumns, }) => {
|
|
295
|
+
const DynamicFilterBar = ({ serverFilterDefs, visibleFilterIds, onToggleFilter, filterValues, onFilterValuesChange, columnFilters, onColumnFilterChange, availableColumns, maxVisibleFilters = 4, }) => {
|
|
269
296
|
const getColValue = (id) => columnFilters.find((f) => f.id === id)?.value ?? '';
|
|
270
297
|
const applyColFilter = (id, value) => {
|
|
271
298
|
const rest = columnFilters.filter((f) => f.id !== id);
|
|
@@ -313,12 +340,12 @@ const DynamicFilterBar = ({ serverFilterDefs, visibleFilterIds, onToggleFilter,
|
|
|
313
340
|
if (col.filterType === 'date') {
|
|
314
341
|
return (jsx(DatePickerChip, { label: col.label, value: getColValue(id), onApply: (v) => applyColFilter(id, v), onRemove: () => removeFilter(id) }, id));
|
|
315
342
|
}
|
|
316
|
-
if (col.filterType === '
|
|
343
|
+
if (col.filterType === 'select' || col.filterType === 'searchable-select') {
|
|
317
344
|
return (jsx(SearchableSelectChip, { label: col.label, value: getColValue(id), options: col.filterOptions ?? [], onApply: (v) => applyColFilter(id, v), onRemove: () => removeFilter(id) }, id));
|
|
318
345
|
}
|
|
319
346
|
// Default: free-text input
|
|
320
347
|
return (jsx(TextFilterChip, { label: col.label, value: getColValue(id), onApply: (v) => applyColFilter(id, v), onRemove: () => removeFilter(id), placeholder: `Filter by ${col.label}` }, id));
|
|
321
|
-
}), jsx(ManageFiltersButton, { serverFilterDefs: serverFilterDefs, visibleIds: visibleFilterIds, availableColumns: availableColumns, onToggle: onToggleFilter })] }));
|
|
348
|
+
}), jsx(ManageFiltersButton, { serverFilterDefs: serverFilterDefs, visibleIds: visibleFilterIds, availableColumns: availableColumns, onToggle: onToggleFilter, maxVisible: maxVisibleFilters })] }));
|
|
322
349
|
};
|
|
323
350
|
|
|
324
351
|
export { DynamicFilterBar as default };
|
|
@@ -1,14 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { TPColumnDef } from './types';
|
|
2
2
|
import { type ServerFilterDef } from './DynamicFilterBar';
|
|
3
3
|
export type { ServerFilterDef };
|
|
4
|
+
export type { TPColumnDef } from './types';
|
|
4
5
|
/** Shape that fetchPage must return. */
|
|
5
6
|
export interface PagedResult<TData> {
|
|
6
7
|
data: TData[];
|
|
7
8
|
totalRecords: number;
|
|
8
9
|
}
|
|
9
10
|
export interface GenericPaginatedGridProps<TData extends object> {
|
|
10
|
-
/**
|
|
11
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Column definitions. Use `TPColumnDef<TData>` (a superset of `MRT_ColumnDef`)
|
|
13
|
+
* to get top-level `filterType` and `options` support with no `meta` boilerplate.
|
|
14
|
+
*
|
|
15
|
+
* The grid automatically injects the right `filterFn` for each `filterType`,
|
|
16
|
+
* and wires up the correct chip in Manage Filters → Column Filters.
|
|
17
|
+
*/
|
|
18
|
+
columns: TPColumnDef<TData>[];
|
|
12
19
|
/**
|
|
13
20
|
* Async function called on every page/filter change.
|
|
14
21
|
* Receives the current flat filter map and the 0-based page index.
|
|
@@ -35,6 +42,12 @@ export interface GenericPaginatedGridProps<TData extends object> {
|
|
|
35
42
|
* Accepts any valid CSS colour string.
|
|
36
43
|
*/
|
|
37
44
|
headerBgColor?: string;
|
|
45
|
+
/**
|
|
46
|
+
* Maximum number of filter chips that can be visible at once.
|
|
47
|
+
* Prevents the filter bar from wrapping to a second row on typical screens.
|
|
48
|
+
* Default: 4.
|
|
49
|
+
*/
|
|
50
|
+
maxVisibleFilters?: number;
|
|
38
51
|
}
|
|
39
|
-
declare function GenericPaginatedGrid<TData extends object>({ columns, fetchPage, queryKey, serverFilterDefs, defaultFilters, defaultVisibleFilterIds, batchSize, exportFilename, tableHeight, pageSizeOptions, headerBgColor, }: GenericPaginatedGridProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
52
|
+
declare function GenericPaginatedGrid<TData extends object>({ columns, fetchPage, queryKey, serverFilterDefs, defaultFilters, defaultVisibleFilterIds, batchSize, exportFilename, tableHeight, pageSizeOptions, headerBgColor, maxVisibleFilters, }: GenericPaginatedGridProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
40
53
|
export default GenericPaginatedGrid;
|
|
@@ -43,7 +43,7 @@ const PaginationFooter = ({ pageIndex, pageSize, totalRecords, isFetching, isLoa
|
|
|
43
43
|
}, children: pageIndex + 1 }), jsx(Tooltip, { title: "Next page", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: onNext, disabled: !canNext, children: jsx(ChevronRightIcon, { sx: { fontSize: 20 } }) }) }) }), jsx(Tooltip, { title: "Last page", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: onLast, disabled: !canNext, children: jsx(LastPageIcon, { sx: { fontSize: 20 } }) }) }) })] })] }));
|
|
44
44
|
};
|
|
45
45
|
// ─── GenericPaginatedGrid ─────────────────────────────────────────────────────
|
|
46
|
-
function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs, defaultFilters, defaultVisibleFilterIds, batchSize = 10000, exportFilename = 'export', tableHeight = '60vh', pageSizeOptions = [1000, 5000, 10000], headerBgColor, }) {
|
|
46
|
+
function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs, defaultFilters, defaultVisibleFilterIds, batchSize = 10000, exportFilename = 'export', tableHeight = '60vh', pageSizeOptions = [1000, 5000, 10000], headerBgColor, maxVisibleFilters = 4, }) {
|
|
47
47
|
const defaultVisible = defaultVisibleFilterIds
|
|
48
48
|
?? (serverFilterDefs.length > 0 ? [serverFilterDefs[0].id] : []);
|
|
49
49
|
// ── State ──────────────────────────────────────────────────────────────────
|
|
@@ -66,6 +66,34 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
|
|
|
66
66
|
});
|
|
67
67
|
const rows = data?.data ?? [];
|
|
68
68
|
const totalRecords = data?.totalRecords ?? 0;
|
|
69
|
+
// ── Strip custom props + auto-inject filterFn before passing to MRT ──────────
|
|
70
|
+
//
|
|
71
|
+
// `TPColumnDef` extends `MRT_ColumnDef` with `filterType` and `options`.
|
|
72
|
+
// MRT doesn't know these props, so we strip them here. We also inject the
|
|
73
|
+
// appropriate `filterFn` automatically so callers never have to write one.
|
|
74
|
+
const processedColumns = useMemo(() => {
|
|
75
|
+
return columns.map((col) => {
|
|
76
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
77
|
+
const { filterType, options, ...mrtCol } = col;
|
|
78
|
+
// Auto-inject filterFn only when the user hasn't already supplied one.
|
|
79
|
+
if (!mrtCol.filterFn && filterType) {
|
|
80
|
+
if (filterType === 'date') {
|
|
81
|
+
// ISO date strings: "2026-05-05T00:00:00" → startsWith "2026-05-05"
|
|
82
|
+
mrtCol.filterFn = (row, columnId, filterValue) => filterValue
|
|
83
|
+
? (row.getValue(columnId) ?? '').startsWith(filterValue)
|
|
84
|
+
: true;
|
|
85
|
+
}
|
|
86
|
+
else if (filterType === 'select' || filterType === 'searchable-select') {
|
|
87
|
+
// Exact-value match (avoids substring false positives)
|
|
88
|
+
mrtCol.filterFn = (row, columnId, filterValue) => filterValue
|
|
89
|
+
? row.getValue(columnId) === filterValue
|
|
90
|
+
: true;
|
|
91
|
+
}
|
|
92
|
+
// 'text' and 'number' use MRT's built-in client-side filtering
|
|
93
|
+
}
|
|
94
|
+
return mrtCol;
|
|
95
|
+
});
|
|
96
|
+
}, [columns]);
|
|
69
97
|
// ── Derive column list for filter chip picker ──────────────────────────────
|
|
70
98
|
//
|
|
71
99
|
// A column is excluded from the "Column Filters" section of Manage Filters
|
|
@@ -73,7 +101,7 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
|
|
|
73
101
|
// 1. It has no accessorKey (computed / display columns).
|
|
74
102
|
// 2. Its accessorKey is already handled by a server-side 'date' filter def.
|
|
75
103
|
// 3. Its MRT `enableColumnFilter` prop is explicitly set to `false` —
|
|
76
|
-
// this
|
|
104
|
+
// use this for numeric/computed columns that don't need a filter chip.
|
|
77
105
|
const availableColumns = useMemo(() => {
|
|
78
106
|
const serverManagedColKeys = new Set(serverFilterDefs
|
|
79
107
|
.filter((d) => d.type === 'date')
|
|
@@ -82,16 +110,14 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
|
|
|
82
110
|
.filter((c) => 'accessorKey' in c &&
|
|
83
111
|
c.accessorKey &&
|
|
84
112
|
!serverManagedColKeys.has(c.accessorKey) &&
|
|
85
|
-
// Honour the standard MRT opt-out flag: columns with
|
|
86
|
-
// enableColumnFilter: false should not appear in Manage Filters.
|
|
87
113
|
c.enableColumnFilter !== false)
|
|
88
114
|
.map((c) => ({
|
|
89
115
|
id: c.accessorKey,
|
|
90
116
|
label: c.header,
|
|
91
|
-
//
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
filterOptions: c.
|
|
117
|
+
// Pass filterType directly from TPColumnDef (no meta unwrapping needed)
|
|
118
|
+
filterType: c.filterType,
|
|
119
|
+
// Map TPColumnDef.options → AvailableColumn.filterOptions
|
|
120
|
+
filterOptions: c.options,
|
|
95
121
|
}));
|
|
96
122
|
}, [columns, serverFilterDefs]);
|
|
97
123
|
// ── Handlers ───────────────────────────────────────────────────────────────
|
|
@@ -99,7 +125,13 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
|
|
|
99
125
|
setFilterValues(newValues);
|
|
100
126
|
setPagination((p) => ({ ...p, pageIndex: 0 }));
|
|
101
127
|
};
|
|
102
|
-
const handleToggleFilter = (id) => setVisibleFilterIds((prev) =>
|
|
128
|
+
const handleToggleFilter = (id) => setVisibleFilterIds((prev) => {
|
|
129
|
+
if (prev.includes(id))
|
|
130
|
+
return prev.filter((v) => v !== id); // always allow remove
|
|
131
|
+
if (prev.length >= maxVisibleFilters)
|
|
132
|
+
return prev; // cap reached — ignore add
|
|
133
|
+
return [...prev, id];
|
|
134
|
+
});
|
|
103
135
|
const handleClearAll = () => {
|
|
104
136
|
setFilterValues(defaultFilters);
|
|
105
137
|
setColumnFilters([]);
|
|
@@ -127,7 +159,7 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
|
|
|
127
159
|
columnFilters.some((f) => f.value);
|
|
128
160
|
// ── Table instance ─────────────────────────────────────────────────────────
|
|
129
161
|
const table = useMaterialReactTable({
|
|
130
|
-
columns,
|
|
162
|
+
columns: processedColumns,
|
|
131
163
|
data: rows,
|
|
132
164
|
manualPagination: true,
|
|
133
165
|
rowCount: totalRecords,
|
|
@@ -187,8 +219,8 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
|
|
|
187
219
|
whiteSpace: 'normal',
|
|
188
220
|
borderRight: '1px solid rgba(224,224,224,1)',
|
|
189
221
|
borderBottom: '2px solid rgba(0,0,0,0.15)',
|
|
190
|
-
'& button[aria-label="Move"]': { display: 'none' },
|
|
191
|
-
'& .MuiTableSortLabel-icon': { display: 'none' },
|
|
222
|
+
'& button[aria-label="Move"]': { display: 'none !important' },
|
|
223
|
+
'& .MuiTableSortLabel-icon': { display: 'none !important' },
|
|
192
224
|
'& .Mui-TableHeadCell-ResizeHandle-Wrapper': {
|
|
193
225
|
height: '100%',
|
|
194
226
|
top: 0,
|
|
@@ -223,7 +255,7 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
|
|
|
223
255
|
muiToolbarAlertBannerProps: isError
|
|
224
256
|
? { color: 'error', children: 'Failed to load data. Please try again.' }
|
|
225
257
|
: undefined,
|
|
226
|
-
renderTopToolbarCustomActions: () => (jsxs(Box, { sx: { display: 'flex', alignItems: 'center', flex: 1, minWidth: 0, pr: 1, gap: 0.5 }, children: [jsxs(Box, { sx: { display: 'flex', alignItems: 'center', flexShrink: 0, gap: 0.25 }, children: [jsx(Tooltip, { title: "Refresh current batch", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: () => refetch(), disabled: isFetching, children: jsx(RefreshIcon, { fontSize: "small" }) }) }) }), jsx(Tooltip, { title: "Export batch as CSV", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: handleExport, disabled: rows.length === 0 || isFetching, children: jsx(FileDownloadIcon, { fontSize: "small" }) }) }) })] }), jsx(Box, { sx: { flex: 1, minWidth: 0 }, children: jsx(DynamicFilterBar, { serverFilterDefs: serverFilterDefs, visibleFilterIds: visibleFilterIds, onToggleFilter: handleToggleFilter, filterValues: filterValues, onFilterValuesChange: handleFilterValuesChange, columnFilters: columnFilters, onColumnFilterChange: setColumnFilters, availableColumns: availableColumns }) }), hasAnyValue && (jsx(Button, { size: "small", onClick: handleClearAll, sx: {
|
|
258
|
+
renderTopToolbarCustomActions: () => (jsxs(Box, { sx: { display: 'flex', alignItems: 'center', flex: 1, minWidth: 0, pr: 1, gap: 0.5 }, children: [jsxs(Box, { sx: { display: 'flex', alignItems: 'center', flexShrink: 0, gap: 0.25 }, children: [jsx(Tooltip, { title: "Refresh current batch", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: () => refetch(), disabled: isFetching, children: jsx(RefreshIcon, { fontSize: "small" }) }) }) }), jsx(Tooltip, { title: "Export batch as CSV", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: handleExport, disabled: rows.length === 0 || isFetching, children: jsx(FileDownloadIcon, { fontSize: "small" }) }) }) })] }), jsx(Box, { sx: { flex: 1, minWidth: 0 }, children: jsx(DynamicFilterBar, { serverFilterDefs: serverFilterDefs, visibleFilterIds: visibleFilterIds, onToggleFilter: handleToggleFilter, filterValues: filterValues, onFilterValuesChange: handleFilterValuesChange, columnFilters: columnFilters, onColumnFilterChange: setColumnFilters, availableColumns: availableColumns, maxVisibleFilters: maxVisibleFilters }) }), hasAnyValue && (jsx(Button, { size: "small", onClick: handleClearAll, sx: {
|
|
227
259
|
flexShrink: 0,
|
|
228
260
|
textTransform: 'none',
|
|
229
261
|
fontSize: 12,
|
|
@@ -234,7 +266,11 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
|
|
|
234
266
|
}, children: "Clear All" }))] })),
|
|
235
267
|
renderBottomToolbar: ({ table: t }) => (jsx(PaginationFooter, { pageIndex: t.getState().pagination.pageIndex, pageSize: t.getState().pagination.pageSize, totalRecords: totalRecords, isFetching: isFetching, isLoading: isLoading, canPrev: t.getCanPreviousPage() && !isFetching, canNext: t.getCanNextPage() && !isFetching, onFirst: () => t.firstPage(), onPrev: () => t.previousPage(), onNext: () => t.nextPage(), onLast: () => t.lastPage(), onPageSizeChange: (s) => t.setPageSize(s), pageSizeOptions: pageSizeOptions })),
|
|
236
268
|
});
|
|
237
|
-
return (jsxs(Box, { sx: { position: 'relative' }, children: [jsx(GlobalStyles, { styles: {
|
|
269
|
+
return (jsxs(Box, { className: "tp-gpg-root", sx: { position: 'relative' }, children: [jsx(GlobalStyles, { styles: {
|
|
270
|
+
'button[aria-label="Pin to right"]': { display: 'none' },
|
|
271
|
+
'.tp-gpg-root .MuiTableSortLabel-icon': { display: 'none !important' },
|
|
272
|
+
'.tp-gpg-root button[aria-label="Move"]': { display: 'none !important' },
|
|
273
|
+
} }), isLoading && jsx(OverlayLoader, { message: "Loading data\u2026" }), !isLoading && isFetching && jsx(OverlayLoader, { message: "Updating data\u2026" }), jsx(MaterialReactTable, { table: table })] }));
|
|
238
274
|
}
|
|
239
275
|
|
|
240
276
|
export { GenericPaginatedGrid as default };
|
|
@@ -1,22 +1,3 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { TPColumnDef } from './types';
|
|
2
2
|
import type { InvoiceDetail } from './types';
|
|
3
|
-
|
|
4
|
-
declare module '@tanstack/table-core' {
|
|
5
|
-
interface ColumnMeta<TData extends RowData, TValue> {
|
|
6
|
-
/**
|
|
7
|
-
* Which chip variant to render in the "Column Filters" section of
|
|
8
|
-
* Manage Filters. Defaults to `'text'` when omitted.
|
|
9
|
-
*
|
|
10
|
-
* 'text' → TextFilterChip (free-text input)
|
|
11
|
-
* 'date' → DatePickerChip (MUI X calendar)
|
|
12
|
-
* 'searchableDropdown' → SearchableSelectChip (search + options list)
|
|
13
|
-
*/
|
|
14
|
-
filterType?: 'text' | 'date' | 'searchableDropdown';
|
|
15
|
-
/** Option pairs for the `'searchableDropdown'` filter chip. */
|
|
16
|
-
filterOptions?: {
|
|
17
|
-
label: string;
|
|
18
|
-
value: string;
|
|
19
|
-
}[];
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
export declare const invoiceColumns: MRT_ColumnDef<InvoiceDetail>[];
|
|
3
|
+
export declare const invoiceColumns: TPColumnDef<InvoiceDetail>[];
|
|
@@ -1,3 +1,64 @@
|
|
|
1
|
+
import type { MRT_ColumnDef } from 'material-react-table';
|
|
2
|
+
/**
|
|
3
|
+
* Filter chip variant shown in Manage Filters → Column Filters.
|
|
4
|
+
*
|
|
5
|
+
* | Value | Chip rendered |
|
|
6
|
+
* |---------------------|---------------------------|
|
|
7
|
+
* | `'text'` | Free-text input (default) |
|
|
8
|
+
* | `'date'` | Calendar date picker |
|
|
9
|
+
* | `'select'` | Searchable option list |
|
|
10
|
+
* | `'searchable-select'` | Searchable option list |
|
|
11
|
+
* | `'number'` | Numeric input |
|
|
12
|
+
*
|
|
13
|
+
* Set `enableColumnFilter: false` to hide the column from Manage Filters
|
|
14
|
+
* entirely (e.g. for computed or numeric columns that don't need filtering).
|
|
15
|
+
*/
|
|
16
|
+
export type ColumnFilterType = 'text' | 'date' | 'select' | 'searchable-select' | 'number';
|
|
17
|
+
/**
|
|
18
|
+
* Drop-in replacement for `MRT_ColumnDef` that adds top-level
|
|
19
|
+
* `filterType` and `options` so you never have to write `meta` blocks
|
|
20
|
+
* or custom `filterFn` — the grid handles both automatically.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* import type { TPColumnDef } from './types';
|
|
25
|
+
*
|
|
26
|
+
* const columns: TPColumnDef<MyRow>[] = [
|
|
27
|
+
* // Date picker chip
|
|
28
|
+
* { accessorKey: 'invoiceDate', header: 'Invoice Date', filterType: 'date' },
|
|
29
|
+
*
|
|
30
|
+
* // Searchable option list chip
|
|
31
|
+
* {
|
|
32
|
+
* accessorKey: 'status',
|
|
33
|
+
* header: 'Status',
|
|
34
|
+
* filterType: 'searchable-select',
|
|
35
|
+
* options: [
|
|
36
|
+
* { label: 'Active', value: 'A' },
|
|
37
|
+
* { label: 'Inactive', value: 'I' },
|
|
38
|
+
* ],
|
|
39
|
+
* },
|
|
40
|
+
*
|
|
41
|
+
* // Hidden from Manage Filters (numeric column)
|
|
42
|
+
* { accessorKey: 'qty', header: 'Qty', enableColumnFilter: false },
|
|
43
|
+
* ];
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export type TPColumnDef<TData extends object = object> = MRT_ColumnDef<TData> & {
|
|
47
|
+
/**
|
|
48
|
+
* Which filter chip to show in Manage Filters → Column Filters.
|
|
49
|
+
* Omit (or set to `'text'`) for a plain text-input chip.
|
|
50
|
+
*/
|
|
51
|
+
filterType?: ColumnFilterType;
|
|
52
|
+
/**
|
|
53
|
+
* Option pairs for `'select'` and `'searchable-select'` filter types.
|
|
54
|
+
* Each entry needs `label` (display text) and `value` (filter value sent).
|
|
55
|
+
*/
|
|
56
|
+
options?: {
|
|
57
|
+
label: string;
|
|
58
|
+
value: string | number;
|
|
59
|
+
disable?: boolean;
|
|
60
|
+
}[];
|
|
61
|
+
};
|
|
1
62
|
export interface InvoiceDetail {
|
|
2
63
|
Data_from: string;
|
|
3
64
|
FINYEAR: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __exports as Calendar } from '../../../../../_virtual/index.
|
|
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 DateInput } from '../../../../../_virtual/index.
|
|
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.
|
|
1
|
+
import { __exports as DateRange } 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 requireCalendar } from '../Calendar/index.esm.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __exports as DateRangePicker } from '../../../../../_virtual/index.
|
|
1
|
+
import { __exports as DateRangePicker } 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 requireDateRange } from '../DateRange/index.esm.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __exports as DefinedRange } from '../../../../../_virtual/index.
|
|
1
|
+
import { __exports as DefinedRange } 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 requireStyles } from '../../styles.esm.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __exports as InputRangeField } from '../../../../../_virtual/index.
|
|
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.
|
|
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';
|
|
@@ -26,122 +26,122 @@ import { useEffect } from 'react';
|
|
|
26
26
|
const STYLE_ID = 'tp-rdr-styles';
|
|
27
27
|
/* ─── Combined CSS from react-date-range ──────────────────────────────────── */
|
|
28
28
|
/* Source: react-date-range/dist/styles.css + theme/default.css v2.0.1 */
|
|
29
|
-
const RDR_CSS = `
|
|
30
|
-
/* ── react-date-range/dist/styles.css ── */
|
|
31
|
-
.rdrCalendarWrapper{box-sizing:border-box;background:#ffffff;display:inline-flex;flex-direction:column;-webkit-user-select:none;-moz-user-select:none;user-select:none}
|
|
32
|
-
.rdrDateDisplay{display:flex;justify-content:space-between}
|
|
33
|
-
.rdrDateDisplayItem{flex:1 1;width:0;text-align:center;color:inherit}
|
|
34
|
-
.rdrDateDisplayItem+.rdrDateDisplayItem{margin-left:.833em}
|
|
35
|
-
.rdrDateDisplayItem input{text-align:inherit}
|
|
36
|
-
.rdrDateDisplayItem input:disabled{cursor:default}
|
|
37
|
-
.rdrDateDisplayItemActive{}
|
|
38
|
-
.rdrMonthAndYearWrapper{box-sizing:inherit;display:flex;justify-content:space-between}
|
|
39
|
-
.rdrMonthAndYearPickers{flex:1 1 auto;display:flex;justify-content:center;align-items:center}
|
|
40
|
-
.rdrMonthPicker{}
|
|
41
|
-
.rdrYearPicker{}
|
|
42
|
-
.rdrNextPrevButton{box-sizing:inherit;cursor:pointer;outline:none}
|
|
43
|
-
.rdrPprevButton{}
|
|
44
|
-
.rdrNextButton{}
|
|
45
|
-
.rdrMonths{display:flex}
|
|
46
|
-
.rdrMonthsVertical{flex-direction:column}
|
|
47
|
-
.rdrMonthsHorizontal>div>div>div{display:flex;flex-direction:row}
|
|
48
|
-
.rdrMonth{width:27.667em}
|
|
49
|
-
.rdrWeekDays{display:flex}
|
|
50
|
-
.rdrWeekDay{flex-basis:calc(100% / 7);box-sizing:inherit;text-align:center}
|
|
51
|
-
.rdrDays{display:flex;flex-wrap:wrap}
|
|
52
|
-
.rdrDateDisplayWrapper{}
|
|
53
|
-
.rdrMonthName{}
|
|
54
|
-
.rdrInfiniteMonths{overflow:auto}
|
|
55
|
-
.rdrDateRangeWrapper{-webkit-user-select:none;-moz-user-select:none;user-select:none}
|
|
56
|
-
.rdrDateInput{position:relative}
|
|
57
|
-
.rdrDateInput input{outline:none}
|
|
58
|
-
.rdrDateInput .rdrWarning{position:absolute;font-size:1.6em;line-height:1.6em;top:0;right:.25em;color:#FF0000}
|
|
59
|
-
.rdrDay{box-sizing:inherit;width:calc(100% / 7);position:relative;font:inherit;cursor:pointer}
|
|
60
|
-
.rdrDayNumber{display:block;position:relative}
|
|
61
|
-
.rdrDayNumber span{color:#1d2429}
|
|
62
|
-
.rdrDayDisabled{cursor:not-allowed}
|
|
63
|
-
@supports (-ms-ime-align:auto){.rdrDay{flex-basis:14.285% !important}}
|
|
64
|
-
.rdrSelected,.rdrInRange,.rdrStartEdge,.rdrEndEdge{pointer-events:none}
|
|
65
|
-
.rdrInRange{}
|
|
66
|
-
.rdrDayStartPreview,.rdrDayInPreview,.rdrDayEndPreview{pointer-events:none}
|
|
67
|
-
.rdrDayHovered{}
|
|
68
|
-
.rdrDayActive{}
|
|
69
|
-
.rdrDateRangePickerWrapper{display:inline-flex;-webkit-user-select:none;-moz-user-select:none;user-select:none}
|
|
70
|
-
.rdrDefinedRangesWrapper{}
|
|
71
|
-
.rdrStaticRanges{display:flex;flex-direction:column}
|
|
72
|
-
.rdrStaticRange{font-size:inherit}
|
|
73
|
-
.rdrStaticRangeLabel{}
|
|
74
|
-
.rdrInputRanges{}
|
|
75
|
-
.rdrInputRange{display:flex}
|
|
76
|
-
.rdrInputRangeInput{}
|
|
77
|
-
|
|
78
|
-
/* ── react-date-range/dist/theme/default.css ── */
|
|
79
|
-
.rdrCalendarWrapper{color:#000000;font-size:12px}
|
|
80
|
-
.rdrDateDisplayWrapper{background-color:rgb(239,242,247)}
|
|
81
|
-
.rdrDateDisplay{margin:.833em}
|
|
82
|
-
.rdrDateDisplayItem{border-radius:4px;background-color:rgb(255,255,255);box-shadow:0 1px 2px 0 rgba(35,57,66,.21);border:1px solid transparent}
|
|
83
|
-
.rdrDateDisplayItem input{cursor:pointer;height:2.5em;line-height:2.5em;border:0;background:transparent;width:100%;color:#849095}
|
|
84
|
-
.rdrDateDisplayItemActive{border-color:currentColor}
|
|
85
|
-
.rdrDateDisplayItemActive input{color:#7d888d}
|
|
86
|
-
.rdrMonthAndYearWrapper{align-items:center;height:60px;padding-top:10px}
|
|
87
|
-
.rdrMonthAndYearPickers{font-weight:600}
|
|
88
|
-
.rdrMonthAndYearPickers select{-moz-appearance:none;appearance:none;-webkit-appearance:none;border:0;background:transparent;padding:10px 30px 10px 10px;border-radius:4px;outline:0;color:#3e484f;background:url("data:image/svg+xml;utf8,<svg width='9px' height='6px' viewBox='0 0 9 6' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g id='Artboard' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' transform='translate(-636.000000, -171.000000)' fill-opacity='0.368716033'><g id='input' transform='translate(172.000000, 37.000000)' fill='%230E242F' fill-rule='nonzero'><g id='Group-9' transform='translate(323.000000, 127.000000)'><path d='M142.280245,7.23952813 C141.987305,6.92353472 141.512432,6.92361662 141.219585,7.23971106 C140.926739,7.5558055 140.926815,8.06821394 141.219755,8.38420735 L145.498801,13 L149.780245,8.38162071 C150.073185,8.0656273 150.073261,7.55321886 149.780415,7.23712442 C149.487568,6.92102998 149.012695,6.92094808 148.719755,7.23694149 L145.498801,10.7113732 L142.280245,7.23952813 Z' id='arrow'></path></g></g></g></svg>") no-repeat;background-position:right 8px center;cursor:pointer;text-align:center}
|
|
89
|
-
.rdrMonthAndYearPickers select:hover{background-color:rgba(0,0,0,.07)}
|
|
90
|
-
.rdrMonthPicker,.rdrYearPicker{margin:0 5px}
|
|
91
|
-
.rdrNextPrevButton{display:block;width:24px;height:24px;margin:0 .833em;padding:0;border:0;border-radius:5px;background:#EFF2F7}
|
|
92
|
-
.rdrNextPrevButton:hover{background:#E1E7F0}
|
|
93
|
-
.rdrNextPrevButton i{display:block;width:0;height:0;padding:0;text-align:center;border-style:solid;margin:auto;transform:translate(-3px,0)}
|
|
94
|
-
.rdrPprevButton i{border-width:4px 6px 4px 4px;border-color:transparent rgb(52,73,94) transparent transparent;transform:translate(-3px,0)}
|
|
95
|
-
.rdrNextButton i{margin:0 0 0 7px;border-width:4px 4px 4px 6px;border-color:transparent transparent transparent rgb(52,73,94);transform:translate(3px,0)}
|
|
96
|
-
.rdrWeekDays{padding:0 .833em}
|
|
97
|
-
.rdrMonth{padding:0 .833em 1.666em .833em}
|
|
98
|
-
.rdrMonth .rdrWeekDays{padding:0}
|
|
99
|
-
.rdrMonths.rdrMonthsVertical .rdrMonth:first-child .rdrMonthName{display:none}
|
|
100
|
-
.rdrWeekDay{font-weight:400;line-height:2.667em;color:rgb(132,144,149)}
|
|
101
|
-
.rdrDay{background:transparent;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:0;padding:0;line-height:3em;height:3em;text-align:center;color:#1d2429}
|
|
102
|
-
.rdrDay:focus{outline:0}
|
|
103
|
-
.rdrDayNumber{outline:0;font-weight:300;position:absolute;left:0;right:0;top:5px;bottom:5px;display:flex;align-items:center;justify-content:center}
|
|
104
|
-
.rdrDayToday .rdrDayNumber span{font-weight:500}
|
|
105
|
-
.rdrDayToday .rdrDayNumber span:after{content:'';position:absolute;bottom:4px;left:50%;transform:translate(-50%,0);width:18px;height:2px;border-radius:2px;background:#3d91ff}
|
|
106
|
-
.rdrDayToday:not(.rdrDayPassive) .rdrInRange~.rdrDayNumber span:after,.rdrDayToday:not(.rdrDayPassive) .rdrStartEdge~.rdrDayNumber span:after,.rdrDayToday:not(.rdrDayPassive) .rdrEndEdge~.rdrDayNumber span:after,.rdrDayToday:not(.rdrDayPassive) .rdrSelected~.rdrDayNumber span:after{background:#fff}
|
|
107
|
-
.rdrDay:not(.rdrDayPassive) .rdrInRange~.rdrDayNumber span,.rdrDay:not(.rdrDayPassive) .rdrStartEdge~.rdrDayNumber span,.rdrDay:not(.rdrDayPassive) .rdrEndEdge~.rdrDayNumber span,.rdrDay:not(.rdrDayPassive) .rdrSelected~.rdrDayNumber span{color:rgba(255,255,255,.85)}
|
|
108
|
-
.rdrSelected,.rdrInRange,.rdrStartEdge,.rdrEndEdge{background:currentColor;position:absolute;top:5px;left:0;right:0;bottom:5px}
|
|
109
|
-
.rdrSelected{left:2px;right:2px}
|
|
110
|
-
.rdrInRange{}
|
|
111
|
-
.rdrStartEdge{border-top-left-radius:1.042em;border-bottom-left-radius:1.042em;left:2px}
|
|
112
|
-
.rdrEndEdge{border-top-right-radius:1.042em;border-bottom-right-radius:1.042em;right:2px}
|
|
113
|
-
.rdrSelected{border-radius:1.042em}
|
|
114
|
-
.rdrDayStartOfMonth .rdrInRange,.rdrDayStartOfMonth .rdrEndEdge,.rdrDayStartOfWeek .rdrInRange,.rdrDayStartOfWeek .rdrEndEdge{border-top-left-radius:1.042em;border-bottom-left-radius:1.042em;left:2px}
|
|
115
|
-
.rdrDayEndOfMonth .rdrInRange,.rdrDayEndOfMonth .rdrStartEdge,.rdrDayEndOfWeek .rdrInRange,.rdrDayEndOfWeek .rdrStartEdge{border-top-right-radius:1.042em;border-bottom-right-radius:1.042em;right:2px}
|
|
116
|
-
.rdrDayStartOfMonth .rdrDayInPreview,.rdrDayStartOfMonth .rdrDayEndPreview,.rdrDayStartOfWeek .rdrDayInPreview,.rdrDayStartOfWeek .rdrDayEndPreview{border-top-left-radius:1.333em;border-bottom-left-radius:1.333em;border-left-width:1px;left:0}
|
|
117
|
-
.rdrDayEndOfMonth .rdrDayInPreview,.rdrDayEndOfMonth .rdrDayStartPreview,.rdrDayEndOfWeek .rdrDayInPreview,.rdrDayEndOfWeek .rdrDayStartPreview{border-top-right-radius:1.333em;border-bottom-right-radius:1.333em;border-right-width:1px;right:0}
|
|
118
|
-
.rdrDayStartPreview,.rdrDayInPreview,.rdrDayEndPreview{background:rgba(255,255,255,.09);position:absolute;top:3px;left:0;right:0;bottom:3px;pointer-events:none;border:0 solid currentColor;z-index:1}
|
|
119
|
-
.rdrDayStartPreview{border-top-width:1px;border-left-width:1px;border-bottom-width:1px;border-top-left-radius:1.333em;border-bottom-left-radius:1.333em;left:0}
|
|
120
|
-
.rdrDayInPreview{border-top-width:1px;border-bottom-width:1px}
|
|
121
|
-
.rdrDayEndPreview{border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-top-right-radius:1.333em;border-bottom-right-radius:1.333em;right:0}
|
|
122
|
-
.rdrDefinedRangesWrapper{font-size:12px;width:226px;border-right:solid 1px #eff2f7;background:#fff}
|
|
123
|
-
.rdrDefinedRangesWrapper .rdrStaticRangeSelected{color:currentColor;font-weight:600}
|
|
124
|
-
.rdrStaticRange{border:0;cursor:pointer;display:block;outline:0;border-bottom:1px solid #eff2f7;padding:0;background:#fff}
|
|
125
|
-
.rdrStaticRange:hover .rdrStaticRangeLabel,.rdrStaticRange:focus .rdrStaticRangeLabel{background:#eff2f7}
|
|
126
|
-
.rdrStaticRangeLabel{display:block;outline:0;line-height:18px;padding:10px 20px;text-align:left}
|
|
127
|
-
.rdrInputRanges{padding:10px 0}
|
|
128
|
-
.rdrInputRange{align-items:center;padding:5px 20px}
|
|
129
|
-
.rdrInputRangeInput{width:30px;height:30px;line-height:30px;border-radius:4px;text-align:center;border:solid 1px rgb(222,231,235);margin-right:10px;color:rgb(108,118,122)}
|
|
130
|
-
.rdrInputRangeInput:focus,.rdrInputRangeInput:hover{border-color:rgb(180,191,196);outline:0;color:#333}
|
|
131
|
-
.rdrCalendarWrapper:not(.rdrDateRangeWrapper) .rdrDayHovered .rdrDayNumber:after{content:'';border:1px solid currentColor;border-radius:1.333em;position:absolute;top:-2px;bottom:-2px;left:0;right:0;background:transparent}
|
|
132
|
-
.rdrDayPassive{pointer-events:none}
|
|
133
|
-
.rdrDayPassive .rdrDayNumber span{color:#d5dce0}
|
|
134
|
-
.rdrDayPassive .rdrInRange,.rdrDayPassive .rdrStartEdge,.rdrDayPassive .rdrEndEdge,.rdrDayPassive .rdrSelected,.rdrDayPassive .rdrDayStartPreview,.rdrDayPassive .rdrDayInPreview,.rdrDayPassive .rdrDayEndPreview{display:none}
|
|
135
|
-
.rdrDayDisabled{background-color:rgb(248,248,248)}
|
|
136
|
-
.rdrDayDisabled .rdrDayNumber span{color:#aeb9bf}
|
|
137
|
-
.rdrDayDisabled .rdrInRange,.rdrDayDisabled .rdrStartEdge,.rdrDayDisabled .rdrEndEdge,.rdrDayDisabled .rdrSelected,.rdrDayDisabled .rdrDayStartPreview,.rdrDayDisabled .rdrDayInPreview,.rdrDayDisabled .rdrDayEndPreview{filter:grayscale(100%) opacity(60%)}
|
|
138
|
-
.rdrMonthName{text-align:left;font-weight:600;color:#849095;padding:.833em}
|
|
139
|
-
|
|
140
|
-
/* ── DateRangePicker.scss override (compiled) ── */
|
|
141
|
-
.rdrCalendarWrapper .rdrDay:not(.rdrDayPassive) .rdrInRange~.rdrDayNumber span,
|
|
142
|
-
.rdrCalendarWrapper .rdrDay:not(.rdrDayPassive) .rdrStartEdge~.rdrDayNumber span,
|
|
143
|
-
.rdrCalendarWrapper .rdrDay:not(.rdrDayPassive) .rdrEndEdge~.rdrDayNumber span,
|
|
144
|
-
.rdrCalendarWrapper .rdrDay:not(.rdrDayPassive) .rdrSelected~.rdrDayNumber span{color:#fff !important}
|
|
29
|
+
const RDR_CSS = `
|
|
30
|
+
/* ── react-date-range/dist/styles.css ── */
|
|
31
|
+
.rdrCalendarWrapper{box-sizing:border-box;background:#ffffff;display:inline-flex;flex-direction:column;-webkit-user-select:none;-moz-user-select:none;user-select:none}
|
|
32
|
+
.rdrDateDisplay{display:flex;justify-content:space-between}
|
|
33
|
+
.rdrDateDisplayItem{flex:1 1;width:0;text-align:center;color:inherit}
|
|
34
|
+
.rdrDateDisplayItem+.rdrDateDisplayItem{margin-left:.833em}
|
|
35
|
+
.rdrDateDisplayItem input{text-align:inherit}
|
|
36
|
+
.rdrDateDisplayItem input:disabled{cursor:default}
|
|
37
|
+
.rdrDateDisplayItemActive{}
|
|
38
|
+
.rdrMonthAndYearWrapper{box-sizing:inherit;display:flex;justify-content:space-between}
|
|
39
|
+
.rdrMonthAndYearPickers{flex:1 1 auto;display:flex;justify-content:center;align-items:center}
|
|
40
|
+
.rdrMonthPicker{}
|
|
41
|
+
.rdrYearPicker{}
|
|
42
|
+
.rdrNextPrevButton{box-sizing:inherit;cursor:pointer;outline:none}
|
|
43
|
+
.rdrPprevButton{}
|
|
44
|
+
.rdrNextButton{}
|
|
45
|
+
.rdrMonths{display:flex}
|
|
46
|
+
.rdrMonthsVertical{flex-direction:column}
|
|
47
|
+
.rdrMonthsHorizontal>div>div>div{display:flex;flex-direction:row}
|
|
48
|
+
.rdrMonth{width:27.667em}
|
|
49
|
+
.rdrWeekDays{display:flex}
|
|
50
|
+
.rdrWeekDay{flex-basis:calc(100% / 7);box-sizing:inherit;text-align:center}
|
|
51
|
+
.rdrDays{display:flex;flex-wrap:wrap}
|
|
52
|
+
.rdrDateDisplayWrapper{}
|
|
53
|
+
.rdrMonthName{}
|
|
54
|
+
.rdrInfiniteMonths{overflow:auto}
|
|
55
|
+
.rdrDateRangeWrapper{-webkit-user-select:none;-moz-user-select:none;user-select:none}
|
|
56
|
+
.rdrDateInput{position:relative}
|
|
57
|
+
.rdrDateInput input{outline:none}
|
|
58
|
+
.rdrDateInput .rdrWarning{position:absolute;font-size:1.6em;line-height:1.6em;top:0;right:.25em;color:#FF0000}
|
|
59
|
+
.rdrDay{box-sizing:inherit;width:calc(100% / 7);position:relative;font:inherit;cursor:pointer}
|
|
60
|
+
.rdrDayNumber{display:block;position:relative}
|
|
61
|
+
.rdrDayNumber span{color:#1d2429}
|
|
62
|
+
.rdrDayDisabled{cursor:not-allowed}
|
|
63
|
+
@supports (-ms-ime-align:auto){.rdrDay{flex-basis:14.285% !important}}
|
|
64
|
+
.rdrSelected,.rdrInRange,.rdrStartEdge,.rdrEndEdge{pointer-events:none}
|
|
65
|
+
.rdrInRange{}
|
|
66
|
+
.rdrDayStartPreview,.rdrDayInPreview,.rdrDayEndPreview{pointer-events:none}
|
|
67
|
+
.rdrDayHovered{}
|
|
68
|
+
.rdrDayActive{}
|
|
69
|
+
.rdrDateRangePickerWrapper{display:inline-flex;-webkit-user-select:none;-moz-user-select:none;user-select:none}
|
|
70
|
+
.rdrDefinedRangesWrapper{}
|
|
71
|
+
.rdrStaticRanges{display:flex;flex-direction:column}
|
|
72
|
+
.rdrStaticRange{font-size:inherit}
|
|
73
|
+
.rdrStaticRangeLabel{}
|
|
74
|
+
.rdrInputRanges{}
|
|
75
|
+
.rdrInputRange{display:flex}
|
|
76
|
+
.rdrInputRangeInput{}
|
|
77
|
+
|
|
78
|
+
/* ── react-date-range/dist/theme/default.css ── */
|
|
79
|
+
.rdrCalendarWrapper{color:#000000;font-size:12px}
|
|
80
|
+
.rdrDateDisplayWrapper{background-color:rgb(239,242,247)}
|
|
81
|
+
.rdrDateDisplay{margin:.833em}
|
|
82
|
+
.rdrDateDisplayItem{border-radius:4px;background-color:rgb(255,255,255);box-shadow:0 1px 2px 0 rgba(35,57,66,.21);border:1px solid transparent}
|
|
83
|
+
.rdrDateDisplayItem input{cursor:pointer;height:2.5em;line-height:2.5em;border:0;background:transparent;width:100%;color:#849095}
|
|
84
|
+
.rdrDateDisplayItemActive{border-color:currentColor}
|
|
85
|
+
.rdrDateDisplayItemActive input{color:#7d888d}
|
|
86
|
+
.rdrMonthAndYearWrapper{align-items:center;height:60px;padding-top:10px}
|
|
87
|
+
.rdrMonthAndYearPickers{font-weight:600}
|
|
88
|
+
.rdrMonthAndYearPickers select{-moz-appearance:none;appearance:none;-webkit-appearance:none;border:0;background:transparent;padding:10px 30px 10px 10px;border-radius:4px;outline:0;color:#3e484f;background:url("data:image/svg+xml;utf8,<svg width='9px' height='6px' viewBox='0 0 9 6' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g id='Artboard' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' transform='translate(-636.000000, -171.000000)' fill-opacity='0.368716033'><g id='input' transform='translate(172.000000, 37.000000)' fill='%230E242F' fill-rule='nonzero'><g id='Group-9' transform='translate(323.000000, 127.000000)'><path d='M142.280245,7.23952813 C141.987305,6.92353472 141.512432,6.92361662 141.219585,7.23971106 C140.926739,7.5558055 140.926815,8.06821394 141.219755,8.38420735 L145.498801,13 L149.780245,8.38162071 C150.073185,8.0656273 150.073261,7.55321886 149.780415,7.23712442 C149.487568,6.92102998 149.012695,6.92094808 148.719755,7.23694149 L145.498801,10.7113732 L142.280245,7.23952813 Z' id='arrow'></path></g></g></g></svg>") no-repeat;background-position:right 8px center;cursor:pointer;text-align:center}
|
|
89
|
+
.rdrMonthAndYearPickers select:hover{background-color:rgba(0,0,0,.07)}
|
|
90
|
+
.rdrMonthPicker,.rdrYearPicker{margin:0 5px}
|
|
91
|
+
.rdrNextPrevButton{display:block;width:24px;height:24px;margin:0 .833em;padding:0;border:0;border-radius:5px;background:#EFF2F7}
|
|
92
|
+
.rdrNextPrevButton:hover{background:#E1E7F0}
|
|
93
|
+
.rdrNextPrevButton i{display:block;width:0;height:0;padding:0;text-align:center;border-style:solid;margin:auto;transform:translate(-3px,0)}
|
|
94
|
+
.rdrPprevButton i{border-width:4px 6px 4px 4px;border-color:transparent rgb(52,73,94) transparent transparent;transform:translate(-3px,0)}
|
|
95
|
+
.rdrNextButton i{margin:0 0 0 7px;border-width:4px 4px 4px 6px;border-color:transparent transparent transparent rgb(52,73,94);transform:translate(3px,0)}
|
|
96
|
+
.rdrWeekDays{padding:0 .833em}
|
|
97
|
+
.rdrMonth{padding:0 .833em 1.666em .833em}
|
|
98
|
+
.rdrMonth .rdrWeekDays{padding:0}
|
|
99
|
+
.rdrMonths.rdrMonthsVertical .rdrMonth:first-child .rdrMonthName{display:none}
|
|
100
|
+
.rdrWeekDay{font-weight:400;line-height:2.667em;color:rgb(132,144,149)}
|
|
101
|
+
.rdrDay{background:transparent;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:0;padding:0;line-height:3em;height:3em;text-align:center;color:#1d2429}
|
|
102
|
+
.rdrDay:focus{outline:0}
|
|
103
|
+
.rdrDayNumber{outline:0;font-weight:300;position:absolute;left:0;right:0;top:5px;bottom:5px;display:flex;align-items:center;justify-content:center}
|
|
104
|
+
.rdrDayToday .rdrDayNumber span{font-weight:500}
|
|
105
|
+
.rdrDayToday .rdrDayNumber span:after{content:'';position:absolute;bottom:4px;left:50%;transform:translate(-50%,0);width:18px;height:2px;border-radius:2px;background:#3d91ff}
|
|
106
|
+
.rdrDayToday:not(.rdrDayPassive) .rdrInRange~.rdrDayNumber span:after,.rdrDayToday:not(.rdrDayPassive) .rdrStartEdge~.rdrDayNumber span:after,.rdrDayToday:not(.rdrDayPassive) .rdrEndEdge~.rdrDayNumber span:after,.rdrDayToday:not(.rdrDayPassive) .rdrSelected~.rdrDayNumber span:after{background:#fff}
|
|
107
|
+
.rdrDay:not(.rdrDayPassive) .rdrInRange~.rdrDayNumber span,.rdrDay:not(.rdrDayPassive) .rdrStartEdge~.rdrDayNumber span,.rdrDay:not(.rdrDayPassive) .rdrEndEdge~.rdrDayNumber span,.rdrDay:not(.rdrDayPassive) .rdrSelected~.rdrDayNumber span{color:rgba(255,255,255,.85)}
|
|
108
|
+
.rdrSelected,.rdrInRange,.rdrStartEdge,.rdrEndEdge{background:currentColor;position:absolute;top:5px;left:0;right:0;bottom:5px}
|
|
109
|
+
.rdrSelected{left:2px;right:2px}
|
|
110
|
+
.rdrInRange{}
|
|
111
|
+
.rdrStartEdge{border-top-left-radius:1.042em;border-bottom-left-radius:1.042em;left:2px}
|
|
112
|
+
.rdrEndEdge{border-top-right-radius:1.042em;border-bottom-right-radius:1.042em;right:2px}
|
|
113
|
+
.rdrSelected{border-radius:1.042em}
|
|
114
|
+
.rdrDayStartOfMonth .rdrInRange,.rdrDayStartOfMonth .rdrEndEdge,.rdrDayStartOfWeek .rdrInRange,.rdrDayStartOfWeek .rdrEndEdge{border-top-left-radius:1.042em;border-bottom-left-radius:1.042em;left:2px}
|
|
115
|
+
.rdrDayEndOfMonth .rdrInRange,.rdrDayEndOfMonth .rdrStartEdge,.rdrDayEndOfWeek .rdrInRange,.rdrDayEndOfWeek .rdrStartEdge{border-top-right-radius:1.042em;border-bottom-right-radius:1.042em;right:2px}
|
|
116
|
+
.rdrDayStartOfMonth .rdrDayInPreview,.rdrDayStartOfMonth .rdrDayEndPreview,.rdrDayStartOfWeek .rdrDayInPreview,.rdrDayStartOfWeek .rdrDayEndPreview{border-top-left-radius:1.333em;border-bottom-left-radius:1.333em;border-left-width:1px;left:0}
|
|
117
|
+
.rdrDayEndOfMonth .rdrDayInPreview,.rdrDayEndOfMonth .rdrDayStartPreview,.rdrDayEndOfWeek .rdrDayInPreview,.rdrDayEndOfWeek .rdrDayStartPreview{border-top-right-radius:1.333em;border-bottom-right-radius:1.333em;border-right-width:1px;right:0}
|
|
118
|
+
.rdrDayStartPreview,.rdrDayInPreview,.rdrDayEndPreview{background:rgba(255,255,255,.09);position:absolute;top:3px;left:0;right:0;bottom:3px;pointer-events:none;border:0 solid currentColor;z-index:1}
|
|
119
|
+
.rdrDayStartPreview{border-top-width:1px;border-left-width:1px;border-bottom-width:1px;border-top-left-radius:1.333em;border-bottom-left-radius:1.333em;left:0}
|
|
120
|
+
.rdrDayInPreview{border-top-width:1px;border-bottom-width:1px}
|
|
121
|
+
.rdrDayEndPreview{border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-top-right-radius:1.333em;border-bottom-right-radius:1.333em;right:0}
|
|
122
|
+
.rdrDefinedRangesWrapper{font-size:12px;width:226px;border-right:solid 1px #eff2f7;background:#fff}
|
|
123
|
+
.rdrDefinedRangesWrapper .rdrStaticRangeSelected{color:currentColor;font-weight:600}
|
|
124
|
+
.rdrStaticRange{border:0;cursor:pointer;display:block;outline:0;border-bottom:1px solid #eff2f7;padding:0;background:#fff}
|
|
125
|
+
.rdrStaticRange:hover .rdrStaticRangeLabel,.rdrStaticRange:focus .rdrStaticRangeLabel{background:#eff2f7}
|
|
126
|
+
.rdrStaticRangeLabel{display:block;outline:0;line-height:18px;padding:10px 20px;text-align:left}
|
|
127
|
+
.rdrInputRanges{padding:10px 0}
|
|
128
|
+
.rdrInputRange{align-items:center;padding:5px 20px}
|
|
129
|
+
.rdrInputRangeInput{width:30px;height:30px;line-height:30px;border-radius:4px;text-align:center;border:solid 1px rgb(222,231,235);margin-right:10px;color:rgb(108,118,122)}
|
|
130
|
+
.rdrInputRangeInput:focus,.rdrInputRangeInput:hover{border-color:rgb(180,191,196);outline:0;color:#333}
|
|
131
|
+
.rdrCalendarWrapper:not(.rdrDateRangeWrapper) .rdrDayHovered .rdrDayNumber:after{content:'';border:1px solid currentColor;border-radius:1.333em;position:absolute;top:-2px;bottom:-2px;left:0;right:0;background:transparent}
|
|
132
|
+
.rdrDayPassive{pointer-events:none}
|
|
133
|
+
.rdrDayPassive .rdrDayNumber span{color:#d5dce0}
|
|
134
|
+
.rdrDayPassive .rdrInRange,.rdrDayPassive .rdrStartEdge,.rdrDayPassive .rdrEndEdge,.rdrDayPassive .rdrSelected,.rdrDayPassive .rdrDayStartPreview,.rdrDayPassive .rdrDayInPreview,.rdrDayPassive .rdrDayEndPreview{display:none}
|
|
135
|
+
.rdrDayDisabled{background-color:rgb(248,248,248)}
|
|
136
|
+
.rdrDayDisabled .rdrDayNumber span{color:#aeb9bf}
|
|
137
|
+
.rdrDayDisabled .rdrInRange,.rdrDayDisabled .rdrStartEdge,.rdrDayDisabled .rdrEndEdge,.rdrDayDisabled .rdrSelected,.rdrDayDisabled .rdrDayStartPreview,.rdrDayDisabled .rdrDayInPreview,.rdrDayDisabled .rdrDayEndPreview{filter:grayscale(100%) opacity(60%)}
|
|
138
|
+
.rdrMonthName{text-align:left;font-weight:600;color:#849095;padding:.833em}
|
|
139
|
+
|
|
140
|
+
/* ── DateRangePicker.scss override (compiled) ── */
|
|
141
|
+
.rdrCalendarWrapper .rdrDay:not(.rdrDayPassive) .rdrInRange~.rdrDayNumber span,
|
|
142
|
+
.rdrCalendarWrapper .rdrDay:not(.rdrDayPassive) .rdrStartEdge~.rdrDayNumber span,
|
|
143
|
+
.rdrCalendarWrapper .rdrDay:not(.rdrDayPassive) .rdrEndEdge~.rdrDayNumber span,
|
|
144
|
+
.rdrCalendarWrapper .rdrDay:not(.rdrDayPassive) .rdrSelected~.rdrDayNumber span{color:#fff !important}
|
|
145
145
|
`;
|
|
146
146
|
/* ─── Singleton injection ─────────────────────────────────────────────────── */
|
|
147
147
|
let _injected = false;
|
package/package.json
CHANGED
package/scripts/install-deps.js
CHANGED