@dative-gpi/foundation-shared-components 0.0.12 → 0.0.13
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/FSButton.vue +1 -1
- package/components/FSCheckbox.vue +3 -3
- package/components/FSClock.vue +45 -30
- package/components/FSDivider.vue +46 -7
- package/components/FSForm.vue +52 -0
- package/components/FSImage.vue +41 -32
- package/components/FSLabel.vue +105 -0
- package/components/FSPagination.vue +25 -9
- package/components/FSPermissions.vue +0 -0
- package/components/FSRadio.vue +3 -3
- package/components/FSSubmitDialog.vue +1 -1
- package/components/FSSwitch.vue +3 -3
- package/components/FSText.vue +1 -1
- package/components/{FSAutocompleteField.vue → fields/FSAutocompleteField.vue} +18 -17
- package/components/fields/FSColorField.vue +194 -0
- package/components/{FSDateField.vue → fields/FSDateField.vue} +14 -49
- package/components/{FSDateRangeField.vue → fields/FSDateRangeField.vue} +18 -64
- package/components/{FSDateTimeField.vue → fields/FSDateTimeField.vue} +16 -51
- package/components/{FSDateTimeRangeField.vue → fields/FSDateTimeRangeField.vue} +23 -67
- package/components/{FSIconField.vue → fields/FSIconField.vue} +15 -50
- package/components/{FSNumberField.vue → fields/FSNumberField.vue} +0 -24
- package/components/{FSPasswordField.vue → fields/FSPasswordField.vue} +5 -29
- package/components/{FSRichTextField.vue → fields/FSRichTextField.vue} +3 -3
- package/components/{FSSearchField.vue → fields/FSSearchField.vue} +1 -1
- package/components/{FSSelectField.vue → fields/FSSelectField.vue} +17 -21
- package/components/{FSTagField.vue → fields/FSTagField.vue} +15 -50
- package/components/{FSTextArea.vue → fields/FSTextArea.vue} +24 -24
- package/components/{FSTextField.vue → fields/FSTextField.vue} +18 -18
- package/components/fields/FSTimeField.vue +104 -0
- package/components/fields/FSTimeSlotField.vue +263 -0
- package/components/lists/FSDataTableUI.vue +2 -2
- package/components/lists/FSFilterButton.vue +1 -1
- package/components/tiles/FSDeviceOrganisationTileUI.vue +4 -9
- package/components/tiles/FSGroupTileUI.vue +4 -9
- package/composables/index.ts +1 -0
- package/composables/useBreakpoints.ts +7 -5
- package/composables/useRules.ts +72 -0
- package/elements/FSFormElement.ts +17 -0
- package/icons/flags/France.vue +9 -0
- package/icons/flags/Germany.vue +7 -0
- package/icons/flags/GreatBritain.vue +9 -0
- package/icons/flags/Italy.vue +9 -0
- package/icons/flags/Portugal.vue +59 -0
- package/icons/flags/Spain.vue +546 -0
- package/icons/flags/UnitedStates.vue +12 -0
- package/icons/sets.ts +17 -0
- package/models/rules.ts +8 -0
- package/package.json +4 -4
- package/pages/FSExternalIdentityButton.vue +64 -0
- package/pages/FSLanguageSetter.vue +140 -0
- package/pages/FSLoginPage.vue +253 -0
- package/styles/components/fs_clock.scss +4 -0
- package/styles/components/fs_color_field.scss +17 -0
- package/styles/components/fs_divider.scss +5 -0
- package/styles/components/fs_image.scss +12 -1
- package/styles/components/fs_label.scss +86 -0
- package/styles/components/fs_pagination.scss +3 -3
- package/styles/components/fs_time_field.scss +3 -0
- package/styles/components/fs_timeslot_field.scss +75 -0
- package/styles/components/index.scss +4 -0
- package/styles/globals/text_fonts.scss +18 -0
- package/styles/main.scss +3 -1
- package/styles/pages/fs_language_setter.scss +55 -0
- package/styles/pages/index.scss +1 -0
- package/utils/color.ts +7 -0
- package/utils/css.ts +2 -1
- package/utils/index.ts +3 -1
- package/utils/time.ts +29 -0
- package/components/FSHeaderButton.vue +0 -17
- package/components/lists/FSDataIteratorGroup.vue +0 -7
|
@@ -7,45 +7,16 @@
|
|
|
7
7
|
:hideHeader="$props.hideHeader"
|
|
8
8
|
:required="$props.required"
|
|
9
9
|
:editable="$props.editable"
|
|
10
|
-
:error="messages.length > 0"
|
|
11
10
|
:readonly="true"
|
|
12
|
-
:
|
|
11
|
+
:rules="$props.rules"
|
|
12
|
+
:messages="messages"
|
|
13
|
+
:validateOn="validateOn"
|
|
14
|
+
:validationValue="$props.modelValue"
|
|
15
|
+
:modelValue="toShortTimeFormat"
|
|
13
16
|
@click="onClick"
|
|
14
17
|
@click:clear="onClear"
|
|
18
|
+
@blur="blurred = true"
|
|
15
19
|
>
|
|
16
|
-
<template v-if="!$props.hideHeader" #label>
|
|
17
|
-
<slot name="label">
|
|
18
|
-
<FSRow :wrap="false">
|
|
19
|
-
<FSSpan
|
|
20
|
-
v-if="$props.label"
|
|
21
|
-
class="fs-date-field-label"
|
|
22
|
-
font="text-overline"
|
|
23
|
-
:style="style"
|
|
24
|
-
>
|
|
25
|
-
{{ $props.label }}
|
|
26
|
-
</FSSpan>
|
|
27
|
-
<FSSpan
|
|
28
|
-
v-if="$props.label && $props.required"
|
|
29
|
-
class="fs-date-field-label"
|
|
30
|
-
style="margin-left: -8px;"
|
|
31
|
-
font="text-overline"
|
|
32
|
-
:ellipsis="false"
|
|
33
|
-
:style="style"
|
|
34
|
-
>
|
|
35
|
-
*
|
|
36
|
-
</FSSpan>
|
|
37
|
-
<v-spacer style="min-width: 40px;" />
|
|
38
|
-
<FSSpan
|
|
39
|
-
v-if="messages.length > 0"
|
|
40
|
-
class="fs-date-field-messages"
|
|
41
|
-
font="text-overline"
|
|
42
|
-
:style="style"
|
|
43
|
-
>
|
|
44
|
-
{{ messages.join(", ") }}
|
|
45
|
-
</FSSpan>
|
|
46
|
-
</FSRow>
|
|
47
|
-
</slot>
|
|
48
|
-
</template>
|
|
49
20
|
<template #prepend-inner>
|
|
50
21
|
<slot name="prepend-inner">
|
|
51
22
|
<FSButton
|
|
@@ -94,17 +65,18 @@
|
|
|
94
65
|
<script lang="ts">
|
|
95
66
|
import { computed, defineComponent, PropType, ref } from "vue";
|
|
96
67
|
|
|
68
|
+
import { useColors, useRules } from "@dative-gpi/foundation-shared-components/composables";
|
|
97
69
|
import { ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
|
|
98
70
|
import { useTimeZone } from "@dative-gpi/foundation-shared-services/composables";
|
|
99
|
-
import { useColors } from "@dative-gpi/foundation-shared-components/composables";
|
|
100
71
|
|
|
101
|
-
import FSSubmitDialog from "
|
|
102
|
-
import FSCalendarTwin from "
|
|
72
|
+
import FSSubmitDialog from "../FSSubmitDialog.vue";
|
|
73
|
+
import FSCalendarTwin from "../FSCalendarTwin.vue";
|
|
103
74
|
import FSTextField from "./FSTextField.vue";
|
|
104
|
-
import FSButton from "
|
|
105
|
-
import FSClock from "
|
|
106
|
-
import FSCard from "
|
|
107
|
-
import FSCol from "
|
|
75
|
+
import FSButton from "../FSButton.vue";
|
|
76
|
+
import FSClock from "../FSClock.vue";
|
|
77
|
+
import FSCard from "../FSCard.vue";
|
|
78
|
+
import FSCol from "../FSCol.vue";
|
|
79
|
+
import FSRow from "../FSRow.vue";
|
|
108
80
|
|
|
109
81
|
export default defineComponent({
|
|
110
82
|
name: "FSDateTimeRangeField",
|
|
@@ -115,7 +87,8 @@ export default defineComponent({
|
|
|
115
87
|
FSButton,
|
|
116
88
|
FSClock,
|
|
117
89
|
FSCard,
|
|
118
|
-
FSCol
|
|
90
|
+
FSCol,
|
|
91
|
+
FSRow
|
|
119
92
|
},
|
|
120
93
|
props: {
|
|
121
94
|
label: {
|
|
@@ -162,6 +135,7 @@ export default defineComponent({
|
|
|
162
135
|
emits: ["update:modelValue"],
|
|
163
136
|
setup(props, { emit }) {
|
|
164
137
|
const { getUserOffsetMillis, epochToShortTimeFormat } = useTimeZone();
|
|
138
|
+
const { validateOn, blurred, getMessages } = useRules();
|
|
165
139
|
const { getColors } = useColors();
|
|
166
140
|
|
|
167
141
|
const errors = getColors(ColorEnum.Error);
|
|
@@ -204,35 +178,13 @@ export default defineComponent({
|
|
|
204
178
|
};
|
|
205
179
|
});
|
|
206
180
|
|
|
207
|
-
const
|
|
181
|
+
const toShortTimeFormat = computed((): string => {
|
|
208
182
|
if (!props.modelValue || !Array.isArray(props.modelValue) || !props.modelValue.length) {
|
|
209
183
|
return "";
|
|
210
184
|
}
|
|
211
185
|
return props.modelValue.map((epoch) => epochToShortTimeFormat(epoch)).join(" - ");
|
|
212
186
|
});
|
|
213
187
|
|
|
214
|
-
const messages = computed((): string[] => {
|
|
215
|
-
const messages = [];
|
|
216
|
-
for (const rule of props.rules) {
|
|
217
|
-
if (props.modelValue && Array.isArray(props.modelValue)) {
|
|
218
|
-
for (const value of props.modelValue) {
|
|
219
|
-
const message = rule(value);
|
|
220
|
-
if (typeof(message) === "string") {
|
|
221
|
-
messages.push(message);
|
|
222
|
-
break;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
else {
|
|
227
|
-
const message = rule(null);
|
|
228
|
-
if (typeof(message) === "string") {
|
|
229
|
-
messages.push(message);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
return messages;
|
|
234
|
-
});
|
|
235
|
-
|
|
236
188
|
const innerDateLeft = computed((): number | null => {
|
|
237
189
|
if (innerDateRange.value && Array.isArray(innerDateRange.value) && innerDateRange.value.length) {
|
|
238
190
|
return innerDateRange.value[0];
|
|
@@ -247,6 +199,8 @@ export default defineComponent({
|
|
|
247
199
|
return null;
|
|
248
200
|
});
|
|
249
201
|
|
|
202
|
+
const messages = computed((): string[] => getMessages(props.modelValue, props.rules, true));
|
|
203
|
+
|
|
250
204
|
const onClick = (): void => {
|
|
251
205
|
if (props.editable) {
|
|
252
206
|
dialog.value = true;
|
|
@@ -269,10 +223,12 @@ export default defineComponent({
|
|
|
269
223
|
|
|
270
224
|
return {
|
|
271
225
|
ColorEnum,
|
|
226
|
+
validateOn,
|
|
272
227
|
messages,
|
|
228
|
+
blurred,
|
|
273
229
|
style,
|
|
274
230
|
dialog,
|
|
275
|
-
|
|
231
|
+
toShortTimeFormat,
|
|
276
232
|
innerDateLeft,
|
|
277
233
|
innerTimeLeft,
|
|
278
234
|
innerDateRight,
|
|
@@ -6,43 +6,14 @@
|
|
|
6
6
|
:hideHeader="$props.hideHeader"
|
|
7
7
|
:required="$props.required"
|
|
8
8
|
:editable="$props.editable"
|
|
9
|
-
:
|
|
9
|
+
:rules="$props.rules"
|
|
10
|
+
:messages="messages"
|
|
11
|
+
:validateOn="validateOn"
|
|
12
|
+
:validationValue="$props.modelValue"
|
|
13
|
+
@blur="blurred = true"
|
|
10
14
|
v-model="innerValue"
|
|
11
15
|
v-bind="$attrs"
|
|
12
16
|
>
|
|
13
|
-
<template v-if="!$props.hideHeader" #label>
|
|
14
|
-
<slot name="label">
|
|
15
|
-
<FSRow :wrap="false">
|
|
16
|
-
<FSSpan
|
|
17
|
-
v-if="$props.label"
|
|
18
|
-
class="fs-icon-field-label"
|
|
19
|
-
font="text-overline"
|
|
20
|
-
:style="style"
|
|
21
|
-
>
|
|
22
|
-
{{ $props.label }}
|
|
23
|
-
</FSSpan>
|
|
24
|
-
<FSSpan
|
|
25
|
-
v-if="$props.label && $props.required"
|
|
26
|
-
class="fs-icon-field-label"
|
|
27
|
-
style="margin-left: -8px;"
|
|
28
|
-
font="text-overline"
|
|
29
|
-
:ellipsis="false"
|
|
30
|
-
:style="style"
|
|
31
|
-
>
|
|
32
|
-
*
|
|
33
|
-
</FSSpan>
|
|
34
|
-
<v-spacer style="min-width: 40px;" />
|
|
35
|
-
<FSSpan
|
|
36
|
-
v-if="messages.length > 0"
|
|
37
|
-
class="fs-icon-field-messages"
|
|
38
|
-
font="text-overline"
|
|
39
|
-
:style="style"
|
|
40
|
-
>
|
|
41
|
-
{{ messages.join(", ") }}
|
|
42
|
-
</FSSpan>
|
|
43
|
-
</FSRow>
|
|
44
|
-
</slot>
|
|
45
|
-
</template>
|
|
46
17
|
<template #append-inner>
|
|
47
18
|
<FSIcon
|
|
48
19
|
v-if="$props.modelValue"
|
|
@@ -70,20 +41,20 @@
|
|
|
70
41
|
import { computed, defineComponent, PropType, ref } from "vue";
|
|
71
42
|
|
|
72
43
|
import { Icons, sortByLevenshteinDistance } from "@dative-gpi/foundation-shared-components/utils";
|
|
44
|
+
import { useColors, useRules } from "@dative-gpi/foundation-shared-components/composables";
|
|
73
45
|
import { ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
|
|
74
|
-
import { useColors } from "@dative-gpi/foundation-shared-components/composables";
|
|
75
46
|
import { FSToggle } from "@dative-gpi/foundation-shared-components/models";
|
|
76
47
|
|
|
48
|
+
import FSToggleSet from "../FSToggleSet.vue";
|
|
77
49
|
import FSTextField from "./FSTextField.vue";
|
|
78
|
-
import
|
|
79
|
-
import
|
|
80
|
-
import FSCol from "./FSCol.vue";
|
|
50
|
+
import FSIcon from "../FSIcon.vue";
|
|
51
|
+
import FSCol from "../FSCol.vue";
|
|
81
52
|
|
|
82
53
|
export default defineComponent({
|
|
83
54
|
name: "FSIconField",
|
|
84
55
|
components: {
|
|
85
|
-
FSTextField,
|
|
86
56
|
FSToggleSet,
|
|
57
|
+
FSTextField,
|
|
87
58
|
FSIcon,
|
|
88
59
|
FSCol,
|
|
89
60
|
},
|
|
@@ -151,6 +122,7 @@ export default defineComponent({
|
|
|
151
122
|
},
|
|
152
123
|
emits: ["update:modelValue"],
|
|
153
124
|
setup(props) {
|
|
125
|
+
const {validateOn, blurred, getMessages} = useRules();
|
|
154
126
|
const { getColors } = useColors();
|
|
155
127
|
|
|
156
128
|
const errors = getColors(ColorEnum.Error);
|
|
@@ -171,17 +143,6 @@ export default defineComponent({
|
|
|
171
143
|
};
|
|
172
144
|
});
|
|
173
145
|
|
|
174
|
-
const messages = computed((): string[] => {
|
|
175
|
-
const messages = [];
|
|
176
|
-
for (const rule of props.rules) {
|
|
177
|
-
const message = rule(props.modelValue);
|
|
178
|
-
if (typeof(message) === "string") {
|
|
179
|
-
messages.push(message);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
return messages;
|
|
183
|
-
});
|
|
184
|
-
|
|
185
146
|
const icons = computed((): FSToggle[] => {
|
|
186
147
|
const innerIcons: FSToggle[] = [];
|
|
187
148
|
if (!innerValue.value || innerValue.value.length < 3) {
|
|
@@ -223,9 +184,13 @@ export default defineComponent({
|
|
|
223
184
|
return innerIcons;
|
|
224
185
|
});
|
|
225
186
|
|
|
187
|
+
const messages = computed((): string[] => getMessages(props.modelValue, props.rules));
|
|
188
|
+
|
|
226
189
|
return {
|
|
227
190
|
innerValue,
|
|
191
|
+
validateOn,
|
|
228
192
|
messages,
|
|
193
|
+
blurred,
|
|
229
194
|
style,
|
|
230
195
|
icons
|
|
231
196
|
};
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<FSTextField
|
|
3
3
|
type="number"
|
|
4
|
-
:label="$props.label"
|
|
5
|
-
:description="$props.description"
|
|
6
|
-
:hideHeader="$props.hideHeader"
|
|
7
|
-
:required="$props.required"
|
|
8
4
|
:editable="$props.editable"
|
|
9
5
|
:modelValue="$props.modelValue?.toString()"
|
|
10
6
|
@update:modelValue="(value) => $emit('update:modelValue', isNaN(parseFloat(value)) ? 0 : parseFloat(value))"
|
|
@@ -27,31 +23,11 @@ export default defineComponent({
|
|
|
27
23
|
FSTextField
|
|
28
24
|
},
|
|
29
25
|
props: {
|
|
30
|
-
label: {
|
|
31
|
-
type: String,
|
|
32
|
-
required: false,
|
|
33
|
-
default: null
|
|
34
|
-
},
|
|
35
|
-
description: {
|
|
36
|
-
type: String,
|
|
37
|
-
required: false,
|
|
38
|
-
default: null
|
|
39
|
-
},
|
|
40
26
|
modelValue: {
|
|
41
27
|
type: Number,
|
|
42
28
|
required: false,
|
|
43
29
|
default: null
|
|
44
30
|
},
|
|
45
|
-
hideHeader: {
|
|
46
|
-
type: Boolean,
|
|
47
|
-
required: false,
|
|
48
|
-
default: false
|
|
49
|
-
},
|
|
50
|
-
required: {
|
|
51
|
-
type: Boolean,
|
|
52
|
-
required: false,
|
|
53
|
-
default: false
|
|
54
|
-
},
|
|
55
31
|
editable: {
|
|
56
32
|
type: Boolean,
|
|
57
33
|
required: false,
|
|
@@ -1,29 +1,25 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<FSTextField
|
|
3
|
-
:label="$props.label"
|
|
4
|
-
:description="$props.description"
|
|
5
3
|
:type="type"
|
|
6
|
-
:hideHeader="$props.hideHeader"
|
|
7
|
-
:required="$props.required"
|
|
8
4
|
:editable="$props.editable"
|
|
9
5
|
:modelValue="$props.modelValue"
|
|
10
6
|
@update:modelValue="(value) => $emit('update:modelValue', value)"
|
|
11
7
|
v-bind="$attrs"
|
|
12
8
|
>
|
|
9
|
+
<template v-for="(_, name) in $slots" v-slot:[name]="slotData">
|
|
10
|
+
<slot :name="name" v-bind="slotData" />
|
|
11
|
+
</template>
|
|
13
12
|
<template #append-inner>
|
|
14
13
|
<slot name="append-inner">
|
|
15
14
|
<FSButton
|
|
16
15
|
variant="icon"
|
|
17
|
-
:icon="icon"
|
|
18
16
|
:editable="$props.editable"
|
|
19
17
|
:color="ColorEnum.Dark"
|
|
18
|
+
:icon="icon"
|
|
20
19
|
@click="onToggle"
|
|
21
20
|
/>
|
|
22
21
|
</slot>
|
|
23
22
|
</template>
|
|
24
|
-
<template v-for="(_, name) in $slots" v-slot:[name]="slotData">
|
|
25
|
-
<slot :name="name" v-bind="slotData" />
|
|
26
|
-
</template>
|
|
27
23
|
</FSTextField>
|
|
28
24
|
</template>
|
|
29
25
|
|
|
@@ -34,7 +30,7 @@ import { useColors } from "@dative-gpi/foundation-shared-components/composables"
|
|
|
34
30
|
import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
|
|
35
31
|
|
|
36
32
|
import FSTextField from "./FSTextField.vue";
|
|
37
|
-
import FSButton from "
|
|
33
|
+
import FSButton from "../FSButton.vue";
|
|
38
34
|
|
|
39
35
|
export default defineComponent({
|
|
40
36
|
name: "FSPasswordField",
|
|
@@ -43,31 +39,11 @@ export default defineComponent({
|
|
|
43
39
|
FSButton
|
|
44
40
|
},
|
|
45
41
|
props: {
|
|
46
|
-
label: {
|
|
47
|
-
type: String,
|
|
48
|
-
required: false,
|
|
49
|
-
default: null
|
|
50
|
-
},
|
|
51
|
-
description: {
|
|
52
|
-
type: String,
|
|
53
|
-
required: false,
|
|
54
|
-
default: null
|
|
55
|
-
},
|
|
56
42
|
modelValue: {
|
|
57
43
|
type: String,
|
|
58
44
|
required: false,
|
|
59
45
|
default: null
|
|
60
46
|
},
|
|
61
|
-
hideHeader: {
|
|
62
|
-
type: Boolean,
|
|
63
|
-
required: false,
|
|
64
|
-
default: false
|
|
65
|
-
},
|
|
66
|
-
required: {
|
|
67
|
-
type: Boolean,
|
|
68
|
-
required: false,
|
|
69
|
-
default: false
|
|
70
|
-
},
|
|
71
47
|
editable: {
|
|
72
48
|
type: Boolean,
|
|
73
49
|
required: false,
|
|
@@ -172,9 +172,9 @@ import { getAncestor, getSelectedNode } from "@dative-gpi/foundation-shared-comp
|
|
|
172
172
|
import { ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
|
|
173
173
|
|
|
174
174
|
import FSTextField from "./FSTextField.vue";
|
|
175
|
-
import FSIcon from "
|
|
176
|
-
import FSCol from "
|
|
177
|
-
import FSRow from "
|
|
175
|
+
import FSIcon from "../FSIcon.vue";
|
|
176
|
+
import FSCol from "../FSCol.vue";
|
|
177
|
+
import FSRow from "../FSRow.vue";
|
|
178
178
|
|
|
179
179
|
export default defineComponent({
|
|
180
180
|
name: "FSRichTextField",
|
|
@@ -48,7 +48,7 @@ import { useTranslations as useTranslationsProvider } from "@dative-gpi/bones-ui
|
|
|
48
48
|
import { ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
|
|
49
49
|
|
|
50
50
|
import FSTextField from "./FSTextField.vue";
|
|
51
|
-
import FSButton from "
|
|
51
|
+
import FSButton from "../FSButton.vue";
|
|
52
52
|
|
|
53
53
|
export default defineComponent({
|
|
54
54
|
name: "FSSearchField",
|
|
@@ -36,16 +36,18 @@
|
|
|
36
36
|
menuIcon="mdi-chevron-down"
|
|
37
37
|
clearIcon="mdi-close"
|
|
38
38
|
variant="outlined"
|
|
39
|
+
:style="style"
|
|
39
40
|
:hideDetails="true"
|
|
40
41
|
:items="$props.items"
|
|
41
42
|
:itemTitle="$props.itemTitle"
|
|
42
43
|
:itemValue="$props.itemValue"
|
|
43
44
|
:readonly="!$props.editable"
|
|
44
45
|
:clearable="$props.editable && $props.clearable"
|
|
45
|
-
:
|
|
46
|
-
:
|
|
46
|
+
:rules="$props.rules"
|
|
47
|
+
:validateOn="validateOn"
|
|
47
48
|
:modelValue="$props.modelValue"
|
|
48
49
|
@update:modelValue="(value) => $emit('update:modelValue', value)"
|
|
50
|
+
@blur="blurred = true"
|
|
49
51
|
v-bind="$attrs"
|
|
50
52
|
>
|
|
51
53
|
<template v-for="(_, name) in slots" v-slot:[name]="slotData">
|
|
@@ -68,12 +70,12 @@
|
|
|
68
70
|
<script lang="ts">
|
|
69
71
|
import { computed, defineComponent, PropType } from "vue";
|
|
70
72
|
|
|
71
|
-
import { useColors, useSlots } from "@dative-gpi/foundation-shared-components/composables";
|
|
73
|
+
import { useColors, useRules, useSlots } from "@dative-gpi/foundation-shared-components/composables";
|
|
72
74
|
import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
|
|
73
75
|
|
|
74
|
-
import FSSpan from "
|
|
75
|
-
import FSCol from "
|
|
76
|
-
import FSRow from "
|
|
76
|
+
import FSSpan from "../FSSpan.vue";
|
|
77
|
+
import FSCol from "../FSCol.vue";
|
|
78
|
+
import FSRow from "../FSRow.vue";
|
|
77
79
|
|
|
78
80
|
export default defineComponent({
|
|
79
81
|
name: "FSSelectField",
|
|
@@ -122,16 +124,16 @@ export default defineComponent({
|
|
|
122
124
|
required: false,
|
|
123
125
|
default: false
|
|
124
126
|
},
|
|
125
|
-
clearable: {
|
|
126
|
-
type: Boolean,
|
|
127
|
-
required: false,
|
|
128
|
-
default: true
|
|
129
|
-
},
|
|
130
127
|
rules: {
|
|
131
128
|
type: Array as PropType<Function[]>,
|
|
132
129
|
required: false,
|
|
133
130
|
default: () => []
|
|
134
131
|
},
|
|
132
|
+
messages: {
|
|
133
|
+
type: Array as PropType<string[]>,
|
|
134
|
+
required: false,
|
|
135
|
+
default: null
|
|
136
|
+
},
|
|
135
137
|
editable: {
|
|
136
138
|
type: Boolean,
|
|
137
139
|
required: false,
|
|
@@ -140,6 +142,7 @@ export default defineComponent({
|
|
|
140
142
|
},
|
|
141
143
|
emits: ["update:modelValue"],
|
|
142
144
|
setup(props) {
|
|
145
|
+
const { validateOn, blurred, getMessages } = useRules();
|
|
143
146
|
const { getColors } = useColors();
|
|
144
147
|
const { slots } = useSlots();
|
|
145
148
|
|
|
@@ -169,19 +172,12 @@ export default defineComponent({
|
|
|
169
172
|
};
|
|
170
173
|
});
|
|
171
174
|
|
|
172
|
-
const messages = computed((): string[] =>
|
|
173
|
-
const messages = [];
|
|
174
|
-
for (const rule of props.rules) {
|
|
175
|
-
const message = rule(props.modelValue ?? "");
|
|
176
|
-
if (typeof(message) === "string") {
|
|
177
|
-
messages.push(message);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
return messages;
|
|
181
|
-
});
|
|
175
|
+
const messages = computed((): string[] => props.messages ?? getMessages(props.modelValue, props.rules));
|
|
182
176
|
|
|
183
177
|
return {
|
|
178
|
+
validateOn,
|
|
184
179
|
messages,
|
|
180
|
+
blurred,
|
|
185
181
|
slots,
|
|
186
182
|
style
|
|
187
183
|
};
|
|
@@ -6,44 +6,15 @@
|
|
|
6
6
|
:hideHeader="$props.hideHeader"
|
|
7
7
|
:required="$props.required"
|
|
8
8
|
:editable="$props.editable"
|
|
9
|
-
:
|
|
9
|
+
:rules="$props.rules"
|
|
10
|
+
:messages="messages"
|
|
11
|
+
:validateOn="validateOn"
|
|
12
|
+
:validationValue="$props.modelValue"
|
|
10
13
|
@keydown.enter="onAdd"
|
|
14
|
+
@blur="blurred = true"
|
|
11
15
|
v-model="innerValue"
|
|
12
16
|
v-bind="$attrs"
|
|
13
17
|
>
|
|
14
|
-
<template v-if="!$props.hideHeader" #label>
|
|
15
|
-
<slot name="label">
|
|
16
|
-
<FSRow :wrap="false">
|
|
17
|
-
<FSSpan
|
|
18
|
-
v-if="$props.label"
|
|
19
|
-
class="fs-tag-field-label"
|
|
20
|
-
font="text-overline"
|
|
21
|
-
:style="style"
|
|
22
|
-
>
|
|
23
|
-
{{ $props.label }}
|
|
24
|
-
</FSSpan>
|
|
25
|
-
<FSSpan
|
|
26
|
-
v-if="$props.label && $props.required"
|
|
27
|
-
class="fs-tag-field-label"
|
|
28
|
-
style="margin-left: -8px;"
|
|
29
|
-
font="text-overline"
|
|
30
|
-
:ellipsis="false"
|
|
31
|
-
:style="style"
|
|
32
|
-
>
|
|
33
|
-
*
|
|
34
|
-
</FSSpan>
|
|
35
|
-
<v-spacer style="min-width: 40px;" />
|
|
36
|
-
<FSSpan
|
|
37
|
-
v-if="messages.length > 0"
|
|
38
|
-
class="fs-tag-field-messages"
|
|
39
|
-
font="text-overline"
|
|
40
|
-
:style="style"
|
|
41
|
-
>
|
|
42
|
-
{{ messages.join(", ") }}
|
|
43
|
-
</FSSpan>
|
|
44
|
-
</FSRow>
|
|
45
|
-
</slot>
|
|
46
|
-
</template>
|
|
47
18
|
<template #append-inner>
|
|
48
19
|
<slot name="append-inner">
|
|
49
20
|
<FSButton
|
|
@@ -73,14 +44,14 @@
|
|
|
73
44
|
import { computed, defineComponent, PropType, ref } from "vue";
|
|
74
45
|
|
|
75
46
|
import { ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
|
|
76
|
-
import { useColors } from "@dative-gpi/foundation-shared-components/composables";
|
|
47
|
+
import { useColors, useRules } from "@dative-gpi/foundation-shared-components/composables";
|
|
77
48
|
|
|
78
49
|
import FSTextField from "./FSTextField.vue";
|
|
79
|
-
import FSTagGroup from "
|
|
80
|
-
import FSButton from "
|
|
81
|
-
import FSSpan from "
|
|
82
|
-
import FSCol from "
|
|
83
|
-
import FSRow from "
|
|
50
|
+
import FSTagGroup from "../FSTagGroup.vue";
|
|
51
|
+
import FSButton from "../FSButton.vue";
|
|
52
|
+
import FSSpan from "../FSSpan.vue";
|
|
53
|
+
import FSCol from "../FSCol.vue";
|
|
54
|
+
import FSRow from "../FSRow.vue";
|
|
84
55
|
|
|
85
56
|
export default defineComponent({
|
|
86
57
|
name: "FSTagField",
|
|
@@ -141,6 +112,7 @@ export default defineComponent({
|
|
|
141
112
|
},
|
|
142
113
|
emits: ["update:modelValue"],
|
|
143
114
|
setup(props, { emit }) {
|
|
115
|
+
const {validateOn, blurred, getMessages} = useRules();
|
|
144
116
|
const { getColors } = useColors();
|
|
145
117
|
|
|
146
118
|
const errors = getColors(ColorEnum.Error);
|
|
@@ -161,16 +133,7 @@ export default defineComponent({
|
|
|
161
133
|
};
|
|
162
134
|
});
|
|
163
135
|
|
|
164
|
-
const messages = computed((): string[] =>
|
|
165
|
-
const messages = [];
|
|
166
|
-
for (const rule of props.rules) {
|
|
167
|
-
const message = rule(props.modelValue);
|
|
168
|
-
if (typeof(message) === "string") {
|
|
169
|
-
messages.push(message);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
return messages;
|
|
173
|
-
});
|
|
136
|
+
const messages = computed((): string[] => getMessages(props.modelValue, props.rules));
|
|
174
137
|
|
|
175
138
|
const onAdd = (): void => {
|
|
176
139
|
if (!props.editable) {
|
|
@@ -198,7 +161,9 @@ export default defineComponent({
|
|
|
198
161
|
return {
|
|
199
162
|
ColorEnum,
|
|
200
163
|
innerValue,
|
|
164
|
+
validateOn,
|
|
201
165
|
messages,
|
|
166
|
+
blurred,
|
|
202
167
|
style,
|
|
203
168
|
onAdd,
|
|
204
169
|
onRemove
|