@redsift/table 12.0.0-muiv5 → 12.0.0-muiv6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_internal/BasePopper.js +2 -2
- package/_internal/ControlledPagination.js +53 -33
- package/_internal/ControlledPagination.js.map +1 -1
- package/_internal/DataGrid2.js +64 -80
- package/_internal/DataGrid2.js.map +1 -1
- package/_internal/GridToolbarFilterSemanticField2.js +12 -12
- package/_internal/GridToolbarFilterSemanticField2.js.map +1 -1
- package/_internal/Portal.js +1 -1
- package/_internal/StatefulDataGrid.js +1 -1
- package/_internal/StatefulDataGrid2.js +1943 -248
- package/_internal/StatefulDataGrid2.js.map +1 -1
- package/_internal/TextCell2.js +1 -1
- package/_internal/Toolbar2.js +3 -3
- package/_internal/Toolbar2.js.map +1 -1
- package/_internal/ToolbarWrapper2.js +11 -17
- package/_internal/ToolbarWrapper2.js.map +1 -1
- package/_internal/_rollupPluginBabelHelpers.js +1 -1
- package/_internal/useControlledDatagridState.js +24 -1859
- package/_internal/useControlledDatagridState.js.map +1 -1
- package/index.d.ts +54 -54
- package/index.js +48 -3
- package/index.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,15 +1,1791 @@
|
|
|
1
|
-
import { _ as _objectSpread2,
|
|
1
|
+
import { _ as _objectSpread2, a as _objectWithoutProperties, b as _extends$1 } from './_rollupPluginBabelHelpers.js';
|
|
2
|
+
import * as React from 'react';
|
|
2
3
|
import React__default, { useCallback, useEffect, useMemo, forwardRef, useRef, useState } from 'react';
|
|
3
4
|
import classNames from 'classnames';
|
|
4
|
-
import { useTheme, ThemeProvider, RedsiftColorBlueN, RedsiftColorNeutralXDarkGrey, RedsiftColorNeutralWhite } from '@redsift/design-system';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
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';
|
|
8
12
|
import { T as Toolbar } from './Toolbar2.js';
|
|
9
|
-
import { o as onServerSideSelectionStatusChange, S as ServerSideControlledPagination, C as ControlledPagination } from './ControlledPagination.js';
|
|
10
13
|
import { B as BaseButton, a as BaseCheckbox, c as BasePopper, b as BaseIcon } from './BasePopper.js';
|
|
11
14
|
import { T as ToolbarWrapper } from './ToolbarWrapper2.js';
|
|
12
15
|
|
|
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 doesNotHaveAnyOf = {
|
|
1584
|
+
label: "doesn't have any of",
|
|
1585
|
+
value: 'doesNotHaveAnyOf',
|
|
1586
|
+
getApplyFilterFn: filterItem => {
|
|
1587
|
+
if (!filterItem.field || !filterItem.value || !Array.isArray(filterItem.value) || filterItem.value.length === 0) {
|
|
1588
|
+
return null;
|
|
1589
|
+
}
|
|
1590
|
+
return params => {
|
|
1591
|
+
const cellValues = Array.isArray(params.value) ? params.value : [params.value];
|
|
1592
|
+
|
|
1593
|
+
// Return true only if none of the filter values are in the cell values
|
|
1594
|
+
return filterItem.value.every(filterVal => !cellValues.map(value => String(value)).includes(filterVal));
|
|
1595
|
+
};
|
|
1596
|
+
},
|
|
1597
|
+
InputComponent: GridFilterInputMultipleValue
|
|
1598
|
+
};
|
|
1599
|
+
const DOES_NOT_HAVE_ANY_OF = doesNotHaveAnyOf;
|
|
1600
|
+
const DOES_NOT_HAVE_ANY_OF_WITH_SELECT = _objectSpread2(_objectSpread2({}, DOES_NOT_HAVE_ANY_OF), {}, {
|
|
1601
|
+
InputComponent: GridFilterInputMultipleSingleSelect
|
|
1602
|
+
});
|
|
1603
|
+
|
|
1604
|
+
const endsWithAnyOfOperator = {
|
|
1605
|
+
label: 'ends with any of',
|
|
1606
|
+
value: 'endsWithAnyOf',
|
|
1607
|
+
getApplyFilterFn: filterItem => {
|
|
1608
|
+
if (!filterItem.field || !filterItem.value || !filterItem.operator) {
|
|
1609
|
+
return null;
|
|
1610
|
+
}
|
|
1611
|
+
return params => {
|
|
1612
|
+
if (filterItem.value.length === 0) {
|
|
1613
|
+
return true;
|
|
1614
|
+
}
|
|
1615
|
+
const paramValues = Array.isArray(params.value) ? params.value : [params.value];
|
|
1616
|
+
let match = false;
|
|
1617
|
+
filterItem.value.forEach(filteredValue => {
|
|
1618
|
+
paramValues.forEach(paramValue => {
|
|
1619
|
+
if (String(paramValue).endsWith(filteredValue)) {
|
|
1620
|
+
match = true;
|
|
1621
|
+
}
|
|
1622
|
+
});
|
|
1623
|
+
});
|
|
1624
|
+
return match;
|
|
1625
|
+
};
|
|
1626
|
+
},
|
|
1627
|
+
InputComponent: GridFilterInputMultipleValue
|
|
1628
|
+
};
|
|
1629
|
+
const ENDS_WITH_ANY_OF = endsWithAnyOfOperator;
|
|
1630
|
+
|
|
1631
|
+
const isAnyOfOperator = {
|
|
1632
|
+
label: 'is any of',
|
|
1633
|
+
value: 'isAnyOf',
|
|
1634
|
+
getApplyFilterFn: filterItem => {
|
|
1635
|
+
if (!filterItem.field || !filterItem.value || !filterItem.operator) {
|
|
1636
|
+
return null;
|
|
1637
|
+
}
|
|
1638
|
+
return params => {
|
|
1639
|
+
if (filterItem.value.length === 0) {
|
|
1640
|
+
return true;
|
|
1641
|
+
}
|
|
1642
|
+
const paramValues = Array.isArray(params.value) ? params.value : [params.value];
|
|
1643
|
+
for (const paramValue of paramValues) {
|
|
1644
|
+
if (filterItem.value.includes(String(paramValue))) {
|
|
1645
|
+
return true;
|
|
1646
|
+
}
|
|
1647
|
+
}
|
|
1648
|
+
return false;
|
|
1649
|
+
};
|
|
1650
|
+
},
|
|
1651
|
+
InputComponent: GridFilterInputMultipleValue
|
|
1652
|
+
};
|
|
1653
|
+
const IS_ANY_OF = isAnyOfOperator;
|
|
1654
|
+
const IS_ANY_OF_WITH_SELECT = _objectSpread2(_objectSpread2({}, IS_ANY_OF), {}, {
|
|
1655
|
+
InputComponent: GridFilterInputMultipleSingleSelect
|
|
1656
|
+
});
|
|
1657
|
+
|
|
1658
|
+
const isAnyOfIOperator = {
|
|
1659
|
+
label: 'is any of (case-insensitive)',
|
|
1660
|
+
value: 'isAnyOfI',
|
|
1661
|
+
getApplyFilterFn: filterItem => {
|
|
1662
|
+
if (!filterItem.field || !filterItem.value || !filterItem.operator) {
|
|
1663
|
+
return null;
|
|
1664
|
+
}
|
|
1665
|
+
const lowerCaseFilterValues = filterItem.value.map(v => String(v).toLowerCase());
|
|
1666
|
+
return params => {
|
|
1667
|
+
if (filterItem.value.length === 0) {
|
|
1668
|
+
return true;
|
|
1669
|
+
}
|
|
1670
|
+
const paramValues = Array.isArray(params.value) ? params.value : [params.value];
|
|
1671
|
+
for (const paramValue of paramValues) {
|
|
1672
|
+
if (lowerCaseFilterValues.includes(String(paramValue).toLowerCase())) {
|
|
1673
|
+
return true;
|
|
1674
|
+
}
|
|
1675
|
+
}
|
|
1676
|
+
return false;
|
|
1677
|
+
};
|
|
1678
|
+
},
|
|
1679
|
+
InputComponent: GridFilterInputMultipleValue
|
|
1680
|
+
};
|
|
1681
|
+
const IS_ANY_OF_I = isAnyOfIOperator;
|
|
1682
|
+
const IS_ANY_OF_I_WITH_SELECT = _objectSpread2(_objectSpread2({}, IS_ANY_OF_I), {}, {
|
|
1683
|
+
InputComponent: GridFilterInputMultipleSingleSelect
|
|
1684
|
+
});
|
|
1685
|
+
|
|
1686
|
+
const hasAnyOfOperator = {
|
|
1687
|
+
label: 'has any of',
|
|
1688
|
+
value: 'hasAnyOf',
|
|
1689
|
+
getApplyFilterFn: filterItem => {
|
|
1690
|
+
if (!filterItem.field || !filterItem.value || !filterItem.operator) {
|
|
1691
|
+
return null;
|
|
1692
|
+
}
|
|
1693
|
+
return params => {
|
|
1694
|
+
if (filterItem.value.length === 0) {
|
|
1695
|
+
return true;
|
|
1696
|
+
}
|
|
1697
|
+
const cellValues = Array.isArray(params.value) ? params.value : [params.value];
|
|
1698
|
+
const filterItemValues = Array.isArray(filterItem.value) ? filterItem.value : [filterItem.value];
|
|
1699
|
+
return filterItemValues.some(v => cellValues.map(value => String(value)).includes(v));
|
|
1700
|
+
};
|
|
1701
|
+
},
|
|
1702
|
+
InputComponent: GridFilterInputMultipleValue
|
|
1703
|
+
};
|
|
1704
|
+
const HAS_ANY_OF = hasAnyOfOperator;
|
|
1705
|
+
const HAS_ANY_OF_WITH_SELECT = _objectSpread2(_objectSpread2({}, HAS_ANY_OF), {}, {
|
|
1706
|
+
InputComponent: GridFilterInputMultipleSingleSelect
|
|
1707
|
+
});
|
|
1708
|
+
|
|
1709
|
+
const isNotAnyOfOperator = {
|
|
1710
|
+
label: 'is not any of',
|
|
1711
|
+
value: 'isNotAnyOf',
|
|
1712
|
+
getApplyFilterFn: filterItem => {
|
|
1713
|
+
if (!filterItem.field || !filterItem.value || !filterItem.operator) {
|
|
1714
|
+
return null;
|
|
1715
|
+
}
|
|
1716
|
+
return params => {
|
|
1717
|
+
if (filterItem.value.length === 0) {
|
|
1718
|
+
return true;
|
|
1719
|
+
}
|
|
1720
|
+
const paramValues = Array.isArray(params.value) ? params.value : [params.value];
|
|
1721
|
+
for (const paramValue of paramValues) {
|
|
1722
|
+
if (filterItem.value.includes(String(paramValue))) {
|
|
1723
|
+
return false;
|
|
1724
|
+
}
|
|
1725
|
+
}
|
|
1726
|
+
return true;
|
|
1727
|
+
};
|
|
1728
|
+
},
|
|
1729
|
+
InputComponent: GridFilterInputMultipleValue
|
|
1730
|
+
};
|
|
1731
|
+
const IS_NOT_ANY_OF = isNotAnyOfOperator;
|
|
1732
|
+
const IS_NOT_ANY_OF_WITH_SELECT = _objectSpread2(_objectSpread2({}, IS_NOT_ANY_OF), {}, {
|
|
1733
|
+
InputComponent: GridFilterInputMultipleSingleSelect
|
|
1734
|
+
});
|
|
1735
|
+
|
|
1736
|
+
const startsWithAnyOfOperator = {
|
|
1737
|
+
label: 'starts with any of',
|
|
1738
|
+
value: 'startsWithAnyOf',
|
|
1739
|
+
getApplyFilterFn: filterItem => {
|
|
1740
|
+
if (!filterItem.field || !filterItem.value || !filterItem.operator) {
|
|
1741
|
+
return null;
|
|
1742
|
+
}
|
|
1743
|
+
return params => {
|
|
1744
|
+
if (filterItem.value.length === 0) {
|
|
1745
|
+
return true;
|
|
1746
|
+
}
|
|
1747
|
+
const paramValues = Array.isArray(params.value) ? params.value : [params.value];
|
|
1748
|
+
let match = false;
|
|
1749
|
+
filterItem.value.forEach(filteredValue => {
|
|
1750
|
+
paramValues.forEach(paramValue => {
|
|
1751
|
+
if (String(paramValue).startsWith(filteredValue)) {
|
|
1752
|
+
match = true;
|
|
1753
|
+
}
|
|
1754
|
+
});
|
|
1755
|
+
});
|
|
1756
|
+
return match;
|
|
1757
|
+
};
|
|
1758
|
+
},
|
|
1759
|
+
InputComponent: GridFilterInputMultipleValue
|
|
1760
|
+
};
|
|
1761
|
+
const STARTS_WITH_ANY_OF = startsWithAnyOfOperator;
|
|
1762
|
+
|
|
1763
|
+
const getGridStringArrayOperators = () => [CONTAINS_ANY_OF, ENDS_WITH_ANY_OF, IS_ANY_OF, IS_ANY_OF_I, IS_NOT_ANY_OF, STARTS_WITH_ANY_OF];
|
|
1764
|
+
const getGridStringArrayOperatorsWithSelect = () => [CONTAINS_ANY_OF, ENDS_WITH_ANY_OF, IS_ANY_OF_WITH_SELECT, IS_ANY_OF_I_WITH_SELECT, IS_NOT_WITH_SELECT, IS_WITH_SELECT, STARTS_WITH_ANY_OF];
|
|
1765
|
+
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];
|
|
1766
|
+
|
|
1767
|
+
const getGridStringOperators = () => [...getGridStringOperators$1().filter(operator => !['isAnyOf'].includes(operator.value)), DOES_NOT_CONTAIN, DOES_NOT_EQUAL, ...getGridStringArrayOperators()];
|
|
1768
|
+
|
|
1769
|
+
// istanbul ignore file
|
|
1770
|
+
const operatorList = {
|
|
1771
|
+
// Default types
|
|
1772
|
+
string: getGridStringOperators$1(),
|
|
1773
|
+
number: getGridNumericOperators$1(),
|
|
1774
|
+
boolean: getGridBooleanOperators(),
|
|
1775
|
+
date: getGridDateOperators(),
|
|
1776
|
+
dateTime: getGridDateOperators(true),
|
|
1777
|
+
singleSelect: getGridSingleSelectOperators(),
|
|
1778
|
+
// Extended types
|
|
1779
|
+
rsString: getGridStringOperators(),
|
|
1780
|
+
rsNumber: getGridNumericOperators(),
|
|
1781
|
+
rsSingleSelect: [CONTAINS_ANY_OF, ENDS_WITH_ANY_OF, IS_ANY_OF_WITH_SELECT, IS_NOT_WITH_SELECT, IS_WITH_SELECT, STARTS_WITH_ANY_OF],
|
|
1782
|
+
rsSingleSelectWithShortOperatorList: [IS_WITH_SELECT, IS_NOT_WITH_SELECT, IS_ANY_OF_WITH_SELECT],
|
|
1783
|
+
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],
|
|
1784
|
+
rsMultipleSelectWithShortOperatorList: [HAS_WITH_SELECT, DOES_NOT_HAVE_WITH_SELECT, HAS_ANY_OF_WITH_SELECT],
|
|
1785
|
+
// Custom types
|
|
1786
|
+
rsStringArray: getGridStringArrayOperators()
|
|
1787
|
+
};
|
|
1788
|
+
|
|
13
1789
|
const PAGINATION_MODEL_KEY = 'paginationModel';
|
|
14
1790
|
const FILTER_MODEL_KEY = 'filterModel';
|
|
15
1791
|
const SORT_MODEL_KEY = 'sortModel';
|
|
@@ -98,11 +1874,11 @@ const decodeValue = value => {
|
|
|
98
1874
|
if (value === '') {
|
|
99
1875
|
return '';
|
|
100
1876
|
}
|
|
101
|
-
const re = new RegExp(Object.keys(DECODER).reduce((acc, curr) => `${acc}
|
|
1877
|
+
const re = new RegExp(Object.keys(DECODER).reduce((acc, curr) => `${acc}%7C${curr}`), 'g');
|
|
102
1878
|
// decodeValue for lists:
|
|
103
1879
|
if (value.startsWith('list[')) {
|
|
104
1880
|
const arrayValues = value.split('[')[1].split(']')[0];
|
|
105
|
-
const arrayList = arrayValues.split('
|
|
1881
|
+
const arrayList = arrayValues.split('%7C').map(v => v.replace(re, encoded => DECODER[encoded])).filter(item => item);
|
|
106
1882
|
return arrayList.length > 0 ? arrayList : [];
|
|
107
1883
|
}
|
|
108
1884
|
return value.replace(re, encoded => DECODER[encoded]);
|
|
@@ -117,7 +1893,7 @@ const encodeValue = value => {
|
|
|
117
1893
|
if (Array.isArray(value)) {
|
|
118
1894
|
const encodedArray = value.map(entry => {
|
|
119
1895
|
return String(entry).replace(/\s|&|=|\?|\[|\]/g, encoded => ENCODER[encoded]);
|
|
120
|
-
}).join('
|
|
1896
|
+
}).join('%7C');
|
|
121
1897
|
return `list[${encodedArray}]`;
|
|
122
1898
|
}
|
|
123
1899
|
|
|
@@ -148,42 +1924,39 @@ const numberOperatorDecoder = {
|
|
|
148
1924
|
lt: '<',
|
|
149
1925
|
lte: '<='
|
|
150
1926
|
};
|
|
151
|
-
const isOperatorValueValid = (
|
|
152
|
-
const column = columns.find(column => column.field ===
|
|
1927
|
+
const isOperatorValueValid = (field, operator, columns) => {
|
|
1928
|
+
const column = columns.find(column => column.field === field);
|
|
153
1929
|
if (!column) {
|
|
154
1930
|
return false;
|
|
155
1931
|
}
|
|
156
1932
|
const columnType = (column === null || column === void 0 ? void 0 : column.type) || 'string';
|
|
157
|
-
const operators = operatorList[columnType];
|
|
1933
|
+
const operators = column.filterOperators || operatorList[columnType];
|
|
158
1934
|
if (!operators) {
|
|
159
1935
|
return false;
|
|
160
1936
|
}
|
|
161
|
-
|
|
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);
|
|
1937
|
+
return !!operators.find(op => columnType === 'number' && Object.keys(numberOperatorEncoder).includes(op.value) ? numberOperatorEncoder[op.value] === operator : op.value === operator);
|
|
165
1938
|
};
|
|
166
1939
|
const listOperators = ['containsAnyOf', 'doesNotContainAnyOf', 'endsWithAnyOf', 'doesNotEndWithAnyOf', 'hasAnyOf', 'doesNotHaveAnyOf', 'isAnyOf', 'isNotAnyOf', 'startsWithAnyOf', 'doesNotStartWithAnyOf'];
|
|
167
1940
|
|
|
168
1941
|
// Check if the value doesn't break
|
|
169
|
-
const isValueValid = (value,
|
|
1942
|
+
const isValueValid = (value, field, columns, operator) => {
|
|
170
1943
|
var _column$type;
|
|
171
1944
|
// every field accepts undefined as value for default
|
|
172
1945
|
if (value === undefined || value === '') {
|
|
173
1946
|
return true;
|
|
174
1947
|
}
|
|
175
1948
|
|
|
176
|
-
// xxxAnyOf accepts as value only lists, and we are
|
|
1949
|
+
// xxxAnyOf accepts as value only lists, and we are declaring them in the
|
|
177
1950
|
// URL as `list=[...]`
|
|
178
|
-
if (listOperators.includes(
|
|
1951
|
+
if (listOperators.includes(operator)) {
|
|
179
1952
|
return Array.isArray(value) || value === '';
|
|
180
1953
|
}
|
|
181
1954
|
|
|
182
1955
|
// We are accepting arrays only if they are of the 'xxxAnyOf' type
|
|
183
|
-
if (Array.isArray(value) && !listOperators.includes(
|
|
1956
|
+
if (Array.isArray(value) && !listOperators.includes(operator)) {
|
|
184
1957
|
return false;
|
|
185
1958
|
}
|
|
186
|
-
const column = columns.find(column => column.field ===
|
|
1959
|
+
const column = columns.find(column => column.field === field);
|
|
187
1960
|
if (!column) {
|
|
188
1961
|
return false;
|
|
189
1962
|
}
|
|
@@ -221,7 +1994,7 @@ const getFilterModelFromString = (searchString, columns) => {
|
|
|
221
1994
|
if (!searchString) {
|
|
222
1995
|
return 'invalid';
|
|
223
1996
|
}
|
|
224
|
-
let
|
|
1997
|
+
let logicOperator = GridLogicOperator.And;
|
|
225
1998
|
let quickFilterValues = [];
|
|
226
1999
|
const searchParams = new URLSearchParams();
|
|
227
2000
|
for (const [key, value] of new URLSearchParams(searchString)) {
|
|
@@ -229,7 +2002,7 @@ const getFilterModelFromString = (searchString, columns) => {
|
|
|
229
2002
|
searchParams.set(key, value);
|
|
230
2003
|
}
|
|
231
2004
|
if (key === '_logicOperator') {
|
|
232
|
-
|
|
2005
|
+
logicOperator = value === GridLogicOperator.And || value === GridLogicOperator.Or ? value : GridLogicOperator.And;
|
|
233
2006
|
}
|
|
234
2007
|
if (key === '_quickFilterValues') {
|
|
235
2008
|
try {
|
|
@@ -248,7 +2021,7 @@ const getFilterModelFromString = (searchString, columns) => {
|
|
|
248
2021
|
if (isInvalid) {
|
|
249
2022
|
return;
|
|
250
2023
|
}
|
|
251
|
-
const field = key.split('[')[0].slice(1);
|
|
2024
|
+
const field = key.split('[')[0].slice(1);
|
|
252
2025
|
if (!fields.includes(field)) {
|
|
253
2026
|
return;
|
|
254
2027
|
}
|
|
@@ -258,14 +2031,13 @@ const getFilterModelFromString = (searchString, columns) => {
|
|
|
258
2031
|
isInvalid = true;
|
|
259
2032
|
return;
|
|
260
2033
|
}
|
|
261
|
-
const splitRight = key.split('[')[1].split(']')[0].split('
|
|
2034
|
+
const splitRight = key.split('[')[1].split(']')[0].split('%7C');
|
|
262
2035
|
const type = splitRight[1];
|
|
263
2036
|
if (type !== columnType) {
|
|
264
2037
|
isInvalid = true;
|
|
265
2038
|
return;
|
|
266
2039
|
}
|
|
267
2040
|
const operator = splitRight[0];
|
|
268
|
-
// if the operator is not part of the valid operators invalidate the URL
|
|
269
2041
|
if (!isOperatorValueValid(field, operator, columns) || Array.isArray(operator)) {
|
|
270
2042
|
isInvalid = true;
|
|
271
2043
|
return;
|
|
@@ -277,41 +2049,37 @@ const getFilterModelFromString = (searchString, columns) => {
|
|
|
277
2049
|
return;
|
|
278
2050
|
}
|
|
279
2051
|
items.push({
|
|
280
|
-
|
|
281
|
-
|
|
2052
|
+
field,
|
|
2053
|
+
operator: columnType === 'number' && Object.keys(numberOperatorDecoder).includes(operator) ? numberOperatorDecoder[operator] : operator,
|
|
282
2054
|
id,
|
|
283
2055
|
value: listOperators.includes(operator) && decodedValue === '' ? [] : decodedValue,
|
|
284
2056
|
type
|
|
285
2057
|
});
|
|
286
2058
|
});
|
|
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
|
|
291
2059
|
if (isInvalid) {
|
|
292
2060
|
return 'invalid';
|
|
293
2061
|
}
|
|
294
2062
|
return {
|
|
295
2063
|
items,
|
|
296
|
-
|
|
2064
|
+
logicOperator,
|
|
297
2065
|
quickFilterValues
|
|
298
2066
|
};
|
|
299
2067
|
};
|
|
300
2068
|
const getSearchParamsFromFilterModel = filterModel => {
|
|
301
2069
|
var _filterModel$quickFil;
|
|
302
2070
|
const searchParams = new URLSearchParams();
|
|
303
|
-
searchParams.set('_logicOperator', filterModel['
|
|
2071
|
+
searchParams.set('_logicOperator', filterModel['logicOperator'] || '');
|
|
304
2072
|
filterModel['items'].forEach(item => {
|
|
305
2073
|
const {
|
|
306
|
-
|
|
307
|
-
|
|
2074
|
+
field,
|
|
2075
|
+
operator,
|
|
308
2076
|
value,
|
|
309
2077
|
type
|
|
310
2078
|
} = item;
|
|
311
|
-
if (Object.keys(numberOperatorEncoder).includes(
|
|
312
|
-
searchParams.set(`_${
|
|
2079
|
+
if (Object.keys(numberOperatorEncoder).includes(operator)) {
|
|
2080
|
+
searchParams.set(`_${field}[${numberOperatorEncoder[operator]}%7C${encodeValue(type)}]`, encodeValue(value));
|
|
313
2081
|
} else {
|
|
314
|
-
searchParams.set(`_${
|
|
2082
|
+
searchParams.set(`_${field}[${encodeValue(operator)}%7C${encodeValue(type)}]`, encodeValue(value));
|
|
315
2083
|
}
|
|
316
2084
|
});
|
|
317
2085
|
if ((_filterModel$quickFil = filterModel.quickFilterValues) !== null && _filterModel$quickFil !== void 0 && _filterModel$quickFil.length) {
|
|
@@ -327,7 +2095,7 @@ const getSearchParamsFromFilterModel = filterModel => {
|
|
|
327
2095
|
const getFilterModel = (search, columns, localStorageFilters, setLocalStorageFilters, initialState, isNewVersion) => {
|
|
328
2096
|
const defaultValue = initialState && initialState.filter && initialState.filter.filterModel ? initialState.filter.filterModel : {
|
|
329
2097
|
items: [],
|
|
330
|
-
|
|
2098
|
+
logicOperator: GridLogicOperator.And
|
|
331
2099
|
};
|
|
332
2100
|
if (isNewVersion) {
|
|
333
2101
|
return defaultValue;
|
|
@@ -360,7 +2128,7 @@ const getSortingFromString = (searchString, columns) => {
|
|
|
360
2128
|
return [];
|
|
361
2129
|
}
|
|
362
2130
|
const fields = columns.map(column => column.field);
|
|
363
|
-
const [column, order] = value.slice(1, value.length - 1).split('
|
|
2131
|
+
const [column, order] = value.slice(1, value.length - 1).split('%7C');
|
|
364
2132
|
if (fields.includes(column) && (order === 'asc' || order === 'desc')) {
|
|
365
2133
|
return [{
|
|
366
2134
|
field: column,
|
|
@@ -371,7 +2139,7 @@ const getSortingFromString = (searchString, columns) => {
|
|
|
371
2139
|
};
|
|
372
2140
|
const getSearchParamsFromSorting = sorting => {
|
|
373
2141
|
const searchParams = new URLSearchParams();
|
|
374
|
-
searchParams.set('_sortColumn', sorting.length > 0 && sorting[0].sort ? `[${encodeValue(sorting[0].field)}
|
|
2142
|
+
searchParams.set('_sortColumn', sorting.length > 0 && sorting[0].sort ? `[${encodeValue(sorting[0].field)}%7C${encodeValue(sorting[0].sort)}]` : '[]');
|
|
375
2143
|
return searchParams;
|
|
376
2144
|
};
|
|
377
2145
|
|
|
@@ -412,7 +2180,7 @@ const getPaginationFromString = searchString => {
|
|
|
412
2180
|
if (value === '' || value === null || value === '[]') {
|
|
413
2181
|
return 'invalid';
|
|
414
2182
|
}
|
|
415
|
-
const pagination = value.slice(1, value.length - 1).split('
|
|
2183
|
+
const pagination = value.slice(1, value.length - 1).split('%7C');
|
|
416
2184
|
const page = parseFloat(pagination[0]);
|
|
417
2185
|
const pageSize = parseFloat(pagination[1]);
|
|
418
2186
|
const direction = pagination[2];
|
|
@@ -427,7 +2195,7 @@ const getPaginationFromString = searchString => {
|
|
|
427
2195
|
};
|
|
428
2196
|
const getSearchParamsFromPagination = pagination => {
|
|
429
2197
|
const searchParams = new URLSearchParams();
|
|
430
|
-
searchParams.set('_pagination', `[${pagination.page}
|
|
2198
|
+
searchParams.set('_pagination', `[${pagination.page}%7C${pagination.pageSize}%7C${pagination.direction}]`);
|
|
431
2199
|
return searchParams;
|
|
432
2200
|
};
|
|
433
2201
|
|
|
@@ -466,13 +2234,38 @@ const getPaginationModel = (search, localStoragePagination, setLocalStoragePagin
|
|
|
466
2234
|
|
|
467
2235
|
/** COLUMN VISIBILITY */
|
|
468
2236
|
|
|
2237
|
+
const getColumnVisibilityFromString = (searchString, columns) => {
|
|
2238
|
+
if (!searchString) {
|
|
2239
|
+
return 'invalid';
|
|
2240
|
+
}
|
|
2241
|
+
const searchParams = new URLSearchParams(searchString);
|
|
2242
|
+
const value = searchParams.get('_columnVisibility');
|
|
2243
|
+
if (value === '' || value === null || value === '[]') {
|
|
2244
|
+
return 'invalid';
|
|
2245
|
+
}
|
|
2246
|
+
const parsedFields = value.slice(1, value.length - 1).split('%7C');
|
|
2247
|
+
const fields = columns.map(column => column.field);
|
|
2248
|
+
const visibility = {};
|
|
2249
|
+
for (const field of fields) {
|
|
2250
|
+
visibility[field] = false;
|
|
2251
|
+
}
|
|
2252
|
+
for (const parsedField of parsedFields) {
|
|
2253
|
+
if (fields.includes(parsedField)) {
|
|
2254
|
+
visibility[parsedField] = true;
|
|
2255
|
+
}
|
|
2256
|
+
}
|
|
2257
|
+
if (Object.values(visibility).filter(v => v === true).length === 0) {
|
|
2258
|
+
return 'invalid';
|
|
2259
|
+
}
|
|
2260
|
+
return visibility;
|
|
2261
|
+
};
|
|
469
2262
|
const getSearchParamsFromColumnVisibility = (columnVisibility, columns) => {
|
|
470
2263
|
const searchParams = new URLSearchParams();
|
|
471
|
-
const
|
|
2264
|
+
const fields = columns.map(column => column.field);
|
|
472
2265
|
|
|
473
2266
|
// if column visibility model is empty, show all columns
|
|
474
2267
|
if (Object.keys(columnVisibility).length == 0) {
|
|
475
|
-
searchParams.set('_columnVisibility', `[${
|
|
2268
|
+
searchParams.set('_columnVisibility', `[${fields.join('%7C')}]`);
|
|
476
2269
|
return searchParams;
|
|
477
2270
|
}
|
|
478
2271
|
const finalColumnVisibility = columns.filter(c => {
|
|
@@ -483,63 +2276,10 @@ const getSearchParamsFromColumnVisibility = (columnVisibility, columns) => {
|
|
|
483
2276
|
[colName]: true
|
|
484
2277
|
});
|
|
485
2278
|
}, columnVisibility);
|
|
486
|
-
const visibleColumns =
|
|
487
|
-
|
|
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
|
-
});
|
|
497
|
-
searchParams.set('_columnVisibility', `[${visibleColumns.join('|')}]`);
|
|
2279
|
+
const visibleColumns = fields.filter(column => finalColumnVisibility[column] !== false);
|
|
2280
|
+
searchParams.set('_columnVisibility', `[${visibleColumns.join('%7C')}]`);
|
|
498
2281
|
return searchParams;
|
|
499
2282
|
};
|
|
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
|
-
};
|
|
543
2283
|
|
|
544
2284
|
// Rules:
|
|
545
2285
|
// - if we have something in the URL, use that info
|
|
@@ -600,8 +2340,8 @@ const getPinnedColumnsFromString = (notParsed, tableColumns) => {
|
|
|
600
2340
|
if (typeof encodedValues !== 'string') {
|
|
601
2341
|
continue;
|
|
602
2342
|
}
|
|
603
|
-
const
|
|
604
|
-
const columns = encodedValues.split('
|
|
2343
|
+
const fields = [...tableColumns.map(column => column.field), '__check__'];
|
|
2344
|
+
const columns = encodedValues.split('%7C').map(value => decodeValue(value)).filter(val => typeof val === 'string' && fields.includes(val));
|
|
605
2345
|
if (fieldURL === '_pinnedColumnsLeft') {
|
|
606
2346
|
pinnedColumns['left'] = columns;
|
|
607
2347
|
}
|
|
@@ -609,9 +2349,9 @@ const getPinnedColumnsFromString = (notParsed, tableColumns) => {
|
|
|
609
2349
|
pinnedColumns['right'] = columns;
|
|
610
2350
|
}
|
|
611
2351
|
}
|
|
612
|
-
return pinnedColumns
|
|
613
|
-
left: pinnedColumns
|
|
614
|
-
right: pinnedColumns
|
|
2352
|
+
return pinnedColumns.left && pinnedColumns.left.length > 0 || pinnedColumns.right && pinnedColumns.right.length > 0 ? {
|
|
2353
|
+
left: pinnedColumns.left || [],
|
|
2354
|
+
right: pinnedColumns.right || []
|
|
615
2355
|
} : 'invalid';
|
|
616
2356
|
};
|
|
617
2357
|
const getSearchParamsFromPinnedColumns = pinnedColumns => {
|
|
@@ -619,8 +2359,8 @@ const getSearchParamsFromPinnedColumns = pinnedColumns => {
|
|
|
619
2359
|
const searchParams = new URLSearchParams();
|
|
620
2360
|
const pinnedColumnLeft = ((_pinnedColumns$left = pinnedColumns.left) === null || _pinnedColumns$left === void 0 ? void 0 : _pinnedColumns$left.map(val => encodeValue(val))) || [];
|
|
621
2361
|
const pinnedColumnRight = ((_pinnedColumns$right = pinnedColumns.right) === null || _pinnedColumns$right === void 0 ? void 0 : _pinnedColumns$right.map(val => encodeValue(val))) || [];
|
|
622
|
-
searchParams.set('_pinnedColumnsLeft', `[${pinnedColumnLeft.join('
|
|
623
|
-
searchParams.set('_pinnedColumnsRight', `[${pinnedColumnRight.join('
|
|
2362
|
+
searchParams.set('_pinnedColumnsLeft', `[${pinnedColumnLeft.join('%7C')}]`);
|
|
2363
|
+
searchParams.set('_pinnedColumnsRight', `[${pinnedColumnRight.join('%7C')}]`);
|
|
624
2364
|
return searchParams;
|
|
625
2365
|
};
|
|
626
2366
|
|
|
@@ -661,7 +2401,7 @@ const getSearchParamsFromTab = search => {
|
|
|
661
2401
|
}
|
|
662
2402
|
return searchParams;
|
|
663
2403
|
};
|
|
664
|
-
const getFinalSearch =
|
|
2404
|
+
const getFinalSearch = _ref => {
|
|
665
2405
|
let {
|
|
666
2406
|
search,
|
|
667
2407
|
localStorageVersion,
|
|
@@ -671,7 +2411,7 @@ const getFinalSearch = _ref3 => {
|
|
|
671
2411
|
columnsVisibilityModel,
|
|
672
2412
|
pinnedColumnsModel,
|
|
673
2413
|
columns
|
|
674
|
-
} =
|
|
2414
|
+
} = _ref;
|
|
675
2415
|
const filterModelSearch = getSearchParamsFromFilterModel(filterModel);
|
|
676
2416
|
const sortModelSearch = getSearchParamsFromSorting(sortModel);
|
|
677
2417
|
const paginationModelSearch = getSearchParamsFromPagination(paginationModel);
|
|
@@ -736,14 +2476,14 @@ const getModelsParsedOrUpdateLocalStorage = (search, localStorageVersion, column
|
|
|
736
2476
|
pinnedColumnsModel
|
|
737
2477
|
};
|
|
738
2478
|
};
|
|
739
|
-
const updateUrl = (
|
|
2479
|
+
const updateUrl = (_ref2, search, localStorageVersion, historyReplace, columns) => {
|
|
740
2480
|
let {
|
|
741
2481
|
filterModel,
|
|
742
2482
|
sortModel,
|
|
743
2483
|
paginationModel,
|
|
744
2484
|
columnsModel: columnsVisibilityModel,
|
|
745
2485
|
pinnedColumnsModel
|
|
746
|
-
} =
|
|
2486
|
+
} = _ref2;
|
|
747
2487
|
const newSearch = getFinalSearch({
|
|
748
2488
|
search,
|
|
749
2489
|
localStorageVersion,
|
|
@@ -764,17 +2504,17 @@ const updateUrl = (_ref4, search, localStorageVersion, historyReplace, columns)
|
|
|
764
2504
|
// do not use it for equivalence (e.g. with value `3` and undefined we
|
|
765
2505
|
// will get 0).
|
|
766
2506
|
const compareFilters = (firstFilter, secondFilter) => {
|
|
767
|
-
if (firstFilter.
|
|
2507
|
+
if (firstFilter.field < secondFilter.field) {
|
|
768
2508
|
return -1;
|
|
769
|
-
} else if (firstFilter.
|
|
2509
|
+
} else if (firstFilter.field > secondFilter.field) {
|
|
770
2510
|
return 1;
|
|
771
2511
|
}
|
|
772
|
-
if (firstFilter.
|
|
2512
|
+
if (firstFilter.operator === undefined || secondFilter.operator === undefined) {
|
|
773
2513
|
return 0;
|
|
774
2514
|
}
|
|
775
|
-
if (firstFilter.
|
|
2515
|
+
if (firstFilter.operator < secondFilter.operator) {
|
|
776
2516
|
return -1;
|
|
777
|
-
} else if (firstFilter.
|
|
2517
|
+
} else if (firstFilter.operator > secondFilter.operator) {
|
|
778
2518
|
return 1;
|
|
779
2519
|
}
|
|
780
2520
|
if (firstFilter.value < secondFilter.value) {
|
|
@@ -785,18 +2525,18 @@ const compareFilters = (firstFilter, secondFilter) => {
|
|
|
785
2525
|
return 0;
|
|
786
2526
|
};
|
|
787
2527
|
const areFiltersEquivalent = (firstFilter, secondFilter) => {
|
|
788
|
-
return firstFilter.
|
|
2528
|
+
return firstFilter.field === secondFilter.field && firstFilter.operator === secondFilter.operator && firstFilter.value === secondFilter.value;
|
|
789
2529
|
};
|
|
790
2530
|
const areFilterModelsEquivalent = (filterModel, filterModelToMatch) => {
|
|
791
2531
|
const {
|
|
792
2532
|
items,
|
|
793
|
-
|
|
2533
|
+
logicOperator
|
|
794
2534
|
} = filterModel;
|
|
795
2535
|
const {
|
|
796
2536
|
items: itemsToMatch,
|
|
797
|
-
|
|
2537
|
+
logicOperator: logicOperatorToMatch
|
|
798
2538
|
} = filterModelToMatch;
|
|
799
|
-
if (
|
|
2539
|
+
if (logicOperator !== logicOperatorToMatch) {
|
|
800
2540
|
return false;
|
|
801
2541
|
}
|
|
802
2542
|
if (items.length !== itemsToMatch.length) {
|
|
@@ -809,7 +2549,7 @@ const areFilterModelsEquivalent = (filterModel, filterModelToMatch) => {
|
|
|
809
2549
|
const filterToCompare = itemsToMatch[i];
|
|
810
2550
|
|
|
811
2551
|
// compareFilters return 0 if and only if the filters have the same
|
|
812
|
-
//
|
|
2552
|
+
// field, operator, and value
|
|
813
2553
|
if (!areFiltersEquivalent(filter, filterToCompare)) {
|
|
814
2554
|
return false;
|
|
815
2555
|
}
|
|
@@ -818,8 +2558,6 @@ const areFilterModelsEquivalent = (filterModel, filterModelToMatch) => {
|
|
|
818
2558
|
};
|
|
819
2559
|
|
|
820
2560
|
// Get and Set data from LocalStorage WITHOUT useState
|
|
821
|
-
|
|
822
|
-
// triggering a state update and consecutive re-render
|
|
823
2561
|
const useFetchState = (defaultValue, key) => {
|
|
824
2562
|
let stickyValue = null;
|
|
825
2563
|
try {
|
|
@@ -827,16 +2565,7 @@ const useFetchState = (defaultValue, key) => {
|
|
|
827
2565
|
} catch (e) {
|
|
828
2566
|
console.error('StatefulDataGrid: error getting item from local storage: ', e);
|
|
829
2567
|
}
|
|
830
|
-
|
|
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
|
-
}
|
|
2568
|
+
const parsedValue = stickyValue !== null && stickyValue !== undefined && stickyValue !== 'undefined' ? JSON.parse(stickyValue) : defaultValue;
|
|
840
2569
|
const updateValue = useCallback(value => {
|
|
841
2570
|
try {
|
|
842
2571
|
window.localStorage.setItem(key, JSON.stringify(value));
|
|
@@ -847,6 +2576,8 @@ const useFetchState = (defaultValue, key) => {
|
|
|
847
2576
|
return [parsedValue, updateValue];
|
|
848
2577
|
};
|
|
849
2578
|
|
|
2579
|
+
// import useLocalStorage from './useLocalStorage';
|
|
2580
|
+
|
|
850
2581
|
const useTableStates = (id, version) => {
|
|
851
2582
|
const [paginationModel, setPaginationModel] = useFetchState('', buildStorageKey({
|
|
852
2583
|
id,
|
|
@@ -903,8 +2634,7 @@ const useStatefulTable = props => {
|
|
|
903
2634
|
onColumnVisibilityModelChange: propsOnColumnVisibilityModelChange,
|
|
904
2635
|
onColumnWidthChange: propsOnColumnWidthChange,
|
|
905
2636
|
onFilterModelChange: propsOnFilterModelChange,
|
|
906
|
-
|
|
907
|
-
onPageSizeChange: propsOnPageSizeChange,
|
|
2637
|
+
onPaginationModelChange: propsOnPaginationModelChange,
|
|
908
2638
|
onPinnedColumnsChange: propsOnPinnedColumnsChange,
|
|
909
2639
|
onSortModelChange: propsOnSortModelChange,
|
|
910
2640
|
useRouter,
|
|
@@ -934,7 +2664,7 @@ const useStatefulTable = props => {
|
|
|
934
2664
|
setDimensionModel
|
|
935
2665
|
} = useTableStates(id, localStorageVersion);
|
|
936
2666
|
|
|
937
|
-
// clearing up old version keys
|
|
2667
|
+
// clearing up old version keys, triggering only on first render
|
|
938
2668
|
useEffect(() => clearPreviousVersionStorage(id, previousLocalStorageVersions), [id, previousLocalStorageVersions]);
|
|
939
2669
|
const onColumnDimensionChange = useCallback(_ref => {
|
|
940
2670
|
let {
|
|
@@ -979,7 +2709,7 @@ const useStatefulTable = props => {
|
|
|
979
2709
|
onFilterModelChange: (model, details) => {
|
|
980
2710
|
const filterModel = _objectSpread2(_objectSpread2({}, model), {}, {
|
|
981
2711
|
items: model.items.map(item => {
|
|
982
|
-
const column = apiRef.current.getColumn(item.
|
|
2712
|
+
const column = apiRef.current.getColumn(item.field);
|
|
983
2713
|
item.type = column.type || 'string';
|
|
984
2714
|
return item;
|
|
985
2715
|
}),
|
|
@@ -1017,33 +2747,16 @@ const useStatefulTable = props => {
|
|
|
1017
2747
|
}, search, localStorageVersion, historyReplace, columns);
|
|
1018
2748
|
},
|
|
1019
2749
|
pinnedColumns: pinnedColumnsModel,
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
filterModel: filterParsed,
|
|
1027
|
-
sortModel: sortModelParsed,
|
|
1028
|
-
paginationModel: {
|
|
1029
|
-
page,
|
|
1030
|
-
pageSize: paginationModelParsed.pageSize,
|
|
1031
|
-
direction
|
|
1032
|
-
},
|
|
1033
|
-
columnsModel: apiRef.current.state.columns.columnVisibilityModel,
|
|
1034
|
-
pinnedColumnsModel: pinnedColumnsModel
|
|
1035
|
-
}, search, localStorageVersion, historyReplace, columns);
|
|
1036
|
-
},
|
|
1037
|
-
onPageSizeChange: (pageSize, details) => {
|
|
1038
|
-
propsOnPageSizeChange === null || propsOnPageSizeChange === void 0 ? void 0 : propsOnPageSizeChange(pageSize, details);
|
|
2750
|
+
paginationModel: paginationModelParsed,
|
|
2751
|
+
onPaginationModelChange: (model, details) => {
|
|
2752
|
+
const paginationModel = _objectSpread2(_objectSpread2({}, model), {}, {
|
|
2753
|
+
direction: paginationModelParsed.page < model.page ? 'next' : 'back'
|
|
2754
|
+
});
|
|
2755
|
+
propsOnPaginationModelChange === null || propsOnPaginationModelChange === void 0 ? void 0 : propsOnPaginationModelChange(paginationModel, details);
|
|
1039
2756
|
updateUrl({
|
|
1040
2757
|
filterModel: filterParsed,
|
|
1041
2758
|
sortModel: sortModelParsed,
|
|
1042
|
-
paginationModel:
|
|
1043
|
-
page: paginationModelParsed.page,
|
|
1044
|
-
pageSize,
|
|
1045
|
-
direction: paginationModelParsed.direction
|
|
1046
|
-
},
|
|
2759
|
+
paginationModel: paginationModel,
|
|
1047
2760
|
columnsModel: apiRef.current.state.columns.columnVisibilityModel,
|
|
1048
2761
|
pinnedColumnsModel: pinnedColumnsModel
|
|
1049
2762
|
}, search, localStorageVersion, historyReplace, columns);
|
|
@@ -1069,7 +2782,7 @@ const useStatefulTable = props => {
|
|
|
1069
2782
|
};
|
|
1070
2783
|
};
|
|
1071
2784
|
|
|
1072
|
-
const _excluded = ["apiRef", "autoHeight", "className", "columns", "
|
|
2785
|
+
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"];
|
|
1073
2786
|
const COMPONENT_NAME = 'DataGrid';
|
|
1074
2787
|
const CLASSNAME = 'redsift-datagrid';
|
|
1075
2788
|
const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
|
|
@@ -1079,15 +2792,13 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
1079
2792
|
autoHeight,
|
|
1080
2793
|
className,
|
|
1081
2794
|
columns,
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
componentsProps,
|
|
2795
|
+
slots,
|
|
2796
|
+
slotProps,
|
|
1085
2797
|
filterModel: propsFilterModel,
|
|
1086
2798
|
columnVisibilityModel: propsColumnVisibilityModel,
|
|
1087
2799
|
pinnedColumns: propsPinnedColumns,
|
|
1088
2800
|
sortModel: propsSortModel,
|
|
1089
|
-
|
|
1090
|
-
pageSize: propsPageSize,
|
|
2801
|
+
paginationModel: propsPaginationModel,
|
|
1091
2802
|
height: propsHeight,
|
|
1092
2803
|
hideToolbar,
|
|
1093
2804
|
initialState,
|
|
@@ -1096,11 +2807,10 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
1096
2807
|
localStorageVersion,
|
|
1097
2808
|
previousLocalStorageVersions,
|
|
1098
2809
|
onFilterModelChange: propsOnFilterModelChange,
|
|
1099
|
-
|
|
2810
|
+
rowSelectionModel: propsRowSelectionModel,
|
|
1100
2811
|
onColumnWidthChange: propsOnColumnWidthChange,
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
onSelectionModelChange: propsOnSelectionModelChange,
|
|
2812
|
+
onPaginationModelChange: propsOnPaginationModelChange,
|
|
2813
|
+
onRowSelectionModelChange: propsOnRowSelectionModelChange,
|
|
1104
2814
|
onColumnVisibilityModelChange: propsOnColumnVisibilityModelChange,
|
|
1105
2815
|
onPinnedColumnsChange: propsOnPinnedColumnsChange,
|
|
1106
2816
|
onSortModelChange: propsOnSortModelChange,
|
|
@@ -1108,7 +2818,7 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
1108
2818
|
paginationPlacement = 'both',
|
|
1109
2819
|
paginationProps,
|
|
1110
2820
|
rows,
|
|
1111
|
-
|
|
2821
|
+
pageSizeOptions,
|
|
1112
2822
|
sx,
|
|
1113
2823
|
theme: propsTheme,
|
|
1114
2824
|
useRouter,
|
|
@@ -1116,46 +2826,41 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
1116
2826
|
rowCount
|
|
1117
2827
|
} = props,
|
|
1118
2828
|
forwardedProps = _objectWithoutProperties(props, _excluded);
|
|
1119
|
-
const theme = useTheme(propsTheme);
|
|
2829
|
+
const theme = useTheme$1(propsTheme);
|
|
1120
2830
|
const _apiRef = useGridApiRef();
|
|
1121
2831
|
const apiRef = propsApiRef !== null && propsApiRef !== void 0 ? propsApiRef : _apiRef;
|
|
1122
|
-
const RenderedToolbar =
|
|
2832
|
+
const RenderedToolbar = slots !== null && slots !== void 0 && slots.toolbar ? slots.toolbar : Toolbar;
|
|
1123
2833
|
LicenseInfo.setLicenseKey(license);
|
|
1124
2834
|
const height = propsHeight !== null && propsHeight !== void 0 ? propsHeight : autoHeight ? undefined : '500px';
|
|
1125
2835
|
const {
|
|
1126
2836
|
onColumnVisibilityModelChange: controlledOnColumnVisibilityModelChange,
|
|
1127
2837
|
onFilterModelChange: controlledOnFilterModelChange,
|
|
1128
|
-
|
|
1129
|
-
onPageSizeChange: controlledOnPageSizeChange,
|
|
2838
|
+
onPaginationModelChange: controlledOnPaginationModelChange,
|
|
1130
2839
|
onPinnedColumnsChange: controlledOnPinnedColumnsChange,
|
|
1131
2840
|
onSortModelChange: controlledOnSortModelChange
|
|
1132
2841
|
} = useControlledDatagridState({
|
|
1133
2842
|
initialState,
|
|
1134
|
-
|
|
2843
|
+
pageSizeOptions,
|
|
1135
2844
|
propsColumnVisibilityModel,
|
|
1136
2845
|
propsFilterModel,
|
|
1137
2846
|
propsOnColumnVisibilityModelChange,
|
|
1138
2847
|
propsOnFilterModelChange,
|
|
1139
2848
|
propsOnPinnedColumnsChange,
|
|
1140
2849
|
propsOnSortModelChange,
|
|
1141
|
-
|
|
1142
|
-
propsPageSize,
|
|
2850
|
+
propsPaginationModel,
|
|
1143
2851
|
propsPinnedColumns,
|
|
1144
2852
|
propsSortModel,
|
|
1145
|
-
|
|
1146
|
-
propsOnPageSizeChange
|
|
2853
|
+
propsOnPaginationModelChange
|
|
1147
2854
|
});
|
|
1148
2855
|
const {
|
|
1149
2856
|
columnVisibilityModel,
|
|
1150
2857
|
filterModel,
|
|
1151
2858
|
onColumnVisibilityModelChange,
|
|
1152
2859
|
onFilterModelChange,
|
|
1153
|
-
|
|
1154
|
-
onPageSizeChange,
|
|
2860
|
+
onPaginationModelChange,
|
|
1155
2861
|
onPinnedColumnsChange,
|
|
1156
2862
|
onSortModelChange,
|
|
1157
|
-
|
|
1158
|
-
pageSize,
|
|
2863
|
+
paginationModel,
|
|
1159
2864
|
pinnedColumns,
|
|
1160
2865
|
sortModel,
|
|
1161
2866
|
onColumnWidthChange
|
|
@@ -1166,31 +2871,30 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
1166
2871
|
onColumnVisibilityModelChange: controlledOnColumnVisibilityModelChange,
|
|
1167
2872
|
onColumnWidthChange: propsOnColumnWidthChange,
|
|
1168
2873
|
onFilterModelChange: controlledOnFilterModelChange,
|
|
1169
|
-
|
|
1170
|
-
onPageSizeChange: controlledOnPageSizeChange,
|
|
2874
|
+
onPaginationModelChange: controlledOnPaginationModelChange,
|
|
1171
2875
|
onPinnedColumnsChange: controlledOnPinnedColumnsChange,
|
|
1172
2876
|
onSortModelChange: controlledOnSortModelChange,
|
|
1173
2877
|
useRouter: useRouter,
|
|
1174
2878
|
localStorageVersion,
|
|
1175
2879
|
previousLocalStorageVersions
|
|
1176
2880
|
});
|
|
1177
|
-
const [
|
|
2881
|
+
const [rowSelectionModel, setRowSelectionModel] = useState(propsRowSelectionModel !== null && propsRowSelectionModel !== void 0 ? propsRowSelectionModel : []);
|
|
1178
2882
|
useEffect(() => {
|
|
1179
|
-
|
|
1180
|
-
}, [
|
|
1181
|
-
const
|
|
1182
|
-
if (
|
|
1183
|
-
|
|
2883
|
+
setRowSelectionModel(propsRowSelectionModel !== null && propsRowSelectionModel !== void 0 ? propsRowSelectionModel : []);
|
|
2884
|
+
}, [propsRowSelectionModel]);
|
|
2885
|
+
const onRowSelectionModelChange = (selectionModel, details) => {
|
|
2886
|
+
if (propsOnRowSelectionModelChange) {
|
|
2887
|
+
propsOnRowSelectionModelChange(selectionModel, details);
|
|
1184
2888
|
} else {
|
|
1185
|
-
|
|
2889
|
+
setRowSelectionModel(selectionModel);
|
|
1186
2890
|
}
|
|
1187
2891
|
};
|
|
1188
2892
|
const selectionStatus = useRef({
|
|
1189
2893
|
type: 'none',
|
|
1190
2894
|
numberOfSelectedRows: 0,
|
|
1191
2895
|
numberOfSelectedRowsInPage: 0,
|
|
1192
|
-
page,
|
|
1193
|
-
pageSize: pageSize
|
|
2896
|
+
page: paginationModel.page,
|
|
2897
|
+
pageSize: paginationModel.pageSize
|
|
1194
2898
|
});
|
|
1195
2899
|
|
|
1196
2900
|
// The checkboxSelectionVisibleOnly should only be applied to client-side pagination,
|
|
@@ -1201,9 +2905,9 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
1201
2905
|
// every time we navigate between pages, resize our page or select something
|
|
1202
2906
|
useEffect(() => {
|
|
1203
2907
|
if (paginationMode == 'server') {
|
|
1204
|
-
onServerSideSelectionStatusChange(Array.isArray(
|
|
2908
|
+
onServerSideSelectionStatusChange(Array.isArray(rowSelectionModel) ? rowSelectionModel : [rowSelectionModel], apiRef, selectionStatus, isRowSelectable, paginationModel.page, paginationModel.pageSize);
|
|
1205
2909
|
}
|
|
1206
|
-
}, [
|
|
2910
|
+
}, [rowSelectionModel, paginationModel.page, paginationModel.pageSize]);
|
|
1207
2911
|
if (!Array.isArray(rows)) {
|
|
1208
2912
|
return null;
|
|
1209
2913
|
}
|
|
@@ -1229,22 +2933,20 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
1229
2933
|
ref: datagridRef,
|
|
1230
2934
|
className: classNames(StatefulDataGrid.className, className),
|
|
1231
2935
|
$height: height
|
|
1232
|
-
}, /*#__PURE__*/React__default.createElement(DataGridPro, _extends({}, forwardedProps, {
|
|
2936
|
+
}, /*#__PURE__*/React__default.createElement(DataGridPro, _extends$1({}, forwardedProps, {
|
|
1233
2937
|
apiRef: apiRef,
|
|
1234
2938
|
columns: columns,
|
|
1235
2939
|
columnVisibilityModel: columnVisibilityModel,
|
|
1236
2940
|
filterModel: filterModel,
|
|
1237
2941
|
onColumnVisibilityModelChange: onColumnVisibilityModelChange,
|
|
1238
2942
|
onFilterModelChange: onFilterModelChange,
|
|
1239
|
-
|
|
1240
|
-
onPageSizeChange: onPageSizeChange,
|
|
2943
|
+
onPaginationModelChange: onPaginationModelChange,
|
|
1241
2944
|
onPinnedColumnsChange: onPinnedColumnsChange,
|
|
1242
2945
|
onSortModelChange: onSortModelChange,
|
|
1243
|
-
|
|
1244
|
-
pageSize: pageSize,
|
|
2946
|
+
paginationModel: paginationModel,
|
|
1245
2947
|
pinnedColumns: pinnedColumns,
|
|
1246
2948
|
sortModel: sortModel,
|
|
1247
|
-
|
|
2949
|
+
pageSizeOptions: pageSizeOptions,
|
|
1248
2950
|
onColumnWidthChange: onColumnWidthChange,
|
|
1249
2951
|
initialState: initialState,
|
|
1250
2952
|
isRowSelectable: isRowSelectable,
|
|
@@ -1255,79 +2957,74 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
1255
2957
|
rowCount: rowCount,
|
|
1256
2958
|
autoHeight: autoHeight,
|
|
1257
2959
|
checkboxSelectionVisibleOnly: checkboxSelectionVisibleOnly,
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
ColumnFilteredIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends({}, props, {
|
|
2960
|
+
slots: _objectSpread2(_objectSpread2({
|
|
2961
|
+
baseButton: BaseButton,
|
|
2962
|
+
baseCheckbox: BaseCheckbox,
|
|
2963
|
+
// baseTextField,
|
|
2964
|
+
basePopper: BasePopper,
|
|
2965
|
+
columnFilteredIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
|
|
1265
2966
|
displayName: "ColumnFilteredIcon"
|
|
1266
2967
|
})),
|
|
1267
|
-
|
|
2968
|
+
columnSelectorIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
|
|
1268
2969
|
displayName: "ColumnSelectorIcon"
|
|
1269
2970
|
})),
|
|
1270
|
-
|
|
2971
|
+
columnSortedAscendingIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
|
|
1271
2972
|
displayName: "ColumnSortedAscendingIcon"
|
|
1272
2973
|
})),
|
|
1273
|
-
|
|
2974
|
+
columnSortedDescendingIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
|
|
1274
2975
|
displayName: "ColumnSortedDescendingIcon"
|
|
1275
2976
|
})),
|
|
1276
|
-
|
|
2977
|
+
densityCompactIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
|
|
1277
2978
|
displayName: "DensityCompactIcon"
|
|
1278
2979
|
})),
|
|
1279
|
-
|
|
2980
|
+
densityStandardIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
|
|
1280
2981
|
displayName: "DensityStandardIcon"
|
|
1281
2982
|
})),
|
|
1282
|
-
|
|
2983
|
+
densityComfortableIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
|
|
1283
2984
|
displayName: "DensityComfortableIcon"
|
|
1284
2985
|
})),
|
|
1285
|
-
|
|
2986
|
+
detailPanelCollapseIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
|
|
1286
2987
|
displayName: "DetailPanelCollapseIcon"
|
|
1287
2988
|
})),
|
|
1288
|
-
|
|
2989
|
+
detailPanelExpandIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
|
|
1289
2990
|
displayName: "DetailPanelExpandIcon"
|
|
1290
2991
|
})),
|
|
1291
|
-
|
|
2992
|
+
exportIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({}, props, {
|
|
1292
2993
|
displayName: "ExportIcon"
|
|
1293
2994
|
})),
|
|
1294
|
-
|
|
2995
|
+
openFilterButtonIcon: props => /*#__PURE__*/React__default.createElement(BaseIcon, _extends$1({
|
|
1295
2996
|
displayName: "OpenFilterButtonIcon"
|
|
1296
2997
|
}, props))
|
|
1297
|
-
},
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
return pagination ? paginationMode == 'server' ? /*#__PURE__*/React__default.createElement(ServerSideControlledPagination, _extends({}, props, {
|
|
2998
|
+
}, slots), {}, {
|
|
2999
|
+
toolbar: ToolbarWrapper,
|
|
3000
|
+
pagination: props => {
|
|
3001
|
+
return pagination ? paginationMode == 'server' ? /*#__PURE__*/React__default.createElement(ServerSideControlledPagination, _extends$1({}, props, {
|
|
1301
3002
|
displaySelection: false,
|
|
1302
3003
|
displayRowsPerPage: ['bottom', 'both'].includes(paginationPlacement),
|
|
1303
3004
|
displayPagination: ['bottom', 'both'].includes(paginationPlacement),
|
|
1304
3005
|
selectionStatus: selectionStatus.current,
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
onPageSizeChange: onPageSizeChange,
|
|
1309
|
-
rowsPerPageOptions: rowsPerPageOptions,
|
|
3006
|
+
paginationModel: paginationModel,
|
|
3007
|
+
onPaginationModelChange: onPaginationModelChange,
|
|
3008
|
+
pageSizeOptions: pageSizeOptions,
|
|
1310
3009
|
paginationProps: paginationProps,
|
|
1311
3010
|
paginationMode: paginationMode,
|
|
1312
3011
|
rowCount: rowCount
|
|
1313
|
-
})) : /*#__PURE__*/React__default.createElement(ControlledPagination, _extends({}, props, {
|
|
3012
|
+
})) : /*#__PURE__*/React__default.createElement(ControlledPagination, _extends$1({}, props, {
|
|
1314
3013
|
displaySelection: false,
|
|
1315
3014
|
displayRowsPerPage: ['bottom', 'both'].includes(paginationPlacement),
|
|
1316
3015
|
displayPagination: ['bottom', 'both'].includes(paginationPlacement),
|
|
1317
3016
|
selectionStatus: selectionStatus.current,
|
|
1318
3017
|
apiRef: apiRef,
|
|
1319
3018
|
isRowSelectable: isRowSelectable,
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
onPageSizeChange: onPageSizeChange,
|
|
1324
|
-
rowsPerPageOptions: rowsPerPageOptions,
|
|
3019
|
+
paginationModel: paginationModel,
|
|
3020
|
+
onPaginationModelChange: onPaginationModelChange,
|
|
3021
|
+
pageSizeOptions: pageSizeOptions,
|
|
1325
3022
|
paginationProps: paginationProps,
|
|
1326
3023
|
paginationMode: paginationMode
|
|
1327
3024
|
})) : null;
|
|
1328
3025
|
}
|
|
1329
3026
|
}),
|
|
1330
|
-
|
|
3027
|
+
slotProps: _objectSpread2(_objectSpread2({}, slotProps), {}, {
|
|
1331
3028
|
toolbar: _objectSpread2({
|
|
1332
3029
|
hideToolbar,
|
|
1333
3030
|
RenderedToolbar,
|
|
@@ -1338,18 +3035,16 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
1338
3035
|
selectionStatus,
|
|
1339
3036
|
apiRef,
|
|
1340
3037
|
isRowSelectable,
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
onPageSizeChange,
|
|
1345
|
-
rowsPerPageOptions,
|
|
3038
|
+
paginationModel,
|
|
3039
|
+
onPaginationModelChange,
|
|
3040
|
+
pageSizeOptions,
|
|
1346
3041
|
paginationProps,
|
|
1347
3042
|
paginationMode,
|
|
1348
3043
|
rowCount
|
|
1349
|
-
},
|
|
3044
|
+
}, slotProps === null || slotProps === void 0 ? void 0 : slotProps.toolbar)
|
|
1350
3045
|
}),
|
|
1351
|
-
|
|
1352
|
-
|
|
3046
|
+
rowSelectionModel: rowSelectionModel,
|
|
3047
|
+
onRowSelectionModelChange: (newSelectionModel, details) => {
|
|
1353
3048
|
if (pagination && paginationMode != 'server') {
|
|
1354
3049
|
const selectableRowsInPage = isRowSelectable ? gridPaginatedVisibleSortedGridRowEntriesSelector(apiRef).filter(_ref => {
|
|
1355
3050
|
let {
|
|
@@ -1407,7 +3102,7 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
1407
3102
|
};
|
|
1408
3103
|
}
|
|
1409
3104
|
}
|
|
1410
|
-
|
|
3105
|
+
onRowSelectionModelChange === null || onRowSelectionModelChange === void 0 ? void 0 : onRowSelectionModelChange(newSelectionModel, details);
|
|
1411
3106
|
},
|
|
1412
3107
|
sx: _objectSpread2(_objectSpread2({}, sx), {}, {
|
|
1413
3108
|
'.MuiDataGrid-columnHeaders': {
|
|
@@ -1423,5 +3118,5 @@ const StatefulDataGrid = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
1423
3118
|
StatefulDataGrid.className = CLASSNAME;
|
|
1424
3119
|
StatefulDataGrid.displayName = COMPONENT_NAME;
|
|
1425
3120
|
|
|
1426
|
-
export {
|
|
3121
|
+
export { getSearchParamsFromSorting as $, getGridStringArrayOperatorsWithSelectOnStringArrayColumns as A, SORT_MODEL_KEY as B, CONTAINS_ANY_OF as C, DOES_NOT_CONTAIN as D, ENDS_WITH_ANY_OF as E, FILTER_MODEL_KEY as F, PINNED_COLUMNS as G, HAS as H, IS_BETWEEN as I, DIMENSION_MODEL_KEY as J, FILTER_SEARCH_KEY as K, CATEGORIES as L, buildStorageKey as M, clearPreviousVersionStorage as N, decodeValue as O, PAGINATION_MODEL_KEY as P, encodeValue as Q, urlSearchParamsToString as R, STARTS_WITH_ANY_OF as S, numberOperatorEncoder as T, numberOperatorDecoder as U, VISIBILITY_MODEL_KEY as V, isOperatorValueValid as W, isValueValid as X, getFilterModelFromString as Y, getSearchParamsFromFilterModel as Z, getSortingFromString as _, DOES_NOT_EQUAL as a, getPaginationFromString as a0, getSearchParamsFromPagination as a1, getColumnVisibilityFromString as a2, getSearchParamsFromColumnVisibility as a3, getPinnedColumnsFromString as a4, getSearchParamsFromPinnedColumns as a5, getSearchParamsFromTab as a6, getFinalSearch as a7, getModelsParsedOrUpdateLocalStorage as a8, updateUrl as a9, areFilterModelsEquivalent as aa, StatefulDataGrid as ab, 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, DOES_NOT_HAVE_ANY_OF as n, operatorList as o, DOES_NOT_HAVE_ANY_OF_WITH_SELECT as p, IS_ANY_OF as q, IS_ANY_OF_WITH_SELECT as r, IS_ANY_OF_I as s, IS_ANY_OF_I_WITH_SELECT as t, HAS_ANY_OF as u, HAS_ANY_OF_WITH_SELECT as v, IS_NOT_ANY_OF as w, IS_NOT_ANY_OF_WITH_SELECT as x, getGridStringArrayOperators as y, getGridStringArrayOperatorsWithSelect as z };
|
|
1427
3122
|
//# sourceMappingURL=StatefulDataGrid2.js.map
|