@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.
Files changed (70) hide show
  1. package/components/FSButton.vue +1 -1
  2. package/components/FSCheckbox.vue +3 -3
  3. package/components/FSClock.vue +45 -30
  4. package/components/FSDivider.vue +46 -7
  5. package/components/FSForm.vue +52 -0
  6. package/components/FSImage.vue +41 -32
  7. package/components/FSLabel.vue +105 -0
  8. package/components/FSPagination.vue +25 -9
  9. package/components/FSPermissions.vue +0 -0
  10. package/components/FSRadio.vue +3 -3
  11. package/components/FSSubmitDialog.vue +1 -1
  12. package/components/FSSwitch.vue +3 -3
  13. package/components/FSText.vue +1 -1
  14. package/components/{FSAutocompleteField.vue → fields/FSAutocompleteField.vue} +18 -17
  15. package/components/fields/FSColorField.vue +194 -0
  16. package/components/{FSDateField.vue → fields/FSDateField.vue} +14 -49
  17. package/components/{FSDateRangeField.vue → fields/FSDateRangeField.vue} +18 -64
  18. package/components/{FSDateTimeField.vue → fields/FSDateTimeField.vue} +16 -51
  19. package/components/{FSDateTimeRangeField.vue → fields/FSDateTimeRangeField.vue} +23 -67
  20. package/components/{FSIconField.vue → fields/FSIconField.vue} +15 -50
  21. package/components/{FSNumberField.vue → fields/FSNumberField.vue} +0 -24
  22. package/components/{FSPasswordField.vue → fields/FSPasswordField.vue} +5 -29
  23. package/components/{FSRichTextField.vue → fields/FSRichTextField.vue} +3 -3
  24. package/components/{FSSearchField.vue → fields/FSSearchField.vue} +1 -1
  25. package/components/{FSSelectField.vue → fields/FSSelectField.vue} +17 -21
  26. package/components/{FSTagField.vue → fields/FSTagField.vue} +15 -50
  27. package/components/{FSTextArea.vue → fields/FSTextArea.vue} +24 -24
  28. package/components/{FSTextField.vue → fields/FSTextField.vue} +18 -18
  29. package/components/fields/FSTimeField.vue +104 -0
  30. package/components/fields/FSTimeSlotField.vue +263 -0
  31. package/components/lists/FSDataTableUI.vue +2 -2
  32. package/components/lists/FSFilterButton.vue +1 -1
  33. package/components/tiles/FSDeviceOrganisationTileUI.vue +4 -9
  34. package/components/tiles/FSGroupTileUI.vue +4 -9
  35. package/composables/index.ts +1 -0
  36. package/composables/useBreakpoints.ts +7 -5
  37. package/composables/useRules.ts +72 -0
  38. package/elements/FSFormElement.ts +17 -0
  39. package/icons/flags/France.vue +9 -0
  40. package/icons/flags/Germany.vue +7 -0
  41. package/icons/flags/GreatBritain.vue +9 -0
  42. package/icons/flags/Italy.vue +9 -0
  43. package/icons/flags/Portugal.vue +59 -0
  44. package/icons/flags/Spain.vue +546 -0
  45. package/icons/flags/UnitedStates.vue +12 -0
  46. package/icons/sets.ts +17 -0
  47. package/models/rules.ts +8 -0
  48. package/package.json +4 -4
  49. package/pages/FSExternalIdentityButton.vue +64 -0
  50. package/pages/FSLanguageSetter.vue +140 -0
  51. package/pages/FSLoginPage.vue +253 -0
  52. package/styles/components/fs_clock.scss +4 -0
  53. package/styles/components/fs_color_field.scss +17 -0
  54. package/styles/components/fs_divider.scss +5 -0
  55. package/styles/components/fs_image.scss +12 -1
  56. package/styles/components/fs_label.scss +86 -0
  57. package/styles/components/fs_pagination.scss +3 -3
  58. package/styles/components/fs_time_field.scss +3 -0
  59. package/styles/components/fs_timeslot_field.scss +75 -0
  60. package/styles/components/index.scss +4 -0
  61. package/styles/globals/text_fonts.scss +18 -0
  62. package/styles/main.scss +3 -1
  63. package/styles/pages/fs_language_setter.scss +55 -0
  64. package/styles/pages/index.scss +1 -0
  65. package/utils/color.ts +7 -0
  66. package/utils/css.ts +2 -1
  67. package/utils/index.ts +3 -1
  68. package/utils/time.ts +29 -0
  69. package/components/FSHeaderButton.vue +0 -17
  70. 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
- :modelValue="placeholder"
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 "./FSSubmitDialog.vue";
102
- import FSCalendarTwin from "./FSCalendarTwin.vue";
72
+ import FSSubmitDialog from "../FSSubmitDialog.vue";
73
+ import FSCalendarTwin from "../FSCalendarTwin.vue";
103
74
  import FSTextField from "./FSTextField.vue";
104
- import FSButton from "./FSButton.vue";
105
- import FSClock from "./FSClock.vue";
106
- import FSCard from "./FSCard.vue";
107
- import FSCol from "./FSCol.vue";
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 placeholder = computed((): string => {
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
- placeholder,
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
- :error="messages.length > 0"
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 FSToggleSet from "./FSToggleSet.vue";
79
- import FSIcon from "./FSIcon.vue";
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 "./FSButton.vue";
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 "./FSIcon.vue";
176
- import FSCol from "./FSCol.vue";
177
- import FSRow from "./FSRow.vue";
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 "./FSButton.vue";
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
- :error="messages.length > 0"
46
- :style="style"
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 "./FSSpan.vue";
75
- import FSCol from "./FSCol.vue";
76
- import FSRow from "./FSRow.vue";
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
- :error="messages.length > 0"
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 "./FSTagGroup.vue";
80
- import FSButton from "./FSButton.vue";
81
- import FSSpan from "./FSSpan.vue";
82
- import FSCol from "./FSCol.vue";
83
- import FSRow from "./FSRow.vue";
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