@react-fabric/form 1.0.0-beta.6 → 1.0.0-beta.60
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/{src/input/ArrayInput.module.css → css/_arrayInput.css} +8 -8
- package/css/_colorPicker.css +65 -0
- package/{src/internal/Field.module.css → css/_field.css} +66 -30
- package/{src/input/File.module.css → css/_file.css} +21 -6
- package/css/styles.css +27 -0
- package/dist/cjs/builder/FileField.js +40 -28
- package/dist/cjs/builder/FormField.js +50 -34
- package/dist/cjs/builder/SchemaEditor.js +72 -0
- package/dist/cjs/builder/components/AddSchemaFields.js +62 -0
- package/dist/cjs/builder/components/SchemaArrayForm.js +145 -0
- package/dist/cjs/builder/components/SchemaField.js +414 -0
- package/dist/cjs/form/Controller.js +46 -1
- package/dist/cjs/form/Form.js +70 -9
- package/dist/cjs/hooks/useFileUploader.js +16 -0
- package/dist/cjs/hooks/useFormBuilder.js +57 -15
- package/dist/cjs/i18n/ar.json.js +5 -4
- package/dist/cjs/i18n/en.json.js +5 -5
- package/dist/cjs/index.js +12 -2
- package/dist/cjs/input/ArrayInput.js +126 -36
- package/dist/cjs/input/AvatarInput.js +43 -23
- package/dist/cjs/input/Checkbox.js +16 -6
- package/dist/cjs/input/ColorInput.js +113 -58
- package/dist/cjs/input/ColorPicker.js +60 -76
- package/dist/cjs/input/DateInput.js +197 -0
- package/dist/cjs/input/Field.js +10 -4
- package/dist/cjs/input/File.js +14 -7
- package/dist/cjs/input/Hidden.js +13 -2
- package/dist/cjs/input/Input.js +24 -10
- package/dist/cjs/input/Number.js +22 -10
- package/dist/cjs/input/Password.js +22 -12
- package/dist/cjs/input/Radio.js +12 -3
- package/dist/cjs/input/RadioGroup.js +10 -1
- package/dist/cjs/input/{Range.js → RangeSlider.js} +16 -8
- package/dist/cjs/input/Search.js +30 -19
- package/dist/cjs/input/Slider.js +12 -6
- package/dist/cjs/input/Switch.js +20 -9
- package/dist/cjs/input/Textarea.js +29 -8
- package/dist/cjs/internal/ErrorIcon.js +1 -1
- package/dist/cjs/internal/FieldWrapper.js +11 -4
- package/dist/cjs/internal/InputWrapper.js +27 -20
- package/dist/cjs/select/AutoComplete.js +21 -11
- package/dist/cjs/select/DualList.js +34 -12
- package/dist/cjs/select/List.js +68 -22
- package/dist/cjs/select/Options.js +49 -42
- package/dist/cjs/select/Select.js +40 -10
- package/dist/cjs/select/useSelect.js +22 -11
- package/dist/cjs/types/schema.js +43 -0
- package/dist/cjs/utils/eventHandlers.js +15 -5
- package/dist/esm/builder/FileField.js +42 -30
- package/dist/esm/builder/FormField.js +50 -34
- package/dist/esm/builder/SchemaEditor.js +72 -0
- package/dist/esm/builder/components/AddSchemaFields.js +62 -0
- package/dist/esm/builder/components/SchemaArrayForm.js +145 -0
- package/dist/esm/builder/components/SchemaField.js +414 -0
- package/dist/esm/form/Controller.js +46 -1
- package/dist/esm/form/Form.js +72 -12
- package/dist/esm/hooks/useFileUploader.js +16 -0
- package/dist/esm/hooks/useFormBuilder.js +55 -13
- package/dist/esm/i18n/ar.json.js +5 -4
- package/dist/esm/i18n/en.json.js +5 -5
- package/dist/esm/index.js +6 -2
- package/dist/esm/input/ArrayInput.js +126 -36
- package/dist/esm/input/AvatarInput.js +44 -24
- package/dist/esm/input/Checkbox.js +16 -6
- package/dist/esm/input/ColorInput.js +115 -60
- package/dist/esm/input/ColorPicker.js +60 -76
- package/dist/esm/input/DateInput.js +197 -0
- package/dist/esm/input/Field.js +11 -5
- package/dist/esm/input/File.js +16 -9
- package/dist/esm/input/Hidden.js +13 -2
- package/dist/esm/input/Input.js +26 -12
- package/dist/esm/input/Number.js +24 -12
- package/dist/esm/input/Password.js +24 -14
- package/dist/esm/input/Radio.js +12 -3
- package/dist/esm/input/RadioGroup.js +11 -2
- package/dist/esm/input/{Range.js → RangeSlider.js} +16 -8
- package/dist/esm/input/Search.js +32 -21
- package/dist/esm/input/Slider.js +12 -6
- package/dist/esm/input/Switch.js +20 -9
- package/dist/esm/input/Textarea.js +30 -9
- package/dist/esm/internal/ErrorIcon.js +1 -1
- package/dist/esm/internal/FieldWrapper.js +11 -4
- package/dist/esm/internal/InputWrapper.js +27 -20
- package/dist/esm/select/AutoComplete.js +21 -11
- package/dist/esm/select/DualList.js +34 -12
- package/dist/esm/select/List.js +69 -23
- package/dist/esm/select/Options.js +49 -42
- package/dist/esm/select/Select.js +40 -10
- package/dist/esm/select/useSelect.js +23 -12
- package/{src/input/ColorPicker.module.css → dist/esm/types/schema.js} +18 -27
- package/dist/esm/utils/eventHandlers.js +15 -5
- package/dist/types/builder/FileField.d.ts +4 -2
- package/dist/types/builder/FormField.d.ts +3 -1
- package/dist/types/builder/SchemaEditor.d.ts +9 -0
- package/dist/types/builder/components/AddSchemaFields.d.ts +2 -0
- package/dist/types/builder/components/SchemaArrayForm.d.ts +2 -0
- package/dist/types/builder/components/SchemaField.d.ts +10 -0
- package/dist/types/form/Controller.d.ts +47 -2
- package/dist/types/form/Form.d.ts +48 -2
- package/dist/types/hooks/useFileUploader.d.ts +16 -0
- package/dist/types/hooks/useFormBuilder.d.ts +32 -1
- package/dist/types/index.d.ts +6 -3
- package/dist/types/input/ArrayInput.d.ts +69 -12
- package/dist/types/input/AvatarInput.d.ts +23 -3
- package/dist/types/input/Checkbox.d.ts +13 -4
- package/dist/types/input/ColorInput.d.ts +15 -2
- package/dist/types/input/ColorPicker.d.ts +11 -1
- package/dist/types/input/DateInput.d.ts +28 -0
- package/dist/types/input/Field.d.ts +5 -1
- package/dist/types/input/File.d.ts +9 -0
- package/dist/types/input/Hidden.d.ts +13 -1
- package/dist/types/input/Input.d.ts +9 -1
- package/dist/types/input/Number.d.ts +9 -1
- package/dist/types/input/Password.d.ts +7 -1
- package/dist/types/input/Radio.d.ts +9 -1
- package/dist/types/input/RadioGroup.d.ts +8 -1
- package/dist/types/input/RangeSlider.d.ts +67 -0
- package/dist/types/input/Search.d.ts +14 -1
- package/dist/types/input/Slider.d.ts +8 -2
- package/dist/types/input/Switch.d.ts +10 -2
- package/dist/types/input/Textarea.d.ts +15 -1
- package/dist/types/internal/FieldWrapper.d.ts +1 -1
- package/dist/types/internal/InputWrapper.d.ts +1 -1
- package/dist/types/ranger/index.d.ts +2 -2
- package/dist/types/select/AutoComplete.d.ts +8 -1
- package/dist/types/select/DualList.d.ts +17 -2
- package/dist/types/select/List.d.ts +9 -1
- package/dist/types/select/Options.d.ts +4 -3
- package/dist/types/select/Select.d.ts +9 -1
- package/dist/types/select/useSelect.d.ts +10 -6
- package/dist/types/types/index.d.ts +34 -5
- package/dist/types/types/schema.d.ts +78 -33
- package/dist/types/utils/eventHandlers.d.ts +2 -2
- package/package.json +22 -20
- package/src/builder/FileField.tsx +62 -30
- package/src/builder/FormField.tsx +52 -32
- package/src/builder/SchemaEditor.tsx +79 -0
- package/src/builder/components/AddSchemaFields.tsx +74 -0
- package/src/builder/components/SchemaArrayForm.tsx +161 -0
- package/src/builder/components/SchemaField.tsx +436 -0
- package/src/form/Controller.tsx +48 -3
- package/src/form/Form.tsx +80 -8
- package/src/hooks/useFileUploader.ts +16 -0
- package/src/hooks/useFormBuilder.tsx +58 -15
- package/src/i18n/ar.json +5 -4
- package/src/i18n/en.json +5 -5
- package/src/index.ts +12 -3
- package/src/input/ArrayInput.tsx +199 -64
- package/src/input/AvatarInput.tsx +67 -19
- package/src/input/Checkbox.tsx +16 -6
- package/src/input/ColorInput.tsx +131 -71
- package/src/input/ColorPicker.tsx +54 -72
- package/src/input/DateInput.tsx +260 -0
- package/src/input/Field.tsx +15 -11
- package/src/input/File.tsx +16 -14
- package/src/input/Hidden.tsx +17 -2
- package/src/input/Input.tsx +27 -13
- package/src/input/Number.tsx +22 -13
- package/src/input/Password.tsx +24 -16
- package/src/input/Radio.tsx +12 -3
- package/src/input/RadioGroup.tsx +12 -3
- package/src/input/{Range.tsx → RangeSlider.tsx} +17 -9
- package/src/input/Search.tsx +33 -22
- package/src/input/Slider.tsx +20 -11
- package/src/input/Switch.tsx +17 -6
- package/src/input/Textarea.tsx +34 -9
- package/src/internal/ErrorIcon.tsx +1 -1
- package/src/internal/FieldWrapper.tsx +8 -4
- package/src/internal/InputWrapper.tsx +49 -27
- package/src/select/AutoComplete.tsx +14 -3
- package/src/select/DualList.tsx +31 -16
- package/src/select/List.tsx +52 -8
- package/src/select/Options.tsx +50 -46
- package/src/select/Select.tsx +25 -5
- package/src/select/useSelect.tsx +26 -9
- package/src/types/index.ts +37 -6
- package/src/types/schema.ts +96 -41
- package/src/utils/eventHandlers.ts +14 -4
- package/dist/cjs/input/ArrayInput.module.css +0 -1
- package/dist/cjs/input/ColorPicker.module.css +0 -1
- package/dist/cjs/input/File.module.css +0 -1
- package/dist/cjs/internal/Field.module.css +0 -1
- package/dist/esm/input/ArrayInput.module.css +0 -1
- package/dist/esm/input/ColorPicker.module.css +0 -1
- package/dist/esm/input/File.module.css +0 -1
- package/dist/esm/internal/Field.module.css +0 -1
- package/dist/types/input/Range.d.ts +0 -59
|
@@ -4,22 +4,34 @@ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
|
|
|
4
4
|
var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
|
|
5
5
|
var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
|
|
6
6
|
var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
|
|
7
|
+
var core = require('@dnd-kit/core');
|
|
8
|
+
var modifiers = require('@dnd-kit/modifiers');
|
|
7
9
|
var core$1 = require('@react-fabric/core');
|
|
10
|
+
var utilities = require('@react-fabric/utilities');
|
|
8
11
|
var react = require('react');
|
|
9
12
|
var Field = require('../input/Field.js');
|
|
10
13
|
var List = require('./List.js');
|
|
11
|
-
var modifiers = require('@dnd-kit/modifiers');
|
|
12
|
-
var core = require('@dnd-kit/core');
|
|
13
|
-
var utilities = require('@react-fabric/utilities');
|
|
14
14
|
var jsxRuntime = require('react/jsx-runtime');
|
|
15
15
|
|
|
16
|
-
var _excluded = ["ref", "value", "options", "groupProperty", "height", "labelProperty", "valueProperty", "renderer", "onChange", "name", "invalid", "readOnly", "disabled", "placeholder", "autoFocus", "error"];
|
|
16
|
+
var _excluded = ["ref", "value", "options", "emptyDisplay", "groupProperty", "height", "labelProperty", "valueProperty", "renderer", "onChange", "name", "invalid", "readOnly", "disabled", "placeholder", "autoFocus", "error"];
|
|
17
17
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
18
18
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
19
|
+
/**
|
|
20
|
+
* DualList component allows users to select items from two lists.
|
|
21
|
+
* It displays two lists side by side, one for unselected items and one for selected items.
|
|
22
|
+
* Users can move items between the lists using buttons or drag-and-drop functionality.
|
|
23
|
+
* It supports multiple selections and provides options for grouping, labeling, and rendering items.
|
|
24
|
+
* It also includes features for handling empty states and custom rendering of items.
|
|
25
|
+
* This component is useful for scenarios where users need to manage selections from a larger set of options, such as in forms or settings.
|
|
26
|
+
*
|
|
27
|
+
* @param {DualListProps<T>} props - The properties for the DualList component.
|
|
28
|
+
* @returns {JSX.Element} The rendered DualList component.
|
|
29
|
+
*/
|
|
19
30
|
var DualList = function DualList(_ref) {
|
|
20
31
|
var ref = _ref.ref,
|
|
21
32
|
value = _ref.value,
|
|
22
33
|
options = _ref.options,
|
|
34
|
+
emptyDisplay = _ref.emptyDisplay,
|
|
23
35
|
groupProperty = _ref.groupProperty,
|
|
24
36
|
_ref$height = _ref.height,
|
|
25
37
|
height = _ref$height === void 0 ? "18rem" : _ref$height,
|
|
@@ -163,6 +175,7 @@ var DualList = function DualList(_ref) {
|
|
|
163
175
|
error: error,
|
|
164
176
|
height: height,
|
|
165
177
|
options: leftOptions,
|
|
178
|
+
emptyDisplay: emptyDisplay,
|
|
166
179
|
groupProperty: groupProperty,
|
|
167
180
|
labelProperty: labelProperty,
|
|
168
181
|
valueProperty: valueProperty,
|
|
@@ -177,36 +190,44 @@ var DualList = function DualList(_ref) {
|
|
|
177
190
|
vertical: true,
|
|
178
191
|
className: "outline overflow-hidden bg-base",
|
|
179
192
|
children: [/*#__PURE__*/jsxRuntime.jsx(core$1.Button, {
|
|
180
|
-
rtlFlip: true,
|
|
181
193
|
size: "sm",
|
|
182
194
|
variant: "link",
|
|
183
195
|
"aria-label": "scroll to top",
|
|
184
196
|
onClick: moveAllLeft,
|
|
185
|
-
icon:
|
|
197
|
+
icon: {
|
|
198
|
+
icon: core$1.CoreIcons.chevronsLeft,
|
|
199
|
+
rtlFlip: true
|
|
200
|
+
},
|
|
186
201
|
disabled: !rightOptions.length
|
|
187
202
|
}), /*#__PURE__*/jsxRuntime.jsx(core$1.Button, {
|
|
188
|
-
rtlFlip: true,
|
|
189
203
|
size: "sm",
|
|
190
204
|
variant: "link",
|
|
191
205
|
"aria-label": "scroll up",
|
|
192
206
|
onClick: moveRightSelected,
|
|
193
|
-
icon:
|
|
207
|
+
icon: {
|
|
208
|
+
icon: core$1.CoreIcons.chevronLeft,
|
|
209
|
+
rtlFlip: true
|
|
210
|
+
},
|
|
194
211
|
disabled: !rightSelected.length
|
|
195
212
|
}), /*#__PURE__*/jsxRuntime.jsx(core$1.Button, {
|
|
196
|
-
rtlFlip: true,
|
|
197
213
|
size: "sm",
|
|
198
214
|
variant: "link",
|
|
199
215
|
"aria-label": "scroll down",
|
|
200
216
|
onClick: moveLeftSelected,
|
|
201
|
-
icon:
|
|
217
|
+
icon: {
|
|
218
|
+
icon: core$1.CoreIcons.chevronRight,
|
|
219
|
+
rtlFlip: true
|
|
220
|
+
},
|
|
202
221
|
disabled: !leftSelected.length
|
|
203
222
|
}), /*#__PURE__*/jsxRuntime.jsx(core$1.Button, {
|
|
204
|
-
rtlFlip: true,
|
|
205
223
|
size: "sm",
|
|
206
224
|
variant: "link",
|
|
207
225
|
"aria-label": "scroll to bottom",
|
|
208
226
|
onClick: moveAllRight,
|
|
209
|
-
icon:
|
|
227
|
+
icon: {
|
|
228
|
+
icon: core$1.CoreIcons.chevronsRight,
|
|
229
|
+
rtlFlip: true
|
|
230
|
+
},
|
|
210
231
|
disabled: !leftOptions.length
|
|
211
232
|
})]
|
|
212
233
|
})
|
|
@@ -218,6 +239,7 @@ var DualList = function DualList(_ref) {
|
|
|
218
239
|
allowClear: true,
|
|
219
240
|
height: height,
|
|
220
241
|
options: rightOptions,
|
|
242
|
+
emptyDisplay: emptyDisplay,
|
|
221
243
|
groupProperty: groupProperty,
|
|
222
244
|
labelProperty: labelProperty,
|
|
223
245
|
valueProperty: valueProperty,
|
package/dist/cjs/select/List.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator');
|
|
3
4
|
var _defineProperty = require('@babel/runtime/helpers/defineProperty');
|
|
4
5
|
var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
|
|
6
|
+
var _regeneratorRuntime = require('@babel/runtime/regenerator');
|
|
5
7
|
var react$1 = require('@floating-ui/react');
|
|
6
8
|
var core = require('@react-fabric/core');
|
|
7
9
|
var utilities = require('@react-fabric/utilities');
|
|
@@ -13,26 +15,29 @@ var Options = require('./Options.js');
|
|
|
13
15
|
var useSelect = require('./useSelect.js');
|
|
14
16
|
var jsxRuntime = require('react/jsx-runtime');
|
|
15
17
|
|
|
16
|
-
var _excluded = ["ref", "name", "value", "readOnly", "disabled", "required", "placeholder", "autoFocus", "options", "height", "groupProperty", "labelProperty", "valueProperty", "multiple", "allowCreate", "createOption", "matcher", "renderer", "onQuery", "onChange", "onSelect", "onEnterPressed", "invalid", "error", "allowClear", "decorateStart", "decorateEnd", "data-inner", "data-hide-selected"];
|
|
18
|
+
var _excluded = ["ref", "name", "value", "readOnly", "disabled", "required", "placeholder", "autoFocus", "options", "height", "groupProperty", "labelProperty", "valueProperty", "infoProperty", "sortProperty", "multiple", "allowCreate", "searchable", "createOption", "matcher", "renderer", "onQuery", "onChange", "onSelect", "onEnterPressed", "emptyDisplay", "invalid", "error", "allowClear", "decorateStart", "decorateEnd", "data-inner", "data-hide-selected"];
|
|
17
19
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
18
20
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
19
21
|
var List = function List(_ref) {
|
|
20
|
-
var _state$query;
|
|
21
|
-
_ref.ref
|
|
22
|
-
|
|
22
|
+
var _state$query, _state$activeItem;
|
|
23
|
+
var ref = _ref.ref,
|
|
24
|
+
name = _ref.name,
|
|
23
25
|
value = _ref.value,
|
|
24
26
|
readOnly = _ref.readOnly,
|
|
25
27
|
disabled = _ref.disabled,
|
|
26
28
|
required = _ref.required,
|
|
27
|
-
placeholder = _ref.placeholder
|
|
28
|
-
_ref.autoFocus
|
|
29
|
-
|
|
29
|
+
placeholder = _ref.placeholder,
|
|
30
|
+
autoFocus = _ref.autoFocus,
|
|
31
|
+
options = _ref.options,
|
|
30
32
|
height = _ref.height,
|
|
31
33
|
groupProperty = _ref.groupProperty,
|
|
32
34
|
labelProperty = _ref.labelProperty,
|
|
33
35
|
valueProperty = _ref.valueProperty,
|
|
36
|
+
infoProperty = _ref.infoProperty,
|
|
37
|
+
sortProperty = _ref.sortProperty,
|
|
34
38
|
multiple = _ref.multiple,
|
|
35
39
|
allowCreate = _ref.allowCreate,
|
|
40
|
+
searchable = _ref.searchable,
|
|
36
41
|
createOption = _ref.createOption,
|
|
37
42
|
matcher = _ref.matcher,
|
|
38
43
|
renderer = _ref.renderer,
|
|
@@ -40,6 +45,7 @@ var List = function List(_ref) {
|
|
|
40
45
|
onChange = _ref.onChange,
|
|
41
46
|
onSelect = _ref.onSelect,
|
|
42
47
|
onEnterPressed = _ref.onEnterPressed,
|
|
48
|
+
emptyDisplay = _ref.emptyDisplay,
|
|
43
49
|
invalid = _ref.invalid,
|
|
44
50
|
error = _ref.error;
|
|
45
51
|
_ref.allowClear;
|
|
@@ -58,9 +64,11 @@ var List = function List(_ref) {
|
|
|
58
64
|
value: value,
|
|
59
65
|
options: options,
|
|
60
66
|
multiple: multiple,
|
|
67
|
+
alwaysOpen: true,
|
|
61
68
|
groupProperty: groupProperty,
|
|
62
69
|
labelProperty: labelProperty,
|
|
63
70
|
valueProperty: valueProperty,
|
|
71
|
+
sortProperty: sortProperty,
|
|
64
72
|
allowCreate: allowCreate,
|
|
65
73
|
createOption: createOption,
|
|
66
74
|
matcher: matcher,
|
|
@@ -138,9 +146,10 @@ var List = function List(_ref) {
|
|
|
138
146
|
}
|
|
139
147
|
} else if (evt.key === "Backspace") {
|
|
140
148
|
!state.query && handleRemove();
|
|
141
|
-
} else if (["ArrowUp", "ArrowDown"].includes(evt.key)) {
|
|
142
|
-
if (state.activeIndex === null) {
|
|
143
|
-
|
|
149
|
+
} else if (!searchable || ["ArrowUp", "ArrowDown"].includes(evt.key)) {
|
|
150
|
+
if (["ArrowUp", "ArrowDown"].includes(evt.key) && state.activeIndex === null) {
|
|
151
|
+
var _state$selectedIndex;
|
|
152
|
+
setActiveIndex((_state$selectedIndex = state.selectedIndex) !== null && _state$selectedIndex !== void 0 ? _state$selectedIndex : 0);
|
|
144
153
|
}
|
|
145
154
|
setTimeout(function () {
|
|
146
155
|
var _props$onKeyDown;
|
|
@@ -185,6 +194,14 @@ var List = function List(_ref) {
|
|
|
185
194
|
});
|
|
186
195
|
}
|
|
187
196
|
}, [state.value, state.query, placeholder, renderer]);
|
|
197
|
+
react.useLayoutEffect(function () {
|
|
198
|
+
setTimeout(function () {
|
|
199
|
+
var _listRef$current$stat;
|
|
200
|
+
state.selectedIndex && ((_listRef$current$stat = listRef.current[state.selectedIndex]) === null || _listRef$current$stat === void 0 ? void 0 : _listRef$current$stat.scrollIntoView({
|
|
201
|
+
block: "center"
|
|
202
|
+
}));
|
|
203
|
+
}, 100);
|
|
204
|
+
}, [state.selectedIndex]);
|
|
188
205
|
return /*#__PURE__*/jsxRuntime.jsxs(Wrapper, _objectSpread(_objectSpread({}, wrapperProps), {}, {
|
|
189
206
|
children: [/*#__PURE__*/jsxRuntime.jsx(InputWrapper.InputWrapper, {
|
|
190
207
|
showClear: !utilities.isEmpty(state.value),
|
|
@@ -197,23 +214,32 @@ var List = function List(_ref) {
|
|
|
197
214
|
className: "z-1 rounded-b-none",
|
|
198
215
|
"data-inner": true,
|
|
199
216
|
wrapperRef: refs.setReference,
|
|
200
|
-
children: /*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
217
|
+
children: /*#__PURE__*/jsxRuntime.jsxs("div", _objectSpread(_objectSpread({
|
|
218
|
+
role: "none",
|
|
201
219
|
"data-select-display": "true",
|
|
202
|
-
className: "group flex-1 py-1 px-2 truncate text-start flex gap-1 flex-wrap"
|
|
203
|
-
|
|
220
|
+
className: classNames("group flex-1 py-1 px-2 truncate text-start flex gap-1 relative min-h-5 justify-start", multiple ? "flex-wrap" : "flex-nowrap overflow-hidden")
|
|
221
|
+
}, referenceProps), {}, {
|
|
222
|
+
onMouseUp: function onMouseUp(e) {
|
|
223
|
+
var _e$currentTarget$quer;
|
|
224
|
+
return (_e$currentTarget$quer = e.currentTarget.querySelector("input")) === null || _e$currentTarget$quer === void 0 ? void 0 : _e$currentTarget$quer.focus();
|
|
225
|
+
},
|
|
226
|
+
children: [!hideSelected && displayValue, /*#__PURE__*/jsxRuntime.jsx("input", {
|
|
227
|
+
readOnly: !searchable || readOnly,
|
|
204
228
|
disabled: disabled,
|
|
205
229
|
value: (_state$query = state.query) !== null && _state$query !== void 0 ? _state$query : "",
|
|
206
230
|
"aria-invalid": invalid,
|
|
207
231
|
"data-testid": name,
|
|
208
232
|
name: name,
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
233
|
+
size: 1,
|
|
234
|
+
ref: ref,
|
|
235
|
+
autoFocus: autoFocus,
|
|
236
|
+
className: classNames("appearance-none bg-transparent outline-none border-none ring-0 flex-1 min-w-24", disabled && "cursor-not-allowed pointer-events-none", multiple && "min-w-24"),
|
|
237
|
+
placeholder: utilities.isEmpty(state.value) ? placeholder : "",
|
|
212
238
|
onChange: function onChange(evt) {
|
|
213
239
|
return handleQuery(evt.target.value);
|
|
214
240
|
}
|
|
215
|
-
})
|
|
216
|
-
})
|
|
241
|
+
})]
|
|
242
|
+
}))
|
|
217
243
|
}), /*#__PURE__*/jsxRuntime.jsx(react$1.FloatingFocusManager, {
|
|
218
244
|
context: context,
|
|
219
245
|
initialFocus: -1,
|
|
@@ -227,12 +253,32 @@ var List = function List(_ref) {
|
|
|
227
253
|
}, floatingProps), {}, {
|
|
228
254
|
items: state.items,
|
|
229
255
|
active: state.activeIndex,
|
|
256
|
+
valueProperty: valueProperty,
|
|
257
|
+
labelProperty: labelProperty,
|
|
230
258
|
itemRef: setItemRef,
|
|
231
259
|
itemProps: makeItemProps,
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
260
|
+
empty: emptyDisplay,
|
|
261
|
+
info: (_state$activeItem = state.activeItem) === null || _state$activeItem === void 0 ? void 0 : _state$activeItem[infoProperty !== null && infoProperty !== void 0 ? infoProperty : "info"],
|
|
262
|
+
children: ( /*#__PURE__*/function () {
|
|
263
|
+
var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(item, label) {
|
|
264
|
+
var _renderer3;
|
|
265
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
266
|
+
while (1) switch (_context.prev = _context.next) {
|
|
267
|
+
case 0:
|
|
268
|
+
_context.next = 2;
|
|
269
|
+
return (_renderer3 = renderer === null || renderer === void 0 ? void 0 : renderer(item)) !== null && _renderer3 !== void 0 ? _renderer3 : label;
|
|
270
|
+
case 2:
|
|
271
|
+
return _context.abrupt("return", _context.sent);
|
|
272
|
+
case 3:
|
|
273
|
+
case "end":
|
|
274
|
+
return _context.stop();
|
|
275
|
+
}
|
|
276
|
+
}, _callee);
|
|
277
|
+
}));
|
|
278
|
+
return function (_x, _x2) {
|
|
279
|
+
return _ref4.apply(this, arguments);
|
|
280
|
+
};
|
|
281
|
+
}())
|
|
236
282
|
}))
|
|
237
283
|
})]
|
|
238
284
|
}));
|
|
@@ -7,7 +7,7 @@ var classNames = require('classnames');
|
|
|
7
7
|
var reactI18next = require('react-i18next');
|
|
8
8
|
var jsxRuntime = require('react/jsx-runtime');
|
|
9
9
|
|
|
10
|
-
var _excluded = ["ref", "style", "items", "active", "className", "itemRef", "empty", "valueProperty", "labelProperty", "itemProps", "children"];
|
|
10
|
+
var _excluded = ["ref", "style", "items", "active", "className", "itemRef", "empty", "info", "valueProperty", "labelProperty", "itemProps", "children"];
|
|
11
11
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
12
12
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
13
13
|
var Options = function Options(_ref) {
|
|
@@ -17,7 +17,8 @@ var Options = function Options(_ref) {
|
|
|
17
17
|
active = _ref.active,
|
|
18
18
|
className = _ref.className,
|
|
19
19
|
itemRef = _ref.itemRef,
|
|
20
|
-
empty = _ref.empty
|
|
20
|
+
empty = _ref.empty,
|
|
21
|
+
info = _ref.info;
|
|
21
22
|
_ref.valueProperty;
|
|
22
23
|
var _ref$labelProperty = _ref.labelProperty,
|
|
23
24
|
labelProperty = _ref$labelProperty === void 0 ? "label" : _ref$labelProperty,
|
|
@@ -26,49 +27,55 @@ var Options = function Options(_ref) {
|
|
|
26
27
|
rest = _objectWithoutProperties(_ref, _excluded);
|
|
27
28
|
return /*#__PURE__*/jsxRuntime.jsxs("div", _objectSpread(_objectSpread({
|
|
28
29
|
ref: ref,
|
|
29
|
-
className: classNames("bg-base select-none
|
|
30
|
+
className: classNames("bg-base select-none flex flex-col", className),
|
|
30
31
|
style: style
|
|
31
32
|
}, rest), {}, {
|
|
32
|
-
children: [
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
var _item$labelProperty;
|
|
38
|
-
if (item.___group___) return /*#__PURE__*/jsxRuntime.jsx("p", {
|
|
39
|
-
className: "px-2 py-1 text-muted text-xs sticky -top-px z-2 bg-base border-t",
|
|
40
|
-
children: item.label
|
|
41
|
-
}, index);
|
|
42
|
-
if (item.___create___) return /*#__PURE__*/jsxRuntime.jsx("div", _objectSpread(_objectSpread({
|
|
43
|
-
role: "none",
|
|
44
|
-
tabIndex: active === index ? 0 : -1,
|
|
45
|
-
ref: function ref(el) {
|
|
46
|
-
return itemRef(index, el);
|
|
47
|
-
},
|
|
48
|
-
"data-active": active === index ? true : undefined,
|
|
49
|
-
className: classNames("block text-start truncate px-2 py-1 leading-normal cursor-pointer select-none", "data-[active]:bg-primary-200 data-[selected]:bg-primary-600 data-[selected]:text-white data-[active]:data-[selected]:underline")
|
|
50
|
-
}, itemProps(item)), {}, {
|
|
51
|
-
children: /*#__PURE__*/jsxRuntime.jsx(reactI18next.Trans, {
|
|
52
|
-
i18nKey: "form:select.createOption",
|
|
53
|
-
values: {
|
|
54
|
-
query: item.value
|
|
55
|
-
},
|
|
56
|
-
components: [/*#__PURE__*/jsxRuntime.jsx("strong", {
|
|
57
|
-
children: "query"
|
|
58
|
-
}, "t0")]
|
|
33
|
+
children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
34
|
+
className: classNames("overflow-x-hidden overflow-y-auto flex-1"),
|
|
35
|
+
children: [items.length === 0 && (empty !== null && empty !== void 0 ? empty : /*#__PURE__*/jsxRuntime.jsx(core.EmptyContent, {
|
|
36
|
+
message: /*#__PURE__*/jsxRuntime.jsx(reactI18next.Trans, {
|
|
37
|
+
i18nKey: "form:select.emptyList"
|
|
59
38
|
})
|
|
60
|
-
}), index)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
39
|
+
})), items.map(function (item, index) {
|
|
40
|
+
var _item$value, _item$labelProperty;
|
|
41
|
+
if (item.___group___) return /*#__PURE__*/jsxRuntime.jsx("p", {
|
|
42
|
+
className: "px-2 py-1 text-muted text-xs sticky -top-px z-2 bg-base border-t",
|
|
43
|
+
children: item.label
|
|
44
|
+
}, index);
|
|
45
|
+
if (item.___create___) return /*#__PURE__*/jsxRuntime.jsx("div", _objectSpread(_objectSpread({
|
|
46
|
+
role: "none",
|
|
47
|
+
tabIndex: active === index ? 0 : -1,
|
|
48
|
+
ref: function ref(el) {
|
|
49
|
+
return itemRef(index, el);
|
|
50
|
+
},
|
|
51
|
+
"data-active": active === index ? true : undefined,
|
|
52
|
+
className: classNames("block text-start truncate px-2 py-1 leading-normal cursor-pointer select-none", "data-active:bg-primary-200 data-selected:bg-primary-600 data-selected:text-white data-active:data-selected:underline")
|
|
53
|
+
}, itemProps(item)), {}, {
|
|
54
|
+
children: /*#__PURE__*/jsxRuntime.jsx(reactI18next.Trans, {
|
|
55
|
+
i18nKey: "form:select.createOption",
|
|
56
|
+
values: {
|
|
57
|
+
query: (_item$value = item.value) !== null && _item$value !== void 0 ? _item$value : item
|
|
58
|
+
},
|
|
59
|
+
components: [/*#__PURE__*/jsxRuntime.jsx("strong", {
|
|
60
|
+
children: "query"
|
|
61
|
+
}, "t0")]
|
|
62
|
+
})
|
|
63
|
+
}), index);
|
|
64
|
+
return /*#__PURE__*/jsxRuntime.jsx("div", _objectSpread(_objectSpread({
|
|
65
|
+
role: "none",
|
|
66
|
+
tabIndex: active === index ? 0 : -1,
|
|
67
|
+
ref: function ref(el) {
|
|
68
|
+
return itemRef(index, el);
|
|
69
|
+
},
|
|
70
|
+
"data-active": active === index ? true : undefined,
|
|
71
|
+
className: classNames("block text-start truncate px-2 py-1 leading-normal cursor-pointer", "data-active:bg-primary-200 data-selected:bg-primary-600 data-selected:text-white data-active:data-selected:underline")
|
|
72
|
+
}, itemProps(item)), {}, {
|
|
73
|
+
children: children(item, (_item$labelProperty = item[labelProperty]) !== null && _item$labelProperty !== void 0 ? _item$labelProperty : item)
|
|
74
|
+
}), index);
|
|
75
|
+
})]
|
|
76
|
+
}), info && /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
77
|
+
className: "px-2 py-1 text-sm bg-dimmed text-muted",
|
|
78
|
+
children: info
|
|
72
79
|
})]
|
|
73
80
|
}));
|
|
74
81
|
};
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator');
|
|
3
4
|
var _defineProperty = require('@babel/runtime/helpers/defineProperty');
|
|
4
5
|
var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
|
|
6
|
+
var _regeneratorRuntime = require('@babel/runtime/regenerator');
|
|
5
7
|
var react$1 = require('@floating-ui/react');
|
|
6
8
|
var core = require('@react-fabric/core');
|
|
7
9
|
var utilities = require('@react-fabric/utilities');
|
|
@@ -12,11 +14,11 @@ var Options = require('./Options.js');
|
|
|
12
14
|
var useSelect = require('./useSelect.js');
|
|
13
15
|
var jsxRuntime = require('react/jsx-runtime');
|
|
14
16
|
|
|
15
|
-
var _excluded = ["ref", "name", "value", "invalid", "readOnly", "disabled", "required", "placeholder", "autoFocus", "error", "options", "groupProperty", "labelProperty", "valueProperty", "multiple", "searchable", "allowCreate", "createOption", "matcher", "renderer", "onQuery", "onChange", "onSelect", "onEnterPressed"];
|
|
17
|
+
var _excluded = ["ref", "name", "value", "invalid", "readOnly", "disabled", "required", "placeholder", "autoFocus", "error", "options", "defaultOpen", "hideHandle", "groupProperty", "labelProperty", "valueProperty", "sortProperty", "infoProperty", "multiple", "searchable", "allowCreate", "emptyDisplay", "createOption", "matcher", "renderer", "onQuery", "onChange", "onSelect", "onEnterPressed"];
|
|
16
18
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
17
19
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
18
20
|
var Select = function Select(_ref) {
|
|
19
|
-
var _state$query, _refs$reference$curre;
|
|
21
|
+
var _state$query, _refs$reference$curre, _state$activeItem;
|
|
20
22
|
var ref = _ref.ref,
|
|
21
23
|
name = _ref.name,
|
|
22
24
|
value = _ref.value,
|
|
@@ -28,14 +30,19 @@ var Select = function Select(_ref) {
|
|
|
28
30
|
autoFocus = _ref.autoFocus,
|
|
29
31
|
error = _ref.error,
|
|
30
32
|
options = _ref.options,
|
|
33
|
+
defaultOpen = _ref.defaultOpen,
|
|
34
|
+
hideHandle = _ref.hideHandle,
|
|
31
35
|
groupProperty = _ref.groupProperty,
|
|
32
36
|
_ref$labelProperty = _ref.labelProperty,
|
|
33
37
|
labelProperty = _ref$labelProperty === void 0 ? "label" : _ref$labelProperty,
|
|
34
38
|
_ref$valueProperty = _ref.valueProperty,
|
|
35
39
|
valueProperty = _ref$valueProperty === void 0 ? "id" : _ref$valueProperty,
|
|
40
|
+
sortProperty = _ref.sortProperty,
|
|
41
|
+
infoProperty = _ref.infoProperty,
|
|
36
42
|
multiple = _ref.multiple,
|
|
37
43
|
searchable = _ref.searchable,
|
|
38
44
|
allowCreate = _ref.allowCreate,
|
|
45
|
+
emptyDisplay = _ref.emptyDisplay,
|
|
39
46
|
createOption = _ref.createOption,
|
|
40
47
|
matcher = _ref.matcher,
|
|
41
48
|
renderer = _ref.renderer,
|
|
@@ -48,9 +55,11 @@ var Select = function Select(_ref) {
|
|
|
48
55
|
value: value,
|
|
49
56
|
options: options,
|
|
50
57
|
multiple: multiple,
|
|
58
|
+
defaultOpen: defaultOpen,
|
|
51
59
|
groupProperty: groupProperty,
|
|
52
60
|
labelProperty: labelProperty,
|
|
53
61
|
valueProperty: valueProperty,
|
|
62
|
+
sortProperty: sortProperty,
|
|
54
63
|
allowCreate: allowCreate,
|
|
55
64
|
createOption: createOption,
|
|
56
65
|
matcher: matcher,
|
|
@@ -140,6 +149,9 @@ var Select = function Select(_ref) {
|
|
|
140
149
|
return false;
|
|
141
150
|
} else if (state.query) {
|
|
142
151
|
handleQuery("");
|
|
152
|
+
evt.preventDefault();
|
|
153
|
+
evt.stopPropagation();
|
|
154
|
+
return false;
|
|
143
155
|
} else {
|
|
144
156
|
onEnterPressed === null || onEnterPressed === void 0 || onEnterPressed(evt);
|
|
145
157
|
}
|
|
@@ -215,7 +227,7 @@ var Select = function Select(_ref) {
|
|
|
215
227
|
required: required,
|
|
216
228
|
error: error,
|
|
217
229
|
wrapperRef: refs.setReference,
|
|
218
|
-
className: state.open ? "
|
|
230
|
+
className: state.open ? "z-99!" : ""
|
|
219
231
|
}, rest), {}, {
|
|
220
232
|
children: [/*#__PURE__*/jsxRuntime.jsxs("div", _objectSpread(_objectSpread({
|
|
221
233
|
role: "none",
|
|
@@ -236,13 +248,13 @@ var Select = function Select(_ref) {
|
|
|
236
248
|
size: 1,
|
|
237
249
|
ref: ref,
|
|
238
250
|
autoFocus: autoFocus,
|
|
239
|
-
className: classNames("appearance-none bg-transparent outline-none border-none ring-0 flex-1", disabled && "cursor-not-allowed pointer-events-none", multiple && "min-w-24"),
|
|
251
|
+
className: classNames("appearance-none bg-transparent outline-none border-none ring-0 flex-1 peer", disabled && "cursor-not-allowed pointer-events-none", multiple && "min-w-24"),
|
|
240
252
|
placeholder: utilities.isEmpty(state.value) ? placeholder : "",
|
|
241
253
|
onChange: function onChange(evt) {
|
|
242
254
|
return handleQuery(evt.target.value);
|
|
243
255
|
}
|
|
244
256
|
})]
|
|
245
|
-
})), !state.loading && /*#__PURE__*/jsxRuntime.jsx(core.Icon, {
|
|
257
|
+
})), !state.loading && !hideHandle && /*#__PURE__*/jsxRuntime.jsx(core.Icon, {
|
|
246
258
|
className: classNames("flex-content p-2 z-0 order-9 text-muted cursor-pointer self-stretch flex items-center h-auto", state.open && "-scale-y-100 pointer-events-none", disabled && "pointer-events-none"),
|
|
247
259
|
onClick: function onClick() {
|
|
248
260
|
return !disabled && openDropdown();
|
|
@@ -259,7 +271,7 @@ var Select = function Select(_ref) {
|
|
|
259
271
|
visuallyHiddenDismiss: true,
|
|
260
272
|
children: /*#__PURE__*/jsxRuntime.jsx(Options.Options, _objectSpread(_objectSpread({
|
|
261
273
|
ref: refs.setFloating,
|
|
262
|
-
className: "outline shadow-lg max-h-[40vh] z-
|
|
274
|
+
className: "outline shadow-lg max-h-[40vh] z-(--z-popover)",
|
|
263
275
|
style: _objectSpread({
|
|
264
276
|
width: (_refs$reference$curre = refs.reference.current) === null || _refs$reference$curre === void 0 ? void 0 : _refs$reference$curre.getBoundingClientRect().width
|
|
265
277
|
}, floatingStyles)
|
|
@@ -270,10 +282,28 @@ var Select = function Select(_ref) {
|
|
|
270
282
|
labelProperty: labelProperty,
|
|
271
283
|
itemRef: setItemRef,
|
|
272
284
|
itemProps: makeItemProps,
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
285
|
+
empty: emptyDisplay,
|
|
286
|
+
info: (_state$activeItem = state.activeItem) === null || _state$activeItem === void 0 ? void 0 : _state$activeItem[infoProperty !== null && infoProperty !== void 0 ? infoProperty : "info"],
|
|
287
|
+
children: ( /*#__PURE__*/function () {
|
|
288
|
+
var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(item, label) {
|
|
289
|
+
var _renderer3;
|
|
290
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
291
|
+
while (1) switch (_context.prev = _context.next) {
|
|
292
|
+
case 0:
|
|
293
|
+
_context.next = 2;
|
|
294
|
+
return (_renderer3 = renderer === null || renderer === void 0 ? void 0 : renderer(item)) !== null && _renderer3 !== void 0 ? _renderer3 : label;
|
|
295
|
+
case 2:
|
|
296
|
+
return _context.abrupt("return", _context.sent);
|
|
297
|
+
case 3:
|
|
298
|
+
case "end":
|
|
299
|
+
return _context.stop();
|
|
300
|
+
}
|
|
301
|
+
}, _callee);
|
|
302
|
+
}));
|
|
303
|
+
return function (_x, _x2) {
|
|
304
|
+
return _ref4.apply(this, arguments);
|
|
305
|
+
};
|
|
306
|
+
}())
|
|
277
307
|
}))
|
|
278
308
|
})
|
|
279
309
|
})]
|