@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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/select/Select.js +154 -56
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cashub/ui",
3
- "version": "0.18.1",
3
+ "version": "0.18.3",
4
4
  "private": false,
5
5
  "author": "CASHUB Team",
6
6
  "description": "CASHUB UI components library",
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)(false),
102
- _useState4 = _slicedToArray(_useState3, 2),
103
- display = _useState4[0],
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)(null),
112
+ var _useState5 = (0, _react.useState)(false),
107
113
  _useState6 = _slicedToArray(_useState5, 2),
108
- comboboxElement = _useState6[0],
109
- setComboboxElement = _useState6[1];
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
- listBoxElement = _useState8[0],
114
- setListBoxElement = _useState8[1];
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 _useState9 = (0, _react.useState)(0),
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
- optionList = _useState12[0],
127
- setOptionList = _useState12[1];
132
+ listBoxWidth = _useState12[0],
133
+ setListBoxWidth = _useState12[1];
128
134
 
129
- var _useState13 = (0, _react.useState)(null),
135
+ var _useState13 = (0, _react.useState)([]),
130
136
  _useState14 = _slicedToArray(_useState13, 2),
131
- focusedOption = _useState14[0],
132
- setFocusedOption = _useState14[1];
137
+ optionList = _useState14[0],
138
+ setOptionList = _useState14[1];
133
139
 
134
- var _useState15 = (0, _react.useState)(false),
140
+ var _useState15 = (0, _react.useState)(null),
135
141
  _useState16 = _slicedToArray(_useState15, 2),
136
- isFocusCombobox = _useState16[0],
137
- setIsFocusCombobox = _useState16[1];
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
- selectedOptions = _useState18[0],
142
- setSelectedOptions = _useState18[1];
147
+ isFocusCombobox = _useState18[0],
148
+ setIsFocusCombobox = _useState18[1];
143
149
 
144
- var _useState19 = (0, _react.useState)(options),
150
+ var _useState19 = (0, _react.useState)([]),
145
151
  _useState20 = _slicedToArray(_useState19, 2),
146
- filteredOptions = _useState20[0],
147
- setFilteredOptions = _useState20[1];
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
- search = _useState22[0],
152
- setSearch = _useState22[1];
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; // parse all value to string
159
- // for subsequently determine whether it is a selected item
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]); // set focused option
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
- onSelect(value);
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
- setDisplay(false);
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
- onDeselect(value);
249
- }, [disabled, onDeselect]); // list all selected option
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 (!options) return;
533
+ if (!newOptions) return;
436
534
  var tmpSelectedOptions = [];
437
- options.forEach(function (option) {
535
+ newOptions.forEach(function (option) {
438
536
  if (option.child && option.child.length > 0) {
439
537
  option.child.forEach(function (option) {
440
- if (multiple && parsedSelected.includes(option.id.toString())) {
538
+ if (multiple && selectedAllOptions.includes(option.id.toString())) {
441
539
  tmpSelectedOptions.push(option);
442
- } else if (parsedSelected === option.id.toString()) {
540
+ } else if (selectedAllOptions === option.id.toString()) {
443
541
  tmpSelectedOptions.push(option);
444
542
  }
445
543
  });
446
544
  } else {
447
- if (multiple && parsedSelected.includes(option.id.toString())) {
545
+ if (multiple && selectedAllOptions.includes(option.id.toString())) {
448
546
  tmpSelectedOptions.push(option);
449
- } else if (parsedSelected === option.id.toString()) {
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
- }, [options, parsedSelected, multiple]);
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 && parsedSelected.includes(option.id.toString())) {
605
+ if (multiple && selectedAllOptions.includes(option.id.toString())) {
508
606
  selected = true;
509
- } else if (parsedSelected === option.id.toString()) {
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 && parsedSelected.includes(option.id.toString())) {
620
+ if (multiple && selectedAllOptions.includes(option.id.toString())) {
523
621
  selected = true;
524
- } else if (parsedSelected === option.id.toString()) {
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, parsedSelected]); // filter options on search keyword changed
630
+ }, [filteredOptions, multiple, selectedAllOptions]); // filter options on search keyword changed
533
631
 
534
632
  (0, _react.useEffect)(function () {
535
633
  var tmpFilteredOptions = [];
536
- options.forEach(function (option) {
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, options]);
650
+ }, [search, newOptions]);
553
651
  (0, _react.useEffect)(function () {
554
652
  if (display) {
555
653
  setupFocus();