@dative-gpi/foundation-shared-components 0.0.11 → 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 (98) hide show
  1. package/aliases/FSButton.ts +8 -6
  2. package/components/FSBreadcrumbs.vue +3 -1
  3. package/components/FSButton.vue +13 -10
  4. package/components/FSCalendar.vue +4 -3
  5. package/components/FSCalendarTwin.vue +4 -3
  6. package/components/FSCarousel.vue +3 -1
  7. package/components/FSCheckbox.vue +8 -6
  8. package/components/FSChip.vue +5 -3
  9. package/components/FSClock.vue +50 -34
  10. package/components/FSColor.vue +3 -1
  11. package/components/FSColorIcon.vue +3 -1
  12. package/components/FSContainer.vue +4 -2
  13. package/components/FSDivider.vue +49 -8
  14. package/components/FSFadeOut.vue +3 -1
  15. package/components/FSFileButton.vue +4 -3
  16. package/components/FSForm.vue +52 -0
  17. package/components/FSImage.vue +42 -33
  18. package/components/FSLabel.vue +105 -0
  19. package/components/FSLink.vue +95 -0
  20. package/components/FSPagination.vue +96 -0
  21. package/components/FSPermissions.vue +0 -0
  22. package/components/FSRadio.vue +8 -6
  23. package/components/FSRemoveDialog.vue +1 -1
  24. package/components/FSSlideGroup.vue +2 -1
  25. package/components/FSSlider.vue +5 -3
  26. package/components/FSSubmitDialog.vue +2 -2
  27. package/components/FSSwitch.vue +9 -7
  28. package/components/FSTabs.vue +4 -3
  29. package/components/FSTag.vue +4 -2
  30. package/components/FSText.vue +3 -2
  31. package/components/FSWrapGroup.vue +2 -1
  32. package/components/deviceOrganisations/FSConnectivity.vue +2 -1
  33. package/components/deviceOrganisations/FSWorstAlert.vue +2 -1
  34. package/components/{FSAutocompleteField.vue → fields/FSAutocompleteField.vue} +25 -22
  35. package/components/fields/FSColorField.vue +194 -0
  36. package/components/{FSDateField.vue → fields/FSDateField.vue} +18 -52
  37. package/components/{FSDateRangeField.vue → fields/FSDateRangeField.vue} +22 -67
  38. package/components/{FSDateTimeField.vue → fields/FSDateTimeField.vue} +20 -54
  39. package/components/{FSDateTimeRangeField.vue → fields/FSDateTimeRangeField.vue} +27 -70
  40. package/components/{FSIconField.vue → fields/FSIconField.vue} +20 -53
  41. package/components/{FSNumberField.vue → fields/FSNumberField.vue} +0 -24
  42. package/components/{FSPasswordField.vue → fields/FSPasswordField.vue} +9 -31
  43. package/components/{FSRichTextField.vue → fields/FSRichTextField.vue} +10 -9
  44. package/components/{FSSearchField.vue → fields/FSSearchField.vue} +47 -14
  45. package/components/{FSSelectField.vue → fields/FSSelectField.vue} +22 -24
  46. package/components/{FSTagField.vue → fields/FSTagField.vue} +19 -53
  47. package/components/{FSTextArea.vue → fields/FSTextArea.vue} +28 -27
  48. package/components/{FSTextField.vue → fields/FSTextField.vue} +23 -21
  49. package/components/fields/FSTimeField.vue +104 -0
  50. package/components/fields/FSTimeSlotField.vue +263 -0
  51. package/components/lists/FSDataTableUI.vue +7 -6
  52. package/components/lists/FSFilterButton.vue +25 -17
  53. package/components/lists/FSHiddenButton.vue +1 -0
  54. package/components/lists/FSLoadDataTable.vue +88 -0
  55. package/components/tiles/FSDeviceOrganisationTileUI.vue +5 -10
  56. package/components/tiles/FSGroupTileUI.vue +5 -10
  57. package/components/{FSLoadTile.vue → tiles/FSLoadTile.vue} +9 -7
  58. package/components/{FSTile.vue → tiles/FSTile.vue} +5 -4
  59. package/composables/index.ts +2 -0
  60. package/composables/useBreakpoints.ts +7 -5
  61. package/composables/useDebounce.ts +22 -0
  62. package/composables/useRules.ts +72 -0
  63. package/elements/FSFormElement.ts +17 -0
  64. package/icons/flags/France.vue +9 -0
  65. package/icons/flags/Germany.vue +7 -0
  66. package/icons/flags/GreatBritain.vue +9 -0
  67. package/icons/flags/Italy.vue +9 -0
  68. package/icons/flags/Portugal.vue +59 -0
  69. package/icons/flags/Spain.vue +546 -0
  70. package/icons/flags/UnitedStates.vue +12 -0
  71. package/icons/sets.ts +17 -0
  72. package/models/rules.ts +10 -1
  73. package/package.json +6 -4
  74. package/pages/FSExternalIdentityButton.vue +64 -0
  75. package/pages/FSLanguageSetter.vue +140 -0
  76. package/pages/FSLoginPage.vue +253 -0
  77. package/styles/components/fs_clock.scss +4 -0
  78. package/styles/components/fs_color_field.scss +17 -0
  79. package/styles/components/fs_divider.scss +5 -0
  80. package/styles/components/fs_image.scss +12 -1
  81. package/styles/components/fs_label.scss +86 -0
  82. package/styles/components/fs_link.scss +6 -0
  83. package/styles/components/fs_load_data_table.scss +77 -0
  84. package/styles/components/fs_pagination.scss +11 -0
  85. package/styles/components/fs_time_field.scss +3 -0
  86. package/styles/components/fs_timeslot_field.scss +75 -0
  87. package/styles/components/index.scss +7 -0
  88. package/styles/globals/text_fonts.scss +18 -0
  89. package/styles/main.scss +3 -1
  90. package/styles/pages/fs_language_setter.scss +55 -0
  91. package/styles/pages/index.scss +1 -0
  92. package/utils/color.ts +7 -0
  93. package/utils/css.ts +2 -1
  94. package/utils/index.ts +3 -1
  95. package/utils/time.ts +29 -0
  96. package/components/FSHeaderButton.vue +0 -17
  97. package/components/lists/FSDataIteratorGroup.vue +0 -7
  98. package/index.ts +0 -6
