@cashub/ui 0.18.1 → 0.18.3
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/package.json +1 -1
- package/select/Select.js +154 -56
package/package.json
CHANGED
package/select/Select.js
CHANGED
|
@@ -7,6 +7,8 @@ exports.default = void 0;
|
|
|
7
7
|
|
|
8
8
|
var _react = require("react");
|
|
9
9
|
|
|
10
|
+
var _reactI18next = require("react-i18next");
|
|
11
|
+
|
|
10
12
|
var _reactOutsideClickHandler = _interopRequireDefault(require("react-outside-click-handler"));
|
|
11
13
|
|
|
12
14
|
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
@@ -75,6 +77,8 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
75
77
|
|
|
76
78
|
var Select = function Select(_ref) {
|
|
77
79
|
var options = _ref.options,
|
|
80
|
+
_ref$enableSelectAll = _ref.enableSelectAll,
|
|
81
|
+
enableSelectAll = _ref$enableSelectAll === void 0 ? false : _ref$enableSelectAll,
|
|
78
82
|
selected = _ref.selected,
|
|
79
83
|
onSelect = _ref.onSelect,
|
|
80
84
|
onDeselect = _ref.onDeselect,
|
|
@@ -94,70 +98,91 @@ var Select = function Select(_ref) {
|
|
|
94
98
|
onBlur = _ref.onBlur,
|
|
95
99
|
onSearch = _ref.onSearch;
|
|
96
100
|
|
|
101
|
+
var _useTranslation = (0, _reactI18next.useTranslation)(),
|
|
102
|
+
t = _useTranslation.t;
|
|
103
|
+
|
|
97
104
|
var _useState = (0, _react.useState)((0, _lodash.default)('select-')),
|
|
98
105
|
_useState2 = _slicedToArray(_useState, 1),
|
|
99
106
|
id = _useState2[0];
|
|
100
107
|
|
|
101
|
-
var _useState3 = (0, _react.useState)(
|
|
102
|
-
_useState4 = _slicedToArray(_useState3,
|
|
103
|
-
|
|
104
|
-
setDisplay = _useState4[1];
|
|
108
|
+
var _useState3 = (0, _react.useState)((0, _lodash.default)('allOptons-')),
|
|
109
|
+
_useState4 = _slicedToArray(_useState3, 1),
|
|
110
|
+
allOptionId = _useState4[0];
|
|
105
111
|
|
|
106
|
-
var _useState5 = (0, _react.useState)(
|
|
112
|
+
var _useState5 = (0, _react.useState)(false),
|
|
107
113
|
_useState6 = _slicedToArray(_useState5, 2),
|
|
108
|
-
|
|
109
|
-
|
|
114
|
+
display = _useState6[0],
|
|
115
|
+
setDisplay = _useState6[1];
|
|
110
116
|
|
|
111
117
|
var _useState7 = (0, _react.useState)(null),
|
|
112
118
|
_useState8 = _slicedToArray(_useState7, 2),
|
|
113
|
-
|
|
114
|
-
|
|
119
|
+
comboboxElement = _useState8[0],
|
|
120
|
+
setComboboxElement = _useState8[1];
|
|
121
|
+
|
|
122
|
+
var _useState9 = (0, _react.useState)(null),
|
|
123
|
+
_useState10 = _slicedToArray(_useState9, 2),
|
|
124
|
+
listBoxElement = _useState10[0],
|
|
125
|
+
setListBoxElement = _useState10[1];
|
|
115
126
|
|
|
116
127
|
var optionsElementRef = (0, _react.useRef)(null);
|
|
117
128
|
var searchBoxElement = (0, _react.useRef)(null);
|
|
118
129
|
|
|
119
|
-
var
|
|
120
|
-
_useState10 = _slicedToArray(_useState9, 2),
|
|
121
|
-
listBoxWidth = _useState10[0],
|
|
122
|
-
setListBoxWidth = _useState10[1];
|
|
123
|
-
|
|
124
|
-
var _useState11 = (0, _react.useState)([]),
|
|
130
|
+
var _useState11 = (0, _react.useState)(0),
|
|
125
131
|
_useState12 = _slicedToArray(_useState11, 2),
|
|
126
|
-
|
|
127
|
-
|
|
132
|
+
listBoxWidth = _useState12[0],
|
|
133
|
+
setListBoxWidth = _useState12[1];
|
|
128
134
|
|
|
129
|
-
var _useState13 = (0, _react.useState)(
|
|
135
|
+
var _useState13 = (0, _react.useState)([]),
|
|
130
136
|
_useState14 = _slicedToArray(_useState13, 2),
|
|
131
|
-
|
|
132
|
-
|
|
137
|
+
optionList = _useState14[0],
|
|
138
|
+
setOptionList = _useState14[1];
|
|
133
139
|
|
|
134
|
-
var _useState15 = (0, _react.useState)(
|
|
140
|
+
var _useState15 = (0, _react.useState)(null),
|
|
135
141
|
_useState16 = _slicedToArray(_useState15, 2),
|
|
136
|
-
|
|
137
|
-
|
|
142
|
+
focusedOption = _useState16[0],
|
|
143
|
+
setFocusedOption = _useState16[1];
|
|
138
144
|
|
|
139
|
-
var _useState17 = (0, _react.useState)(
|
|
145
|
+
var _useState17 = (0, _react.useState)(false),
|
|
140
146
|
_useState18 = _slicedToArray(_useState17, 2),
|
|
141
|
-
|
|
142
|
-
|
|
147
|
+
isFocusCombobox = _useState18[0],
|
|
148
|
+
setIsFocusCombobox = _useState18[1];
|
|
143
149
|
|
|
144
|
-
var _useState19 = (0, _react.useState)(
|
|
150
|
+
var _useState19 = (0, _react.useState)([]),
|
|
145
151
|
_useState20 = _slicedToArray(_useState19, 2),
|
|
146
|
-
|
|
147
|
-
|
|
152
|
+
selectedOptions = _useState20[0],
|
|
153
|
+
setSelectedOptions = _useState20[1];
|
|
148
154
|
|
|
149
|
-
var _useState21 = (0, _react.useState)(
|
|
155
|
+
var _useState21 = (0, _react.useState)(options),
|
|
150
156
|
_useState22 = _slicedToArray(_useState21, 2),
|
|
151
|
-
|
|
152
|
-
|
|
157
|
+
filteredOptions = _useState22[0],
|
|
158
|
+
setFilteredOptions = _useState22[1];
|
|
159
|
+
|
|
160
|
+
var _useState23 = (0, _react.useState)(''),
|
|
161
|
+
_useState24 = _slicedToArray(_useState23, 2),
|
|
162
|
+
search = _useState24[0],
|
|
163
|
+
setSearch = _useState24[1];
|
|
153
164
|
|
|
154
165
|
var _useCustomPopper = (0, _hooks.useCustomPopper)(comboboxElement, listBoxElement),
|
|
155
166
|
styles = _useCustomPopper.styles,
|
|
156
167
|
attributes = _useCustomPopper.attributes,
|
|
157
168
|
state = _useCustomPopper.state,
|
|
158
|
-
update = _useCustomPopper.update;
|
|
159
|
-
|
|
169
|
+
update = _useCustomPopper.update;
|
|
170
|
+
|
|
171
|
+
var newOptions = (0, _react.useMemo)(function () {
|
|
172
|
+
if (!options) return;
|
|
160
173
|
|
|
174
|
+
var newOptions = _toConsumableArray(options);
|
|
175
|
+
|
|
176
|
+
if (options.length > 0 && multiple && enableSelectAll) {
|
|
177
|
+
newOptions.unshift({
|
|
178
|
+
id: allOptionId,
|
|
179
|
+
text: t('all')
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return newOptions;
|
|
184
|
+
}, [options, multiple, enableSelectAll, allOptionId]); // parse all value to string
|
|
185
|
+
// for subsequently determine whether it is a selected item
|
|
161
186
|
|
|
162
187
|
var parsedSelected = (0, _react.useMemo)(function () {
|
|
163
188
|
if (selected || selected === 0) {
|
|
@@ -173,7 +198,18 @@ var Select = function Select(_ref) {
|
|
|
173
198
|
}
|
|
174
199
|
|
|
175
200
|
return '';
|
|
176
|
-
}, [selected]);
|
|
201
|
+
}, [selected]);
|
|
202
|
+
var selectedAllOptions = (0, _react.useMemo)(function () {
|
|
203
|
+
if (multiple && enableSelectAll && parsedSelected.length + 1 === newOptions.length) {
|
|
204
|
+
var _selectedAllOptions = _toConsumableArray(parsedSelected);
|
|
205
|
+
|
|
206
|
+
_selectedAllOptions.unshift(allOptionId);
|
|
207
|
+
|
|
208
|
+
return _selectedAllOptions;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return parsedSelected;
|
|
212
|
+
}, [multiple, enableSelectAll, newOptions.length, parsedSelected, allOptionId]); // set focused option
|
|
177
213
|
|
|
178
214
|
var handleFocusItem = (0, _react.useCallback)(function (element) {
|
|
179
215
|
if (!optionsElementRef.current) return;
|
|
@@ -236,21 +272,83 @@ var Select = function Select(_ref) {
|
|
|
236
272
|
}, [listBoxElement]);
|
|
237
273
|
var handleOnSelect = (0, _react.useCallback)(function (event, value) {
|
|
238
274
|
event.stopPropagation();
|
|
239
|
-
if (disabled === true) return;
|
|
240
|
-
|
|
275
|
+
if (disabled === true) return; // 選取選項
|
|
276
|
+
// 點選 all 全選
|
|
277
|
+
|
|
278
|
+
if (multiple) {
|
|
279
|
+
if (value.toString() === allOptionId && selectedAllOptions.length < newOptions.length) {
|
|
280
|
+
for (var index = 1; index < newOptions.length; index += 1) {
|
|
281
|
+
onSelect(newOptions[index].id);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (value.toString() !== allOptionId && !selectedAllOptions.includes(value.toString())) {
|
|
286
|
+
// 選取一個選項,變成全選
|
|
287
|
+
if (selectedAllOptions.length + 2 === newOptions.length) {
|
|
288
|
+
onSelect(value);
|
|
289
|
+
} else {
|
|
290
|
+
// 選取特定選項
|
|
291
|
+
onSelect(value);
|
|
292
|
+
}
|
|
293
|
+
} // 刪除選項
|
|
294
|
+
// 點選 all 刪除全選
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
if (value.toString() === allOptionId && selectedAllOptions.length === newOptions.length) {
|
|
298
|
+
for (var _index = 0; _index < newOptions.length; _index += 1) {
|
|
299
|
+
onDeselect(newOptions[_index].id);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
if (value.toString() !== allOptionId && selectedAllOptions.includes(value.toString())) {
|
|
304
|
+
// 原本是 all 全選後來刪除其中一個選項
|
|
305
|
+
if (selectedAllOptions.length === newOptions.length) {
|
|
306
|
+
onDeselect(value);
|
|
307
|
+
} else {
|
|
308
|
+
// 刪除特定選項
|
|
309
|
+
onDeselect(value);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
setDisplay(true);
|
|
314
|
+
} else {
|
|
315
|
+
onSelect(value);
|
|
316
|
+
setDisplay(false);
|
|
317
|
+
}
|
|
318
|
+
|
|
241
319
|
comboboxElement.focus();
|
|
242
320
|
setSearch('');
|
|
243
|
-
|
|
244
|
-
}, [disabled, onSelect, comboboxElement]);
|
|
321
|
+
}, [disabled, onSelect, comboboxElement, selectedAllOptions, onDeselect, newOptions, allOptionId, multiple]);
|
|
245
322
|
var handleOnDeselect = (0, _react.useCallback)(function (event, value) {
|
|
246
323
|
event.stopPropagation();
|
|
247
324
|
if (disabled === true) return;
|
|
248
|
-
|
|
249
|
-
|
|
325
|
+
|
|
326
|
+
if (multiple) {
|
|
327
|
+
if (value.toString() === allOptionId) {
|
|
328
|
+
for (var index = 0; index < optionList.length; index += 1) {
|
|
329
|
+
onDeselect(optionList[index].id);
|
|
330
|
+
}
|
|
331
|
+
} else {
|
|
332
|
+
onDeselect(value);
|
|
333
|
+
}
|
|
334
|
+
} else {
|
|
335
|
+
onDeselect(value);
|
|
336
|
+
}
|
|
337
|
+
}, [disabled, onDeselect, optionList, allOptionId, multiple]); // list all selected option
|
|
250
338
|
|
|
251
339
|
var selectedItem = (0, _react.useMemo)(function () {
|
|
252
340
|
if (selectedOptions.length > 0) {
|
|
253
341
|
if (multiple) {
|
|
342
|
+
if (selectedOptions[0].id === allOptionId) {
|
|
343
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_SelectedMultiple.default, {
|
|
344
|
+
content: selectedOptions[0].text,
|
|
345
|
+
onClick: function onClick(event) {
|
|
346
|
+
return handleOnDeselect(event, selectedOptions[0].id);
|
|
347
|
+
},
|
|
348
|
+
disabled: disabled
|
|
349
|
+
}, selectedOptions[0].id);
|
|
350
|
+
}
|
|
351
|
+
|
|
254
352
|
return selectedOptions.map(function (value) {
|
|
255
353
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_SelectedMultiple.default, {
|
|
256
354
|
content: value.text,
|
|
@@ -268,7 +366,7 @@ var Select = function Select(_ref) {
|
|
|
268
366
|
}
|
|
269
367
|
|
|
270
368
|
return placeholder;
|
|
271
|
-
}, [placeholder, handleOnDeselect, multiple, selectedOptions, disabled]);
|
|
369
|
+
}, [placeholder, handleOnDeselect, multiple, selectedOptions, disabled, allOptionId]);
|
|
272
370
|
var optionItem = (0, _react.useMemo)(function () {
|
|
273
371
|
if (optionList.length <= 0) return null;
|
|
274
372
|
return optionList.map(function (option) {
|
|
@@ -432,21 +530,21 @@ var Select = function Select(_ref) {
|
|
|
432
530
|
|
|
433
531
|
|
|
434
532
|
(0, _react.useEffect)(function () {
|
|
435
|
-
if (!
|
|
533
|
+
if (!newOptions) return;
|
|
436
534
|
var tmpSelectedOptions = [];
|
|
437
|
-
|
|
535
|
+
newOptions.forEach(function (option) {
|
|
438
536
|
if (option.child && option.child.length > 0) {
|
|
439
537
|
option.child.forEach(function (option) {
|
|
440
|
-
if (multiple &&
|
|
538
|
+
if (multiple && selectedAllOptions.includes(option.id.toString())) {
|
|
441
539
|
tmpSelectedOptions.push(option);
|
|
442
|
-
} else if (
|
|
540
|
+
} else if (selectedAllOptions === option.id.toString()) {
|
|
443
541
|
tmpSelectedOptions.push(option);
|
|
444
542
|
}
|
|
445
543
|
});
|
|
446
544
|
} else {
|
|
447
|
-
if (multiple &&
|
|
545
|
+
if (multiple && selectedAllOptions.includes(option.id.toString())) {
|
|
448
546
|
tmpSelectedOptions.push(option);
|
|
449
|
-
} else if (
|
|
547
|
+
} else if (selectedAllOptions === option.id.toString()) {
|
|
450
548
|
tmpSelectedOptions.push(option);
|
|
451
549
|
}
|
|
452
550
|
}
|
|
@@ -454,7 +552,7 @@ var Select = function Select(_ref) {
|
|
|
454
552
|
return false;
|
|
455
553
|
});
|
|
456
554
|
setSelectedOptions(tmpSelectedOptions);
|
|
457
|
-
}, [
|
|
555
|
+
}, [newOptions, selectedAllOptions, multiple]);
|
|
458
556
|
(0, _react.useEffect)(function () {
|
|
459
557
|
if (update) {
|
|
460
558
|
setTimeout(function () {
|
|
@@ -504,9 +602,9 @@ var Select = function Select(_ref) {
|
|
|
504
602
|
child: option.child.map(function (option) {
|
|
505
603
|
var selected = false;
|
|
506
604
|
|
|
507
|
-
if (multiple &&
|
|
605
|
+
if (multiple && selectedAllOptions.includes(option.id.toString())) {
|
|
508
606
|
selected = true;
|
|
509
|
-
} else if (
|
|
607
|
+
} else if (selectedAllOptions === option.id.toString()) {
|
|
510
608
|
selected = true;
|
|
511
609
|
}
|
|
512
610
|
|
|
@@ -519,9 +617,9 @@ var Select = function Select(_ref) {
|
|
|
519
617
|
|
|
520
618
|
var selected = false;
|
|
521
619
|
|
|
522
|
-
if (multiple &&
|
|
620
|
+
if (multiple && selectedAllOptions.includes(option.id.toString())) {
|
|
523
621
|
selected = true;
|
|
524
|
-
} else if (
|
|
622
|
+
} else if (selectedAllOptions === option.id.toString()) {
|
|
525
623
|
selected = true;
|
|
526
624
|
}
|
|
527
625
|
|
|
@@ -529,11 +627,11 @@ var Select = function Select(_ref) {
|
|
|
529
627
|
selected: selected
|
|
530
628
|
});
|
|
531
629
|
}));
|
|
532
|
-
}, [filteredOptions, multiple,
|
|
630
|
+
}, [filteredOptions, multiple, selectedAllOptions]); // filter options on search keyword changed
|
|
533
631
|
|
|
534
632
|
(0, _react.useEffect)(function () {
|
|
535
633
|
var tmpFilteredOptions = [];
|
|
536
|
-
|
|
634
|
+
newOptions.forEach(function (option) {
|
|
537
635
|
if (option.child && option.child.length > 0) {
|
|
538
636
|
var tmpFilteredChildOptions = option.child.filter(function (option) {
|
|
539
637
|
return option.text.toLowerCase().indexOf(search.toLowerCase().trim()) !== -1;
|
|
@@ -549,7 +647,7 @@ var Select = function Select(_ref) {
|
|
|
549
647
|
}
|
|
550
648
|
});
|
|
551
649
|
setFilteredOptions(tmpFilteredOptions);
|
|
552
|
-
}, [search,
|
|
650
|
+
}, [search, newOptions]);
|
|
553
651
|
(0, _react.useEffect)(function () {
|
|
554
652
|
if (display) {
|
|
555
653
|
setupFocus();
|