@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farm-investimentos/front-mfe-components",
3
- "version": "15.7.4",
3
+ "version": "15.8.1",
4
4
  "author": "farm investimentos",
5
5
  "private": false,
6
6
  "main": "./dist/front-mfe-components.common.js",
@@ -28,22 +28,30 @@
28
28
  margin-right: 8px;
29
29
  }
30
30
 
31
- :deep(.farm-listitem:hover .farm-typography) {
31
+ :deep(.farm-listitem:focus .farm-typography) {
32
32
  color: var(--farm-primary-base);
33
33
  }
34
34
 
35
- :deep(.farm-listitem:focus .farm-typography) {
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:hover .farm-checkbox .farm-icon) {
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 bottom v-model="isVisible" :stay-open="multiple" ref="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="{ 'farm-listitem--selected': item[itemValue] === innerValue }"
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
  });