@redsift/table 11.6.0 → 11.7.0-muiv5

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,1763 +1,15 @@
1
- import { _ as _objectSpread2, a as _objectWithoutProperties, b as _extends$1 } from './_rollupPluginBabelHelpers.js';
2
- import * as React from 'react';
1
+ import { _ as _objectSpread2, b as _objectWithoutProperties, a as _extends } from './_rollupPluginBabelHelpers.js';
3
2
  import React__default, { useCallback, useEffect, useMemo, forwardRef, useRef, useState } from 'react';
4
3
  import classNames from 'classnames';
5
- import { Icon, useTheme as useTheme$1, ThemeProvider, RedsiftColorBlueN, RedsiftColorNeutralXDarkGrey, RedsiftColorNeutralWhite } from '@redsift/design-system';
6
- import { getGridNumericOperators as getGridNumericOperators$1, GridFilterInputValue, GridFilterInputSingleSelect, GridFilterInputMultipleValue, GridFilterInputMultipleSingleSelect, getGridStringOperators as getGridStringOperators$1, getGridBooleanOperators, getGridDateOperators, getGridSingleSelectOperators, GridLogicOperator, useGridApiRef, DataGridPro, gridPaginatedVisibleSortedGridRowEntriesSelector, gridPaginatedVisibleSortedGridRowIdsSelector, gridFilteredSortedRowEntriesSelector, gridFilteredSortedRowIdsSelector } from '@mui/x-data-grid-pro';
7
- import { L as LicenseInfo, u as useControlledDatagridState, T as ThemeProvider$1, S as StyledDataGrid } from './useControlledDatagridState.js';
8
- import { mdiSync } from '@redsift/icons';
9
- import { _ as _objectWithoutPropertiesLoose, a as _extends, d as defaultSxConfig, i as isPlainObject, s as styled, b as styleFunctionSx, u as useTheme, c as clsx, e as createTheme, T as THEME_ID, C as ClassNameGenerator, P as PropTypes, g as generateUtilityClasses, f as generateUtilityClass, h as styled$1, j as useThemeProps, k as capitalize, l as composeClasses, r as rootShouldForwardProp, m as refType } from './Portal.js';
10
- import { j as jsxRuntimeExports } from './jsx-runtime.js';
11
- import { u as useFormControl, f as formControlState, i as isAdornedStart, a as isFilled, F as FormControlContext, b as useId, c as Select, I as Input, d as FilledInput, O as OutlinedInput, o as onServerSideSelectionStatusChange, S as ServerSideControlledPagination, C as ControlledPagination } from './ControlledPagination.js';
4
+ import { useTheme, ThemeProvider, RedsiftColorBlueN, RedsiftColorNeutralXDarkGrey, RedsiftColorNeutralWhite } from '@redsift/design-system';
5
+ import { GridLinkOperator, useGridApiRef, DataGridPro, gridPaginatedVisibleSortedGridRowEntriesSelector, gridPaginatedVisibleSortedGridRowIdsSelector, gridFilteredSortedRowEntriesSelector, gridFilteredSortedRowIdsSelector } from '@mui/x-data-grid-pro';
6
+ import { o as operatorList, L as LicenseInfo, K as useControlledDatagridState, T as ThemeProvider$1, M as StyledDataGrid, f as customColumnTypes } from './useControlledDatagridState.js';
7
+ import { g as createTheme } from './Portal.js';
12
8
  import { T as Toolbar } from './Toolbar2.js';
9
+ import { o as onServerSideSelectionStatusChange, S as ServerSideControlledPagination, C as ControlledPagination } from './ControlledPagination.js';
13
10
  import { B as BaseButton, a as BaseCheckbox, c as BasePopper, b as BaseIcon } from './BasePopper.js';
14
11
  import { T as ToolbarWrapper } from './ToolbarWrapper2.js';
15
12
 