@@ -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,10 +112,12 @@ export default defineComponent({
141
112
  },
142
113
  emits: ["update:modelValue"],
143
114
  setup(props, { emit }) {
115
+ const {validateOn, blurred, getMessages} = useRules();
116
+ const { getColors } = useColors();
144
117
 
145
- const errors = useColors().getColors(ColorEnum.Error);
146
- const lights = useColors().getColors(ColorEnum.Light);
147
- const darks = useColors().getColors(ColorEnum.Dark);
118
+ const errors = getColors(ColorEnum.Error);
119
+ const lights = getColors(ColorEnum.Light);
120
+ const darks = getColors(ColorEnum.Dark);
148
121
 
149
122
  const innerValue = ref("");
150
123
 
@@ -160,16 +133,7 @@ export default defineComponent({
160
133
  };
161
134
  });
162
135
 
163
- const messages = computed((): string[] => {
164
- const messages = [];
165
- for (const rule of props.rules) {
166
- const message = rule(props.modelValue);
167
- if (typeof(message) === "string") {
168
- messages.push(message);
169
- }
170
- }
171
- return messages;
172
- });
136
+ const messages = computed((): string[] => getMessages(props.modelValue, props.rules));
173
137
 
174
138
  const onAdd = (): void => {
175
139
  if (!props.editable) {
@@ -197,7 +161,9 @@ export default defineComponent({
197
161
  return {
198
162
  ColorEnum,
199
163
  innerValue,
164
+ validateOn,
200
165
  messages,
166
+ blurred,
201
167
  style,
202
168
  onAdd,
203
169
  onRemove
@@ -36,17 +36,19 @@
36
36
  <v-textarea
37
37
  clearIcon="mdi-close"
38
38
  variant="outlined"
39
- hide-details
40
39
  :style="style"
41
40
  :class="classes"
42
41
  :rows="$props.rows"
43
- :rules="$props.rules"
42
+ :hideDetails="true"
44
43
  :noResize="!$props.resize"
45
44
  :autoGrow="$props.autoGrow"
46
45
  :readonly="!$props.editable"
47
- :clearable="$props.editable"
46
+ :clearable="$props.editable && !!$props.modelValue"
47
+ :rules="$props.rules"
48
+ :validateOn="validateOn"
48
49
  :modelValue="$props.modelValue"
49
50
  @update:modelValue="(value) => $emit('update:modelValue', value)"
51
+ @blur="blurred = true"
50
52
  v-bind="$attrs"
51
53
  >
52
54
  <template v-for="(_, name) in $slots" v-slot:[name]="slotData">
@@ -69,12 +71,12 @@
69
71
  <script lang="ts">
70
72
  import { computed, defineComponent, PropType } from "vue";
71
73
 
72
- import { useColors, useBreakpoints } from "@dative-gpi/foundation-shared-components/composables";
74
+ import { useColors, useBreakpoints, useRules } from "@dative-gpi/foundation-shared-components/composables";
73
75
  import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
74
76
 
75
- import FSSpan from "./FSSpan.vue";
76
- import FSCol from "./FSCol.vue";
77
- import FSRow from "./FSRow.vue";
77
+ import FSSpan from "../FSSpan.vue";
78
+ import FSCol from "../FSCol.vue";
79
+ import FSRow from "../FSRow.vue";
78
80
 
79
81
  export default defineComponent({
80
82
  name: "FSTextArea",
@@ -83,7 +85,6 @@ export default defineComponent({
83
85
  FSCol,
84
86
  FSRow
85
87
  },
86
- inheritAttrs: false,
87
88
  props: {
88
89
  label: {
89
90
  type: String,
@@ -100,11 +101,6 @@ export default defineComponent({
100
101
  required: false,
101
102
  default: null
102
103
  },
103
- required: {
104
- type: Boolean,
105
- required: false,
106
- default: false
107
- },
108
104
  rows: {
109
105
  type: Number,
110
106
  required: false,
@@ -125,11 +121,21 @@ export default defineComponent({
125
121
  required: false,
126
122
  default: false
127
123
  },
124
+ required: {
125
+ type: Boolean,
126
+ required: false,
127
+ default: false
128
+ },
128
129
  rules: {
129
130
  type: Array as PropType<Function[]>,
130
131
  required: false,
131
132
  default: () => []
132
133
  },
134
+ messages: {
135
+ type: Array as PropType<string[]>,
136
+ required: false,
137
+ default: null
138
+ },
133
139
  editable: {
134
140
  type: Boolean,
135
141
  required: false,
@@ -138,11 +144,13 @@ export default defineComponent({
138
144
  },
139
145
  emits: ["update:modelValue"],
140
146
  setup(props) {
147
+ const { validateOn, blurred, getMessages } = useRules();
141
148
  const { isMobileSized } = useBreakpoints();
149
+ const { getColors } = useColors();
142
150
 
143
- const errors = useColors().getColors(ColorEnum.Error);
144
- const lights = useColors().getColors(ColorEnum.Light);
145
- const darks = useColors().getColors(ColorEnum.Dark);
151
+ const errors = getColors(ColorEnum.Error);
152
+ const lights = getColors(ColorEnum.Light);
153
+ const darks = getColors(ColorEnum.Dark);
146
154
 
147
155
  const style = computed((): {[code: string]: string} & Partial<CSSStyleDeclaration> => {
148
156
  let height: string | undefined = undefined;
@@ -180,17 +188,6 @@ export default defineComponent({
180
188
  };
181
189
  });
182
190
 
183
- const messages = computed(() => {
184
- const messages = [];
185
- for (const rule of props.rules) {
186
- const message = rule(props.modelValue);
187
- if (typeof(message) === "string") {
188
- messages.push(message);
189
- }
190
- }
191
- return messages;
192
- });
193
-
194
191
  const classes = computed((): string[] => {
195
192
  const classNames = ["fs-text-area"];
196
193
  if (props.autoGrow) {
@@ -199,8 +196,12 @@ export default defineComponent({
199
196
  return classNames;
200
197
  });
201
198
 
199
+ const messages = computed((): string[] => props.messages ?? getMessages(props.modelValue, props.rules));
200
+
202
201
  return {
202
+ validateOn,
203
203
  messages,
204
+ blurred,
204
205
  style,
205
206
  classes
206
207
  };
@@ -35,14 +35,16 @@
35
35
  class="fs-text-field"
36
36
  clearIcon="mdi-close"
37
37
  variant="outlined"
38
- hide-details
39
38
  :style="style"
40
39
  :type="$props.type"
41
- :rules="$props.rules"
40
+ :hideDetails="true"
42
41
  :readonly="!$props.editable"
43
- :clearable="$props.editable"
42
+ :clearable="$props.editable && !!$props.modelValue"
43
+ :rules="$props.rules"
44
+ :validateOn="validateOn"
44
45
  :modelValue="$props.modelValue"
45
46
  @update:modelValue="(value) => $emit('update:modelValue', value)"
47
+ @blur="blurred = true"
46
48
  v-bind="$attrs"
47
49
  >
48
50
  <template v-for="(_, name) in slots" v-slot:[name]="slotData">
@@ -65,12 +67,12 @@
65
67
  <script lang="ts">
66
68
  import { computed, defineComponent, PropType } from "vue";
67
69
 
68
- import { useColors, useSlots } from "@dative-gpi/foundation-shared-components/composables";
70
+ import { useColors, useRules, useSlots } from "@dative-gpi/foundation-shared-components/composables";
69
71
  import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
70
72
 
71
- import FSSpan from "./FSSpan.vue";
72
- import FSCol from "./FSCol.vue";
73
- import FSRow from "./FSRow.vue";
73
+ import FSSpan from "../FSSpan.vue";
74
+ import FSCol from "../FSCol.vue";
75
+ import FSRow from "../FSRow.vue";
74
76
 
75
77
  export default defineComponent({
76
78
  name: "FSTextField",
@@ -79,7 +81,6 @@ export default defineComponent({
79
81
  FSCol,
80
82
  FSRow
81
83
  },
82
- inheritAttrs: false,
83
84
  props: {
84
85
  label: {
85
86
  type: String,
@@ -116,6 +117,11 @@ export default defineComponent({
116
117
  required: false,
117
118
  default: () => []
118
119
  },
120
+ messages: {
121
+ type: Array as PropType<string[]>,
122
+ required: false,
123
+ default: null
124
+ },
119
125
  editable: {
120
126
  type: Boolean,
121
127
  required: false,
@@ -124,13 +130,16 @@ export default defineComponent({
124
130
  },
125
131
  emits: ["update:modelValue"],
126
132
  setup(props) {
133
+ const { validateOn, blurred, getMessages } = useRules();
134
+ const { getColors } = useColors();
127
135
  const { slots } = useSlots();
136
+
128
137
  delete slots.label;
129
138
  delete slots.description;
130
139
 
131
- const errors = useColors().getColors(ColorEnum.Error);
132
- const lights = useColors().getColors(ColorEnum.Light);
133
- const darks = useColors().getColors(ColorEnum.Dark);
140
+ const errors = getColors(ColorEnum.Error);
141
+ const lights = getColors(ColorEnum.Light);
142
+ const darks = getColors(ColorEnum.Dark);
134
143
 
135
144
  const style = computed((): {[code: string]: string} & Partial<CSSStyleDeclaration> => {
136
145
  if (!props.editable) {
@@ -151,19 +160,12 @@ export default defineComponent({
151
160
  };
152
161
  });
153
162
 
154
- const messages = computed((): string[] => {
155
- const messages = [];
156
- for (const rule of props.rules) {
157
- const message = rule(props.modelValue ?? "");
158
- if (typeof(message) === "string") {
159
- messages.push(message);
160
- }
161
- }
162
- return messages;
163
- });
163
+ const messages = computed((): string[] => props.messages ?? getMessages(props.modelValue, props.rules));
164
164
 
165
165
  return {
166
+ validateOn,
166
167
  messages,
168
+ blurred,
167
169
  slots,
168
170
  style
169
171
  };
@@ -0,0 +1,104 @@
1
+ <template>
2
+ <FSNumberField
3
+ class="fs-time-field"
4
+ :editable="$props.editable"
5
+ :modelValue="innerTime"
6
+ @update:modelValue="onSubmitValue"
7
+ v-bind="$attrs"
8
+ >
9
+ <template #append>
10
+ <FSSelectField
11
+ class="fs-time-field-select"
12
+ :editable="$props.editable"
13
+ :hideHeader="true"
14
+ :clearable="false"
15
+ :items="timeScale"
16
+ :modelValue="selectedUnit.id"
17
+ @update:modelValue="onSubmitTimeScale"
18
+ />
19
+ </template>
20
+ </FSNumberField>
21
+ </template>
22
+
23
+ <script lang="ts">
24
+ import { computed, defineComponent, ref } from "vue";
25
+
26
+ import { getTimeScaleIndex, timeScale } from "@dative-gpi/foundation-shared-components/utils";
27
+ import { useColors } from "@dative-gpi/foundation-shared-components/composables";
28
+ import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
29
+
30
+ import FSNumberField from "./FSNumberField.vue";
31
+ import FSSelectField from "./FSSelectField.vue";
32
+
33
+ export default defineComponent({
34
+ name: "FSTimeField",
35
+ components: {
36
+ FSNumberField,
37
+ FSSelectField
38
+ },
39
+ props: {
40
+ modelValue: {
41
+ type: Number,
42
+ required: false,
43
+ default: null
44
+ },
45
+ editable: {
46
+ type: Boolean,
47
+ required: false,
48
+ default: true
49
+ }
50
+ },
51
+ emits: ["update:modelValue"],
52
+ setup(props, { emit }) {
53
+ const innerTime = ref(props.modelValue);
54
+ const selectedUnit = ref(timeScale[0]);
55
+
56
+ if (getTimeScaleIndex(props.modelValue) !== 0) {
57
+ selectedUnit.value = timeScale[getTimeScaleIndex(props.modelValue)];
58
+ innerTime.value = props.modelValue / selectedUnit.value.id;
59
+ }
60
+
61
+ const errors = useColors().getColors(ColorEnum.Error);
62
+ const lights = useColors().getColors(ColorEnum.Light);
63
+ const darks = useColors().getColors(ColorEnum.Dark);
64
+
65
+ const style = computed((): {[code: string]: string} & Partial<CSSStyleDeclaration> => {
66
+ if (!props.editable) {
67
+ return {
68
+ "--fs-time-field-cursor" : "default",
69
+ "--fs-time-field-border-color" : lights.base,
70
+ "--fs-time-field-color" : lights.dark,
71
+ "--fs-time-field-active-border-color": lights.base
72
+ };
73
+ }
74
+ return {
75
+ "--fs-time-field-cursor" : "text",
76
+ "--fs-time-field-border-color" : lights.dark,
77
+ "--fs-time-field-color" : darks.base,
78
+ "--fs-time-field-active-border-color": darks.dark,
79
+ "--fs-time-field-error-color" : errors.base,
80
+ "--fs-time-field-error-border-color" : errors.base
81
+ };
82
+ });
83
+
84
+ const onSubmitValue = (value: number): void => {
85
+ innerTime.value = value;
86
+ emit("update:modelValue", innerTime.value * selectedUnit.value.id);
87
+ };
88
+
89
+ const onSubmitTimeScale = (value: number): void => {
90
+ selectedUnit.value = timeScale.find((item) => item.id === value);
91
+ emit("update:modelValue", innerTime.value * selectedUnit.value.id);
92
+ };
93
+
94
+ return {
95
+ style,
96
+ innerTime,
97
+ selectedUnit,
98
+ timeScale,
99
+ onSubmitValue,
100
+ onSubmitTimeScale,
101
+ };
102
+ }
103
+ });
104
+ </script>