@dative-gpi/foundation-shared-components 0.0.123 → 0.0.124
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/components/FSCheckbox.vue +5 -2
- package/components/FSRadio.vue +18 -6
- package/components/FSRadioGroup.vue +17 -6
- package/components/FSSlideGroup.vue +19 -3
- package/components/FSToggleSet.vue +8 -0
- package/components/fields/FSAutocompleteField.vue +118 -34
- package/components/fields/FSSelectField.vue +116 -17
- package/components/fields/FSTextArea.vue +1 -0
- package/components/fields/FSTextField.vue +1 -0
- package/components/lists/FSDataIteratorItem.vue +14 -1
- package/components/lists/FSDataTableUI.vue +47 -18
- package/package.json +4 -4
- package/styles/components/fs_card.scss +0 -1
- package/styles/components/fs_checkbox.scss +2 -1
- package/styles/components/fs_data_iterator_item.scss +19 -6
- package/styles/components/fs_meta_field.scss +6 -0
- package/styles/components/fs_radio.scss +2 -1
- package/styles/components/index.scss +1 -1
- package/styles/globals/overrides.scss +31 -4
- package/styles/components/fs_date_field.scss +0 -8
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
#input
|
|
18
18
|
>
|
|
19
19
|
<FSRow
|
|
20
|
+
class="fs-checkbox-label"
|
|
20
21
|
align="center-left"
|
|
21
22
|
width="hug"
|
|
22
23
|
:style="style"
|
|
@@ -28,10 +29,12 @@
|
|
|
28
29
|
>
|
|
29
30
|
{{ icon }}
|
|
30
31
|
</FSIcon>
|
|
31
|
-
<slot
|
|
32
|
+
<slot
|
|
33
|
+
name="label"
|
|
34
|
+
v-bind="{ font }"
|
|
35
|
+
>
|
|
32
36
|
<FSSpan
|
|
33
37
|
v-if="$props.label"
|
|
34
|
-
class="fs-checkbox-label"
|
|
35
38
|
:style="style"
|
|
36
39
|
:font="font"
|
|
37
40
|
>
|
package/components/FSRadio.vue
CHANGED
|
@@ -8,16 +8,19 @@
|
|
|
8
8
|
:rules="$props.rules"
|
|
9
9
|
:validateOn="validateOn"
|
|
10
10
|
:modelValue="$props.selected"
|
|
11
|
-
@click.prevent
|
|
11
|
+
@click.prevent.stop
|
|
12
12
|
@blur="blurred = true"
|
|
13
13
|
v-bind="$attrs"
|
|
14
14
|
>
|
|
15
|
-
<template
|
|
15
|
+
<template
|
|
16
|
+
#input
|
|
17
|
+
>
|
|
16
18
|
<FSRow
|
|
19
|
+
class="fs-radio-label"
|
|
17
20
|
align="center-left"
|
|
18
21
|
width="hug"
|
|
19
22
|
:style="style"
|
|
20
|
-
@click.stop="onToggle"
|
|
23
|
+
@click.prevent.stop="onToggle"
|
|
21
24
|
>
|
|
22
25
|
<FSIcon
|
|
23
26
|
class="fs-radio"
|
|
@@ -26,10 +29,12 @@
|
|
|
26
29
|
>
|
|
27
30
|
{{ icon }}
|
|
28
31
|
</FSIcon>
|
|
29
|
-
<slot
|
|
32
|
+
<slot
|
|
33
|
+
name="label"
|
|
34
|
+
v-bind="{ item: $props.item, font }"
|
|
35
|
+
>
|
|
30
36
|
<FSSpan
|
|
31
37
|
v-if="$props.label"
|
|
32
|
-
class="fs-radio-label"
|
|
33
38
|
:style="style"
|
|
34
39
|
:font="font"
|
|
35
40
|
>
|
|
@@ -39,7 +44,9 @@
|
|
|
39
44
|
</FSRow>
|
|
40
45
|
</template>
|
|
41
46
|
</v-radio>
|
|
42
|
-
<slot
|
|
47
|
+
<slot
|
|
48
|
+
name="description"
|
|
49
|
+
>
|
|
43
50
|
<FSSpan
|
|
44
51
|
v-if="$props.description"
|
|
45
52
|
class="fs-radio-description"
|
|
@@ -72,6 +79,11 @@ export default defineComponent({
|
|
|
72
79
|
FSRow
|
|
73
80
|
},
|
|
74
81
|
props: {
|
|
82
|
+
item: {
|
|
83
|
+
type: Object as PropType<object | null>,
|
|
84
|
+
required: false,
|
|
85
|
+
default: null
|
|
86
|
+
},
|
|
75
87
|
label: {
|
|
76
88
|
type: String as PropType<string | null>,
|
|
77
89
|
required: false,
|
|
@@ -5,15 +5,26 @@
|
|
|
5
5
|
>
|
|
6
6
|
<FSRadio
|
|
7
7
|
v-for="(item, index) in $props.values"
|
|
8
|
-
:key="index"
|
|
9
|
-
:label="item.label"
|
|
10
|
-
:description="item.description"
|
|
11
8
|
:selected="isSelected(item.value)"
|
|
12
|
-
:
|
|
9
|
+
:description="item.description"
|
|
13
10
|
:editable="$props.editable"
|
|
11
|
+
:color="$props.color"
|
|
12
|
+
:label="item.label"
|
|
13
|
+
:item="item.item"
|
|
14
|
+
:key="index"
|
|
14
15
|
:modelValue="item.value"
|
|
15
16
|
@update:modelValue="onToggle"
|
|
16
|
-
|
|
17
|
+
>
|
|
18
|
+
<template
|
|
19
|
+
v-for="(_, name) in $slots"
|
|
20
|
+
v-slot:[name]="slotData"
|
|
21
|
+
>
|
|
22
|
+
<slot
|
|
23
|
+
:name="name"
|
|
24
|
+
v-bind="slotData"
|
|
25
|
+
/>
|
|
26
|
+
</template>
|
|
27
|
+
</FSRadio>
|
|
17
28
|
</FSCol>
|
|
18
29
|
</template>
|
|
19
30
|
|
|
@@ -38,7 +49,7 @@ export default defineComponent({
|
|
|
38
49
|
default: "8px"
|
|
39
50
|
},
|
|
40
51
|
values: {
|
|
41
|
-
type: Array as PropType<{ value: string | boolean | number, label?: string, description?: string }[]>,
|
|
52
|
+
type: Array as PropType<{ value: string | boolean | number, label?: string, description?: string, item: any | null }[]>,
|
|
42
53
|
required: true,
|
|
43
54
|
default: null
|
|
44
55
|
},
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
>
|
|
13
13
|
<FSButtonPreviousIcon
|
|
14
14
|
:color="ColorEnum.Dark"
|
|
15
|
-
@click="goToPrev"
|
|
15
|
+
@click.prevent.stop="goToPrev"
|
|
16
16
|
/>
|
|
17
17
|
</template>
|
|
18
18
|
<template
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
<FSButtonNextIcon
|
|
34
34
|
:color="ColorEnum.Dark"
|
|
35
35
|
:class="nextClasses"
|
|
36
|
-
@click="goToNext"
|
|
36
|
+
@click.prevent.stop="goToNext"
|
|
37
37
|
/>
|
|
38
38
|
</template>
|
|
39
39
|
</v-slide-group>
|
|
@@ -105,6 +105,20 @@ export default defineComponent({
|
|
|
105
105
|
return classes;
|
|
106
106
|
});
|
|
107
107
|
|
|
108
|
+
const goToStart = () => {
|
|
109
|
+
if (slideGroupRef.value) {
|
|
110
|
+
const scrollElement = (slideGroupRef.value as any).$el.children[1];
|
|
111
|
+
scrollElement.scrollTo({ left: -scrollElement.scrollLeft, behavior: "smooth" });
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const goToEnd = () => {
|
|
116
|
+
if (slideGroupRef.value) {
|
|
117
|
+
const scrollElement = (slideGroupRef.value as any).$el.children[1];
|
|
118
|
+
scrollElement.scrollTo({ left: scrollElement.scrollWidth - scrollElement.scrollLeft, behavior: "smooth" });
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
|
|
108
122
|
const goToPrev = () => {
|
|
109
123
|
if (slideGroupRef.value) {
|
|
110
124
|
(slideGroupRef.value as any).scrollTo("prev");
|
|
@@ -143,8 +157,10 @@ export default defineComponent({
|
|
|
143
157
|
elementId,
|
|
144
158
|
style,
|
|
145
159
|
getChildren,
|
|
160
|
+
goToStart,
|
|
161
|
+
goToNext,
|
|
146
162
|
goToPrev,
|
|
147
|
-
|
|
163
|
+
goToEnd
|
|
148
164
|
};
|
|
149
165
|
}
|
|
150
166
|
});
|
|
@@ -157,6 +157,11 @@ export default defineComponent({
|
|
|
157
157
|
required: false,
|
|
158
158
|
default: ColorEnum.Primary
|
|
159
159
|
},
|
|
160
|
+
errorColor: {
|
|
161
|
+
type: String as PropType<ColorBase>,
|
|
162
|
+
required: false,
|
|
163
|
+
default: ColorEnum.Error
|
|
164
|
+
},
|
|
160
165
|
padding: {
|
|
161
166
|
type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
|
|
162
167
|
required: false,
|
|
@@ -210,6 +215,9 @@ export default defineComponent({
|
|
|
210
215
|
if (!Array.isArray(props.modelValue) && props.modelValue === value.id) {
|
|
211
216
|
return props.activeColor;
|
|
212
217
|
}
|
|
218
|
+
if (inputRef.value && (inputRef.value as any).errorMessages.length) {
|
|
219
|
+
return props.errorColor;
|
|
220
|
+
}
|
|
213
221
|
return props.buttonColor;
|
|
214
222
|
};
|
|
215
223
|
|
|
@@ -37,6 +37,15 @@
|
|
|
37
37
|
v-bind="slotData"
|
|
38
38
|
/>
|
|
39
39
|
</template>
|
|
40
|
+
<template
|
|
41
|
+
v-if="mobileSelectionProps"
|
|
42
|
+
#prepend-inner
|
|
43
|
+
>
|
|
44
|
+
<slot
|
|
45
|
+
name="selection-mobile"
|
|
46
|
+
v-bind="mobileSelectionProps"
|
|
47
|
+
/>
|
|
48
|
+
</template>
|
|
40
49
|
<template
|
|
41
50
|
#append-inner
|
|
42
51
|
>
|
|
@@ -66,32 +75,47 @@
|
|
|
66
75
|
:height="height"
|
|
67
76
|
>
|
|
68
77
|
<FSCol
|
|
78
|
+
v-if="$props.multiple"
|
|
69
79
|
gap="12px"
|
|
70
80
|
>
|
|
71
|
-
<
|
|
72
|
-
v-
|
|
81
|
+
<FSRow
|
|
82
|
+
v-for="(item, index) in searchItems"
|
|
83
|
+
:key="index"
|
|
73
84
|
>
|
|
74
|
-
<
|
|
75
|
-
|
|
76
|
-
:
|
|
85
|
+
<FSCheckbox
|
|
86
|
+
:label="item[$props.itemTitle]"
|
|
87
|
+
:editable="$props.editable"
|
|
88
|
+
:modelValue="$props.modelValue?.includes(item[$props.itemValue])"
|
|
89
|
+
@update:modelValue="() => onCheckboxChange(item[$props.itemValue])"
|
|
77
90
|
>
|
|
78
|
-
<
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
gap="12px"
|
|
89
|
-
:values="searchItems.map((item: any) => ({ value: item[$props.itemValue], label: item[$props.itemTitle] }))"
|
|
90
|
-
:modelValue="$props.modelValue"
|
|
91
|
-
:editable="$props.editable"
|
|
92
|
-
@update:modelValue="onRadioChange"
|
|
93
|
-
/>
|
|
91
|
+
<template
|
|
92
|
+
#label="{ font }"
|
|
93
|
+
>
|
|
94
|
+
<slot
|
|
95
|
+
name="item-label"
|
|
96
|
+
v-bind="mobileItemProps(item, font)"
|
|
97
|
+
/>
|
|
98
|
+
</template>
|
|
99
|
+
</FSCheckbox>
|
|
100
|
+
</FSRow>
|
|
94
101
|
</FSCol>
|
|
102
|
+
<FSRadioGroup
|
|
103
|
+
v-else
|
|
104
|
+
gap="12px"
|
|
105
|
+
:values="searchItems.map((item: any) => ({ value: item[$props.itemValue], label: item[$props.itemTitle], item: item }))"
|
|
106
|
+
:editable="$props.editable"
|
|
107
|
+
:modelValue="$props.modelValue"
|
|
108
|
+
@update:modelValue="onRadioChange"
|
|
109
|
+
>
|
|
110
|
+
<template
|
|
111
|
+
#label="{ item, font }"
|
|
112
|
+
>
|
|
113
|
+
<slot
|
|
114
|
+
name="item-label"
|
|
115
|
+
v-bind="mobileItemProps(item, font)"
|
|
116
|
+
/>
|
|
117
|
+
</template>
|
|
118
|
+
</FSRadioGroup>
|
|
95
119
|
</FSFadeOut>
|
|
96
120
|
</template>
|
|
97
121
|
</FSDialogMenu>
|
|
@@ -135,6 +159,7 @@
|
|
|
135
159
|
:style="style"
|
|
136
160
|
:listProps="listStyle"
|
|
137
161
|
:class="classes"
|
|
162
|
+
:persistentClear="true"
|
|
138
163
|
:hideDetails="true"
|
|
139
164
|
:items="$props.items"
|
|
140
165
|
:autoSelectFirst="true"
|
|
@@ -153,6 +178,15 @@
|
|
|
153
178
|
v-model:search="search"
|
|
154
179
|
v-bind="$attrs"
|
|
155
180
|
>
|
|
181
|
+
<template
|
|
182
|
+
v-for="(_, name) in autocompleteSlots"
|
|
183
|
+
v-slot:[name]="slotData"
|
|
184
|
+
>
|
|
185
|
+
<slot
|
|
186
|
+
:name="`autocomplete-${name}`"
|
|
187
|
+
v-bind="slotData"
|
|
188
|
+
/>
|
|
189
|
+
</template>
|
|
156
190
|
<template
|
|
157
191
|
#item="{ props, item }"
|
|
158
192
|
>
|
|
@@ -161,28 +195,42 @@
|
|
|
161
195
|
>
|
|
162
196
|
<FSRow
|
|
163
197
|
align="center-left"
|
|
164
|
-
:wrap="false"
|
|
165
198
|
>
|
|
166
199
|
<FSCheckbox
|
|
167
200
|
v-if="$props.multiple"
|
|
168
201
|
:modelValue="$props.modelValue?.includes(item.raw[$props.itemValue])"
|
|
169
202
|
@click="props.onClick"
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
203
|
+
>
|
|
204
|
+
<template
|
|
205
|
+
#label="{ font }"
|
|
206
|
+
>
|
|
207
|
+
<slot
|
|
208
|
+
name="item-label"
|
|
209
|
+
v-bind="{ item, font }"
|
|
210
|
+
>
|
|
211
|
+
<FSSpan
|
|
212
|
+
:font="font"
|
|
213
|
+
>
|
|
214
|
+
{{ item.raw[$props.itemTitle] }}
|
|
215
|
+
</FSSpan>
|
|
216
|
+
</slot>
|
|
217
|
+
</template>
|
|
218
|
+
</FSCheckbox>
|
|
219
|
+
<FSSpan
|
|
220
|
+
v-else
|
|
221
|
+
>
|
|
222
|
+
<slot
|
|
223
|
+
name="item-label"
|
|
224
|
+
v-bind="{ item }"
|
|
225
|
+
>
|
|
226
|
+
<FSSpan>
|
|
227
|
+
{{ item.raw[$props.itemTitle] }}
|
|
228
|
+
</FSSpan>
|
|
229
|
+
</slot>
|
|
173
230
|
</FSSpan>
|
|
174
231
|
</FSRow>
|
|
175
232
|
</v-list-item>
|
|
176
233
|
</template>
|
|
177
|
-
<template
|
|
178
|
-
v-for="(_, name) in autocompleteSlots"
|
|
179
|
-
v-slot:[name]="slotData"
|
|
180
|
-
>
|
|
181
|
-
<slot
|
|
182
|
-
:name="`autocomplete-${name}`"
|
|
183
|
-
v-bind="slotData"
|
|
184
|
-
/>
|
|
185
|
-
</template>
|
|
186
234
|
<template
|
|
187
235
|
#clear
|
|
188
236
|
>
|
|
@@ -447,6 +495,40 @@ export default defineComponent({
|
|
|
447
495
|
return null;
|
|
448
496
|
});
|
|
449
497
|
|
|
498
|
+
const mobileSelectionProps = computed((): any | null => {
|
|
499
|
+
const item = props.items.find((item: any) => item[props.itemValue] === props.modelValue);
|
|
500
|
+
if (item) {
|
|
501
|
+
return {
|
|
502
|
+
item: {
|
|
503
|
+
title: "",
|
|
504
|
+
value: item[props.itemValue],
|
|
505
|
+
props: {
|
|
506
|
+
title: item[props.itemTitle],
|
|
507
|
+
value: item[props.itemValue]
|
|
508
|
+
},
|
|
509
|
+
raw: { ...item }
|
|
510
|
+
},
|
|
511
|
+
font: "text-body"
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
return null;
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
const mobileItemProps = (item: any, font: "text-body" | "text-button" | null): any => {
|
|
518
|
+
return {
|
|
519
|
+
item: {
|
|
520
|
+
title: "",
|
|
521
|
+
value: item[props.itemValue],
|
|
522
|
+
props: {
|
|
523
|
+
title: item[props.itemTitle],
|
|
524
|
+
value: item[props.itemValue]
|
|
525
|
+
},
|
|
526
|
+
raw: { ...item }
|
|
527
|
+
},
|
|
528
|
+
font
|
|
529
|
+
}
|
|
530
|
+
};
|
|
531
|
+
|
|
450
532
|
const openMobileOverlay = () => {
|
|
451
533
|
if (!props.editable) {
|
|
452
534
|
return;
|
|
@@ -487,6 +569,7 @@ export default defineComponent({
|
|
|
487
569
|
});
|
|
488
570
|
|
|
489
571
|
return {
|
|
572
|
+
mobileSelectionProps,
|
|
490
573
|
autocompleteSlots,
|
|
491
574
|
toggleSetSlots,
|
|
492
575
|
isExtraSmall,
|
|
@@ -505,6 +588,7 @@ export default defineComponent({
|
|
|
505
588
|
style,
|
|
506
589
|
openMobileOverlay,
|
|
507
590
|
onCheckboxChange,
|
|
591
|
+
mobileItemProps,
|
|
508
592
|
onRadioChange,
|
|
509
593
|
onUpdate
|
|
510
594
|
};
|
|
@@ -30,6 +30,15 @@
|
|
|
30
30
|
v-bind="slotData"
|
|
31
31
|
/>
|
|
32
32
|
</template>
|
|
33
|
+
<template
|
|
34
|
+
v-if="mobileSelectionProps"
|
|
35
|
+
#prepend-inner
|
|
36
|
+
>
|
|
37
|
+
<slot
|
|
38
|
+
name="selection-mobile"
|
|
39
|
+
v-bind="mobileSelectionProps"
|
|
40
|
+
/>
|
|
41
|
+
</template>
|
|
33
42
|
<template
|
|
34
43
|
#append-inner
|
|
35
44
|
>
|
|
@@ -68,17 +77,35 @@
|
|
|
68
77
|
:editable="$props.editable"
|
|
69
78
|
:modelValue="$props.modelValue?.includes(item[$props.itemValue])"
|
|
70
79
|
@update:modelValue="() => onCheckboxChange(item[$props.itemValue])"
|
|
71
|
-
|
|
80
|
+
>
|
|
81
|
+
<template
|
|
82
|
+
#label="{ font }"
|
|
83
|
+
>
|
|
84
|
+
<slot
|
|
85
|
+
name="item-label"
|
|
86
|
+
v-bind="mobileItemProps(item, font)"
|
|
87
|
+
/>
|
|
88
|
+
</template>
|
|
89
|
+
</FSCheckbox>
|
|
72
90
|
</FSRow>
|
|
73
91
|
</FSCol>
|
|
74
92
|
<FSRadioGroup
|
|
75
93
|
v-else
|
|
76
94
|
gap="12px"
|
|
77
|
-
:values="$props.items.map((item: any) => ({ value: item[$props.itemValue], label: item[$props.itemTitle] }))"
|
|
78
|
-
:modelValue="$props.modelValue"
|
|
95
|
+
:values="$props.items.map((item: any) => ({ value: item[$props.itemValue], label: item[$props.itemTitle], item: item }))"
|
|
79
96
|
:editable="$props.editable"
|
|
97
|
+
:modelValue="$props.modelValue"
|
|
80
98
|
@update:modelValue="onRadioChange"
|
|
81
|
-
|
|
99
|
+
>
|
|
100
|
+
<template
|
|
101
|
+
#label="{ item, font }"
|
|
102
|
+
>
|
|
103
|
+
<slot
|
|
104
|
+
name="item-label"
|
|
105
|
+
v-bind="mobileItemProps(item, font)"
|
|
106
|
+
/>
|
|
107
|
+
</template>
|
|
108
|
+
</FSRadioGroup>
|
|
82
109
|
</FSFadeOut>
|
|
83
110
|
</template>
|
|
84
111
|
</FSDialogMenu>
|
|
@@ -100,6 +127,7 @@
|
|
|
100
127
|
:menuIcon="null"
|
|
101
128
|
:style="style"
|
|
102
129
|
:listProps="listStyle"
|
|
130
|
+
:persistentClear="true"
|
|
103
131
|
:hideDetails="true"
|
|
104
132
|
:items="$props.items"
|
|
105
133
|
:itemTitle="$props.itemTitle"
|
|
@@ -115,6 +143,15 @@
|
|
|
115
143
|
@blur="blurred = true"
|
|
116
144
|
v-bind="$attrs"
|
|
117
145
|
>
|
|
146
|
+
<template
|
|
147
|
+
v-for="(_, name) in $slots"
|
|
148
|
+
v-slot:[name]="slotData"
|
|
149
|
+
>
|
|
150
|
+
<slot
|
|
151
|
+
:name="name"
|
|
152
|
+
v-bind="slotData"
|
|
153
|
+
/>
|
|
154
|
+
</template>
|
|
118
155
|
<template
|
|
119
156
|
#item="{ props, item }"
|
|
120
157
|
>
|
|
@@ -126,24 +163,39 @@
|
|
|
126
163
|
>
|
|
127
164
|
<FSCheckbox
|
|
128
165
|
v-if="$props.multiple"
|
|
129
|
-
:modelValue="$props.modelValue?.includes(item.raw.
|
|
166
|
+
:modelValue="$props.modelValue?.includes(item.raw[$props.itemValue])"
|
|
130
167
|
@click="props.onClick"
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
168
|
+
>
|
|
169
|
+
<template
|
|
170
|
+
#label="{ font }"
|
|
171
|
+
>
|
|
172
|
+
<slot
|
|
173
|
+
name="item-label"
|
|
174
|
+
v-bind="{ item, font }"
|
|
175
|
+
>
|
|
176
|
+
<FSSpan
|
|
177
|
+
:font="font"
|
|
178
|
+
>
|
|
179
|
+
{{ item.raw[$props.itemTitle] }}
|
|
180
|
+
</FSSpan>
|
|
181
|
+
</slot>
|
|
182
|
+
</template>
|
|
183
|
+
</FSCheckbox>
|
|
184
|
+
<FSSpan
|
|
185
|
+
v-else
|
|
186
|
+
>
|
|
187
|
+
<slot
|
|
188
|
+
name="item-label"
|
|
189
|
+
v-bind="{ item }"
|
|
190
|
+
>
|
|
191
|
+
<FSSpan>
|
|
192
|
+
{{ item.raw[$props.itemTitle] }}
|
|
193
|
+
</FSSpan>
|
|
194
|
+
</slot>
|
|
134
195
|
</FSSpan>
|
|
135
196
|
</FSRow>
|
|
136
197
|
</v-list-item>
|
|
137
198
|
</template>
|
|
138
|
-
<template
|
|
139
|
-
v-for="(_, name) in $slots"
|
|
140
|
-
v-slot:[name]="slotData"
|
|
141
|
-
>
|
|
142
|
-
<slot
|
|
143
|
-
:name="name"
|
|
144
|
-
v-bind="slotData"
|
|
145
|
-
/>
|
|
146
|
-
</template>
|
|
147
199
|
<template
|
|
148
200
|
#clear
|
|
149
201
|
>
|
|
@@ -173,6 +225,17 @@
|
|
|
173
225
|
/>
|
|
174
226
|
</slot>
|
|
175
227
|
</template>
|
|
228
|
+
<template
|
|
229
|
+
#no-data
|
|
230
|
+
>
|
|
231
|
+
<FSRow
|
|
232
|
+
padding="17px"
|
|
233
|
+
>
|
|
234
|
+
<FSSpan>
|
|
235
|
+
{{ $tr("ui.common.no-data", "No data") }}
|
|
236
|
+
</FSSpan>
|
|
237
|
+
</FSRow>
|
|
238
|
+
</template>
|
|
176
239
|
</v-select>
|
|
177
240
|
</FSBaseField>
|
|
178
241
|
</template>
|
|
@@ -346,6 +409,40 @@ export default defineComponent({
|
|
|
346
409
|
return null;
|
|
347
410
|
});
|
|
348
411
|
|
|
412
|
+
const mobileSelectionProps = computed((): any | null => {
|
|
413
|
+
const item = props.items.find((item: any) => item[props.itemValue] === props.modelValue);
|
|
414
|
+
if (item) {
|
|
415
|
+
return {
|
|
416
|
+
item: {
|
|
417
|
+
title: "",
|
|
418
|
+
value: item[props.itemValue],
|
|
419
|
+
props: {
|
|
420
|
+
title: item[props.itemTitle],
|
|
421
|
+
value: item[props.itemValue]
|
|
422
|
+
},
|
|
423
|
+
raw: { ...item }
|
|
424
|
+
},
|
|
425
|
+
font: "text-body"
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
return null;
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
const mobileItemProps = (item: any, font: "text-body" | "text-button" | null): any => {
|
|
432
|
+
return {
|
|
433
|
+
item: {
|
|
434
|
+
title: "",
|
|
435
|
+
value: item[props.itemValue],
|
|
436
|
+
props: {
|
|
437
|
+
title: item[props.itemTitle],
|
|
438
|
+
value: item[props.itemValue]
|
|
439
|
+
},
|
|
440
|
+
raw: { ...item }
|
|
441
|
+
},
|
|
442
|
+
font
|
|
443
|
+
}
|
|
444
|
+
};
|
|
445
|
+
|
|
349
446
|
const openMobileOverlay = () => {
|
|
350
447
|
if (!props.editable) {
|
|
351
448
|
return;
|
|
@@ -378,6 +475,7 @@ export default defineComponent({
|
|
|
378
475
|
};
|
|
379
476
|
|
|
380
477
|
return {
|
|
478
|
+
mobileSelectionProps,
|
|
381
479
|
isExtraSmall,
|
|
382
480
|
mobileValue,
|
|
383
481
|
validateOn,
|
|
@@ -390,6 +488,7 @@ export default defineComponent({
|
|
|
390
488
|
style,
|
|
391
489
|
openMobileOverlay,
|
|
392
490
|
onCheckboxChange,
|
|
491
|
+
mobileItemProps,
|
|
393
492
|
onRadioChange
|
|
394
493
|
};
|
|
395
494
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
width="100%"
|
|
6
6
|
:color="$props.itemColor"
|
|
7
7
|
:variant="variant"
|
|
8
|
+
:style="style"
|
|
8
9
|
>
|
|
9
10
|
<FSCol>
|
|
10
11
|
<slot
|
|
@@ -112,6 +113,11 @@ export default defineComponent({
|
|
|
112
113
|
required: false,
|
|
113
114
|
default: ColorEnum.Primary
|
|
114
115
|
},
|
|
116
|
+
clickable: {
|
|
117
|
+
type: Boolean,
|
|
118
|
+
required: false,
|
|
119
|
+
default: false
|
|
120
|
+
},
|
|
115
121
|
showSelect: {
|
|
116
122
|
type: Boolean,
|
|
117
123
|
required: false,
|
|
@@ -127,8 +133,15 @@ export default defineComponent({
|
|
|
127
133
|
}
|
|
128
134
|
});
|
|
129
135
|
|
|
136
|
+
const style = computed((): { [key: string]: string | null | undefined } => {
|
|
137
|
+
return {
|
|
138
|
+
"--fs-data-iterator-item-cursor": props.clickable ? "pointer" : "default"
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
|
|
130
142
|
return {
|
|
131
|
-
variant
|
|
143
|
+
variant,
|
|
144
|
+
style
|
|
132
145
|
};
|
|
133
146
|
}
|
|
134
147
|
});
|
|
@@ -125,8 +125,8 @@
|
|
|
125
125
|
:page="innerPage"
|
|
126
126
|
:itemsPerPage="innerRowsPerPage"
|
|
127
127
|
:modelValue="$props.modelValue"
|
|
128
|
-
@auxclick:row="
|
|
129
|
-
@click:row="
|
|
128
|
+
@auxclick:row="onClickLibrary.row"
|
|
129
|
+
@click:row="onClickLibrary.row"
|
|
130
130
|
@update:sortBy="innerSortBy = $event ? $event[0] : null"
|
|
131
131
|
@dragover.prevent
|
|
132
132
|
@drop:row="(event, row) => onDrop(event, row, 'tr.v-data-table__tr')"
|
|
@@ -435,6 +435,7 @@
|
|
|
435
435
|
v-if="item.type === 'item'"
|
|
436
436
|
:itemColor="$props.rowColor ? $props.rowColor(item.raw) : ColorEnum.Background"
|
|
437
437
|
:headers="innerHeaders.filter(h => !$props.sneakyHeaders.includes(h.value))"
|
|
438
|
+
:clickable="onClickLibrary.clickable"
|
|
438
439
|
:showSelect="$props.showSelect"
|
|
439
440
|
:itemTo="$props.itemTo"
|
|
440
441
|
:color="$props.color"
|
|
@@ -442,6 +443,8 @@
|
|
|
442
443
|
:key="index"
|
|
443
444
|
:modelValue="$props.modelValue.includes(item.raw[$props.itemValue])"
|
|
444
445
|
@update:modelValue="toggleSelect"
|
|
446
|
+
@auxclick="() => onClickLibrary.mobile($event, item)"
|
|
447
|
+
@click="() => onClickLibrary.mobile($event, item)"
|
|
445
448
|
>
|
|
446
449
|
<template
|
|
447
450
|
#item.top="props"
|
|
@@ -584,6 +587,7 @@
|
|
|
584
587
|
<FSDataIteratorItem
|
|
585
588
|
:itemColor="$props.rowColor ? $props.rowColor(item.raw) : ColorEnum.Background"
|
|
586
589
|
:headers="innerHeaders.filter(h => !$props.sneakyHeaders.includes(h.value))"
|
|
590
|
+
:clickable="onClickLibrary.clickable"
|
|
587
591
|
:showSelect="$props.showSelect"
|
|
588
592
|
:itemTo="$props.itemTo"
|
|
589
593
|
:color="$props.color"
|
|
@@ -591,6 +595,8 @@
|
|
|
591
595
|
:key="index"
|
|
592
596
|
:modelValue="$props.modelValue.includes(item.raw[$props.itemValue])"
|
|
593
597
|
@update:modelValue="toggleSelect"
|
|
598
|
+
@auxclick="() => onClickLibrary.mobile($event, item)"
|
|
599
|
+
@click="() => onClickLibrary.mobile($event, item)"
|
|
594
600
|
>
|
|
595
601
|
<template
|
|
596
602
|
#item.top="props"
|
|
@@ -638,7 +644,7 @@
|
|
|
638
644
|
</template>
|
|
639
645
|
|
|
640
646
|
<script lang="ts">
|
|
641
|
-
import { computed, defineComponent,
|
|
647
|
+
import { computed, defineComponent, onMounted, onUnmounted, PropType, ref, Ref, Slot, watch } from "vue";
|
|
642
648
|
import { useRouter } from "vue-router";
|
|
643
649
|
|
|
644
650
|
import { ColorEnum, FSDataTableColumn, FSDataTableFilter, FSDataTableOrder, FSToggle } from "@dative-gpi/foundation-shared-components/models";
|
|
@@ -718,6 +724,11 @@ export default defineComponent({
|
|
|
718
724
|
required: false,
|
|
719
725
|
default: null
|
|
720
726
|
},
|
|
727
|
+
["onClick:row"]: {
|
|
728
|
+
type: Function,
|
|
729
|
+
required: false,
|
|
730
|
+
default: null
|
|
731
|
+
},
|
|
721
732
|
rowsPerPage: {
|
|
722
733
|
type: Number,
|
|
723
734
|
required: false,
|
|
@@ -1018,25 +1029,43 @@ export default defineComponent({
|
|
|
1018
1029
|
}
|
|
1019
1030
|
});
|
|
1020
1031
|
|
|
1021
|
-
const
|
|
1022
|
-
if (
|
|
1023
|
-
return
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1032
|
+
const onClickLibrary = computed((): { [key: string]: Function | boolean } => {
|
|
1033
|
+
if (props["onClick:row"] || props.itemTo) {
|
|
1034
|
+
return {
|
|
1035
|
+
clickable: true,
|
|
1036
|
+
row: (event: PointerEvent, row: any) => {
|
|
1037
|
+
if (props.itemTo && router) {
|
|
1038
|
+
if (event.metaKey || event.ctrlKey || event.button === 1) {
|
|
1039
|
+
window.open(router.resolve(props.itemTo(row.item)).href, "_blank");
|
|
1040
|
+
}
|
|
1041
|
+
else {
|
|
1042
|
+
router.push(props.itemTo(row.item));
|
|
1043
|
+
}
|
|
1027
1044
|
}
|
|
1028
1045
|
else {
|
|
1029
|
-
|
|
1046
|
+
emit("click:row", row.item);
|
|
1047
|
+
}
|
|
1048
|
+
},
|
|
1049
|
+
mobile: (event: PointerEvent, item: any) => {
|
|
1050
|
+
if (props.itemTo && router) {
|
|
1051
|
+
if (event.metaKey || event.ctrlKey || event.button === 1) {
|
|
1052
|
+
window.open(router.resolve(props.itemTo(item)).href, "_blank");
|
|
1053
|
+
}
|
|
1054
|
+
else {
|
|
1055
|
+
router.push(props.itemTo(item));
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
else {
|
|
1059
|
+
emit("click:row", item);
|
|
1030
1060
|
}
|
|
1031
1061
|
}
|
|
1032
|
-
|
|
1033
|
-
emit("click:row", row.item);
|
|
1034
|
-
}
|
|
1035
|
-
};
|
|
1036
|
-
}
|
|
1037
|
-
else {
|
|
1038
|
-
return null;
|
|
1062
|
+
}
|
|
1039
1063
|
}
|
|
1064
|
+
return {
|
|
1065
|
+
clickable: false,
|
|
1066
|
+
row: null,
|
|
1067
|
+
mobile: () => null
|
|
1068
|
+
};
|
|
1040
1069
|
});
|
|
1041
1070
|
|
|
1042
1071
|
const draggableDisabled = computed(() => {
|
|
@@ -1453,10 +1482,10 @@ export default defineComponent({
|
|
|
1453
1482
|
classes,
|
|
1454
1483
|
style,
|
|
1455
1484
|
size,
|
|
1456
|
-
onClickRow,
|
|
1457
1485
|
isExtraSmall,
|
|
1458
1486
|
draggableDisabled,
|
|
1459
1487
|
elementId,
|
|
1488
|
+
onClickLibrary,
|
|
1460
1489
|
toggleSelectAll,
|
|
1461
1490
|
toggleSelectGroup,
|
|
1462
1491
|
toggleSelect,
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dative-gpi/foundation-shared-components",
|
|
3
3
|
"sideEffects": false,
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.124",
|
|
5
5
|
"description": "",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
"author": "",
|
|
11
11
|
"license": "ISC",
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@dative-gpi/foundation-shared-domain": "0.0.
|
|
14
|
-
"@dative-gpi/foundation-shared-services": "0.0.
|
|
13
|
+
"@dative-gpi/foundation-shared-domain": "0.0.124",
|
|
14
|
+
"@dative-gpi/foundation-shared-services": "0.0.124",
|
|
15
15
|
"@fontsource/montserrat": "^5.0.16",
|
|
16
16
|
"@lexical/clipboard": "^0.12.5",
|
|
17
17
|
"@lexical/history": "^0.12.5",
|
|
@@ -32,5 +32,5 @@
|
|
|
32
32
|
"sass": "^1.69.5",
|
|
33
33
|
"sass-loader": "^13.3.2"
|
|
34
34
|
},
|
|
35
|
-
"gitHead": "
|
|
35
|
+
"gitHead": "37128d517dbaf731a08637d60b8b996b4d6e8019"
|
|
36
36
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
.fs-data-iterator-item {
|
|
2
|
+
cursor: var(--fs-data-iterator-item-cursor);
|
|
2
3
|
position: relative;
|
|
3
4
|
min-height: 36px;
|
|
4
5
|
flex: 1 0 0;
|
|
@@ -6,15 +7,27 @@
|
|
|
6
7
|
& > .fs-col > .fs-row:first-of-type > :last-child {
|
|
7
8
|
padding-right: 32px;
|
|
8
9
|
}
|
|
10
|
+
|
|
11
|
+
&:hover::after {
|
|
12
|
+
content: "";
|
|
13
|
+
background-color: black;
|
|
14
|
+
pointer-events: none;
|
|
15
|
+
position: absolute;
|
|
16
|
+
opacity: 0.04;
|
|
17
|
+
height: 100%;
|
|
18
|
+
width: 100%;
|
|
19
|
+
left: 0;
|
|
20
|
+
top: 0;
|
|
21
|
+
}
|
|
9
22
|
}
|
|
10
23
|
|
|
11
24
|
.fs-data-iterator-item-checkbox {
|
|
12
|
-
border-radius: 4px;
|
|
13
|
-
position: absolute;
|
|
14
|
-
align-items: center;
|
|
15
25
|
justify-content: center;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
26
|
+
align-items: center;
|
|
27
|
+
position: absolute;
|
|
28
|
+
border-radius: 4px;
|
|
19
29
|
height: 32px;
|
|
30
|
+
width: 32px;
|
|
31
|
+
right: 1px;
|
|
32
|
+
top: 1px;
|
|
20
33
|
}
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
@import "fs_color_icon.scss";
|
|
16
16
|
@import "fs_data_table.scss";
|
|
17
17
|
@import "fs_data_iterator_item.scss";
|
|
18
|
-
@import "fs_date_field.scss";
|
|
19
18
|
@import "fs_dialog_menu.scss";
|
|
20
19
|
@import "fs_dialog.scss";
|
|
21
20
|
@import "fs_divider.scss";
|
|
@@ -36,6 +35,7 @@
|
|
|
36
35
|
@import "fs_load_data_table.scss";
|
|
37
36
|
@import "fs_load_tile.scss";
|
|
38
37
|
@import "fs_loader.scss";
|
|
38
|
+
@import "fs_meta_field.scss";
|
|
39
39
|
@import "fs_option_group.scss";
|
|
40
40
|
@import "fs_pagination.scss";
|
|
41
41
|
@import "fs_password_field.scss";
|
|
@@ -50,11 +50,11 @@
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
& .v-input__prepend {
|
|
53
|
-
margin-inline-end:
|
|
53
|
+
margin-inline-end: 0 !important;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
& .v-input__append {
|
|
57
|
-
margin-inline-start:
|
|
57
|
+
margin-inline-start: 0 !important;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
& > .v-input__control > .v-field {
|
|
@@ -65,6 +65,10 @@
|
|
|
65
65
|
margin-inline: 0px;
|
|
66
66
|
padding-top: 0px;
|
|
67
67
|
height: 100%;
|
|
68
|
+
|
|
69
|
+
& > .v-icon {
|
|
70
|
+
opacity: 1 !important;
|
|
71
|
+
}
|
|
68
72
|
}
|
|
69
73
|
|
|
70
74
|
& > .v-field__outline {
|
|
@@ -78,10 +82,9 @@
|
|
|
78
82
|
& > .v-field__field > .v-field__input {
|
|
79
83
|
@extend .text-body;
|
|
80
84
|
|
|
81
|
-
padding-inline: 0px !important;
|
|
82
85
|
padding-bottom: 0px !important;
|
|
86
|
+
padding-inline: 0px !important;
|
|
83
87
|
padding-top: 0px !important;
|
|
84
|
-
align-items: center;
|
|
85
88
|
flex-wrap: nowrap;
|
|
86
89
|
overflow: hidden;
|
|
87
90
|
|
|
@@ -98,11 +101,34 @@
|
|
|
98
101
|
}
|
|
99
102
|
}
|
|
100
103
|
|
|
104
|
+
// If there is a prepend, it has a padding on the right and an opacity of 100%
|
|
105
|
+
.v-field__prepend-inner:not(:empty) {
|
|
106
|
+
padding-inline-end: 4px !important;
|
|
107
|
+
|
|
108
|
+
& > .v-icon {
|
|
109
|
+
opacity: 1 !important;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// If there is an append, it has a padding on the left and an opacity of 100%
|
|
114
|
+
.v-field__append-inner:not(:empty) {
|
|
115
|
+
padding-inline-start: 4px !important;
|
|
116
|
+
|
|
117
|
+
& > .v-icon {
|
|
118
|
+
opacity: 1 !important;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
101
122
|
// No input messages allowed
|
|
102
123
|
.v-input__details {
|
|
103
124
|
display: none !important;
|
|
104
125
|
}
|
|
105
126
|
|
|
127
|
+
// Ellipsis on input of all fields
|
|
128
|
+
input {
|
|
129
|
+
text-overflow: ellipsis;
|
|
130
|
+
}
|
|
131
|
+
|
|
106
132
|
// No up / down buttons in input field of type number
|
|
107
133
|
input[type=number] {
|
|
108
134
|
-moz-appearance: textfield;
|
|
@@ -128,6 +154,7 @@ $nthOverlay: 25;
|
|
|
128
154
|
.fs-slide-group {
|
|
129
155
|
max-width: 100%;
|
|
130
156
|
|
|
157
|
+
// To avoid borders clipping
|
|
131
158
|
& > .v-slide-group__container > .v-slide-group__content {
|
|
132
159
|
margin: 0 2px 1px 0 !important;
|
|
133
160
|
}
|