16
- function isMuiElement(element, muiNames) {
17
- return /*#__PURE__*/React.isValidElement(element) && muiNames.indexOf(element.type.muiName) !== -1;
18
- }
19
-
20
- const _excluded$7 = ["sx"];
21
- const splitProps = props => {
22
- var _props$theme$unstable, _props$theme;
23
- const result = {
24
- systemProps: {},
25
- otherProps: {}
26
- };
27
- const config = (_props$theme$unstable = props == null ? void 0 : (_props$theme = props.theme) == null ? void 0 : _props$theme.unstable_sxConfig) != null ? _props$theme$unstable : defaultSxConfig;
28
- Object.keys(props).forEach(prop => {
29
- if (config[prop]) {
30
- result.systemProps[prop] = props[prop];
31
- } else {
32
- result.otherProps[prop] = props[prop];
33
- }
34
- });
35
- return result;
36
- };
37
- function extendSxProp(props) {
38
- const {
39
- sx: inSx
40
- } = props,
41
- other = _objectWithoutPropertiesLoose(props, _excluded$7);
42
- const {
43
- systemProps,
44
- otherProps
45
- } = splitProps(other);
46
- let finalSx;
47
- if (Array.isArray(inSx)) {
48
- finalSx = [systemProps, ...inSx];
49
- } else if (typeof inSx === 'function') {
50
- finalSx = (...args) => {
51
- const result = inSx(...args);
52
- if (!isPlainObject(result)) {
53
- return systemProps;
54
- }
55
- return _extends({}, systemProps, result);
56
- };
57
- } else {
58
- finalSx = _extends({}, systemProps, inSx);
59
- }
60
- return _extends({}, otherProps, {
61
- sx: finalSx
62
- });
63
- }
64
-
65
- const _excluded$6 = ["className", "component"];
66
- function createBox(options = {}) {
67
- const {
68
- themeId,
69
- defaultTheme,
70
- defaultClassName = 'MuiBox-root',
71
- generateClassName
72
- } = options;
73
- const BoxRoot = styled('div', {
74
- shouldForwardProp: prop => prop !== 'theme' && prop !== 'sx' && prop !== 'as'
75
- })(styleFunctionSx);
76
- const Box = /*#__PURE__*/React.forwardRef(function Box(inProps, ref) {
77
- const theme = useTheme(defaultTheme);
78
- const _extendSxProp = extendSxProp(inProps),
79
- {
80
- className,
81
- component = 'div'
82
- } = _extendSxProp,
83
- other = _objectWithoutPropertiesLoose(_extendSxProp, _excluded$6);
84
- return /*#__PURE__*/jsxRuntimeExports.jsx(BoxRoot, _extends({
85
- as: component,
86
- ref: ref,
87
- className: clsx(className, generateClassName ? generateClassName(defaultClassName) : defaultClassName),
88
- theme: themeId ? theme[themeId] || theme : theme
89
- }, other));
90
- });
91
- return Box;
92
- }
93
-
94
- const defaultTheme = createTheme();
95
- const Box = createBox({
96
- themeId: THEME_ID,
97
- defaultTheme,
98
- defaultClassName: 'MuiBox-root',
99
- generateClassName: ClassNameGenerator.generate
100
- });
101
- process.env.NODE_ENV !== "production" ? Box.propTypes /* remove-proptypes */ = {
102
- // ----------------------------- Warning --------------------------------
103
- // | These PropTypes are generated from the TypeScript type definitions |
104
- // | To update them edit the d.ts file and run "yarn proptypes" |
105
- // ----------------------------------------------------------------------
106
- /**
107
- * @ignore
108
- */
109
- children: PropTypes.node,
110
- /**
111
- * The component used for the root node.
112
- * Either a string to use a HTML element or a component.
113
- */
114
- component: PropTypes.elementType,
115
- /**
116
- * The system prop that allows defining system overrides as well as additional CSS styles.
117
- */
118
- sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object])
119
- } : void 0;
120
- var Box$1 = Box;
121
-
122
- function getFormLabelUtilityClasses(slot) {
123
- return generateUtilityClass('MuiFormLabel', slot);
124
- }
125
- const formLabelClasses = generateUtilityClasses('MuiFormLabel', ['root', 'colorSecondary', 'focused', 'disabled', 'error', 'filled', 'required', 'asterisk']);
126
- var formLabelClasses$1 = formLabelClasses;
127
-
128
- const _excluded$5 = ["children", "className", "color", "component", "disabled", "error", "filled", "focused", "required"];
129
- const useUtilityClasses$4 = ownerState => {
130
- const {
131
- classes,
132
- color,
133
- focused,
134
- disabled,
135
- error,
136
- filled,
137
- required
138
- } = ownerState;
139
- const slots = {
140
- root: ['root', `color${capitalize(color)}`, disabled && 'disabled', error && 'error', filled && 'filled', focused && 'focused', required && 'required'],
141
- asterisk: ['asterisk', error && 'error']
142
- };
143
- return composeClasses(slots, getFormLabelUtilityClasses, classes);
144
- };
145
- const FormLabelRoot = styled$1('label', {
146
- name: 'MuiFormLabel',
147
- slot: 'Root',
148
- overridesResolver: ({
149
- ownerState
150
- }, styles) => {
151
- return _extends({}, styles.root, ownerState.color === 'secondary' && styles.colorSecondary, ownerState.filled && styles.filled);
152
- }
153
- })(({
154
- theme,
155
- ownerState
156
- }) => _extends({
157
- color: (theme.vars || theme).palette.text.secondary
158
- }, theme.typography.body1, {
159
- lineHeight: '1.4375em',
160
- padding: 0,
161
- position: 'relative',
162
- [`&.${formLabelClasses$1.focused}`]: {
163
- color: (theme.vars || theme).palette[ownerState.color].main
164
- },
165
- [`&.${formLabelClasses$1.disabled}`]: {
166
- color: (theme.vars || theme).palette.text.disabled
167
- },
168
- [`&.${formLabelClasses$1.error}`]: {
169
- color: (theme.vars || theme).palette.error.main
170
- }
171
- }));
172
- const AsteriskComponent = styled$1('span', {
173
- name: 'MuiFormLabel',
174
- slot: 'Asterisk',
175
- overridesResolver: (props, styles) => styles.asterisk
176
- })(({
177
- theme
178
- }) => ({
179
- [`&.${formLabelClasses$1.error}`]: {
180
- color: (theme.vars || theme).palette.error.main
181
- }
182
- }));
183
- const FormLabel = /*#__PURE__*/React.forwardRef(function FormLabel(inProps, ref) {
184
- const props = useThemeProps({
185
- props: inProps,
186
- name: 'MuiFormLabel'
187
- });
188
- const {
189
- children,
190
- className,
191
- component = 'label'
192
- } = props,
193
- other = _objectWithoutPropertiesLoose(props, _excluded$5);
194
- const muiFormControl = useFormControl();
195
- const fcs = formControlState({
196
- props,
197
- muiFormControl,
198
- states: ['color', 'required', 'focused', 'disabled', 'error', 'filled']
199
- });
200
- const ownerState = _extends({}, props, {
201
- color: fcs.color || 'primary',
202
- component,
203
- disabled: fcs.disabled,
204
- error: fcs.error,
205
- filled: fcs.filled,
206
- focused: fcs.focused,
207
- required: fcs.required
208
- });
209
- const classes = useUtilityClasses$4(ownerState);
210
- return /*#__PURE__*/jsxRuntimeExports.jsxs(FormLabelRoot, _extends({
211
- as: component,
212
- ownerState: ownerState,
213
- className: clsx(classes.root, className),
214
- ref: ref
215
- }, other, {
216
- children: [children, fcs.required && /*#__PURE__*/jsxRuntimeExports.jsxs(AsteriskComponent, {
217
- ownerState: ownerState,
218
- "aria-hidden": true,
219
- className: classes.asterisk,
220
- children: ["\u2009", '*']
221
- })]
222
- }));
223
- });
224
- process.env.NODE_ENV !== "production" ? FormLabel.propTypes /* remove-proptypes */ = {
225
- // ----------------------------- Warning --------------------------------
226
- // | These PropTypes are generated from the TypeScript type definitions |
227
- // | To update them edit the d.ts file and run "yarn proptypes" |
228
- // ----------------------------------------------------------------------
229
- /**
230
- * The content of the component.
231
- */
232
- children: PropTypes.node,
233
- /**
234
- * Override or extend the styles applied to the component.
235
- */
236
- classes: PropTypes.object,
237
- /**
238
- * @ignore
239
- */
240
- className: PropTypes.string,
241
- /**
242
- * The color of the component.
243
- * It supports both default and custom theme colors, which can be added as shown in the
244
- * [palette customization guide](https://mui.com/material-ui/customization/palette/#adding-new-colors).
245
- */
246
- color: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.oneOf(['error', 'info', 'primary', 'secondary', 'success', 'warning']), PropTypes.string]),
247
- /**
248
- * The component used for the root node.
249
- * Either a string to use a HTML element or a component.
250
- */
251
- component: PropTypes.elementType,
252
- /**
253
- * If `true`, the label should be displayed in a disabled state.
254
- */
255
- disabled: PropTypes.bool,
256
- /**
257
- * If `true`, the label is displayed in an error state.
258
- */
259
- error: PropTypes.bool,
260
- /**
261
- * If `true`, the label should use filled classes key.
262
- */
263
- filled: PropTypes.bool,
264
- /**
265
- * If `true`, the input of this label is focused (used by `FormGroup` components).
266
- */
267
- focused: PropTypes.bool,
268
- /**
269
- * If `true`, the label will indicate that the `input` is required.
270
- */
271
- required: PropTypes.bool,
272
- /**
273
- * The system prop that allows defining system overrides as well as additional CSS styles.
274
- */
275
- sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object])
276
- } : void 0;
277
- var FormLabel$1 = FormLabel;
278
-
279
- function getInputLabelUtilityClasses(slot) {
280
- return generateUtilityClass('MuiInputLabel', slot);
281
- }
282
- generateUtilityClasses('MuiInputLabel', ['root', 'focused', 'disabled', 'error', 'required', 'asterisk', 'formControl', 'sizeSmall', 'shrink', 'animated', 'standard', 'filled', 'outlined']);
283
-
284
- const _excluded$4 = ["disableAnimation", "margin", "shrink", "variant", "className"];
285
- const useUtilityClasses$3 = ownerState => {
286
- const {
287
- classes,
288
- formControl,
289
- size,
290
- shrink,
291
- disableAnimation,
292
- variant,
293
- required
294
- } = ownerState;
295
- const slots = {
296
- root: ['root', formControl && 'formControl', !disableAnimation && 'animated', shrink && 'shrink', size === 'small' && 'sizeSmall', variant],
297
- asterisk: [required && 'asterisk']
298
- };
299
- const composedClasses = composeClasses(slots, getInputLabelUtilityClasses, classes);
300
- return _extends({}, classes, composedClasses);
301
- };
302
- const InputLabelRoot = styled$1(FormLabel$1, {
303
- shouldForwardProp: prop => rootShouldForwardProp(prop) || prop === 'classes',
304
- name: 'MuiInputLabel',
305
- slot: 'Root',
306
- overridesResolver: (props, styles) => {
307
- const {
308
- ownerState
309
- } = props;
310
- return [{
311
- [`& .${formLabelClasses$1.asterisk}`]: styles.asterisk
312
- }, styles.root, ownerState.formControl && styles.formControl, ownerState.size === 'small' && styles.sizeSmall, ownerState.shrink && styles.shrink, !ownerState.disableAnimation && styles.animated, styles[ownerState.variant]];
313
- }
314
- })(({
315
- theme,
316
- ownerState
317
- }) => _extends({
318
- display: 'block',
319
- transformOrigin: 'top left',
320
- whiteSpace: 'nowrap',
321
- overflow: 'hidden',
322
- textOverflow: 'ellipsis',
323
- maxWidth: '100%'
324
- }, ownerState.formControl && {
325
- position: 'absolute',
326
- left: 0,
327
- top: 0,
328
- // slight alteration to spec spacing to match visual spec result
329
- transform: 'translate(0, 20px) scale(1)'
330
- }, ownerState.size === 'small' && {
331
- // Compensation for the `Input.inputSizeSmall` style.
332
- transform: 'translate(0, 17px) scale(1)'
333
- }, ownerState.shrink && {
334
- transform: 'translate(0, -1.5px) scale(0.75)',
335
- transformOrigin: 'top left',
336
- maxWidth: '133%'
337
- }, !ownerState.disableAnimation && {
338
- transition: theme.transitions.create(['color', 'transform', 'max-width'], {
339
- duration: theme.transitions.duration.shorter,
340
- easing: theme.transitions.easing.easeOut
341
- })
342
- }, ownerState.variant === 'filled' && _extends({
343
- // Chrome's autofill feature gives the input field a yellow background.
344
- // Since the input field is behind the label in the HTML tree,
345
- // the input field is drawn last and hides the label with an opaque background color.
346
- // zIndex: 1 will raise the label above opaque background-colors of input.
347
- zIndex: 1,
348
- pointerEvents: 'none',
349
- transform: 'translate(12px, 16px) scale(1)',
350
- maxWidth: 'calc(100% - 24px)'
351
- }, ownerState.size === 'small' && {
352
- transform: 'translate(12px, 13px) scale(1)'
353
- }, ownerState.shrink && _extends({
354
- userSelect: 'none',
355
- pointerEvents: 'auto',
356
- transform: 'translate(12px, 7px) scale(0.75)',
357
- maxWidth: 'calc(133% - 24px)'
358
- }, ownerState.size === 'small' && {
359
- transform: 'translate(12px, 4px) scale(0.75)'
360
- })), ownerState.variant === 'outlined' && _extends({
361
- // see comment above on filled.zIndex
362
- zIndex: 1,
363
- pointerEvents: 'none',
364
- transform: 'translate(14px, 16px) scale(1)',
365
- maxWidth: 'calc(100% - 24px)'
366
- }, ownerState.size === 'small' && {
367
- transform: 'translate(14px, 9px) scale(1)'
368
- }, ownerState.shrink && {
369
- userSelect: 'none',
370
- pointerEvents: 'auto',
371
- // Theoretically, we should have (8+5)*2/0.75 = 34px
372
- // but it feels a better when it bleeds a bit on the left, so 32px.
373
- maxWidth: 'calc(133% - 32px)',
374
- transform: 'translate(14px, -9px) scale(0.75)'
375
- })));
376
- const InputLabel = /*#__PURE__*/React.forwardRef(function InputLabel(inProps, ref) {
377
- const props = useThemeProps({
378
- name: 'MuiInputLabel',
379
- props: inProps
380
- });
381
- const {
382
- disableAnimation = false,
383
- shrink: shrinkProp,
384
- className
385
- } = props,
386
- other = _objectWithoutPropertiesLoose(props, _excluded$4);
387
- const muiFormControl = useFormControl();
388
- let shrink = shrinkProp;
389
- if (typeof shrink === 'undefined' && muiFormControl) {
390
- shrink = muiFormControl.filled || muiFormControl.focused || muiFormControl.adornedStart;
391
- }
392
- const fcs = formControlState({
393
- props,
394
- muiFormControl,
395
- states: ['size', 'variant', 'required']
396
- });
397
- const ownerState = _extends({}, props, {
398
- disableAnimation,
399
- formControl: muiFormControl,
400
- shrink,
401
- size: fcs.size,
402
- variant: fcs.variant,
403
- required: fcs.required
404
- });
405
- const classes = useUtilityClasses$3(ownerState);
406
- return /*#__PURE__*/jsxRuntimeExports.jsx(InputLabelRoot, _extends({
407
- "data-shrink": shrink,
408
- ownerState: ownerState,
409
- ref: ref,
410
- className: clsx(classes.root, className)
411
- }, other, {
412
- classes: classes
413
- }));
414
- });
415
- process.env.NODE_ENV !== "production" ? InputLabel.propTypes /* remove-proptypes */ = {
416
- // ----------------------------- Warning --------------------------------
417
- // | These PropTypes are generated from the TypeScript type definitions |
418
- // | To update them edit the d.ts file and run "yarn proptypes" |
419
- // ----------------------------------------------------------------------
420
- /**
421
- * The content of the component.
422
- */
423
- children: PropTypes.node,
424
- /**
425
- * Override or extend the styles applied to the component.
426
- */
427
- classes: PropTypes.object,
428
- /**
429
- * @ignore
430
- */
431
- className: PropTypes.string,
432
- /**
433
- * The color of the component.
434
- * It supports both default and custom theme colors, which can be added as shown in the
435
- * [palette customization guide](https://mui.com/material-ui/customization/palette/#adding-new-colors).
436
- */
437
- color: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.oneOf(['error', 'info', 'primary', 'secondary', 'success', 'warning']), PropTypes.string]),
438
- /**
439
- * If `true`, the transition animation is disabled.
440
- * @default false
441
- */
442
- disableAnimation: PropTypes.bool,
443
- /**
444
- * If `true`, the component is disabled.
445
- */
446
- disabled: PropTypes.bool,
447
- /**
448
- * If `true`, the label is displayed in an error state.
449
- */
450
- error: PropTypes.bool,
451
- /**
452
- * If `true`, the `input` of this label is focused.
453
- */
454
- focused: PropTypes.bool,
455
- /**
456
- * If `dense`, will adjust vertical spacing. This is normally obtained via context from
457
- * FormControl.
458
- */
459
- margin: PropTypes.oneOf(['dense']),
460
- /**
461
- * if `true`, the label will indicate that the `input` is required.
462
- */
463
- required: PropTypes.bool,
464
- /**
465
- * If `true`, the label is shrunk.
466
- */
467
- shrink: PropTypes.bool,
468
- /**
469
- * The size of the component.
470
- * @default 'normal'
471
- */
472
- size: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.oneOf(['normal', 'small']), PropTypes.string]),
473
- /**
474
- * The system prop that allows defining system overrides as well as additional CSS styles.
475
- */
476
- sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
477
- /**
478
- * The variant to use.
479
- */
480
- variant: PropTypes.oneOf(['filled', 'outlined', 'standard'])
481
- } : void 0;
482
- var InputLabel$1 = InputLabel;
483
-
484
- function getFormControlUtilityClasses(slot) {
485
- return generateUtilityClass('MuiFormControl', slot);
486
- }
487
- generateUtilityClasses('MuiFormControl', ['root', 'marginNone', 'marginNormal', 'marginDense', 'fullWidth', 'disabled']);
488
-
489
- const _excluded$3 = ["children", "className", "color", "component", "disabled", "error", "focused", "fullWidth", "hiddenLabel", "margin", "required", "size", "variant"];
490
- const useUtilityClasses$2 = ownerState => {
491
- const {
492
- classes,
493
- margin,
494
- fullWidth
495
- } = ownerState;
496
- const slots = {
497
- root: ['root', margin !== 'none' && `margin${capitalize(margin)}`, fullWidth && 'fullWidth']
498
- };
499
- return composeClasses(slots, getFormControlUtilityClasses, classes);
500
- };
501
- const FormControlRoot = styled$1('div', {
502
- name: 'MuiFormControl',
503
- slot: 'Root',
504
- overridesResolver: ({
505
- ownerState
506
- }, styles) => {
507
- return _extends({}, styles.root, styles[`margin${capitalize(ownerState.margin)}`], ownerState.fullWidth && styles.fullWidth);
508
- }
509
- })(({
510
- ownerState
511
- }) => _extends({
512
- display: 'inline-flex',
513
- flexDirection: 'column',
514
- position: 'relative',
515
- // Reset fieldset default style.
516
- minWidth: 0,
517
- padding: 0,
518
- margin: 0,
519
- border: 0,
520
- verticalAlign: 'top'
521
- }, ownerState.margin === 'normal' && {
522
- marginTop: 16,
523
- marginBottom: 8
524
- }, ownerState.margin === 'dense' && {
525
- marginTop: 8,
526
- marginBottom: 4
527
- }, ownerState.fullWidth && {
528
- width: '100%'
529
- }));
530
-
531
- /**
532
- * Provides context such as filled/focused/error/required for form inputs.
533
- * Relying on the context provides high flexibility and ensures that the state always stays
534
- * consistent across the children of the `FormControl`.
535
- * This context is used by the following components:
536
- *
537
- * - FormLabel
538
- * - FormHelperText
539
- * - Input
540
- * - InputLabel
541
- *
542
- * You can find one composition example below and more going to [the demos](/material-ui/react-text-field/#components).
543
- *
544
- * ```jsx
545
- * <FormControl>
546
- * <InputLabel htmlFor="my-input">Email address</InputLabel>
547
- * <Input id="my-input" aria-describedby="my-helper-text" />
548
- * <FormHelperText id="my-helper-text">We'll never share your email.</FormHelperText>
549
- * </FormControl>
550
- * ```
551
- *
552
- * ⚠️ Only one `InputBase` can be used within a FormControl because it creates visual inconsistencies.
553
- * For instance, only one input can be focused at the same time, the state shouldn't be shared.
554
- */
555
- const FormControl = /*#__PURE__*/React.forwardRef(function FormControl(inProps, ref) {
556
- const props = useThemeProps({
557
- props: inProps,
558
- name: 'MuiFormControl'
559
- });
560
- const {
561
- children,
562
- className,
563
- color = 'primary',
564
- component = 'div',
565
- disabled = false,
566
- error = false,
567
- focused: visuallyFocused,
568
- fullWidth = false,
569
- hiddenLabel = false,
570
- margin = 'none',
571
- required = false,
572
- size = 'medium',
573
- variant = 'outlined'
574
- } = props,
575
- other = _objectWithoutPropertiesLoose(props, _excluded$3);
576
- const ownerState = _extends({}, props, {
577
- color,
578
- component,
579
- disabled,
580
- error,
581
- fullWidth,
582
- hiddenLabel,
583
- margin,
584
- required,
585
- size,
586
- variant
587
- });
588
- const classes = useUtilityClasses$2(ownerState);
589
- const [adornedStart, setAdornedStart] = React.useState(() => {
590
- // We need to iterate through the children and find the Input in order
591
- // to fully support server-side rendering.
592
- let initialAdornedStart = false;
593
- if (children) {
594
- React.Children.forEach(children, child => {
595
- if (!isMuiElement(child, ['Input', 'Select'])) {
596
- return;
597
- }
598
- const input = isMuiElement(child, ['Select']) ? child.props.input : child;
599
- if (input && isAdornedStart(input.props)) {
600
- initialAdornedStart = true;
601
- }
602
- });
603
- }
604
- return initialAdornedStart;
605
- });
606
- const [filled, setFilled] = React.useState(() => {
607
- // We need to iterate through the children and find the Input in order
608
- // to fully support server-side rendering.
609
- let initialFilled = false;
610
- if (children) {
611
- React.Children.forEach(children, child => {
612
- if (!isMuiElement(child, ['Input', 'Select'])) {
613
- return;
614
- }
615
- if (isFilled(child.props, true) || isFilled(child.props.inputProps, true)) {
616
- initialFilled = true;
617
- }
618
- });
619
- }
620
- return initialFilled;
621
- });
622
- const [focusedState, setFocused] = React.useState(false);
623
- if (disabled && focusedState) {
624
- setFocused(false);
625
- }
626
- const focused = visuallyFocused !== undefined && !disabled ? visuallyFocused : focusedState;
627
- let registerEffect;
628
- if (process.env.NODE_ENV !== 'production') {
629
- // eslint-disable-next-line react-hooks/rules-of-hooks
630
- const registeredInput = React.useRef(false);
631
- registerEffect = () => {
632
- if (registeredInput.current) {
633
- console.error(['MUI: There are multiple `InputBase` components inside a FormControl.', 'This creates visual inconsistencies, only use one `InputBase`.'].join('\n'));
634
- }
635
- registeredInput.current = true;
636
- return () => {
637
- registeredInput.current = false;
638
- };
639
- };
640
- }
641
- const childContext = React.useMemo(() => {
642
- return {
643
- adornedStart,
644
- setAdornedStart,
645
- color,
646
- disabled,
647
- error,
648
- filled,
649
- focused,
650
- fullWidth,
651
- hiddenLabel,
652
- size,
653
- onBlur: () => {
654
- setFocused(false);
655
- },
656
- onEmpty: () => {
657
- setFilled(false);
658
- },
659
- onFilled: () => {
660
- setFilled(true);
661
- },
662
- onFocus: () => {
663
- setFocused(true);
664
- },
665
- registerEffect,
666
- required,
667
- variant
668
- };
669
- }, [adornedStart, color, disabled, error, filled, focused, fullWidth, hiddenLabel, registerEffect, required, size, variant]);
670
- return /*#__PURE__*/jsxRuntimeExports.jsx(FormControlContext.Provider, {
671
- value: childContext,
672
- children: /*#__PURE__*/jsxRuntimeExports.jsx(FormControlRoot, _extends({
673
- as: component,
674
- ownerState: ownerState,
675
- className: clsx(classes.root, className),
676
- ref: ref
677
- }, other, {
678
- children: children
679
- }))
680
- });
681
- });
682
- process.env.NODE_ENV !== "production" ? FormControl.propTypes /* remove-proptypes */ = {
683
- // ----------------------------- Warning --------------------------------
684
- // | These PropTypes are generated from the TypeScript type definitions |
685
- // | To update them edit the d.ts file and run "yarn proptypes" |
686
- // ----------------------------------------------------------------------
687
- /**
688
- * The content of the component.
689
- */
690
- children: PropTypes.node,
691
- /**
692
- * Override or extend the styles applied to the component.
693
- */
694
- classes: PropTypes.object,
695
- /**
696
- * @ignore
697
- */
698
- className: PropTypes.string,
699
- /**
700
- * The color of the component.
701
- * It supports both default and custom theme colors, which can be added as shown in the
702
- * [palette customization guide](https://mui.com/material-ui/customization/palette/#adding-new-colors).
703
- * @default 'primary'
704
- */
705
- color: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.oneOf(['primary', 'secondary', 'error', 'info', 'success', 'warning']), PropTypes.string]),
706
- /**
707
- * The component used for the root node.
708
- * Either a string to use a HTML element or a component.
709
- */
710
- component: PropTypes.elementType,
711
- /**
712
- * If `true`, the label, input and helper text should be displayed in a disabled state.
713
- * @default false
714
- */
715
- disabled: PropTypes.bool,
716
- /**
717
- * If `true`, the label is displayed in an error state.
718
- * @default false
719
- */
720
- error: PropTypes.bool,
721
- /**
722
- * If `true`, the component is displayed in focused state.
723
- */
724
- focused: PropTypes.bool,
725
- /**
726
- * If `true`, the component will take up the full width of its container.
727
- * @default false
728
- */
729
- fullWidth: PropTypes.bool,
730
- /**
731
- * If `true`, the label is hidden.
732
- * This is used to increase density for a `FilledInput`.
733
- * Be sure to add `aria-label` to the `input` element.
734
- * @default false
735
- */
736
- hiddenLabel: PropTypes.bool,
737
- /**
738
- * If `dense` or `normal`, will adjust vertical spacing of this and contained components.
739
- * @default 'none'
740
- */
741
- margin: PropTypes.oneOf(['dense', 'none', 'normal']),
742
- /**
743
- * If `true`, the label will indicate that the `input` is required.
744
- * @default false
745
- */
746
- required: PropTypes.bool,
747
- /**
748
- * The size of the component.
749
- * @default 'medium'
750
- */
751
- size: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.oneOf(['medium', 'small']), PropTypes.string]),
752
- /**
753
- * The system prop that allows defining system overrides as well as additional CSS styles.
754
- */
755
- sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
756
- /**
757
- * The variant to use.
758
- * @default 'outlined'
759
- */
760
- variant: PropTypes.oneOf(['filled', 'outlined', 'standard'])
761
- } : void 0;
762
- var FormControl$1 = FormControl;
763
-
764
- function getFormHelperTextUtilityClasses(slot) {
765
- return generateUtilityClass('MuiFormHelperText', slot);
766
- }
767
- const formHelperTextClasses = generateUtilityClasses('MuiFormHelperText', ['root', 'error', 'disabled', 'sizeSmall', 'sizeMedium', 'contained', 'focused', 'filled', 'required']);
768
- var formHelperTextClasses$1 = formHelperTextClasses;
769
-
770
- var _span;
771
- const _excluded$2 = ["children", "className", "component", "disabled", "error", "filled", "focused", "margin", "required", "variant"];
772
- const useUtilityClasses$1 = ownerState => {
773
- const {
774
- classes,
775
- contained,
776
- size,
777
- disabled,
778
- error,
779
- filled,
780
- focused,
781
- required
782
- } = ownerState;
783
- const slots = {
784
- root: ['root', disabled && 'disabled', error && 'error', size && `size${capitalize(size)}`, contained && 'contained', focused && 'focused', filled && 'filled', required && 'required']
785
- };
786
- return composeClasses(slots, getFormHelperTextUtilityClasses, classes);
787
- };
788
- const FormHelperTextRoot = styled$1('p', {
789
- name: 'MuiFormHelperText',
790
- slot: 'Root',
791
- overridesResolver: (props, styles) => {
792
- const {
793
- ownerState
794
- } = props;
795
- return [styles.root, ownerState.size && styles[`size${capitalize(ownerState.size)}`], ownerState.contained && styles.contained, ownerState.filled && styles.filled];
796
- }
797
- })(({
798
- theme,
799
- ownerState
800
- }) => _extends({
801
- color: (theme.vars || theme).palette.text.secondary
802
- }, theme.typography.caption, {
803
- textAlign: 'left',
804
- marginTop: 3,
805
- marginRight: 0,
806
- marginBottom: 0,
807
- marginLeft: 0,
808
- [`&.${formHelperTextClasses$1.disabled}`]: {
809
- color: (theme.vars || theme).palette.text.disabled
810
- },
811
- [`&.${formHelperTextClasses$1.error}`]: {
812
- color: (theme.vars || theme).palette.error.main
813
- }
814
- }, ownerState.size === 'small' && {
815
- marginTop: 4
816
- }, ownerState.contained && {
817
- marginLeft: 14,
818
- marginRight: 14
819
- }));
820
- const FormHelperText = /*#__PURE__*/React.forwardRef(function FormHelperText(inProps, ref) {
821
- const props = useThemeProps({
822
- props: inProps,
823
- name: 'MuiFormHelperText'
824
- });
825
- const {
826
- children,
827
- className,
828
- component = 'p'
829
- } = props,
830
- other = _objectWithoutPropertiesLoose(props, _excluded$2);
831
- const muiFormControl = useFormControl();
832
- const fcs = formControlState({
833
- props,
834
- muiFormControl,
835
- states: ['variant', 'size', 'disabled', 'error', 'filled', 'focused', 'required']
836
- });
837
- const ownerState = _extends({}, props, {
838
- component,
839
- contained: fcs.variant === 'filled' || fcs.variant === 'outlined',
840
- variant: fcs.variant,
841
- size: fcs.size,
842
- disabled: fcs.disabled,
843
- error: fcs.error,
844
- filled: fcs.filled,
845
- focused: fcs.focused,
846
- required: fcs.required
847
- });
848
- const classes = useUtilityClasses$1(ownerState);
849
- return /*#__PURE__*/jsxRuntimeExports.jsx(FormHelperTextRoot, _extends({
850
- as: component,
851
- ownerState: ownerState,
852
- className: clsx(classes.root, className),
853
- ref: ref
854
- }, other, {
855
- children: children === ' ' ? // notranslate needed while Google Translate will not fix zero-width space issue
856
- _span || (_span = /*#__PURE__*/jsxRuntimeExports.jsx("span", {
857
- className: "notranslate",
858
- children: "\u200B"
859
- })) : children
860
- }));
861
- });
862
- process.env.NODE_ENV !== "production" ? FormHelperText.propTypes /* remove-proptypes */ = {
863
- // ----------------------------- Warning --------------------------------
864
- // | These PropTypes are generated from the TypeScript type definitions |
865
- // | To update them edit the d.ts file and run "yarn proptypes" |
866
- // ----------------------------------------------------------------------
867
- /**
868
- * The content of the component.
869
- *
870
- * If `' '` is provided, the component reserves one line height for displaying a future message.
871
- */
872
- children: PropTypes.node,
873
- /**
874
- * Override or extend the styles applied to the component.
875
- */
876
- classes: PropTypes.object,
877
- /**
878
- * @ignore
879
- */
880
- className: PropTypes.string,
881
- /**
882
- * The component used for the root node.
883
- * Either a string to use a HTML element or a component.
884
- */
885
- component: PropTypes.elementType,
886
- /**
887
- * If `true`, the helper text should be displayed in a disabled state.
888
- */
889
- disabled: PropTypes.bool,
890
- /**
891
- * If `true`, helper text should be displayed in an error state.
892
- */
893
- error: PropTypes.bool,
894
- /**
895
- * If `true`, the helper text should use filled classes key.
896
- */
897
- filled: PropTypes.bool,
898
- /**
899
- * If `true`, the helper text should use focused classes key.
900
- */
901
- focused: PropTypes.bool,
902
- /**
903
- * If `dense`, will adjust vertical spacing. This is normally obtained via context from
904
- * FormControl.
905
- */
906
- margin: PropTypes.oneOf(['dense']),
907
- /**
908
- * If `true`, the helper text should use required classes key.
909
- */
910
- required: PropTypes.bool,
911
- /**
912
- * The system prop that allows defining system overrides as well as additional CSS styles.
913
- */
914
- sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
915
- /**
916
- * The variant to use.
917
- */
918
- variant: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.oneOf(['filled', 'outlined', 'standard']), PropTypes.string])
919
- } : void 0;
920
- var FormHelperText$1 = FormHelperText;
921
-
922
- function getTextFieldUtilityClass(slot) {
923
- return generateUtilityClass('MuiTextField', slot);
924
- }
925
- generateUtilityClasses('MuiTextField', ['root']);
926
-
927
- const _excluded$1 = ["autoComplete", "autoFocus", "children", "className", "color", "defaultValue", "disabled", "error", "FormHelperTextProps", "fullWidth", "helperText", "id", "InputLabelProps", "inputProps", "InputProps", "inputRef", "label", "maxRows", "minRows", "multiline", "name", "onBlur", "onChange", "onClick", "onFocus", "placeholder", "required", "rows", "select", "SelectProps", "type", "value", "variant"];
928
- const variantComponent = {
929
- standard: Input,
930
- filled: FilledInput,
931
- outlined: OutlinedInput
932
- };
933
- const useUtilityClasses = ownerState => {
934
- const {
935
- classes
936
- } = ownerState;
937
- const slots = {
938
- root: ['root']
939
- };
940
- return composeClasses(slots, getTextFieldUtilityClass, classes);
941
- };
942
- const TextFieldRoot = styled$1(FormControl$1, {
943
- name: 'MuiTextField',
944
- slot: 'Root',
945
- overridesResolver: (props, styles) => styles.root
946
- })({});
947
-
948
- /**
949
- * The `TextField` is a convenience wrapper for the most common cases (80%).
950
- * It cannot be all things to all people, otherwise the API would grow out of control.
951
- *
952
- * ## Advanced Configuration
953
- *
954
- * It's important to understand that the text field is a simple abstraction
955
- * on top of the following components:
956
- *
957
- * - [FormControl](/material-ui/api/form-control/)
958
- * - [InputLabel](/material-ui/api/input-label/)
959
- * - [FilledInput](/material-ui/api/filled-input/)
960
- * - [OutlinedInput](/material-ui/api/outlined-input/)
961
- * - [Input](/material-ui/api/input/)
962
- * - [FormHelperText](/material-ui/api/form-helper-text/)
963
- *
964
- * If you wish to alter the props applied to the `input` element, you can do so as follows:
965
- *
966
- * ```jsx
967
- * const inputProps = {
968
- * step: 300,
969
- * };
970
- *
971
- * return <TextField id="time" type="time" inputProps={inputProps} />;
972
- * ```
973
- *
974
- * For advanced cases, please look at the source of TextField by clicking on the
975
- * "Edit this page" button above. Consider either:
976
- *
977
- * - using the upper case props for passing values directly to the components
978
- * - using the underlying components directly as shown in the demos
979
- */
980
- const TextField = /*#__PURE__*/React.forwardRef(function TextField(inProps, ref) {
981
- const props = useThemeProps({
982
- props: inProps,
983
- name: 'MuiTextField'
984
- });
985
- const {
986
- autoComplete,
987
- autoFocus = false,
988
- children,
989
- className,
990
- color = 'primary',
991
- defaultValue,
992
- disabled = false,
993
- error = false,
994
- FormHelperTextProps,
995
- fullWidth = false,
996
- helperText,
997
- id: idOverride,
998
- InputLabelProps,
999
- inputProps,
1000
- InputProps,
1001
- inputRef,
1002
- label,
1003
- maxRows,
1004
- minRows,
1005
- multiline = false,
1006
- name,
1007
- onBlur,
1008
- onChange,
1009
- onClick,
1010
- onFocus,
1011
- placeholder,
1012
- required = false,
1013
- rows,
1014
- select = false,
1015
- SelectProps,
1016
- type,
1017
- value,
1018
- variant = 'outlined'
1019
- } = props,
1020
- other = _objectWithoutPropertiesLoose(props, _excluded$1);
1021
- const ownerState = _extends({}, props, {
1022
- autoFocus,
1023
- color,
1024
- disabled,
1025
- error,
1026
- fullWidth,
1027
- multiline,
1028
- required,
1029
- select,
1030
- variant
1031
- });
1032
- const classes = useUtilityClasses(ownerState);
1033
- if (process.env.NODE_ENV !== 'production') {
1034
- if (select && !children) {
1035
- console.error('MUI: `children` must be passed when using the `TextField` component with `select`.');
1036
- }
1037
- }
1038
- const InputMore = {};
1039
- if (variant === 'outlined') {
1040
- if (InputLabelProps && typeof InputLabelProps.shrink !== 'undefined') {
1041
- InputMore.notched = InputLabelProps.shrink;
1042
- }
1043
- InputMore.label = label;
1044
- }
1045
- if (select) {
1046
- // unset defaults from textbox inputs
1047
- if (!SelectProps || !SelectProps.native) {
1048
- InputMore.id = undefined;
1049
- }
1050
- InputMore['aria-describedby'] = undefined;
1051
- }
1052
- const id = useId(idOverride);
1053
- const helperTextId = helperText && id ? `${id}-helper-text` : undefined;
1054
- const inputLabelId = label && id ? `${id}-label` : undefined;
1055
- const InputComponent = variantComponent[variant];
1056
- const InputElement = /*#__PURE__*/jsxRuntimeExports.jsx(InputComponent, _extends({
1057
- "aria-describedby": helperTextId,
1058
- autoComplete: autoComplete,
1059
- autoFocus: autoFocus,
1060
- defaultValue: defaultValue,
1061
- fullWidth: fullWidth,
1062
- multiline: multiline,
1063
- name: name,
1064
- rows: rows,
1065
- maxRows: maxRows,
1066
- minRows: minRows,
1067
- type: type,
1068
- value: value,
1069
- id: id,
1070
- inputRef: inputRef,
1071
- onBlur: onBlur,
1072
- onChange: onChange,
1073
- onFocus: onFocus,
1074
- onClick: onClick,
1075
- placeholder: placeholder,
1076
- inputProps: inputProps
1077
- }, InputMore, InputProps));
1078
- return /*#__PURE__*/jsxRuntimeExports.jsxs(TextFieldRoot, _extends({
1079
- className: clsx(classes.root, className),
1080
- disabled: disabled,
1081
- error: error,
1082
- fullWidth: fullWidth,
1083
- ref: ref,
1084
- required: required,
1085
- color: color,
1086
- variant: variant,
1087
- ownerState: ownerState
1088
- }, other, {
1089
- children: [label != null && label !== '' && /*#__PURE__*/jsxRuntimeExports.jsx(InputLabel$1, _extends({
1090
- htmlFor: id,
1091
- id: inputLabelId
1092
- }, InputLabelProps, {
1093
- children: label
1094
- })), select ? /*#__PURE__*/jsxRuntimeExports.jsx(Select, _extends({
1095
- "aria-describedby": helperTextId,
1096
- id: id,
1097
- labelId: inputLabelId,
1098
- value: value,
1099
- input: InputElement
1100
- }, SelectProps, {
1101
- children: children
1102
- })) : InputElement, helperText && /*#__PURE__*/jsxRuntimeExports.jsx(FormHelperText$1, _extends({
1103
- id: helperTextId
1104
- }, FormHelperTextProps, {
1105
- children: helperText
1106
- }))]
1107
- }));
1108
- });
1109
- process.env.NODE_ENV !== "production" ? TextField.propTypes /* remove-proptypes */ = {
1110
- // ----------------------------- Warning --------------------------------
1111
- // | These PropTypes are generated from the TypeScript type definitions |
1112
- // | To update them edit the d.ts file and run "yarn proptypes" |
1113
- // ----------------------------------------------------------------------
1114
- /**
1115
- * This prop helps users to fill forms faster, especially on mobile devices.
1116
- * The name can be confusing, as it's more like an autofill.
1117
- * You can learn more about it [following the specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill).
1118
- */
1119
- autoComplete: PropTypes.string,
1120
- /**
1121
- * If `true`, the `input` element is focused during the first mount.
1122
- * @default false
1123
- */
1124
- autoFocus: PropTypes.bool,
1125
- /**
1126
- * @ignore
1127
- */
1128
- children: PropTypes.node,
1129
- /**
1130
- * Override or extend the styles applied to the component.
1131
- */
1132
- classes: PropTypes.object,
1133
- /**
1134
- * @ignore
1135
- */
1136
- className: PropTypes.string,
1137
- /**
1138
- * The color of the component.
1139
- * It supports both default and custom theme colors, which can be added as shown in the
1140
- * [palette customization guide](https://mui.com/material-ui/customization/palette/#adding-new-colors).
1141
- * @default 'primary'
1142
- */
1143
- color: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.oneOf(['primary', 'secondary', 'error', 'info', 'success', 'warning']), PropTypes.string]),
1144
- /**
1145
- * The default value. Use when the component is not controlled.
1146
- */
1147
- defaultValue: PropTypes.any,
1148
- /**
1149
- * If `true`, the component is disabled.
1150
- * @default false
1151
- */
1152
- disabled: PropTypes.bool,
1153
- /**
1154
- * If `true`, the label is displayed in an error state.
1155
- * @default false
1156
- */
1157
- error: PropTypes.bool,
1158
- /**
1159
- * Props applied to the [`FormHelperText`](/material-ui/api/form-helper-text/) element.
1160
- */
1161
- FormHelperTextProps: PropTypes.object,
1162
- /**
1163
- * If `true`, the input will take up the full width of its container.
1164
- * @default false
1165
- */
1166
- fullWidth: PropTypes.bool,
1167
- /**
1168
- * The helper text content.
1169
- */
1170
- helperText: PropTypes.node,
1171
- /**
1172
- * The id of the `input` element.
1173
- * Use this prop to make `label` and `helperText` accessible for screen readers.
1174
- */
1175
- id: PropTypes.string,
1176
- /**
1177
- * Props applied to the [`InputLabel`](/material-ui/api/input-label/) element.
1178
- * Pointer events like `onClick` are enabled if and only if `shrink` is `true`.
1179
- */
1180
- InputLabelProps: PropTypes.object,
1181
- /**
1182
- * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.
1183
- */
1184
- inputProps: PropTypes.object,
1185
- /**
1186
- * Props applied to the Input element.
1187
- * It will be a [`FilledInput`](/material-ui/api/filled-input/),
1188
- * [`OutlinedInput`](/material-ui/api/outlined-input/) or [`Input`](/material-ui/api/input/)
1189
- * component depending on the `variant` prop value.
1190
- */
1191
- InputProps: PropTypes.object,
1192
- /**
1193
- * Pass a ref to the `input` element.
1194
- */
1195
- inputRef: refType,
1196
- /**
1197
- * The label content.
1198
- */
1199
- label: PropTypes.node,
1200
- /**
1201
- * If `dense` or `normal`, will adjust vertical spacing of this and contained components.
1202
- * @default 'none'
1203
- */
1204
- margin: PropTypes.oneOf(['dense', 'none', 'normal']),
1205
- /**
1206
- * Maximum number of rows to display when multiline option is set to true.
1207
- */
1208
- maxRows: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
1209
- /**
1210
- * Minimum number of rows to display when multiline option is set to true.
1211
- */
1212
- minRows: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
1213
- /**
1214
- * If `true`, a `textarea` element is rendered instead of an input.
1215
- * @default false
1216
- */
1217
- multiline: PropTypes.bool,
1218
- /**
1219
- * Name attribute of the `input` element.
1220
- */
1221
- name: PropTypes.string,
1222
- /**
1223
- * @ignore
1224
- */
1225
- onBlur: PropTypes.func,
1226
- /**
1227
- * Callback fired when the value is changed.
1228
- *
1229
- * @param {object} event The event source of the callback.
1230
- * You can pull out the new value by accessing `event.target.value` (string).
1231
- */
1232
- onChange: PropTypes.func,
1233
- /**
1234
- * @ignore
1235
- */
1236
- onClick: PropTypes.func,
1237
- /**
1238
- * @ignore
1239
- */
1240
- onFocus: PropTypes.func,
1241
- /**
1242
- * The short hint displayed in the `input` before the user enters a value.
1243
- */
1244
- placeholder: PropTypes.string,
1245
- /**
1246
- * If `true`, the label is displayed as required and the `input` element is required.
1247
- * @default false
1248
- */
1249
- required: PropTypes.bool,
1250
- /**
1251
- * Number of rows to display when multiline option is set to true.
1252
- */
1253
- rows: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
1254
- /**
1255
- * Render a [`Select`](/material-ui/api/select/) element while passing the Input element to `Select` as `input` parameter.
1256
- * If this option is set you must pass the options of the select as children.
1257
- * @default false
1258
- */
1259
- select: PropTypes.bool,
1260
- /**
1261
- * Props applied to the [`Select`](/material-ui/api/select/) element.
1262
- */
1263
- SelectProps: PropTypes.object,
1264
- /**
1265
- * The size of the component.
1266
- */
1267
- size: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.oneOf(['medium', 'small']), PropTypes.string]),
1268
- /**
1269
- * The system prop that allows defining system overrides as well as additional CSS styles.
1270
- */
1271
- sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
1272
- /**
1273
- * Type of the `input` element. It should be [a valid HTML5 input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types).
1274
- */
1275
- type: PropTypes /* @typescript-to-proptypes-ignore */.string,
1276
- /**
1277
- * The value of the `input` element, required for a controlled component.
1278
- */
1279
- value: PropTypes.any,
1280
- /**
1281
- * The variant to use.
1282
- * @default 'outlined'
1283
- */
1284
- variant: PropTypes.oneOf(['filled', 'outlined', 'standard'])
1285
- } : void 0;
1286
- var TextField$1 = TextField;
1287
-
1288
- const SUBMIT_FILTER_STROKE_TIME = 500;
1289
- const InputNumberInterval = props => {
1290
- var _item$value;
1291
- const {
1292
- item,
1293
- applyValue,
1294
- focusElementRef = null
1295
- } = props;
1296
- const filterTimeout = React.useRef();
1297
- const [filterValueState, setFilterValueState] = React.useState((_item$value = item.value) !== null && _item$value !== void 0 ? _item$value : '');
1298
- const [applying, setIsApplying] = React.useState(false);
1299
- React.useEffect(() => {
1300
- return () => {
1301
- clearTimeout(filterTimeout.current);
1302
- };
1303
- }, []);
1304
- React.useEffect(() => {
1305
- var _item$value2;
1306
- const itemValue = (_item$value2 = item.value) !== null && _item$value2 !== void 0 ? _item$value2 : [undefined, undefined];
1307
- setFilterValueState(itemValue);
1308
- }, [item.value]);
1309
- const updateFilterValue = (lowerBound, upperBound) => {
1310
- clearTimeout(filterTimeout.current);
1311
- setFilterValueState([lowerBound, upperBound]);
1312
- setIsApplying(true);
1313
- filterTimeout.current = setTimeout(() => {
1314
- setIsApplying(false);
1315
- applyValue(_objectSpread2(_objectSpread2({}, item), {}, {
1316
- value: [lowerBound, upperBound]
1317
- }));
1318
- }, SUBMIT_FILTER_STROKE_TIME);
1319
- };
1320
- const handleUpperFilterChange = event => {
1321
- const newUpperBound = event.target.value;
1322
- updateFilterValue(filterValueState[0], newUpperBound);
1323
- };
1324
- const handleLowerFilterChange = event => {
1325
- const newLowerBound = event.target.value;
1326
- updateFilterValue(newLowerBound, filterValueState[1]);
1327
- };
1328
- return /*#__PURE__*/React.createElement(Box$1, {
1329
- sx: {
1330
- display: 'inline-flex',
1331
- flexDirection: 'row',
1332
- alignItems: 'end',
1333
- height: 48,
1334
- pl: '20px'
1335
- }
1336
- }, /*#__PURE__*/React.createElement(TextField$1, {
1337
- name: "lower-bound-input",
1338
- placeholder: "From",
1339
- label: "From",
1340
- variant: "standard",
1341
- value: Number(filterValueState[0]),
1342
- onChange: handleLowerFilterChange,
1343
- type: "number",
1344
- inputRef: focusElementRef,
1345
- sx: {
1346
- mr: 2
1347
- }
1348
- }), /*#__PURE__*/React.createElement(TextField$1, {
1349
- name: "upper-bound-input",
1350
- placeholder: "To",
1351
- label: "To",
1352
- variant: "standard",
1353
- value: Number(filterValueState[1]),
1354
- onChange: handleUpperFilterChange,
1355
- type: "number",
1356
- InputProps: applying ? {
1357
- endAdornment: /*#__PURE__*/React.createElement(Icon, {
1358
- icon: mdiSync
1359
- })
1360
- } : {}
1361
- }));
1362
- };
1363
-
1364
- const isBetweenOperator = {
1365
- label: 'is between',
1366
- value: 'isBetween',
1367
- getApplyFilterFn: filterItem => {
1368
- if (!filterItem.field || !filterItem.value || !filterItem.operator) {
1369
- return null;
1370
- }
1371
- if (!Array.isArray(filterItem.value) || filterItem.value.length !== 2) {
1372
- return null;
1373
- }
1374
- if (filterItem.value[0] == null || filterItem.value[1] == null) {
1375
- return null;
1376
- }
1377
- if (typeof filterItem.value[0] !== 'number' || typeof filterItem.value[1] !== 'number') {
1378
- return null;
1379
- }
1380
- return params => {
1381
- return params.value !== null && params.value !== undefined && filterItem.value[0] <= params.value && params.value <= filterItem.value[1];
1382
- };
1383
- },
1384
- InputComponent: InputNumberInterval
1385
- };
1386
- const IS_BETWEEN = isBetweenOperator;
1387
-
1388
- const getGridNumericOperators = () => [...getGridNumericOperators$1(), IS_BETWEEN];
1389
-
1390
- const doesNotContain = {
1391
- label: 'does not contain',
1392
- value: 'doesNotContain',
1393
- getApplyFilterFn: filterItem => {
1394
- if (!filterItem.field || !filterItem.value || !filterItem.operator) {
1395
- return null;
1396
- }
1397
- return params => {
1398
- if (filterItem.value.length === 0) {
1399
- return true;
1400
- }
1401
- if (String(params.value).indexOf(filterItem.value) !== -1) {
1402
- return false;
1403
- }
1404
- return true;
1405
- };
1406
- },
1407
- InputComponent: GridFilterInputValue
1408
- };
1409
- const DOES_NOT_CONTAIN = doesNotContain;
1410
-
1411
- const doesNotEqual = {
1412
- label: 'does not equal',
1413
- value: 'doesNotEqual',
1414
- getApplyFilterFn: filterItem => {
1415
- if (!filterItem.field || !filterItem.value || !filterItem.value) {
1416
- return null;
1417
- }
1418
- return params => {
1419
- if (filterItem.value.length === 0) {
1420
- return true;
1421
- }
1422
- if (String(params.value) === filterItem.value) {
1423
- return false;
1424
- }
1425
- return true;
1426
- };
1427
- },
1428
- InputComponent: GridFilterInputValue
1429
- };
1430
- const DOES_NOT_EQUAL = doesNotEqual;
1431
-
1432
- const doesNotHaveOperator = {
1433
- label: "doesn't have",
1434
- value: 'doesNotHave',
1435
- getApplyFilterFn: filterItem => {
1436
- if (!filterItem.field || !filterItem.value || !filterItem.operator) {
1437
- return null;
1438
- }
1439
- return params => {
1440
- const cellValues = Array.isArray(params.value) ? params.value : [params.value];
1441
- return !cellValues.map(value => String(value)).includes(filterItem.value);
1442
- };
1443
- },
1444
- InputComponent: GridFilterInputValue
1445
- };
1446
- const DOES_NOT_HAVE = doesNotHaveOperator;
1447
- const DOES_NOT_HAVE_WITH_SELECT = _objectSpread2(_objectSpread2({}, DOES_NOT_HAVE), {}, {
1448
- InputComponent: GridFilterInputSingleSelect
1449
- });
1450
-
1451
- const hasOperator = {
1452
- label: 'has',
1453
- value: 'has',
1454
- getApplyFilterFn: filterItem => {
1455
- if (!filterItem.field || !filterItem.value || !filterItem.operator) {
1456
- return null;
1457
- }
1458
- return params => {
1459
- const cellValues = Array.isArray(params.value) ? params.value : [params.value];
1460
- return cellValues.map(value => String(value)).includes(filterItem.value);
1461
- };
1462
- },
1463
- InputComponent: GridFilterInputValue
1464
- };
1465
- const HAS = hasOperator;
1466
- const HAS_WITH_SELECT = _objectSpread2(_objectSpread2({}, HAS), {}, {
1467
- InputComponent: GridFilterInputSingleSelect
1468
- });
1469
-
1470
- const hasOnlyOperator = {
1471
- label: 'has only',
1472
- value: 'hasOnly',
1473
- getApplyFilterFn: filterItem => {
1474
- if (!filterItem.field || !filterItem.value || !filterItem.operator) {
1475
- return null;
1476
- }
1477
- return params => {
1478
- const cellValues = Array.isArray(params.value) ? params.value : [params.value];
1479
- return cellValues.length === 1 && String(cellValues[0]) === filterItem.value;
1480
- };
1481
- },
1482
- InputComponent: GridFilterInputValue
1483
- };
1484
- const HAS_ONLY = hasOnlyOperator;
1485
- const HAS_ONLY_WITH_SELECT = _objectSpread2(_objectSpread2({}, HAS_ONLY), {}, {
1486
- InputComponent: GridFilterInputSingleSelect
1487
- });
1488
-
1489
- const isOperator = {
1490
- label: 'is',
1491
- value: 'is',
1492
- getApplyFilterFn: filterItem => {
1493
- if (!filterItem.field || !filterItem.value || !filterItem.operator) {
1494
- return null;
1495
- }
1496
- return params => {
1497
- if (Array.isArray(params.value)) {
1498
- return false;
1499
- }
1500
- return String(params.value) === filterItem.value;
1501
- };
1502
- },
1503
- InputComponent: GridFilterInputValue
1504
- };
1505
- const IS = isOperator;
1506
- const IS_WITH_SELECT = _objectSpread2(_objectSpread2({}, IS), {}, {
1507
- InputComponent: GridFilterInputSingleSelect
1508
- });
1509
-
1510
- const isNotOperator = {
1511
- label: 'is not',
1512
- value: 'isNot',
1513
- getApplyFilterFn: filterItem => {
1514
- if (!filterItem.field || !filterItem.value || !filterItem.operator) {
1515
- return null;
1516
- }
1517
- return params => {
1518
- if (Array.isArray(params.value)) {
1519
- return true;
1520
- }
1521
- return String(params.value) !== filterItem.value;
1522
- };
1523
- },
1524
- InputComponent: GridFilterInputValue
1525
- };
1526
- const IS_NOT = isNotOperator;
1527
- const IS_NOT_WITH_SELECT = _objectSpread2(_objectSpread2({}, IS_NOT), {}, {
1528
- InputComponent: GridFilterInputSingleSelect
1529
- });
1530
-
1531
- const containsAnyOfOperator = {
1532
- label: 'contains any of',
1533
- value: 'containsAnyOf',
1534
- getApplyFilterFn: filterItem => {
1535
- if (!filterItem.field || !filterItem.value || !filterItem.operator) {
1536
- return null;
1537
- }
1538
- return params => {
1539
- if (filterItem.value.length === 0) {
1540
- return true;
1541
- }
1542
- const paramValues = Array.isArray(params.value) ? params.value : [params.value];
1543
- let match = false;
1544
- filterItem.value.forEach(filteredValue => {
1545
- paramValues.forEach(paramValue => {
1546
- if (String(paramValue).indexOf(filteredValue) !== -1) {
1547
- match = true;
1548
- }
1549
- });
1550
- });
1551
- return match;
1552
- };
1553
- },
1554
- InputComponent: GridFilterInputMultipleValue
1555
- };
1556
- const containsAnyOfCIOperator = {
1557
- label: 'contains any of (case insensitive)',
1558
- value: 'containsAnyOf',
1559
- getApplyFilterFn: filterItem => {
1560
- if (!filterItem.field || !filterItem.value || !filterItem.operator) {
1561
- return null;
1562
- }
1563
- return params => {
1564
- if (filterItem.value.length === 0) {
1565
- return true;
1566
- }
1567
- const paramValues = Array.isArray(params.value) ? params.value : [params.value];
1568
- const paramValuesLower = paramValues.map(item => String(item).toLowerCase());
1569
- let match = false;
1570
- filterItem.value.forEach(filteredValue => {
1571
- if (paramValuesLower.indexOf(filteredValue.toLowerCase()) !== -1) {
1572
- match = true;
1573
- }
1574
- });
1575
- return match;
1576
- };
1577
- },
1578
- InputComponent: GridFilterInputMultipleValue
1579
- };
1580
- const CONTAINS_ANY_OF = containsAnyOfOperator;
1581
- const CONTAINS_ANY_OF_I = containsAnyOfCIOperator;
1582
-
1583
- const endsWithAnyOfOperator = {
1584
- label: 'ends with any of',
1585
- value: 'endsWithAnyOf',
1586
- getApplyFilterFn: filterItem => {
1587
- if (!filterItem.field || !filterItem.value || !filterItem.operator) {
1588
- return null;
1589
- }
1590
- return params => {
1591
- if (filterItem.value.length === 0) {
1592
- return true;
1593
- }
1594
- const paramValues = Array.isArray(params.value) ? params.value : [params.value];
1595
- let match = false;
1596
- filterItem.value.forEach(filteredValue => {
1597
- paramValues.forEach(paramValue => {
1598
- if (String(paramValue).endsWith(filteredValue)) {
1599
- match = true;
1600
- }
1601
- });
1602
- });
1603
- return match;
1604
- };
1605
- },
1606
- InputComponent: GridFilterInputMultipleValue
1607
- };
1608
- const ENDS_WITH_ANY_OF = endsWithAnyOfOperator;
1609
-
1610
- const isAnyOfOperator = {
1611
- label: 'is any of',
1612
- value: 'isAnyOf',
1613
- getApplyFilterFn: filterItem => {
1614
- if (!filterItem.field || !filterItem.value || !filterItem.operator) {
1615
- return null;
1616
- }
1617
- return params => {
1618
- if (filterItem.value.length === 0) {
1619
- return true;
1620
- }
1621
- const paramValues = Array.isArray(params.value) ? params.value : [params.value];
1622
- for (const paramValue of paramValues) {
1623
- if (filterItem.value.includes(String(paramValue))) {
1624
- return true;
1625
- }
1626
- }
1627
- return false;
1628
- };
1629
- },
1630
- InputComponent: GridFilterInputMultipleValue
1631
- };
1632
- const IS_ANY_OF = isAnyOfOperator;
1633
- const IS_ANY_OF_WITH_SELECT = _objectSpread2(_objectSpread2({}, IS_ANY_OF), {}, {
1634
- InputComponent: GridFilterInputMultipleSingleSelect
1635
- });
1636
-
1637
- const hasAnyOfOperator = {
1638
- label: 'has any of',
1639
- value: 'hasAnyOf',
1640
- getApplyFilterFn: filterItem => {
1641
- if (!filterItem.field || !filterItem.value || !filterItem.operator) {
1642
- return null;
1643
- }
1644
- return params => {
1645
- if (filterItem.value.length === 0) {
1646
- return true;
1647
- }
1648
- const cellValues = Array.isArray(params.value) ? params.value : [params.value];
1649
- const filterItemValues = Array.isArray(filterItem.value) ? filterItem.value : [filterItem.value];
1650
- return filterItemValues.some(v => cellValues.map(value => String(value)).includes(v));
1651
- };
1652
- },
1653
- InputComponent: GridFilterInputMultipleValue
1654
- };
1655
- const HAS_ANY_OF = hasAnyOfOperator;
1656
- const HAS_ANY_OF_WITH_SELECT = _objectSpread2(_objectSpread2({}, HAS_ANY_OF), {}, {
1657
- InputComponent: GridFilterInputMultipleSingleSelect
1658
- });
1659
-
1660
- const isNotAnyOfOperator = {
1661
- label: 'is not any of',
1662
- value: 'isNotAnyOf',
1663
- getApplyFilterFn: filterItem => {
1664
- if (!filterItem.field || !filterItem.value || !filterItem.operator) {
1665
- return null;
1666
- }
1667
- return params => {
1668
- if (filterItem.value.length === 0) {
1669
- return true;
1670
- }
1671
- const paramValues = Array.isArray(params.value) ? params.value : [params.value];
1672
- for (const paramValue of paramValues) {
1673
- if (filterItem.value.includes(String(paramValue))) {
1674
- return false;
1675
- }
1676
- }
1677
- return true;
1678
- };
1679
- },
1680
- InputComponent: GridFilterInputMultipleValue
1681
- };
1682
- const IS_NOT_ANY_OF = isNotAnyOfOperator;
1683
- const IS_NOT_ANY_OF_WITH_SELECT = _objectSpread2(_objectSpread2({}, IS_NOT_ANY_OF), {}, {
1684
- InputComponent: GridFilterInputMultipleSingleSelect
1685
- });
1686
-
1687
- const startsWithAnyOfOperator = {
1688
- label: 'starts with any of',
1689
- value: 'startsWithAnyOf',
1690
- getApplyFilterFn: filterItem => {
1691
- if (!filterItem.field || !filterItem.value || !filterItem.operator) {
1692
- return null;
1693
- }
1694
- return params => {
1695
- if (filterItem.value.length === 0) {
1696
- return true;
1697
- }
1698
- const paramValues = Array.isArray(params.value) ? params.value : [params.value];
1699
- let match = false;
1700
- filterItem.value.forEach(filteredValue => {
1701
- paramValues.forEach(paramValue => {
1702
- if (String(paramValue).startsWith(filteredValue)) {
1703
- match = true;
1704
- }
1705
- });
1706
- });
1707
- return match;
1708
- };
1709
- },
1710
- InputComponent: GridFilterInputMultipleValue
1711
- };
1712
- const STARTS_WITH_ANY_OF = startsWithAnyOfOperator;
1713
-
1714
- const doesNotHaveAnyOf = {
1715
- label: "doesn't have any of",
1716
- value: 'doesNotHaveAnyOf',
1717
- getApplyFilterFn: filterItem => {
1718
- if (!filterItem.field || !filterItem.value || !Array.isArray(filterItem.value) || filterItem.value.length === 0) {
1719
- return null;
1720
- }
1721
- return params => {
1722
- const cellValues = Array.isArray(params.value) ? params.value : [params.value];
1723
-
1724
- // Return true only if none of the filter values are in the cell values
1725
- return filterItem.value.every(filterVal => !cellValues.map(value => String(value)).includes(filterVal));
1726
- };
1727
- },
1728
- InputComponent: GridFilterInputMultipleValue
1729
- };
1730
- const DOES_NOT_HAVE_ANY_OF = doesNotHaveAnyOf;
1731
- const DOES_NOT_HAVE_ANY_OF_WITH_SELECT = _objectSpread2(_objectSpread2({}, DOES_NOT_HAVE_ANY_OF), {}, {
1732
- InputComponent: GridFilterInputMultipleSingleSelect
1733
- });
1734
-
1735
- const getGridStringArrayOperators = () => [CONTAINS_ANY_OF, ENDS_WITH_ANY_OF, IS_ANY_OF, IS_NOT_ANY_OF, STARTS_WITH_ANY_OF];
1736
- const getGridStringArrayOperatorsWithSelect = () => [CONTAINS_ANY_OF, ENDS_WITH_ANY_OF, IS_ANY_OF_WITH_SELECT, IS_ANY_OF_WITH_SELECT, IS_NOT_WITH_SELECT, IS_WITH_SELECT, STARTS_WITH_ANY_OF];
1737
- const getGridStringArrayOperatorsWithSelectOnStringArrayColumns = () => [HAS_WITH_SELECT, HAS_ANY_OF_WITH_SELECT, HAS_ONLY_WITH_SELECT, DOES_NOT_HAVE_WITH_SELECT, DOES_NOT_HAVE_ANY_OF_WITH_SELECT];
1738
-
1739
- const getGridStringOperators = () => [...getGridStringOperators$1().filter(operator => !['isAnyOf'].includes(operator.value)), DOES_NOT_CONTAIN, DOES_NOT_EQUAL, ...getGridStringArrayOperators()];
1740
-
1741
- // istanbul ignore file
1742
- const operatorList = {
1743
- // Default types
1744
- string: getGridStringOperators$1(),
1745
- number: getGridNumericOperators$1(),
1746
- boolean: getGridBooleanOperators(),
1747
- date: getGridDateOperators(),
1748
- dateTime: getGridDateOperators(true),
1749
- singleSelect: getGridSingleSelectOperators(),
1750
- // Extended types
1751
- rsString: getGridStringOperators(),
1752
- rsNumber: getGridNumericOperators(),
1753
- rsSingleSelect: [CONTAINS_ANY_OF, ENDS_WITH_ANY_OF, IS_ANY_OF_WITH_SELECT, IS_NOT_WITH_SELECT, IS_WITH_SELECT, STARTS_WITH_ANY_OF],
1754
- rsSingleSelectWithShortOperatorList: [IS_WITH_SELECT, IS_NOT_WITH_SELECT, IS_ANY_OF_WITH_SELECT],
1755
- rsMultipleSelect: [HAS_WITH_SELECT, HAS_ANY_OF_WITH_SELECT, HAS_ONLY_WITH_SELECT, DOES_NOT_HAVE_WITH_SELECT, DOES_NOT_HAVE_ANY_OF_WITH_SELECT],
1756
- rsMultipleSelectWithShortOperatorList: [HAS_WITH_SELECT, DOES_NOT_HAVE_WITH_SELECT, HAS_ANY_OF_WITH_SELECT],
1757
- // Custom types
1758
- rsStringArray: getGridStringArrayOperators()
1759
- };
1760
-
1761
13
  const PAGINATION_MODEL_KEY = 'paginationModel';
