@farm-investimentos/front-mfe-components 15.7.4 → 15.8.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/dist/front-mfe-components.common.js +206 -107
- package/dist/front-mfe-components.common.js.map +1 -1
- package/dist/front-mfe-components.css +1 -1
- package/dist/front-mfe-components.umd.js +206 -107
- package/dist/front-mfe-components.umd.js.map +1 -1
- package/dist/front-mfe-components.umd.min.js +1 -1
- package/dist/front-mfe-components.umd.min.js.map +1 -1
- package/package.json +1 -1
- package/src/components/SelectAutoComplete/SelectAutoComplete.scss +13 -5
- package/src/components/SelectAutoComplete/SelectAutoComplete.stories.js +36 -0
- package/src/components/SelectAutoComplete/SelectAutoComplete.vue +100 -4
package/package.json
CHANGED
|
@@ -28,22 +28,30 @@
|
|
|
28
28
|
margin-right: 8px;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
:deep(.farm-listitem:
|
|
31
|
+
:deep(.farm-listitem:focus .farm-typography) {
|
|
32
32
|
color: var(--farm-primary-base);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
:deep(.farm-listitem:focus .farm-
|
|
35
|
+
:deep(.farm-listitem:focus .farm-checkbox .farm-icon) {
|
|
36
|
+
color: var(--farm-primary-lighten);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
:deep(.farm-listitem:not(.farm-listitem--disabled):hover .farm-typography) {
|
|
36
40
|
color: var(--farm-primary-base);
|
|
37
41
|
}
|
|
38
42
|
|
|
39
|
-
:deep(.farm-listitem:
|
|
43
|
+
:deep(.farm-listitem:not(.farm-listitem--disabled):focus .farm-typography) {
|
|
44
|
+
color: var(--farm-primary-base);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
:deep(.farm-listitem:not(.farm-listitem--disabled):hover .farm-checkbox .farm-icon) {
|
|
40
48
|
color: var(--farm-primary-lighten);
|
|
41
49
|
}
|
|
42
50
|
|
|
43
|
-
:deep(.farm-listitem:focus .farm-checkbox .farm-icon) {
|
|
51
|
+
:deep(.farm-listitem:not(.farm-listitem--disabled):focus .farm-checkbox .farm-icon) {
|
|
44
52
|
color: var(--farm-primary-lighten);
|
|
45
53
|
}
|
|
46
54
|
|
|
47
55
|
:deep(.farm-listitem:hover .farm-checkbox.farm-checkbox--checked .farm-icon) {
|
|
48
56
|
color: white;
|
|
49
|
-
}
|
|
57
|
+
}
|
|
@@ -326,3 +326,39 @@ export const ChangeEvent = () => ({
|
|
|
326
326
|
|
|
327
327
|
</div>`,
|
|
328
328
|
});
|
|
329
|
+
|
|
330
|
+
export const MultipleWithAllOption = () => ({
|
|
331
|
+
data() {
|
|
332
|
+
return {
|
|
333
|
+
v: null,
|
|
334
|
+
items: [
|
|
335
|
+
{ value: 0, text: 'value 0' },
|
|
336
|
+
{ value: 1, text: 'value 1' },
|
|
337
|
+
{ value: 2, text: 'value 2' },
|
|
338
|
+
{ value: 3, text: 'value 3' },
|
|
339
|
+
],
|
|
340
|
+
};
|
|
341
|
+
},
|
|
342
|
+
template: `<div style="width: 400px">
|
|
343
|
+
<farm-select-auto-complete v-model="v" :items="items" multiple has-all-option />
|
|
344
|
+
v-model: {{ v }}
|
|
345
|
+
</div>`,
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
export const MultipleWithAllOptionAndDisabledItems = () => ({
|
|
349
|
+
data() {
|
|
350
|
+
return {
|
|
351
|
+
v: null,
|
|
352
|
+
items: [
|
|
353
|
+
{ value: 0, text: 'value 0' },
|
|
354
|
+
{ value: 1, text: 'value 1', disabled: true },
|
|
355
|
+
{ value: 2, text: 'value 2' },
|
|
356
|
+
{ value: 3, text: 'value 3', disabled: true },
|
|
357
|
+
],
|
|
358
|
+
};
|
|
359
|
+
},
|
|
360
|
+
template: `<div style="width: 400px">
|
|
361
|
+
<farm-select-auto-complete v-model="v" :items="items" multiple has-all-option />
|
|
362
|
+
v-model: {{ v }}
|
|
363
|
+
</div>`,
|
|
364
|
+
});
|
|
@@ -14,16 +14,45 @@
|
|
|
14
14
|
v-if="!readonly && !disabled"
|
|
15
15
|
:id="customId"
|
|
16
16
|
>
|
|
17
|
-
<farm-contextmenu
|
|
17
|
+
<farm-contextmenu
|
|
18
|
+
bottom
|
|
19
|
+
v-model="isVisible"
|
|
20
|
+
:stay-open="multiple || clickedDisabledItem"
|
|
21
|
+
ref="contextmenu"
|
|
22
|
+
>
|
|
18
23
|
<farm-list v-if="!readonly" ref="listRef" @keyup="onKeyUp">
|
|
24
|
+
<farm-listitem
|
|
25
|
+
v-if="hasAllOption"
|
|
26
|
+
tabindex="0"
|
|
27
|
+
clickable
|
|
28
|
+
hover-color-variation="lighten"
|
|
29
|
+
:hover-color="hasAllDisabled ? 'neutral' : 'primary'"
|
|
30
|
+
:class="{
|
|
31
|
+
'farm-listitem--selected': innerValue === 'all',
|
|
32
|
+
'farm-listitem--disabled': hasAllDisabled,
|
|
33
|
+
}"
|
|
34
|
+
@click="selectAll"
|
|
35
|
+
>
|
|
36
|
+
<farm-checkbox
|
|
37
|
+
v-model="hasAllSelected"
|
|
38
|
+
class="farm-select__checkbox"
|
|
39
|
+
value="all"
|
|
40
|
+
size="sm"
|
|
41
|
+
:disabled="hasAllDisabled"
|
|
42
|
+
/>
|
|
43
|
+
<farm-caption bold tag="span">Todos</farm-caption>
|
|
44
|
+
</farm-listitem>
|
|
19
45
|
<farm-listitem
|
|
20
46
|
tabindex="0"
|
|
21
47
|
v-for="(item, index) in showFilteredItems ? filteredItems : items"
|
|
22
48
|
clickable
|
|
23
49
|
hoverColorVariation="lighten"
|
|
24
|
-
hover-color="primary"
|
|
50
|
+
:hover-color="item.disabled ? 'neutral' : 'primary'"
|
|
25
51
|
:key="'contextmenu_item_' + index"
|
|
26
|
-
:class="{
|
|
52
|
+
:class="{
|
|
53
|
+
'farm-listitem--selected': item[itemValue] === innerValue,
|
|
54
|
+
'farm-listitem--disabled': item.disabled,
|
|
55
|
+
}"
|
|
27
56
|
@click="selectItem(item)"
|
|
28
57
|
>
|
|
29
58
|
<farm-checkbox
|
|
@@ -32,6 +61,7 @@
|
|
|
32
61
|
value="1"
|
|
33
62
|
size="sm"
|
|
34
63
|
v-if="isChecked(item)"
|
|
64
|
+
:disabled="item.disabled"
|
|
35
65
|
/>
|
|
36
66
|
<farm-checkbox
|
|
37
67
|
class="farm-select__checkbox"
|
|
@@ -39,6 +69,7 @@
|
|
|
39
69
|
value="2"
|
|
40
70
|
size="sm"
|
|
41
71
|
v-else-if="multiple"
|
|
72
|
+
:disabled="item.disabled"
|
|
42
73
|
/>
|
|
43
74
|
<farm-caption bold tag="span">{{ item[itemText] }}</farm-caption>
|
|
44
75
|
</farm-listitem>
|
|
@@ -161,7 +192,7 @@ export default defineComponent({
|
|
|
161
192
|
* This can be changed using the item-text ad item-value
|
|
162
193
|
*/
|
|
163
194
|
items: {
|
|
164
|
-
type: Array
|
|
195
|
+
type: Array as PropType<Array<Function>>,
|
|
165
196
|
default: () => [],
|
|
166
197
|
},
|
|
167
198
|
/**
|
|
@@ -242,6 +273,13 @@ export default defineComponent({
|
|
|
242
273
|
// eslint-disable-next-line
|
|
243
274
|
default: (event: Event) => {},
|
|
244
275
|
},
|
|
276
|
+
/**
|
|
277
|
+
* Set "All" as first option to select all other values<br />
|
|
278
|
+
*/
|
|
279
|
+
hasAllOption: {
|
|
280
|
+
type: Boolean,
|
|
281
|
+
default: false,
|
|
282
|
+
},
|
|
245
283
|
},
|
|
246
284
|
setup(props, { emit }) {
|
|
247
285
|
const { rules, items, itemText, itemValue, disabled, multiple } = toRefs(props);
|
|
@@ -269,6 +307,9 @@ export default defineComponent({
|
|
|
269
307
|
let fieldValidator = validateFormFieldBuilder(rules.value);
|
|
270
308
|
let validate = validateFormMethodBuilder(errorBucket, valid, fieldValidator);
|
|
271
309
|
|
|
310
|
+
const enabledItems = computed(() => items.value.filter(item => !item.disabled));
|
|
311
|
+
const disabledItems = computed(() => items.value.filter(item => item.disabled));
|
|
312
|
+
|
|
272
313
|
const hasError = computed(() => {
|
|
273
314
|
return errorBucket.value.length > 0;
|
|
274
315
|
});
|
|
@@ -279,6 +320,43 @@ export default defineComponent({
|
|
|
279
320
|
|
|
280
321
|
const searchText = ref('');
|
|
281
322
|
|
|
323
|
+
const hasAllDisabled = computed(() => items.value.length == disabledItems.value.length);
|
|
324
|
+
|
|
325
|
+
const clickedDisabledItem = ref(false);
|
|
326
|
+
|
|
327
|
+
const hasAllSelected = computed({
|
|
328
|
+
get() {
|
|
329
|
+
if (
|
|
330
|
+
!multiple.value ||
|
|
331
|
+
!Array.isArray(items.value) ||
|
|
332
|
+
!Array.isArray(innerValue.value)
|
|
333
|
+
) {
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
336
|
+
if (innerValue.value.length === enabledItems.value.length) {
|
|
337
|
+
return 'all';
|
|
338
|
+
}
|
|
339
|
+
return false;
|
|
340
|
+
},
|
|
341
|
+
set() {
|
|
342
|
+
emit('input', innerValue.value);
|
|
343
|
+
},
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
const selectAll = () => {
|
|
347
|
+
if (hasAllDisabled.value) {
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
if (multipleValues.value.length === enabledItems.value.length) {
|
|
351
|
+
multipleValues.value = [];
|
|
352
|
+
} else {
|
|
353
|
+
multipleValues.value = enabledItems.value.map(item => item[itemValue.value]);
|
|
354
|
+
}
|
|
355
|
+
checked.value = '1';
|
|
356
|
+
innerValue.value = [...multipleValues.value];
|
|
357
|
+
validate(innerValue.value);
|
|
358
|
+
};
|
|
359
|
+
|
|
282
360
|
const filterOptions = () => {
|
|
283
361
|
searchText.value = selectedText.value.toLowerCase();
|
|
284
362
|
if (!searchText || searchText.value.includes('+')) {
|
|
@@ -408,6 +486,20 @@ export default defineComponent({
|
|
|
408
486
|
};
|
|
409
487
|
|
|
410
488
|
const selectItem = item => {
|
|
489
|
+
if (inputField.value) {
|
|
490
|
+
inputField.value.focus();
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
if (item.disabled) {
|
|
494
|
+
clickedDisabledItem.value = true;
|
|
495
|
+
|
|
496
|
+
// "Schedule" execution to next loop, so the contextMenu won't close immediately if a disabled item is clicked
|
|
497
|
+
setTimeout(() => {
|
|
498
|
+
clickedDisabledItem.value = false;
|
|
499
|
+
});
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
|
|
411
503
|
if (multiple.value) {
|
|
412
504
|
const alreadyAdded = multipleValues.value.findIndex(
|
|
413
505
|
val => val === item[itemValue.value]
|
|
@@ -531,6 +623,7 @@ export default defineComponent({
|
|
|
531
623
|
isChecked,
|
|
532
624
|
multipleValues,
|
|
533
625
|
addLabelToMultiple,
|
|
626
|
+
clickedDisabledItem,
|
|
534
627
|
inputField,
|
|
535
628
|
onKeyUp,
|
|
536
629
|
addFocusToInput,
|
|
@@ -541,6 +634,9 @@ export default defineComponent({
|
|
|
541
634
|
showFilteredItems,
|
|
542
635
|
searchText,
|
|
543
636
|
handleOutsideClick,
|
|
637
|
+
hasAllDisabled,
|
|
638
|
+
hasAllSelected,
|
|
639
|
+
selectAll,
|
|
544
640
|
};
|
|
545
641
|
},
|
|
546
642
|
});
|