@sipesistemas/polaris 1.3.0 → 1.4.1
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/build/cjs/components/{SearchableSelect/SearchableSelect.css.js → DropDown/DropDown.css.js} +1 -1
- package/build/cjs/components/{SearchableSelect/SearchableSelect.js → DropDown/DropDown.js} +124 -72
- package/build/cjs/components/DropDown/DropDownField.js +33 -0
- package/build/cjs/components/IndexTable/IndexTable.css.js +8 -1
- package/build/cjs/components/IndexTable/IndexTable.js +59 -11
- package/build/cjs/components/IndexTable/components/Row/Row.js +69 -6
- package/build/cjs/index.js +2 -2
- package/build/cjs/utilities/index-table/context.js +2 -0
- package/build/esm/components/DropDown/DropDown.css.js +5 -0
- package/build/esm/components/{SearchableSelect/SearchableSelect.js → DropDown/DropDown.js} +123 -72
- package/build/esm/components/DropDown/DropDownField.js +31 -0
- package/build/esm/components/IndexTable/IndexTable.css.js +8 -1
- package/build/esm/components/IndexTable/IndexTable.js +60 -12
- package/build/esm/components/IndexTable/components/Row/Row.js +68 -5
- package/build/esm/index.js +1 -1
- package/build/esm/styles.css +61 -14
- package/build/esm/utilities/index-table/context.js +2 -1
- package/build/esnext/components/AppProvider/global.out.css +1 -1
- package/build/esnext/components/DropDown/DropDown.css.esnext +7 -0
- package/build/esnext/components/{SearchableSelect/SearchableSelect.esnext → DropDown/DropDown.esnext} +126 -75
- package/build/esnext/components/DropDown/DropDown.out.css +16 -0
- package/build/esnext/components/DropDown/DropDownField.esnext +31 -0
- package/build/esnext/components/IndexTable/IndexTable.css.esnext +8 -1
- package/build/esnext/components/IndexTable/IndexTable.esnext +60 -12
- package/build/esnext/components/IndexTable/IndexTable.out.css +42 -0
- package/build/esnext/components/IndexTable/components/Row/Row.esnext +68 -5
- package/build/esnext/index.esnext +1 -1
- package/build/esnext/utilities/index-table/context.esnext +2 -1
- package/build/ts/src/components/DropDown/DropDown.d.ts +101 -0
- package/build/ts/src/components/DropDown/DropDown.d.ts.map +1 -0
- package/build/ts/src/components/DropDown/DropDownField.d.ts +8 -0
- package/build/ts/src/components/DropDown/DropDownField.d.ts.map +1 -0
- package/build/ts/src/components/DropDown/index.d.ts +2 -0
- package/build/ts/src/components/DropDown/index.d.ts.map +1 -0
- package/build/ts/src/components/IndexTable/IndexTable.d.ts +7 -0
- package/build/ts/src/components/IndexTable/IndexTable.d.ts.map +1 -1
- package/build/ts/src/components/IndexTable/components/Row/Row.d.ts.map +1 -1
- package/build/ts/src/index.d.ts +2 -2
- package/build/ts/src/index.d.ts.map +1 -1
- package/build/ts/src/utilities/index-table/context.d.ts +10 -0
- package/build/ts/src/utilities/index-table/context.d.ts.map +1 -1
- package/locales/en.json +4 -2
- package/locales/pt-BR.json +4 -2
- package/package.json +9 -2
- package/build/esm/components/SearchableSelect/SearchableSelect.css.js +0 -5
- package/build/esnext/components/SearchableSelect/SearchableSelect.css.esnext +0 -7
- package/build/esnext/components/SearchableSelect/SearchableSelect.out.css +0 -11
- package/build/ts/src/components/SearchableSelect/SearchableSelect.d.ts +0 -60
- package/build/ts/src/components/SearchableSelect/SearchableSelect.d.ts.map +0 -1
- package/build/ts/src/components/SearchableSelect/index.d.ts +0 -2
- package/build/ts/src/components/SearchableSelect/index.d.ts.map +0 -1
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
var polarisIcons = require('@shopify/polaris-icons');
|
|
4
4
|
var react = require('react');
|
|
5
|
-
var
|
|
5
|
+
var DropDown_module = require('./DropDown.css.js');
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
+
var EmptySearchResult = require('../EmptySearchResult/EmptySearchResult.js');
|
|
7
8
|
var hooks = require('../../utilities/i18n/hooks.js');
|
|
8
9
|
var TextField = require('../TextField/TextField.js');
|
|
9
10
|
var Icon = require('../Icon/Icon.js');
|
|
11
|
+
var utils = require('../Button/utils.js');
|
|
10
12
|
var Listbox = require('../Listbox/Listbox.js');
|
|
11
|
-
var EmptySearchResult = require('../EmptySearchResult/EmptySearchResult.js');
|
|
12
13
|
var Popover = require('../Popover/Popover.js');
|
|
13
14
|
var Box = require('../Box/Box.js');
|
|
14
15
|
var Scrollable = require('../Scrollable/Scrollable.js');
|
|
@@ -16,26 +17,39 @@ var Scrollable = require('../Scrollable/Scrollable.js');
|
|
|
16
17
|
function getValueByPath(obj, path) {
|
|
17
18
|
return path.split('.').reduce((acc, part) => acc?.[part], obj);
|
|
18
19
|
}
|
|
20
|
+
|
|
21
|
+
/** Resolves the activator text for an option, falling back to its `label` when there is no `object` */
|
|
22
|
+
function resolveOptionLabel(option, selectedLabelKey) {
|
|
23
|
+
if (!option) return '';
|
|
24
|
+
if (selectedLabelKey && option.object !== undefined) {
|
|
25
|
+
const value = getValueByPath(option.object, selectedLabelKey);
|
|
26
|
+
if (typeof value === 'string') return value;
|
|
27
|
+
}
|
|
28
|
+
return typeof option.label === 'string' ? option.label : '';
|
|
29
|
+
}
|
|
19
30
|
const SCROLLABLE_HEIGHT = 292;
|
|
20
|
-
function
|
|
31
|
+
function DropDownBase({
|
|
21
32
|
loading,
|
|
22
33
|
loadingMore,
|
|
23
34
|
options,
|
|
24
|
-
|
|
25
|
-
|
|
35
|
+
value,
|
|
36
|
+
onChange,
|
|
37
|
+
onBlur,
|
|
26
38
|
emptyStateTitle = '',
|
|
27
39
|
emptyStateDescription,
|
|
28
40
|
onQueryChange,
|
|
29
41
|
selectedLabelKey,
|
|
30
42
|
label,
|
|
43
|
+
labelHidden,
|
|
44
|
+
searchable = true,
|
|
31
45
|
placeholder,
|
|
32
46
|
disabled,
|
|
33
47
|
requiredIndicator,
|
|
34
48
|
helpText,
|
|
35
49
|
error,
|
|
36
|
-
pinSelected = true,
|
|
37
50
|
allowClear,
|
|
38
|
-
onScrolledToBottom
|
|
51
|
+
onScrolledToBottom,
|
|
52
|
+
suffixAction
|
|
39
53
|
}) {
|
|
40
54
|
const i18n = hooks.useI18n();
|
|
41
55
|
const [query, setQuery] = react.useState('');
|
|
@@ -46,10 +60,18 @@ function SearchableSelect({
|
|
|
46
60
|
// clicking the clear button bubbles to TextField's container, which focuses the input
|
|
47
61
|
const skipNextFocusOpen = react.useRef(false);
|
|
48
62
|
const listboxId = react.useId();
|
|
63
|
+
const selectedValue = value ?? '';
|
|
64
|
+
const selected = selectedValue ? [selectedValue] : [];
|
|
65
|
+
// when the parent does not control filtering, narrow the options by the query ourselves
|
|
66
|
+
const filteredOptions = react.useMemo(() => {
|
|
67
|
+
if (onQueryChange || !query) return options;
|
|
68
|
+
const needle = query.toLowerCase();
|
|
69
|
+
return options.filter(option => resolveOptionLabel(option, selectedLabelKey).toLowerCase().includes(needle));
|
|
70
|
+
}, [options, query, onQueryChange, selectedLabelKey]);
|
|
49
71
|
const togglePopoverActive = react.useCallback(() => {
|
|
50
72
|
setPopoverActive(active => !active);
|
|
51
73
|
setQuery('');
|
|
52
|
-
onQueryChange('');
|
|
74
|
+
onQueryChange?.('');
|
|
53
75
|
}, [onQueryChange]);
|
|
54
76
|
react.useEffect(() => {
|
|
55
77
|
function handleEsc(event) {
|
|
@@ -62,32 +84,33 @@ function SearchableSelect({
|
|
|
62
84
|
// keep the cache in sync while the selected option is loaded, so its label survives (and stays
|
|
63
85
|
// fresh) if pagination later drops the option from `options`
|
|
64
86
|
react.useEffect(() => {
|
|
65
|
-
if (
|
|
66
|
-
const loadedOption = options.find(option => option.value ===
|
|
67
|
-
|
|
68
|
-
|
|
87
|
+
if (!selectedValue) return;
|
|
88
|
+
const loadedOption = options.find(option => option.value === selectedValue);
|
|
89
|
+
if (!loadedOption) return;
|
|
90
|
+
const label = resolveOptionLabel(loadedOption, selectedLabelKey);
|
|
91
|
+
if (label && (cachedSelection?.value !== selectedValue || cachedSelection.label !== label)) {
|
|
69
92
|
setCachedSelection({
|
|
70
|
-
value:
|
|
93
|
+
value: selectedValue,
|
|
71
94
|
label
|
|
72
95
|
});
|
|
73
96
|
}
|
|
74
|
-
}, [
|
|
97
|
+
}, [selectedValue, options, selectedLabelKey, cachedSelection]);
|
|
75
98
|
const textSelectedItem = react.useMemo(() => {
|
|
76
|
-
if (
|
|
77
|
-
const selectedItem = options.find(option => option.value ===
|
|
78
|
-
const
|
|
79
|
-
if (
|
|
80
|
-
return cachedSelection?.value ===
|
|
81
|
-
}, [
|
|
99
|
+
if (!selectedValue) return '';
|
|
100
|
+
const selectedItem = options.find(option => option.value === selectedValue);
|
|
101
|
+
const resolved = resolveOptionLabel(selectedItem, selectedLabelKey);
|
|
102
|
+
if (resolved) return resolved;
|
|
103
|
+
return cachedSelection?.value === selectedValue ? cachedSelection.label : '';
|
|
104
|
+
}, [selectedValue, options, selectedLabelKey, cachedSelection]);
|
|
82
105
|
const handleSelectionClear = react.useCallback(() => {
|
|
83
106
|
setCachedSelection(null);
|
|
84
|
-
|
|
107
|
+
onChange?.('');
|
|
85
108
|
if (requiredIndicator) {
|
|
86
109
|
setPopoverActive(true);
|
|
87
110
|
} else {
|
|
88
111
|
skipNextFocusOpen.current = true;
|
|
89
112
|
}
|
|
90
|
-
}, [
|
|
113
|
+
}, [onChange, requiredIndicator]);
|
|
91
114
|
const handleActivatorFocus = react.useCallback(() => {
|
|
92
115
|
if (disabled) return;
|
|
93
116
|
if (skipNextFocusOpen.current) {
|
|
@@ -96,10 +119,14 @@ function SearchableSelect({
|
|
|
96
119
|
}
|
|
97
120
|
setPopoverActive(true);
|
|
98
121
|
}, [disabled]);
|
|
122
|
+
|
|
123
|
+
// when the clear button is visible it replaces the caret, so they don't pile up
|
|
124
|
+
const showClearButton = Boolean(allowClear) && textSelectedItem !== '';
|
|
99
125
|
const activator = /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
100
|
-
className:
|
|
126
|
+
className: DropDown_module.default.Activator,
|
|
101
127
|
children: /*#__PURE__*/jsxRuntime.jsx(TextField.TextField, {
|
|
102
128
|
label: label,
|
|
129
|
+
labelHidden: labelHidden,
|
|
103
130
|
placeholder: placeholder,
|
|
104
131
|
autoComplete: "off",
|
|
105
132
|
value: textSelectedItem,
|
|
@@ -107,38 +134,25 @@ function SearchableSelect({
|
|
|
107
134
|
requiredIndicator: requiredIndicator,
|
|
108
135
|
helpText: helpText,
|
|
109
136
|
error: error,
|
|
110
|
-
|
|
137
|
+
role: "combobox",
|
|
138
|
+
ariaExpanded: popoverActive,
|
|
139
|
+
clearButton: showClearButton,
|
|
111
140
|
onClearButtonClick: handleSelectionClear,
|
|
112
141
|
onFocus: handleActivatorFocus,
|
|
113
|
-
|
|
142
|
+
onBlur: onBlur,
|
|
143
|
+
suffix: showClearButton ? undefined : /*#__PURE__*/jsxRuntime.jsx(Icon.Icon, {
|
|
114
144
|
source: polarisIcons.CaretDownIcon
|
|
115
|
-
})
|
|
145
|
+
}),
|
|
146
|
+
connectedRight: suffixAction ? utils.buttonFrom(suffixAction) : undefined
|
|
116
147
|
})
|
|
117
148
|
});
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
return pinSelected ? {
|
|
123
|
-
value: loadedOption.value,
|
|
124
|
-
label: loadedOption.label
|
|
125
|
-
} : null;
|
|
126
|
-
}
|
|
127
|
-
return cachedSelection?.value === selected[0] ? cachedSelection : null;
|
|
128
|
-
}, [query, selected, options, cachedSelection, pinSelected]);
|
|
149
|
+
|
|
150
|
+
// the selected option keeps its natural position in the list; if it is absent from the loaded
|
|
151
|
+
// `options` (e.g. pagination/search reset) it simply isn't listed, while the activator still
|
|
152
|
+
// shows its label via the cache
|
|
129
153
|
const optionsMarkup = react.useMemo(() => {
|
|
130
|
-
if (loading) return null;
|
|
131
|
-
|
|
132
|
-
if (listOptions.length === 0 && !pinnedSelectedOption) return null;
|
|
133
|
-
const pinnedMarkup = pinnedSelectedOption ? /*#__PURE__*/jsxRuntime.jsx(Listbox.Listbox.Option, {
|
|
134
|
-
value: pinnedSelectedOption.value,
|
|
135
|
-
selected: true,
|
|
136
|
-
children: /*#__PURE__*/jsxRuntime.jsx(Listbox.Listbox.TextOption, {
|
|
137
|
-
selected: true,
|
|
138
|
-
children: pinnedSelectedOption.label
|
|
139
|
-
})
|
|
140
|
-
}, pinnedSelectedOption.value) : null;
|
|
141
|
-
return [pinnedMarkup, ...listOptions.map(option => {
|
|
154
|
+
if (loading || filteredOptions.length === 0) return null;
|
|
155
|
+
return filteredOptions.map(option => {
|
|
142
156
|
const isSelected = selected.includes(option.value);
|
|
143
157
|
return /*#__PURE__*/jsxRuntime.jsx(Listbox.Listbox.Option, {
|
|
144
158
|
value: option.value,
|
|
@@ -148,45 +162,45 @@ function SearchableSelect({
|
|
|
148
162
|
children: option.label
|
|
149
163
|
})
|
|
150
164
|
}, option.value);
|
|
151
|
-
})
|
|
152
|
-
}, [loading,
|
|
165
|
+
});
|
|
166
|
+
}, [loading, filteredOptions, selected]);
|
|
153
167
|
const loadingMarkup = loading ? /*#__PURE__*/jsxRuntime.jsx(Listbox.Listbox.Loading, {
|
|
154
|
-
accessibilityLabel: i18n.translate('Polaris.
|
|
168
|
+
accessibilityLabel: i18n.translate('Polaris.DropDown.loadingAccessibilityLabel')
|
|
155
169
|
}) : null;
|
|
156
170
|
const loadingMoreMarkup = loadingMore ? /*#__PURE__*/jsxRuntime.jsx(Listbox.Listbox.Loading, {
|
|
157
|
-
accessibilityLabel: i18n.translate('Polaris.
|
|
171
|
+
accessibilityLabel: i18n.translate('Polaris.DropDown.loadingMoreAccessibilityLabel')
|
|
158
172
|
}) : null;
|
|
159
|
-
const noResultsMarkup = !loading &&
|
|
160
|
-
title: emptyStateTitle,
|
|
161
|
-
description: emptyStateDescription ?? (query ? i18n.translate('Polaris.SearchableSelect.noResultsFoundFor', {
|
|
173
|
+
const noResultsMarkup = !loading && filteredOptions.length === 0 ? /*#__PURE__*/jsxRuntime.jsx(EmptySearchResult.EmptySearchResult, {
|
|
174
|
+
title: emptyStateTitle || (query ? i18n.translate('Polaris.DropDown.noResultsFoundFor', {
|
|
162
175
|
query
|
|
163
|
-
}) : i18n.translate('Polaris.
|
|
176
|
+
}) : i18n.translate('Polaris.DropDown.noResultsFound')),
|
|
177
|
+
description: emptyStateDescription
|
|
164
178
|
}) : null;
|
|
165
179
|
const updateSelection = react.useCallback(newSelection => {
|
|
166
180
|
const option = options.find(({
|
|
167
|
-
value
|
|
168
|
-
}) =>
|
|
169
|
-
const label =
|
|
170
|
-
if (
|
|
181
|
+
value: optionValue
|
|
182
|
+
}) => optionValue === newSelection);
|
|
183
|
+
const label = resolveOptionLabel(option, selectedLabelKey);
|
|
184
|
+
if (label) {
|
|
171
185
|
setCachedSelection({
|
|
172
186
|
value: newSelection,
|
|
173
187
|
label
|
|
174
188
|
});
|
|
175
189
|
} else if (cachedSelection?.value !== newSelection) {
|
|
176
|
-
// re-selecting the
|
|
190
|
+
// re-selecting the cached option (absent from `options`) must keep its cached label
|
|
177
191
|
setCachedSelection(null);
|
|
178
192
|
}
|
|
179
|
-
|
|
193
|
+
onChange?.(newSelection);
|
|
180
194
|
setQuery('');
|
|
181
|
-
onQueryChange('');
|
|
195
|
+
onQueryChange?.('');
|
|
182
196
|
setPopoverActive(false);
|
|
183
|
-
}, [options, selectedLabelKey, cachedSelection,
|
|
197
|
+
}, [options, selectedLabelKey, cachedSelection, onChange, onQueryChange]);
|
|
184
198
|
const handleActiveOptionChange = react.useCallback((_value, domId) => {
|
|
185
199
|
setActiveOptionId(domId);
|
|
186
200
|
}, []);
|
|
187
201
|
const handleQueryClear = react.useCallback(() => {
|
|
188
202
|
setQuery('');
|
|
189
|
-
onQueryChange('');
|
|
203
|
+
onQueryChange?.('');
|
|
190
204
|
}, [onQueryChange]);
|
|
191
205
|
return /*#__PURE__*/jsxRuntime.jsx(Popover.Popover, {
|
|
192
206
|
activator: activator,
|
|
@@ -197,7 +211,7 @@ function SearchableSelect({
|
|
|
197
211
|
preferInputActivator: false,
|
|
198
212
|
children: /*#__PURE__*/jsxRuntime.jsxs(Popover.Popover.Pane, {
|
|
199
213
|
fixed: true,
|
|
200
|
-
children: [/*#__PURE__*/jsxRuntime.jsx(Box.Box, {
|
|
214
|
+
children: [searchable ? /*#__PURE__*/jsxRuntime.jsx(Box.Box, {
|
|
201
215
|
padding: "300",
|
|
202
216
|
children: /*#__PURE__*/jsxRuntime.jsx(TextField.TextField, {
|
|
203
217
|
prefix: /*#__PURE__*/jsxRuntime.jsx(Icon.Icon, {
|
|
@@ -206,22 +220,23 @@ function SearchableSelect({
|
|
|
206
220
|
label: "",
|
|
207
221
|
labelHidden: true,
|
|
208
222
|
autoComplete: "off",
|
|
209
|
-
placeholder: i18n.translate('Polaris.
|
|
223
|
+
placeholder: i18n.translate('Polaris.DropDown.searchPlaceholder'),
|
|
210
224
|
clearButton: true,
|
|
211
225
|
ariaActiveDescendant: activeOptionId,
|
|
212
226
|
ariaControls: listboxId,
|
|
213
227
|
value: query,
|
|
214
228
|
onChange: value => {
|
|
215
|
-
onQueryChange(value);
|
|
229
|
+
onQueryChange?.(value);
|
|
216
230
|
setQuery(value);
|
|
217
231
|
},
|
|
218
232
|
onClearButtonClick: handleQueryClear
|
|
219
233
|
})
|
|
220
|
-
}), /*#__PURE__*/jsxRuntime.jsx(Scrollable.Scrollable, {
|
|
234
|
+
}) : null, /*#__PURE__*/jsxRuntime.jsx(Scrollable.Scrollable, {
|
|
221
235
|
style: {
|
|
222
236
|
position: 'relative',
|
|
223
237
|
maxHeight: SCROLLABLE_HEIGHT,
|
|
224
|
-
|
|
238
|
+
// without the search field above, the list needs its own top padding
|
|
239
|
+
padding: searchable ? '0 0 var(--p-space-200)' : 'var(--p-space-200) 0',
|
|
225
240
|
borderBottomLeftRadius: 'var(--p-border-radius-200)',
|
|
226
241
|
borderBottomRightRadius: 'var(--p-border-radius-200)'
|
|
227
242
|
},
|
|
@@ -239,5 +254,42 @@ function SearchableSelect({
|
|
|
239
254
|
})
|
|
240
255
|
});
|
|
241
256
|
}
|
|
257
|
+
// react-hook-form is an optional peer dependency: only pull it in when the form-aware mode is used
|
|
258
|
+
const LazyDropDownField = /*#__PURE__*/react.lazy(() => Promise.resolve().then(function () { return require('./DropDownField.js'); }).then(module => ({
|
|
259
|
+
default: module.DropDownField
|
|
260
|
+
})));
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* A searchable single-select dropdown. Works standalone via `value`/`onChange`, or as a form-aware
|
|
264
|
+
* field by passing `name` (and optionally `control`) to integrate with react-hook-form.
|
|
265
|
+
*/
|
|
266
|
+
function DropDown(props) {
|
|
267
|
+
if (props.name != null) {
|
|
268
|
+
const {
|
|
269
|
+
name,
|
|
270
|
+
control,
|
|
271
|
+
rules,
|
|
272
|
+
defaultValue,
|
|
273
|
+
...baseProps
|
|
274
|
+
} = props;
|
|
275
|
+
return /*#__PURE__*/jsxRuntime.jsx(react.Suspense, {
|
|
276
|
+
fallback: /*#__PURE__*/jsxRuntime.jsx(DropDownBase, {
|
|
277
|
+
...baseProps,
|
|
278
|
+
disabled: true
|
|
279
|
+
}),
|
|
280
|
+
children: /*#__PURE__*/jsxRuntime.jsx(LazyDropDownField, {
|
|
281
|
+
name: name,
|
|
282
|
+
control: control,
|
|
283
|
+
rules: rules,
|
|
284
|
+
defaultValue: defaultValue,
|
|
285
|
+
...baseProps
|
|
286
|
+
})
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
return /*#__PURE__*/jsxRuntime.jsx(DropDownBase, {
|
|
290
|
+
...props
|
|
291
|
+
});
|
|
292
|
+
}
|
|
242
293
|
|
|
243
|
-
exports.
|
|
294
|
+
exports.DropDown = DropDown;
|
|
295
|
+
exports.DropDownBase = DropDownBase;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var reactHookForm = require('react-hook-form');
|
|
4
|
+
var DropDown = require('./DropDown.js');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
function DropDownField({
|
|
8
|
+
name,
|
|
9
|
+
control,
|
|
10
|
+
rules,
|
|
11
|
+
defaultValue = '',
|
|
12
|
+
error,
|
|
13
|
+
...rest
|
|
14
|
+
}) {
|
|
15
|
+
const {
|
|
16
|
+
field,
|
|
17
|
+
fieldState
|
|
18
|
+
} = reactHookForm.useController({
|
|
19
|
+
name,
|
|
20
|
+
control,
|
|
21
|
+
rules,
|
|
22
|
+
defaultValue
|
|
23
|
+
});
|
|
24
|
+
return /*#__PURE__*/jsxRuntime.jsx(DropDown.DropDownBase, {
|
|
25
|
+
...rest,
|
|
26
|
+
value: field.value,
|
|
27
|
+
onChange: field.onChange,
|
|
28
|
+
onBlur: field.onBlur,
|
|
29
|
+
error: fieldState.error?.message ?? error
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
exports.DropDownField = DropDownField;
|
|
@@ -96,7 +96,14 @@ var styles = {
|
|
|
96
96
|
"HeaderWrapper": "Polaris-IndexTable__HeaderWrapper",
|
|
97
97
|
"StickyTable-condensed": "Polaris-IndexTable__StickyTable--condensed",
|
|
98
98
|
"StickyTableHeader-condensed": "Polaris-IndexTable__StickyTableHeader--condensed",
|
|
99
|
-
"ScrollBarContent": "Polaris-IndexTable__ScrollBarContent"
|
|
99
|
+
"ScrollBarContent": "Polaris-IndexTable__ScrollBarContent",
|
|
100
|
+
"TableHeading-reorder": "Polaris-IndexTable__TableHeading--reorder",
|
|
101
|
+
"TableCellDragHandle": "Polaris-IndexTable__TableCellDragHandle",
|
|
102
|
+
"DragHandle": "Polaris-IndexTable__DragHandle",
|
|
103
|
+
"DragHandleIcon": "Polaris-IndexTable__DragHandleIcon",
|
|
104
|
+
"TableRow-reorderable": "Polaris-IndexTable__TableRow--reorderable",
|
|
105
|
+
"TableRow-dragging": "Polaris-IndexTable__TableRow--dragging",
|
|
106
|
+
"TableRow-dropTarget": "Polaris-IndexTable__TableRow--dropTarget"
|
|
100
107
|
};
|
|
101
108
|
|
|
102
109
|
exports.default = styles;
|
|
@@ -12,7 +12,6 @@ var IndexProvider = require('../IndexProvider/IndexProvider.js');
|
|
|
12
12
|
var Row = require('./components/Row/Row.js');
|
|
13
13
|
var types = require('../../utilities/index-provider/types.js');
|
|
14
14
|
var utilities = require('./utilities/utilities.js');
|
|
15
|
-
var EmptySearchResult = require('../EmptySearchResult/EmptySearchResult.js');
|
|
16
15
|
var ScrollContainer = require('./components/ScrollContainer/ScrollContainer.js');
|
|
17
16
|
var BulkActions = require('../BulkActions/BulkActions.js');
|
|
18
17
|
var Cell = require('./components/Cell/Cell.js');
|
|
@@ -20,9 +19,11 @@ var hooks = require('../../utilities/index-provider/hooks.js');
|
|
|
20
19
|
var hooks$1 = require('../../utilities/i18n/hooks.js');
|
|
21
20
|
var Spinner = require('../Spinner/Spinner.js');
|
|
22
21
|
var AfterInitialMount = require('../AfterInitialMount/AfterInitialMount.js');
|
|
22
|
+
var EmptySearchResult = require('../EmptySearchResult/EmptySearchResult.js');
|
|
23
23
|
var Pagination = require('../Pagination/Pagination.js');
|
|
24
|
-
var
|
|
24
|
+
var context = require('../../utilities/index-table/context.js');
|
|
25
25
|
var Text = require('../Text/Text.js');
|
|
26
|
+
var Checkbox = require('../Checkbox/Checkbox.js');
|
|
26
27
|
var LegacyStack = require('../LegacyStack/LegacyStack.js');
|
|
27
28
|
var Badge = require('../Badge/Badge.js');
|
|
28
29
|
var UnstyledButton = require('../UnstyledButton/UnstyledButton.js');
|
|
@@ -49,6 +50,7 @@ function IndexTableBase({
|
|
|
49
50
|
sortToggleLabels,
|
|
50
51
|
hasZebraStriping,
|
|
51
52
|
pagination,
|
|
53
|
+
onReorder,
|
|
52
54
|
...restProps
|
|
53
55
|
}) {
|
|
54
56
|
const {
|
|
@@ -66,6 +68,34 @@ function IndexTableBase({
|
|
|
66
68
|
} = hooks.useIndexValue();
|
|
67
69
|
const handleSelectionChange = hooks.useIndexSelectionChange();
|
|
68
70
|
const i18n = hooks$1.useI18n();
|
|
71
|
+
const reorderable = typeof onReorder === 'function';
|
|
72
|
+
const [draggingPosition, setDraggingPosition] = react.useState(null);
|
|
73
|
+
const [dropPosition, setDropPosition] = react.useState(null);
|
|
74
|
+
const handleReorderDragStart = react.useCallback(position => {
|
|
75
|
+
setDraggingPosition(position);
|
|
76
|
+
}, []);
|
|
77
|
+
const handleReorderDragEnter = react.useCallback(position => {
|
|
78
|
+
setDropPosition(position);
|
|
79
|
+
}, []);
|
|
80
|
+
const resetReorderState = react.useCallback(() => {
|
|
81
|
+
setDraggingPosition(null);
|
|
82
|
+
setDropPosition(null);
|
|
83
|
+
}, []);
|
|
84
|
+
const handleReorderDrop = react.useCallback(() => {
|
|
85
|
+
if (draggingPosition !== null && dropPosition !== null && draggingPosition !== dropPosition) {
|
|
86
|
+
onReorder?.(draggingPosition, dropPosition);
|
|
87
|
+
}
|
|
88
|
+
resetReorderState();
|
|
89
|
+
}, [draggingPosition, dropPosition, onReorder, resetReorderState]);
|
|
90
|
+
const reorderContextValue = react.useMemo(() => ({
|
|
91
|
+
reorderable,
|
|
92
|
+
draggingPosition,
|
|
93
|
+
dropPosition,
|
|
94
|
+
onDragStart: handleReorderDragStart,
|
|
95
|
+
onDragEnter: handleReorderDragEnter,
|
|
96
|
+
onDrop: handleReorderDrop,
|
|
97
|
+
onDragEnd: resetReorderState
|
|
98
|
+
}), [reorderable, draggingPosition, dropPosition, handleReorderDragStart, handleReorderDragEnter, handleReorderDrop, resetReorderState]);
|
|
69
99
|
const {
|
|
70
100
|
value: hasMoreLeftColumns,
|
|
71
101
|
toggle: toggleHasMoreLeftColumns
|
|
@@ -391,7 +421,8 @@ function IndexTableBase({
|
|
|
391
421
|
...pagination
|
|
392
422
|
})
|
|
393
423
|
}) : null;
|
|
394
|
-
return /*#__PURE__*/jsxRuntime.jsx(
|
|
424
|
+
return /*#__PURE__*/jsxRuntime.jsx(context.RowReorderContext.Provider, {
|
|
425
|
+
value: reorderContextValue,
|
|
395
426
|
children: /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
396
427
|
className: IndexTable_module.default.IndexTable,
|
|
397
428
|
children: /*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
@@ -416,16 +447,33 @@ function IndexTableBase({
|
|
|
416
447
|
...tagProps,
|
|
417
448
|
children: renderHeadingContent(heading, index)
|
|
418
449
|
}, getHeadingKey(heading));
|
|
419
|
-
if (index !== 0 || !selectable) {
|
|
450
|
+
if (index !== 0 || !selectable && !reorderable) {
|
|
420
451
|
return headingContent;
|
|
421
452
|
}
|
|
422
|
-
const
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
453
|
+
const leadingHeadings = [];
|
|
454
|
+
|
|
455
|
+
// Omits `data-index-table-heading` so this column is excluded from the
|
|
456
|
+
// column index math used by sticky columns and sort handling.
|
|
457
|
+
if (reorderable) {
|
|
458
|
+
leadingHeadings.push(/*#__PURE__*/jsxRuntime.jsx(Tag, {
|
|
459
|
+
className: css.classNames(IndexTable_module.default.TableHeading, IndexTable_module.default['TableHeading-reorder']),
|
|
460
|
+
children: /*#__PURE__*/jsxRuntime.jsx(Text.Text, {
|
|
461
|
+
as: "span",
|
|
462
|
+
variant: "bodySm",
|
|
463
|
+
visuallyHidden: true,
|
|
464
|
+
children: i18n.translate('Polaris.IndexTable.reorderColumnHeader')
|
|
465
|
+
})
|
|
466
|
+
}, "reorder-heading"));
|
|
467
|
+
}
|
|
468
|
+
if (selectable) {
|
|
469
|
+
const checkboxClassName = css.classNames(IndexTable_module.default.TableHeading, hasSortable && IndexTable_module.default['TableHeading-sortable'], index === 0 && IndexTable_module.default['TableHeading-first']);
|
|
470
|
+
leadingHeadings.push(/*#__PURE__*/jsxRuntime.jsx(Tag, {
|
|
471
|
+
className: checkboxClassName,
|
|
472
|
+
...tagProps,
|
|
473
|
+
children: renderCheckboxContent()
|
|
474
|
+
}, `${heading}-${index}`));
|
|
475
|
+
}
|
|
476
|
+
return [...leadingHeadings, headingContent];
|
|
429
477
|
}
|
|
430
478
|
function renderCheckboxContent() {
|
|
431
479
|
return /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var polarisIcons = require('@shopify/polaris-icons');
|
|
3
4
|
var react = require('react');
|
|
4
5
|
var css = require('../../../../utilities/css.js');
|
|
5
6
|
var useToggle = require('../../../../utilities/use-toggle.js');
|
|
6
7
|
var IndexTable_module = require('../../IndexTable.css.js');
|
|
7
8
|
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
-
var hooks = require('../../../../utilities/index-provider/hooks.js');
|
|
9
|
-
var types = require('../../../../utilities/index-provider/types.js');
|
|
9
|
+
var hooks$1 = require('../../../../utilities/index-provider/hooks.js');
|
|
10
10
|
var context = require('../../../../utilities/index-table/context.js');
|
|
11
|
+
var types = require('../../../../utilities/index-provider/types.js');
|
|
11
12
|
var Cell = require('../Cell/Cell.js');
|
|
12
13
|
var Checkbox = require('../Checkbox/Checkbox.js');
|
|
14
|
+
var hooks = require('../../../../utilities/i18n/hooks.js');
|
|
15
|
+
var Icon = require('../../../Icon/Icon.js');
|
|
16
|
+
var Text = require('../../../Text/Text.js');
|
|
13
17
|
|
|
14
18
|
const Row = /*#__PURE__*/react.memo(function Row({
|
|
15
19
|
children,
|
|
@@ -25,18 +29,44 @@ const Row = /*#__PURE__*/react.memo(function Row({
|
|
|
25
29
|
onNavigation,
|
|
26
30
|
onClick
|
|
27
31
|
}) {
|
|
32
|
+
const i18n = hooks.useI18n();
|
|
28
33
|
const {
|
|
29
34
|
selectable: tableIsSelectable,
|
|
30
35
|
selectMode,
|
|
31
36
|
condensed
|
|
32
|
-
} = hooks.useIndexRow();
|
|
37
|
+
} = hooks$1.useIndexRow();
|
|
38
|
+
const {
|
|
39
|
+
resourceName
|
|
40
|
+
} = hooks$1.useIndexValue();
|
|
33
41
|
const rowIsSelectable = tableIsSelectable && !hideSelectable;
|
|
34
|
-
const onSelectionChange = hooks.useIndexSelectionChange();
|
|
42
|
+
const onSelectionChange = hooks$1.useIndexSelectionChange();
|
|
35
43
|
const {
|
|
36
44
|
value: hovered,
|
|
37
45
|
setTrue: setHoverIn,
|
|
38
46
|
setFalse: setHoverOut
|
|
39
47
|
} = useToggle.useToggle(false);
|
|
48
|
+
const reorder = react.useContext(context.RowReorderContext);
|
|
49
|
+
const reorderable = Boolean(reorder?.reorderable) && rowType === 'data';
|
|
50
|
+
const isDragging = reorderable && reorder?.draggingPosition === position;
|
|
51
|
+
const isDropTarget = reorderable && reorder?.dropPosition === position && reorder?.draggingPosition !== position;
|
|
52
|
+
const handleDragStart = react.useCallback(event => {
|
|
53
|
+
event.dataTransfer.effectAllowed = 'move';
|
|
54
|
+
reorder?.onDragStart(position);
|
|
55
|
+
}, [reorder, position]);
|
|
56
|
+
const handleDragEnter = react.useCallback(() => {
|
|
57
|
+
reorder?.onDragEnter(position);
|
|
58
|
+
}, [reorder, position]);
|
|
59
|
+
const handleDragOver = react.useCallback(event => {
|
|
60
|
+
event.preventDefault();
|
|
61
|
+
event.dataTransfer.dropEffect = 'move';
|
|
62
|
+
}, []);
|
|
63
|
+
const handleDrop = react.useCallback(event => {
|
|
64
|
+
event.preventDefault();
|
|
65
|
+
reorder?.onDrop();
|
|
66
|
+
}, [reorder]);
|
|
67
|
+
const handleDragEnd = react.useCallback(() => {
|
|
68
|
+
reorder?.onDragEnd();
|
|
69
|
+
}, [reorder]);
|
|
40
70
|
const handleInteraction = react.useCallback(event => {
|
|
41
71
|
event.stopPropagation();
|
|
42
72
|
let selectionType = types.SelectionType.Single;
|
|
@@ -66,7 +96,7 @@ const Row = /*#__PURE__*/react.memo(function Row({
|
|
|
66
96
|
primaryLinkElement.current = el;
|
|
67
97
|
}
|
|
68
98
|
}, []);
|
|
69
|
-
const rowClassName = css.classNames(IndexTable_module.default.TableRow, rowType === 'subheader' && IndexTable_module.default['TableRow-subheader'], rowType === 'child' && IndexTable_module.default['TableRow-child'], rowIsSelectable && condensed && IndexTable_module.default.condensedRow, selected && IndexTable_module.default['TableRow-selected'], hovered && !condensed && IndexTable_module.default['TableRow-hovered'], disabled && IndexTable_module.default['TableRow-disabled'], tone && IndexTable_module.default[css.variationName('tone', tone)], !rowIsSelectable && !onClick && !primaryLinkElement.current && IndexTable_module.default['TableRow-unclickable']);
|
|
99
|
+
const rowClassName = css.classNames(IndexTable_module.default.TableRow, rowType === 'subheader' && IndexTable_module.default['TableRow-subheader'], rowType === 'child' && IndexTable_module.default['TableRow-child'], rowIsSelectable && condensed && IndexTable_module.default.condensedRow, selected && IndexTable_module.default['TableRow-selected'], hovered && !condensed && IndexTable_module.default['TableRow-hovered'], disabled && IndexTable_module.default['TableRow-disabled'], tone && IndexTable_module.default[css.variationName('tone', tone)], reorderable && IndexTable_module.default['TableRow-reorderable'], isDragging && IndexTable_module.default['TableRow-dragging'], isDropTarget && IndexTable_module.default['TableRow-dropTarget'], !rowIsSelectable && !onClick && !primaryLinkElement.current && IndexTable_module.default['TableRow-unclickable']);
|
|
70
100
|
let handleRowClick;
|
|
71
101
|
if (!disabled && rowIsSelectable || onClick || primaryLinkElement.current) {
|
|
72
102
|
handleRowClick = event => {
|
|
@@ -105,6 +135,35 @@ const Row = /*#__PURE__*/react.memo(function Row({
|
|
|
105
135
|
const checkboxMarkup = hideSelectable ? /*#__PURE__*/jsxRuntime.jsx(Cell.Cell, {}) : /*#__PURE__*/jsxRuntime.jsx(Checkbox.Checkbox, {
|
|
106
136
|
accessibilityLabel: accessibilityLabel
|
|
107
137
|
});
|
|
138
|
+
const dragHandleMarkup = reorderable ? /*#__PURE__*/jsxRuntime.jsx("td", {
|
|
139
|
+
className: IndexTable_module.default.TableCellDragHandle,
|
|
140
|
+
onClick: stopPropagation,
|
|
141
|
+
children: /*#__PURE__*/jsxRuntime.jsxs("span", {
|
|
142
|
+
className: IndexTable_module.default.DragHandle,
|
|
143
|
+
children: [/*#__PURE__*/jsxRuntime.jsx("span", {
|
|
144
|
+
className: IndexTable_module.default.DragHandleIcon,
|
|
145
|
+
"aria-hidden": "true",
|
|
146
|
+
children: /*#__PURE__*/jsxRuntime.jsx(Icon.Icon, {
|
|
147
|
+
source: polarisIcons.DragHandleIcon,
|
|
148
|
+
tone: "subdued"
|
|
149
|
+
})
|
|
150
|
+
}), /*#__PURE__*/jsxRuntime.jsx(Text.Text, {
|
|
151
|
+
as: "span",
|
|
152
|
+
visuallyHidden: true,
|
|
153
|
+
children: i18n.translate('Polaris.IndexTable.reorderAccessibilityLabel', {
|
|
154
|
+
resourceName: resourceName.singular
|
|
155
|
+
})
|
|
156
|
+
})]
|
|
157
|
+
})
|
|
158
|
+
}) : null;
|
|
159
|
+
const reorderProps = reorderable ? {
|
|
160
|
+
draggable: true,
|
|
161
|
+
onDragStart: handleDragStart,
|
|
162
|
+
onDragEnter: handleDragEnter,
|
|
163
|
+
onDragOver: handleDragOver,
|
|
164
|
+
onDrop: handleDrop,
|
|
165
|
+
onDragEnd: handleDragEnd
|
|
166
|
+
} : {};
|
|
108
167
|
return /*#__PURE__*/jsxRuntime.jsx(context.RowContext.Provider, {
|
|
109
168
|
value: contextValue,
|
|
110
169
|
children: /*#__PURE__*/jsxRuntime.jsx(context.RowHoveredContext.Provider, {
|
|
@@ -116,10 +175,14 @@ const Row = /*#__PURE__*/react.memo(function Row({
|
|
|
116
175
|
onMouseLeave: setHoverOut,
|
|
117
176
|
onClick: handleRowClick,
|
|
118
177
|
ref: tableRowCallbackRef,
|
|
119
|
-
|
|
178
|
+
...reorderProps,
|
|
179
|
+
children: [dragHandleMarkup, tableIsSelectable ? checkboxMarkup : null, children]
|
|
120
180
|
}, id)
|
|
121
181
|
})
|
|
122
182
|
});
|
|
123
183
|
});
|
|
184
|
+
function stopPropagation(event) {
|
|
185
|
+
event.stopPropagation();
|
|
186
|
+
}
|
|
124
187
|
|
|
125
188
|
exports.Row = Row;
|