1762
14
  const FILTER_MODEL_KEY = 'filterModel';
1763
15
  const SORT_MODEL_KEY = 'sortModel';
@@ -1896,39 +148,42 @@ const numberOperatorDecoder = {
1896
148
  lt: '<',
1897
149
  lte: '<='
1898
150
  };
1899
- const isOperatorValueValid = (field, operator, columns) => {
1900
- const column = columns.find(column => column.field === field);
151
+ const isOperatorValueValid = (columnField, operatorValue, columns) => {
152
+ const column = columns.find(column => column.field === columnField);
1901
153
  if (!column) {
1902
154
  return false;
1903
155
  }
1904
156
  const columnType = (column === null || column === void 0 ? void 0 : column.type) || 'string';
1905
- const operators = column.filterOperators || operatorList[columnType];
157
+ const operators = operatorList[columnType];
1906
158
  if (!operators) {
1907
159
  return false;
1908
160
  }
1909
- return !!operators.find(op => columnType === 'number' && Object.keys(numberOperatorEncoder).includes(op.value) ? numberOperatorEncoder[op.value] === operator : op.value === operator);
161
+ if ('filterOperators' in operators) {
162
+ return !!operators.filterOperators.find(op => columnType === 'number' && Object.keys(numberOperatorEncoder).includes(op.value) ? numberOperatorEncoder[op.value] === operatorValue : op['value'] === operatorValue);
163
+ }
164
+ return !!operators.find(op => ['number', 'rsNumber'].includes(columnType) && Object.keys(numberOperatorEncoder).includes(op.value) ? numberOperatorEncoder[op.value] === operatorValue : op['value'] === operatorValue);
1910
165
  };
1911
166
  const listOperators = ['containsAnyOf', 'doesNotContainAnyOf', 'endsWithAnyOf', 'doesNotEndWithAnyOf', 'hasAnyOf', 'doesNotHaveAnyOf', 'isAnyOf', 'isNotAnyOf', 'startsWithAnyOf', 'doesNotStartWithAnyOf'];
1912
167
 
1913
168
  // Check if the value doesn't break
1914
- const isValueValid = (value, field, columns, operator) => {
169
+ const isValueValid = (value, columnField, columns, operatorValue) => {
1915
170
  var _column$type;
1916
171
  // every field accepts undefined as value for default
1917
172
  if (value === undefined || value === '') {
1918
173
  return true;
1919
174
  }
1920
175
 
1921
- // xxxAnyOf accepts as value only lists, and we are declaring them in the
176
+ // xxxAnyOf accepts as value only lists, and we are declearing them in the
1922
177
  // URL as `list=[...]`
1923
- if (listOperators.includes(operator)) {
178
+ if (listOperators.includes(operatorValue)) {
1924
179
  return Array.isArray(value) || value === '';
1925
180
  }
1926
181
 
1927
182
  // We are accepting arrays only if they are of the 'xxxAnyOf' type
1928
- if (Array.isArray(value) && !listOperators.includes(operator)) {
183
+ if (Array.isArray(value) && !listOperators.includes(operatorValue)) {
1929
184
  return false;
1930
185
  }
1931
- const column = columns.find(column => column.field === field);
186
+ const column = columns.find(column => column.field === columnField);
1932
187
  if (!column) {
1933
188
  return false;
1934
189
  }
@@ -1966,7 +221,7 @@ const getFilterModelFromString = (searchString, columns) => {
1966
221
  if (!searchString) {
1967
222
  return 'invalid';
1968
223
  }
1969
- let logicOperator = GridLogicOperator.And;
224
+ let linkOperator = GridLinkOperator.And;
1970
225
  let quickFilterValues = [];
1971
226
  const searchParams = new URLSearchParams();
1972
227
  for (const [key, value] of new URLSearchParams(searchString)) {
@@ -1974,7 +229,7 @@ const getFilterModelFromString = (searchString, columns) => {
1974
229
  searchParams.set(key, value);
1975
230
  }
1976
231
  if (key === '_logicOperator') {
1977
- logicOperator = value === GridLogicOperator.And || value === GridLogicOperator.Or ? value : GridLogicOperator.And;
232
+ linkOperator = value;
1978
233
  }
1979
234
  if (key === '_quickFilterValues') {
1980
235
  try {
@@ -1993,7 +248,7 @@ const getFilterModelFromString = (searchString, columns) => {
1993
248
  if (isInvalid) {
1994
249
  return;
1995
250
  }
1996
- const field = key.split('[')[0].slice(1);
251
+ const field = key.split('[')[0].slice(1); // Slice to remove the _ at the beginning
1997
252
  if (!fields.includes(field)) {
1998
253
  return;
1999
254
  }
@@ -2010,6 +265,7 @@ const getFilterModelFromString = (searchString, columns) => {
2010
265
  return;
2011
266
  }
2012
267
  const operator = splitRight[0];
268
+ // if the operator is not part of the valid operators invalidate the URL
2013
269
  if (!isOperatorValueValid(field, operator, columns) || Array.isArray(operator)) {
2014
270
  isInvalid = true;
2015
271
  return;
@@ -2021,37 +277,41 @@ const getFilterModelFromString = (searchString, columns) => {
2021
277
  return;
2022
278
  }
2023
279
  items.push({
2024
- field,
2025
- operator: columnType === 'number' && Object.keys(numberOperatorDecoder).includes(operator) ? numberOperatorDecoder[operator] : operator,
280
+ columnField: field,
281
+ operatorValue: ['number', 'rsNumber'].includes(columnType) && Object.keys(numberOperatorDecoder).includes(operator) ? numberOperatorDecoder[operator] : operator,
2026
282
  id,
2027
283
  value: listOperators.includes(operator) && decodedValue === '' ? [] : decodedValue,
2028
284
  type
2029
285
  });
2030
286
  });
287
+
288
+ // If we found some condition that results in an invalid URL,
289
+ // return the empty filterModel (this will trigger the localStorage)
290
+ // and will pick up the last valid search
2031
291
  if (isInvalid) {
2032
292
  return 'invalid';
2033
293
  }
2034
294
  return {
2035
295
  items,
2036
- logicOperator,
296
+ linkOperator,
2037
297
  quickFilterValues
2038
298
  };
2039
299
  };
2040
300
  const getSearchParamsFromFilterModel = filterModel => {
2041
301
  var _filterModel$quickFil;
2042
302
  const searchParams = new URLSearchParams();
2043
- searchParams.set('_logicOperator', filterModel['logicOperator'] || '');
303
+ searchParams.set('_logicOperator', filterModel['linkOperator'] || '');
2044
304
  filterModel['items'].forEach(item => {
2045
305
  const {
2046
- field,
2047
- operator,
306
+ columnField,
307
+ operatorValue,
2048
308
  value,
2049
309
  type
2050
310
  } = item;
2051
- if (Object.keys(numberOperatorEncoder).includes(operator)) {
2052
- searchParams.set(`_${field}[${numberOperatorEncoder[operator]},${encodeValue(type)}]`, encodeValue(value));
311
+ if (Object.keys(numberOperatorEncoder).includes(operatorValue)) {
312
+ searchParams.set(`_${columnField}[${numberOperatorEncoder[operatorValue]},${encodeValue(type)}]`, encodeValue(value));
2053
313
  } else {
2054
- searchParams.set(`_${field}[${encodeValue(operator)},${encodeValue(type)}]`, encodeValue(value));
314
+ searchParams.set(`_${columnField}[${encodeValue(operatorValue)},${encodeValue(type)}]`, encodeValue(value));
2055
315
  }
2056
316
  });
2057
317
  if ((_filterModel$quickFil = filterModel.quickFilterValues) !== null && _filterModel$quickFil !== void 0 && _filterModel$quickFil.length) {
@@ -2067,7 +327,7 @@ const getSearchParamsFromFilterModel = filterModel => {
2067
327
  const getFilterModel = (search, columns, localStorageFilters, setLocalStorageFilters, initialState, isNewVersion) => {
2068
328
  const defaultValue = initialState && initialState.filter && initialState.filter.filterModel ? initialState.filter.filterModel : {
2069
329
  items: [],
2070
- logicOperator: GridLogicOperator.And
330
+ linkOperator: GridLinkOperator.And
2071
331
  };
2072
332
  if (isNewVersion) {
2073
333
  return defaultValue;
@@ -2206,38 +466,13 @@ const getPaginationModel = (search, localStoragePagination, setLocalStoragePagin
2206
466
 
2207
467
  /** COLUMN VISIBILITY */
2208
468
 
2209
- const getColumnVisibilityFromString = (searchString, columns) => {
2210
- if (!searchString) {
2211
- return 'invalid';
2212
- }
2213
- const searchParams = new URLSearchParams(searchString);
2214
- const value = searchParams.get('_columnVisibility');
2215
- if (value === '' || value === null || value === '[]') {
2216
- return 'invalid';
2217
- }
2218
- const parsedFields = value.slice(1, value.length - 1).split(',');
2219
- const fields = columns.map(column => column.field);
2220
- const visibility = {};
2221
- for (const field of fields) {
2222
- visibility[field] = false;
2223
- }
2224
- for (const parsedField of parsedFields) {
2225
- if (fields.includes(parsedField)) {
2226
- visibility[parsedField] = true;
2227
- }
2228
- }
2229
- if (Object.values(visibility).filter(v => v === true).length === 0) {
2230
- return 'invalid';
2231
- }
2232
- return visibility;
2233
- };
2234
469
  const getSearchParamsFromColumnVisibility = (columnVisibility, columns) => {
2235
470
  const searchParams = new URLSearchParams();
2236
- const fields = columns.map(column => column.field);
471
+ const columnFields = columns.map(column => column.field);
2237
472
 
2238
473
  // if column visibility model is empty, show all columns
2239
474
  if (Object.keys(columnVisibility).length == 0) {
2240
- searchParams.set('_columnVisibility', `[${fields.join(',')}]`);
475
+ searchParams.set('_columnVisibility', `[${columnFields.join(',')}]`);
2241
476
  return searchParams;
2242
477
  }
2243
478
  const finalColumnVisibility = columns.filter(c => {
@@ -2248,10 +483,63 @@ const getSearchParamsFromColumnVisibility = (columnVisibility, columns) => {
2248
483
  [colName]: true
2249
484
  });
2250
485
  }, columnVisibility);
2251
- const visibleColumns = fields.filter(column => finalColumnVisibility[column] !== false);
486
+ const visibleColumns = Object.entries(finalColumnVisibility)
487
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
488
+ .filter(_ref => {
489
+ let [_, visible] = _ref;
490
+ return visible;
491
+ })
492
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
493
+ .map(_ref2 => {
494
+ let [column, _] = _ref2;
495
+ return encodeValue(column);
496
+ });
2252
497
  searchParams.set('_columnVisibility', `[${visibleColumns.join(',')}]`);
2253
498
  return searchParams;
2254
499
  };
500
+ const getColumnVisibilityFromString = (notParsed, tableColumns) => {
501
+ if (!notParsed || notParsed.length === 1 && notParsed[0] === '?') {
502
+ return 'invalid';
503
+ }
504
+ // remove the initial ? if present
505
+ const parsed = notParsed[0] === '?' ? notParsed.slice(1) : notParsed;
506
+ const visibility = {};
507
+ let exist = false;
508
+ let visibleColumnsCount = 0;
509
+ for (const item of parsed.split('&')) {
510
+ // if it's not column visibility field, skip
511
+ const fieldURL = item.split('=')[0];
512
+ if (fieldURL !== '_columnVisibility') {
513
+ continue;
514
+ }
515
+ // e.g. item = _columnVisibility[abc,def]
516
+ const left = item.split(']')[0];
517
+ if (left.split('[').length < 2) {
518
+ continue;
519
+ }
520
+ const encodedValues = item.split('[')[1].split(']')[0];
521
+ if (typeof encodedValues !== 'string') {
522
+ continue;
523
+ }
524
+ exist = true;
525
+ const columnFields = tableColumns.map(column => column.field);
526
+ // TODO: Add validation that , is present
527
+ const columns = encodedValues.split(',').map(value => decodeValue(value));
528
+
529
+ // for each column, check if it's visible and add it to visibility model
530
+ for (const column of columnFields) {
531
+ const isColumnVisible = columns.includes(column);
532
+ visibility[column] = isColumnVisible;
533
+ if (isColumnVisible) {
534
+ visibleColumnsCount += 1;
535
+ }
536
+ }
537
+ }
538
+ if (visibleColumnsCount === 0 && !exist) {
539
+ return 'invalid';
540
+ }
541
+ return visibility;
542
+ };
2255
543
 
2256
544
  // Rules:
2257
545
  // - if we have something in the URL, use that info
@@ -2312,8 +600,8 @@ const getPinnedColumnsFromString = (notParsed, tableColumns) => {
2312
600
  if (typeof encodedValues !== 'string') {
2313
601
  continue;
2314
602
  }
2315
- const fields = [...tableColumns.map(column => column.field), '__check__'];
2316
- const columns = encodedValues.split(',').map(value => decodeValue(value)).filter(val => typeof val === 'string' && fields.includes(val));
603
+ const columnFields = [...tableColumns.map(column => column.field), '__check__'];
604
+ const columns = encodedValues.split(',').map(value => decodeValue(value)).filter(val => typeof val === 'string' && columnFields.includes(val));
2317
605
  if (fieldURL === '_pinnedColumnsLeft') {
2318
606
  pinnedColumns['left'] = columns;
2319
607
  }
@@ -2321,9 +609,9 @@ const getPinnedColumnsFromString = (notParsed, tableColumns) => {
2321
609
  pinnedColumns['right'] = columns;
2322
610
  }
2323
611
  }
2324
- return pinnedColumns.left && pinnedColumns.left.length > 0 || pinnedColumns.right && pinnedColumns.right.length > 0 ? {
2325
- left: pinnedColumns.left || [],
2326
- right: pinnedColumns.right || []
612
+ return pinnedColumns['left'] || pinnedColumns['right'] ? {
613
+ left: pinnedColumns['left'] || [],
614
+ right: pinnedColumns['right'] || []
2327
615
  } : 'invalid';
2328
616
  };
2329
617
  const getSearchParamsFromPinnedColumns = pinnedColumns => {
@@ -2373,7 +661,7 @@ const getSearchParamsFromTab = search => {
2373
661
  }
2374
662
  return searchParams;
2375
663
  };
2376
- const getFinalSearch = _ref => {
664
+ const getFinalSearch = _ref3 => {
2377
665
  let {
2378
666
  search,
2379
667
  localStorageVersion,
@@ -2383,7 +671,7 @@ const getFinalSearch = _ref => {
2383
671
  columnsVisibilityModel,
2384
672
  pinnedColumnsModel,
2385
673
  columns
2386
- } = _ref;
674
+ } = _ref3;
2387
675
  const filterModelSearch = getSearchParamsFromFilterModel(filterModel);
2388
676
  const sortModelSearch = getSearchParamsFromSorting(sortModel);
2389
677
  const paginationModelSearch = getSearchParamsFromPagination(paginationModel);
@@ -2448,14 +736,14 @@ const getModelsParsedOrUpdateLocalStorage = (search, localStorageVersion, column
2448
736
  pinnedColumnsModel
2449
737
  };
2450
738
  };
2451
- const updateUrl = (_ref2, search, localStorageVersion, historyReplace, columns) => {
739
+ const updateUrl = (_ref4, search, localStorageVersion, historyReplace, columns) => {
2452
740
  let {
2453
741
  filterModel,
2454
742
  sortModel,
2455
743
  paginationModel,
2456
744
  columnsModel: columnsVisibilityModel,
2457
745
  pinnedColumnsModel
2458
- } = _ref2;
746
+ } = _ref4;
2459
747
  const newSearch = getFinalSearch({
2460
748
  search,
2461
749
  localStorageVersion,
@@ -2476,17 +764,17 @@ const updateUrl = (_ref2, search, localStorageVersion, historyReplace, columns)
2476
764
  // do not use it for equivalence (e.g. with value `3` and undefined we
2477
765
  // will get 0).
2478
766
  const compareFilters = (firstFilter, secondFilter) => {
2479
- if (firstFilter.field < secondFilter.field) {
767
+ if (firstFilter.columnField < secondFilter.columnField) {
2480
768
  return -1;
2481
- } else if (firstFilter.field > secondFilter.field) {
769
+ } else if (firstFilter.columnField > secondFilter.columnField) {
2482
770
  return 1;
2483
771
  }
2484
- if (firstFilter.operator === undefined || secondFilter.operator === undefined) {
772
+ if (firstFilter.operatorValue === undefined || secondFilter.operatorValue === undefined) {
2485
773
  return 0;
2486
774
  }
2487
- if (firstFilter.operator < secondFilter.operator) {
775
+ if (firstFilter.operatorValue < secondFilter.operatorValue) {
2488
776
  return -1;
2489
- } else if (firstFilter.operator > secondFilter.operator) {
777
+ } else if (firstFilter.operatorValue > secondFilter.operatorValue) {
2490
778
  return 1;
2491
779
  }
2492
780
  if (firstFilter.value < secondFilter.value) {
@@ -2497,18 +785,18 @@ const compareFilters = (firstFilter, secondFilter) => {
2497
785
  return 0;
2498
786
  };
2499
787
  const areFiltersEquivalent = (firstFilter, secondFilter) => {
2500
- return firstFilter.field === secondFilter.field && firstFilter.operator === secondFilter.operator && firstFilter.value === secondFilter.value;
788
+ return firstFilter.columnField === secondFilter.columnField && firstFilter.operatorValue === secondFilter.operatorValue && firstFilter.value === secondFilter.value;
2501
789
  };
2502
790
  const areFilterModelsEquivalent = (filterModel, filterModelToMatch) => {
2503
791
  const {
2504
792
  items,
2505
- logicOperator
793
+ linkOperator
2506
794
  } = filterModel;
2507
795
  const {
2508
796
  items: itemsToMatch,
2509
- logicOperator: logicOperatorToMatch
797
+ linkOperator: linkOperatorToMatch
2510
798
  } = filterModelToMatch;
2511
- if (logicOperator !== logicOperatorToMatch) {
799
+ if (linkOperator !== linkOperatorToMatch) {
2512
800
  return false;
2513
801
  }
2514
802
  if (items.length !== itemsToMatch.length) {
@@ -2521,7 +809,7 @@ const areFilterModelsEquivalent = (filterModel, filterModelToMatch) => {
2521
809
  const filterToCompare = itemsToMatch[i];
2522
810
 
2523
811
  // compareFilters return 0 if and only if the filters have the same
2524
- // field, operator, and value
812
+ // columnField, operatorValue, and value
2525
813
  if (!areFiltersEquivalent(filter, filterToCompare)) {
2526
814
  return false;
2527
815
  }
@@ -2530,6 +818,8 @@ const areFilterModelsEquivalent = (filterModel, filterModelToMatch) => {
2530
818
  };
2531
819
 
2532
820
  // Get and Set data from LocalStorage WITHOUT useState
821
+
822
+ // triggering a state update and consecutive re-render
2533
823
  const useFetchState = (defaultValue, key) => {
2534
824
  let stickyValue = null;
2535
825
  try {
@@ -2537,7 +827,16 @@ const useFetchState = (defaultValue, key) => {
2537
827
  } catch (e) {
2538
828
  console.error('StatefulDataGrid: error getting item from local storage: ', e);
2539
829
  }
2540
- const parsedValue = stickyValue !== null && stickyValue !== undefined && stickyValue !== 'undefined' ? JSON.parse(stickyValue) : defaultValue;
830
+ let parsedValue = stickyValue !== null && stickyValue !== undefined && stickyValue !== 'undefined' ? JSON.parse(stickyValue) : defaultValue;
831
+
832
+ // TODO: temporary workaround to avoid clashes when someone had sorting on the now-removed screenshot field (renamed to num_annotations)
833
+ // Consider upgrading the Datagrid component library as the exception handling was added in this PR: https://github.com/mui-org/material-ui-x/pull/3224
834
+ if (parsedValue instanceof Array) {
835
+ const fields = (parsedValue || []).map(item => item.field);
836
+ if (fields.includes('screenshot') || fields.includes('diffs')) {
837
+ parsedValue = defaultValue;
838
+ }
839
+ }
2541
840
  const updateValue = useCallback(value => {
2542
841
  try {
2543
842
  window.localStorage.setItem(key, JSON.stringify(value));
@@ -2548,8 +847,6 @@ const useFetchState = (defaultValue, key) => {
2548
847
  return [parsedValue, updateValue];
2549
848
  };
2550
849
 
2551
- // import useLocalStorage from './useLocalStorage';
2552
-
2553
850
  const useTableStates = (id, version) => {
2554
851
  const [paginationModel, setPaginationModel] = useFetchState('', buildStorageKey({
2555
852
  id,
@@ -2606,7 +903,8 @@ const useStatefulTable = props => {
2606
903
  onColumnVisibilityModelChange: propsOnColumnVisibilityModelChange,
2607
904
  onColumnWidthChange: propsOnColumnWidthChange,
2608
905
  onFilterModelChange: propsOnFilterModelChange,
2609
- onPaginationModelChange: propsOnPaginationModelChange,
906
+ onPageChange: propsOnPageChange,
907
+ onPageSizeChange: propsOnPageSizeChange,
2610
908
  onPinnedColumnsChange: propsOnPinnedColumnsChange,
2611
909
  onSortModelChange: propsOnSortModelChange,
2612
910
  useRouter,
@@ -2636,7 +934,7 @@ const useStatefulTable = props => {
2636
934
  setDimensionModel
2637
935
  } = useTableStates(id, localStorageVersion);
2638
936
 
2639
- // clearing up old version keys, triggering only on first render
937
+ // clearing up old version keys
2640
938
  useEffect(() => clearPreviousVersionStorage(id, previousLocalStorageVersions), [id, previousLocalStorageVersions]);
2641
939
  const onColumnDimensionChange = useCallback(_ref => {
2642
940
  let {
@@ -2669,6 +967,7 @@ const useStatefulTable = props => {
2669
967
  column.width = dimensionModel[column.field] || column.width || 100;
2670
968
  return column;
2671
969
  }), [propsColumns, dimensionModel]);
970
+
2672
971
  /** Add resetPage method to apiRef. */
2673
972
  apiRef.current.resetPage = () => {
2674
973
  apiRef.current.setPage(0);
@@ -2679,7 +978,7 @@ const useStatefulTable = props => {
2679
978
  onFilterModelChange: (model, details) => {
2680
979
  const filterModel = _objectSpread2(_objectSpread2({}, model), {}, {
2681
980
  items: model.items.map(item => {
2682
- const column = apiRef.current.getColumn(item.field);
981
+ const column = apiRef.current.getColumn(item.columnField);
2683
982
  item.type = column.type || 'string';
2684
983
  return item;
2685
984
  }),
@@ -2717,16 +1016,33 @@ const useStatefulTable = props => {
2717
1016
  }, search, localStorageVersion, historyReplace, columns);
2718
1017
  },
2719
1018
  pinnedColumns: pinnedColumnsModel,
2720
- paginationModel: paginationModelParsed,
2721
- onPaginationModelChange: (model, details) => {
2722
- const paginationModel = _objectSpread2(_objectSpread2({}, model), {}, {
2723
- direction: paginationModelParsed.page < model.page ? 'next' : 'back'
2724
- });
2725
- propsOnPaginationModelChange === null || propsOnPaginationModelChange === void 0 ? void 0 : propsOnPaginationModelChange(paginationModel, details);
1019
+ page: paginationModelParsed.page,
1020
+ pageSize: paginationModelParsed.pageSize,
1021
+ onPageChange: (page, details) => {
1022
+ const direction = paginationModelParsed.page < page ? 'next' : 'back';
1023
+ propsOnPageChange === null || propsOnPageChange === void 0 ? void 0 : propsOnPageChange(page, details);
2726
1024
  updateUrl({
2727
1025
  filterModel: filterParsed,
2728
1026
  sortModel: sortModelParsed,
2729
- paginationModel: paginationModel,
1027
+ paginationModel: {
1028
+ page,
1029
+ pageSize: paginationModelParsed.pageSize,
1030
+ direction
1031
+ },
1032
+ columnsModel: apiRef.current.state.columns.columnVisibilityModel,
1033
+ pinnedColumnsModel: pinnedColumnsModel
1034
+ }, search, localStorageVersion, historyReplace, columns);
1035
+ },
1036
+ onPageSizeChange: (pageSize, details) => {
1037
+ propsOnPageSizeChange === null || propsOnPageSizeChange === void 0 ? void 0 : propsOnPageSizeChange(pageSize, details);
1038
+ updateUrl({
1039
+ filterModel: filterParsed,
1040
+ sortModel: sortModelParsed,
1041
+ paginationModel: {
1042
+ page: paginationModelParsed.page,
1043
+ pageSize,
1044
+ direction: paginationModelParsed.direction
1045
+ },
2730
1046
  columnsModel: apiRef.current.state.columns.columnVisibilityModel,
2731
1047
  pinnedColumnsModel: pinnedColumnsModel
2732
1048
  }, search, localStorageVersion, historyReplace, columns);
@@ -2752,7 +1068,7 @@ const useStatefulTable = props => {
2752
1068
  };
2753
1069
  };
2754
1070
 
2755
- const _excluded = ["apiRef", "autoHeight", "className", "columns", "slots", "slotProps", "filterModel", "columnVisibilityModel", "pinnedColumns", "sortModel", "paginationModel", "height", "hideToolbar", "initialState", "isRowSelectable", "license", "localStorageVersion", "previousLocalStorageVersions", "onFilterModelChange", "rowSelectionModel", "onColumnWidthChange", "onPaginationModelChange", "onRowSelectionModelChange", "onColumnVisibilityModelChange", "onPinnedColumnsChange", "onSortModelChange", "pagination", "paginationPlacement", "paginationProps", "rows", "pageSizeOptions", "sx", "theme", "useRouter", "paginationMode", "rowCount"];
1071
+ const _excluded = ["apiRef", "autoHeight", "className", "columns", "columnTypes", "components", "componentsProps", "filterModel", "columnVisibilityModel", "pinnedColumns", "sortModel", "page", "pageSize", "height", "hideToolbar", "initialState", "isRowSelectable", "license", "localStorageVersion", "previousLocalStorageVersions", "onFilterModelChange", "selectionModel", "onColumnWidthChange", "onPageChange", "onPageSizeChange", "onSelectionModelChange", "onColumnVisibilityModelChange", "onPinnedColumnsChange", "onSortModelChange", "pagination", "paginationPlacement", "paginationProps", "rows", "rowsPerPageOptions", "sx", "theme", "useRouter", "paginationMode", "rowCount"];
2756
1072
  const COMPONENT_NAME = 'DataGrid';
2757
1073
  const CLASSNAME = 'redsift-datagrid';
2758
1074
  const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
@@ -2762,13 +1078,15 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
2762
1078
  autoHeight,
2763
1079
  className,
2764
1080
  columns,
2765
- slots,
2766
- slotProps,
1081
+ columnTypes: propsColumnTypes,
1082
+ components,
1083
+ componentsProps,
2767
1084
  filterModel: propsFilterModel,
2768
1085
  columnVisibilityModel: propsColumnVisibilityModel,
2769
1086
  pinnedColumns: propsPinnedColumns,
2770
1087
  sortModel: propsSortModel,
2771
- paginationModel: propsPaginationModel,
1088
+ page: propsPage,
1089
+ pageSize: propsPageSize,
2772
1090
  height: propsHeight,
2773
1091
  hideToolbar,
2774
1092
  initialState,
@@ -2777,10 +1095,11 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
2777
1095
  localStorageVersion,
2778
1096
  previousLocalStorageVersions,
2779
1097
  onFilterModelChange: propsOnFilterModelChange,
2780
- rowSelectionModel: propsRowSelectionModel,
1098
+ selectionModel: propsSelectionModel,
2781
1099
  onColumnWidthChange: propsOnColumnWidthChange,
2782
- onPaginationModelChange: propsOnPaginationModelChange,
2783
- onRowSelectionModelChange: propsOnRowSelectionModelChange,
1100
+ onPageChange: propsOnPageChange,
1101
+ onPageSizeChange: propsOnPageSizeChange,
1102
+ onSelectionModelChange: propsOnSelectionModelChange,
2784
1103
  onColumnVisibilityModelChange: propsOnColumnVisibilityModelChange,
2785
1104
  onPinnedColumnsChange: propsOnPinnedColumnsChange,
2786
1105
  onSortModelChange: propsOnSortModelChange,
@@ -2788,7 +1107,7 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
2788
1107
  paginationPlacement = 'both',
2789
1108
  paginationProps,
2790
1109
  rows,
2791
- pageSizeOptions,
1110
+ rowsPerPageOptions,
2792
1111
  sx,
2793
1112
  theme: propsTheme,
2794
1113
  useRouter,
@@ -2796,41 +1115,46 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
2796
1115
  rowCount
2797
1116
  } = props,
2798
1117
  forwardedProps = _objectWithoutProperties(props, _excluded);
2799
- const theme = useTheme$1(propsTheme);
1118
+ const theme = useTheme(propsTheme);
2800
1119
  const _apiRef = useGridApiRef();
2801
1120
  const apiRef = propsApiRef !== null && propsApiRef !== void 0 ? propsApiRef : _apiRef;
2802
- const RenderedToolbar = slots !== null && slots !== void 0 && slots.toolbar ? slots.toolbar : Toolbar;
1121
+ const RenderedToolbar = components !== null && components !== void 0 && components.Toolbar ? components.Toolbar : Toolbar;
2803
1122
  LicenseInfo.setLicenseKey(license);
2804
1123
  const height = propsHeight !== null && propsHeight !== void 0 ? propsHeight : autoHeight ? undefined : '500px';
2805
1124
  const {
2806
1125
  onColumnVisibilityModelChange: controlledOnColumnVisibilityModelChange,
2807
1126
  onFilterModelChange: controlledOnFilterModelChange,
2808
- onPaginationModelChange: controlledOnPaginationModelChange,
1127
+ onPageChange: controlledOnPageChange,
1128
+ onPageSizeChange: controlledOnPageSizeChange,
2809
1129
  onPinnedColumnsChange: controlledOnPinnedColumnsChange,
2810
1130
  onSortModelChange: controlledOnSortModelChange
2811
1131
  } = useControlledDatagridState({
2812
1132
  initialState,
2813
- pageSizeOptions,
1133
+ rowsPerPageOptions,
2814
1134
  propsColumnVisibilityModel,
2815
1135
  propsFilterModel,
2816
1136
  propsOnColumnVisibilityModelChange,
2817
1137
  propsOnFilterModelChange,
2818
1138
  propsOnPinnedColumnsChange,
2819
1139
  propsOnSortModelChange,
2820
- propsPaginationModel,
1140
+ propsPage,
1141
+ propsPageSize,
2821
1142
  propsPinnedColumns,
2822
1143
  propsSortModel,
2823
- propsOnPaginationModelChange
1144
+ propsOnPageChange,
1145
+ propsOnPageSizeChange
2824
1146
  });
2825
1147
  const {
2826
1148
  columnVisibilityModel,
2827
1149
  filterModel,
2828
1150
  onColumnVisibilityModelChange,
2829
1151
  onFilterModelChange,
2830
- onPaginationModelChange,
1152
+ onPageChange,
1153
+ onPageSizeChange,
2831
1154
  onPinnedColumnsChange,
2832
1155
  onSortModelChange,
2833
- paginationModel,
1156
+ page,
1157
+ pageSize,
2834
1158
  pinnedColumns,
2835
1159
  sortModel,
2836
1160
  onColumnWidthChange
@@ -2841,39 +1165,40 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
2841
1165
  onColumnVisibilityModelChange: controlledOnColumnVisibilityModelChange,
2842
1166
  onColumnWidthChange: propsOnColumnWidthChange,
2843
1167
  onFilterModelChange: controlledOnFilterModelChange,
2844
- onPaginationModelChange: controlledOnPaginationModelChange,
1168
+ onPageChange: controlledOnPageChange,
1169
+ onPageSizeChange: controlledOnPageSizeChange,
2845
1170
  onPinnedColumnsChange: controlledOnPinnedColumnsChange,
2846
1171
  onSortModelChange: controlledOnSortModelChange,
2847
1172
  useRouter: useRouter,
2848
1173
  localStorageVersion,
2849
1174
  previousLocalStorageVersions
2850
1175
  });
2851
- const [rowSelectionModel, setRowSelectionModel] = useState(propsRowSelectionModel !== null && propsRowSelectionModel !== void 0 ? propsRowSelectionModel : []);
1176
+ const [selectionModel, setSelectionModel] = useState(propsSelectionModel !== null && propsSelectionModel !== void 0 ? propsSelectionModel : []);
2852
1177
  useEffect(() => {
2853
- setRowSelectionModel(propsRowSelectionModel !== null && propsRowSelectionModel !== void 0 ? propsRowSelectionModel : []);
2854
- }, [propsRowSelectionModel]);
2855
- const onRowSelectionModelChange = (selectionModel, details) => {
2856
- if (propsOnRowSelectionModelChange) {
2857
- propsOnRowSelectionModelChange(selectionModel, details);
1178
+ setSelectionModel(propsSelectionModel !== null && propsSelectionModel !== void 0 ? propsSelectionModel : []);
1179
+ }, [propsSelectionModel]);
1180
+ const onSelectionModelChange = (selectionModel, details) => {
1181
+ if (propsOnSelectionModelChange) {
1182
+ propsOnSelectionModelChange(selectionModel, details);
2858
1183
  } else {
2859
- setRowSelectionModel(selectionModel);
1184
+ setSelectionModel(selectionModel);
2860
1185
  }
2861
1186
  };
2862
1187
  const selectionStatus = useRef({
2863
1188
  type: 'none',
2864
1189
  numberOfSelectedRows: 0,
2865
1190
  numberOfSelectedRowsInPage: 0,
2866
- page: paginationModel.page,
2867
- pageSize: paginationModel.pageSize
1191
+ page,
1192
+ pageSize: pageSize
2868
1193
  });
2869
1194
 
2870
1195
  // in server-side pagination we want to update the selection status
2871
1196
  // every time we navigate between pages, resize our page or select something
2872
1197
  useEffect(() => {
2873
1198
  if (paginationMode == 'server') {
2874
- onServerSideSelectionStatusChange(Array.isArray(rowSelectionModel) ? rowSelectionModel : [rowSelectionModel], apiRef, selectionStatus, isRowSelectable, paginationModel.page, paginationModel.pageSize);
1199
+ onServerSideSelectionStatusChange(Array.isArray(selectionModel) ? selectionModel : [selectionModel], apiRef, selectionStatus, isRowSelectable, page, pageSize);
2875
1200
  }
2876
- }, [rowSelectionModel, paginationModel.page, paginationModel.pageSize]);
1201
+ }, [selectionModel, page, pageSize]);
2877
1202
  if (!Array.isArray(rows)) {
2878
1203
  return null;
2879
1204
  }
@@ -2899,20 +1224,22 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
2899
1224
  ref: datagridRef,
2900
1225
  className: classNames(StatefulDataGrid.className, className),
2901
1226
  $height: height
2902
- }, /*#__PURE__*/React__default.createElement(DataGridPro, _extends$1({}, forwardedProps, {
1227
+ }, /*#__PURE__*/React__default.createElement(DataGridPro, _extends({}, forwardedProps, {
2903
1228
  apiRef: apiRef,
2904
1229
  columns: columns,
2905
1230
  columnVisibilityModel: columnVisibilityModel,
2906
1231
  filterModel: filterModel,
2907
1232
  onColumnVisibilityModelChange: onColumnVisibilityModelChange,
2908
1233
  onFilterModelChange: onFilterModelChange,
2909
- onPaginationModelChange: onPaginationModelChange,
1234
+ onPageChange: onPageChange,
1235
+ onPageSizeChange: onPageSizeChange,
2910
1236
  onPinnedColumnsChange: onPinnedColumnsChange,
2911
1237
  onSortModelChange: onSortModelChange,
2912
- paginationModel: paginationModel,
1238
+ page: page,
1239
+ pageSize: pageSize,
2913
1240
  pinnedColumns: pinnedColumns,
2914
1241
  sortModel: sortModel,
2915
- pageSizeOptions: pageSizeOptions,
1242
+ rowsPerPageOptions: rowsPerPageOptions,
2916
1243
  onColumnWidthChange: onColumnWidthChange,
2917
1244
  initialState: initialState,
2918
1245
  isRowSelectable: isRowSelectable,
@@ -2923,74 +1250,79 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
2923
1250
  rowCount: rowCount,
2924
1251
  autoHeight: autoHeight,
2925
1252
  checkboxSelectionVisibleOnly: Boolean(pagination),
2926
- slots: _objectSpread2(_objectSpread2({
2927
- baseButton: BaseButton,
2928
- baseCheckbox: BaseCheckbox,
2929
- // baseTextField,
2930
- basePopper: BasePopper,
2931
- columnFilteredIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
1253
+ columnTypes: _objectSpread2(_objectSpread2({}, customColumnTypes), propsColumnTypes),
1254
+ components: _objectSpread2(_objectSpread2({
1255
+ BaseButton,
1256
+ BaseCheckbox,
1257
+ // BaseTextField,
1258
+ BasePopper,
1259
+ ColumnFilteredIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends({}, props, {
2932
1260
  displayName: "ColumnFilteredIcon"
2933
1261
  })),
2934
- columnSelectorIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
1262
+ ColumnSelectorIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends({}, props, {
2935
1263
  displayName: "ColumnSelectorIcon"
2936
1264
  })),
2937
- columnSortedAscendingIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
1265
+ ColumnSortedAscendingIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends({}, props, {
2938
1266
  displayName: "ColumnSortedAscendingIcon"
2939
1267
  })),
2940
- columnSortedDescendingIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
1268
+ ColumnSortedDescendingIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends({}, props, {
2941
1269
  displayName: "ColumnSortedDescendingIcon"
2942
1270
  })),
2943
- densityCompactIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
1271
+ DensityCompactIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends({}, props, {
2944
1272
  displayName: "DensityCompactIcon"
2945
1273
  })),
2946
- densityStandardIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
1274
+ DensityStandardIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends({}, props, {
2947
1275
  displayName: "DensityStandardIcon"
2948
1276
  })),
2949
- densityComfortableIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
1277
+ DensityComfortableIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends({}, props, {
2950
1278
  displayName: "DensityComfortableIcon"
2951
1279
  })),
2952
- detailPanelCollapseIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
1280
+ DetailPanelCollapseIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends({}, props, {
2953
1281
  displayName: "DetailPanelCollapseIcon"
2954
1282
  })),
2955
- detailPanelExpandIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
1283
+ DetailPanelExpandIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends({}, props, {
2956
1284
  displayName: "DetailPanelExpandIcon"
2957
1285
  })),
2958
- exportIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
1286
+ ExportIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends({}, props, {
2959
1287
  displayName: "ExportIcon"
2960
1288
  })),
2961
- openFilterButtonIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({
1289
+ OpenFilterButtonIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends({
2962
1290
  displayName: "OpenFilterButtonIcon"
2963
1291
  }, props))
2964
- }, slots), {}, {
2965
- toolbar: ToolbarWrapper,
2966
- pagination: props => {
2967
- return pagination ? paginationMode == 'server' ? /*#__PURE__*/React__default.createElement(ServerSideControlledPagination, _extends$1({}, props, {
1292
+ }, components), {}, {
1293
+ Toolbar: ToolbarWrapper,
1294
+ Pagination: props => {
1295
+ return pagination ? paginationMode == 'server' ? /*#__PURE__*/React__default.createElement(ServerSideControlledPagination, _extends({}, props, {
2968
1296
  displaySelection: false,
2969
1297
  displayRowsPerPage: ['bottom', 'both'].includes(paginationPlacement),
2970
1298
  displayPagination: ['bottom', 'both'].includes(paginationPlacement),
2971
1299
  selectionStatus: selectionStatus.current,
2972
- paginationModel: paginationModel,
2973
- onPaginationModelChange: onPaginationModelChange,
2974
- pageSizeOptions: pageSizeOptions,
1300
+ page: page,
1301
+ pageSize: pageSize,
1302
+ onPageChange: onPageChange,
1303
+ onPageSizeChange: onPageSizeChange,
1304
+ rowsPerPageOptions: rowsPerPageOptions,
2975
1305
  paginationProps: paginationProps,
2976
1306
  paginationMode: paginationMode,
2977
1307
  rowCount: rowCount
2978
- })) : /*#__PURE__*/React__default.createElement(ControlledPagination, _extends$1({}, props, {
1308
+ })) : /*#__PURE__*/React__default.createElement(ControlledPagination, _extends({}, props, {
2979
1309
  displaySelection: false,
2980
1310
  displayRowsPerPage: ['bottom', 'both'].includes(paginationPlacement),
2981
1311
  displayPagination: ['bottom', 'both'].includes(paginationPlacement),
2982
1312
  selectionStatus: selectionStatus.current,
2983
1313
  apiRef: apiRef,
2984
1314
  isRowSelectable: isRowSelectable,
2985
- paginationModel: paginationModel,
2986
- onPaginationModelChange: onPaginationModelChange,
2987
- pageSizeOptions: pageSizeOptions,
1315
+ page: page,
1316
+ pageSize: pageSize,
1317
+ onPageChange: onPageChange,
1318
+ onPageSizeChange: onPageSizeChange,
1319
+ rowsPerPageOptions: rowsPerPageOptions,
2988
1320
  paginationProps: paginationProps,
2989
1321
  paginationMode: paginationMode
2990
1322
  })) : null;
2991
1323
  }
2992
1324
  }),
2993
- slotProps: _objectSpread2(_objectSpread2({}, slotProps), {}, {
1325
+ componentsProps: _objectSpread2(_objectSpread2({}, componentsProps), {}, {
2994
1326
  toolbar: _objectSpread2({
2995
1327
  hideToolbar,
2996
1328
  RenderedToolbar,
@@ -3001,16 +1333,18 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
3001
1333
  selectionStatus,
3002
1334
  apiRef,
3003
1335
  isRowSelectable,
3004
- paginationModel,
3005
- onPaginationModelChange,
3006
- pageSizeOptions,
1336
+ page,
1337
+ pageSize,
1338
+ onPageChange,
1339
+ onPageSizeChange,
1340
+ rowsPerPageOptions,
3007
1341
  paginationProps,
3008
1342
  paginationMode,
3009
1343
  rowCount
3010
- }, slotProps === null || slotProps === void 0 ? void 0 : slotProps.toolbar)
1344
+ }, componentsProps === null || componentsProps === void 0 ? void 0 : componentsProps.toolbar)
3011
1345
  }),
3012
- rowSelectionModel: rowSelectionModel,
3013
- onRowSelectionModelChange: (newSelectionModel, details) => {
1346
+ selectionModel: selectionModel,
1347
+ onSelectionModelChange: (newSelectionModel, details) => {
3014
1348
  if (pagination && paginationMode != 'server') {
3015
1349
  const selectableRowsInPage = isRowSelectable ? gridPaginatedVisibleSortedGridRowEntriesSelector(apiRef).filter(_ref => {
3016
1350
  let {
@@ -3068,7 +1402,7 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
3068
1402
  };
3069
1403
  }
3070
1404
  }
3071
- onRowSelectionModelChange === null || onRowSelectionModelChange === void 0 ? void 0 : onRowSelectionModelChange(newSelectionModel, details);
1405
+ onSelectionModelChange === null || onSelectionModelChange === void 0 ? void 0 : onSelectionModelChange(newSelectionModel, details);
3072
1406
  },
3073
1407
  sx: _objectSpread2(_objectSpread2({}, sx), {}, {
3074
1408
  '.MuiDataGrid-columnHeaders': {
@@ -3084,5 +1418,5 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
3084
1418
  StatefulDataGrid.className = CLASSNAME;
3085
1419
  StatefulDataGrid.displayName = COMPONENT_NAME;
3086
1420
 
3087
- export { getSearchParamsFromColumnVisibility as $, FILTER_SEARCH_KEY as A, CATEGORIES as B, CONTAINS_ANY_OF as C, DOES_NOT_CONTAIN as D, ENDS_WITH_ANY_OF as E, FILTER_MODEL_KEY as F, buildStorageKey as G, HAS as H, IS_BETWEEN as I, clearPreviousVersionStorage as J, decodeValue as K, encodeValue as L, urlSearchParamsToString as M, numberOperatorEncoder as N, numberOperatorDecoder as O, PAGINATION_MODEL_KEY as P, isOperatorValueValid as Q, isValueValid as R, STARTS_WITH_ANY_OF as S, getFilterModelFromString as T, getSearchParamsFromFilterModel as U, VISIBILITY_MODEL_KEY as V, getSortingFromString as W, getSearchParamsFromSorting as X, getPaginationFromString as Y, getSearchParamsFromPagination as Z, getColumnVisibilityFromString as _, DOES_NOT_EQUAL as a, getPinnedColumnsFromString as a0, getSearchParamsFromPinnedColumns as a1, getSearchParamsFromTab as a2, getFinalSearch as a3, getModelsParsedOrUpdateLocalStorage as a4, updateUrl as a5, areFilterModelsEquivalent as a6, StatefulDataGrid as a7, DOES_NOT_HAVE as b, DOES_NOT_HAVE_WITH_SELECT as c, HAS_WITH_SELECT as d, HAS_ONLY as e, HAS_ONLY_WITH_SELECT as f, getGridNumericOperators as g, IS as h, IS_WITH_SELECT as i, IS_NOT as j, IS_NOT_WITH_SELECT as k, getGridStringOperators as l, CONTAINS_ANY_OF_I as m, IS_ANY_OF as n, operatorList as o, IS_ANY_OF_WITH_SELECT as p, HAS_ANY_OF as q, HAS_ANY_OF_WITH_SELECT as r, IS_NOT_ANY_OF as s, IS_NOT_ANY_OF_WITH_SELECT as t, getGridStringArrayOperators as u, getGridStringArrayOperatorsWithSelect as v, getGridStringArrayOperatorsWithSelectOnStringArrayColumns as w, SORT_MODEL_KEY as x, PINNED_COLUMNS as y, DIMENSION_MODEL_KEY as z };
1421
+ export { CATEGORIES as C, DIMENSION_MODEL_KEY as D, FILTER_MODEL_KEY as F, PAGINATION_MODEL_KEY as P, SORT_MODEL_KEY as S, VISIBILITY_MODEL_KEY as V, PINNED_COLUMNS as a, FILTER_SEARCH_KEY as b, buildStorageKey as c, clearPreviousVersionStorage as d, decodeValue as e, encodeValue as f, numberOperatorDecoder as g, getFilterModelFromString as h, getSearchParamsFromFilterModel as i, getSortingFromString as j, getSearchParamsFromSorting as k, getPaginationFromString as l, getSearchParamsFromPagination as m, numberOperatorEncoder as n, getSearchParamsFromColumnVisibility as o, getColumnVisibilityFromString as p, getPinnedColumnsFromString as q, getSearchParamsFromPinnedColumns as r, getSearchParamsFromTab as s, getFinalSearch as t, urlSearchParamsToString as u, getModelsParsedOrUpdateLocalStorage as v, updateUrl as w, areFilterModelsEquivalent as x, StatefulDataGrid as y };
3088
1422
  //# sourceMappingURL=StatefulDataGrid2.js.map