@dative-gpi/foundation-shared-components 0.0.87 → 0.0.89

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 (55) hide show
  1. package/components/FSButton.vue +23 -7
  2. package/components/FSCalendar.vue +3 -1
  3. package/components/FSCalendarTwin.vue +16 -6
  4. package/components/FSCard.vue +9 -3
  5. package/components/FSCheckbox.vue +6 -2
  6. package/components/FSClickable.vue +33 -9
  7. package/components/FSDialog.vue +9 -5
  8. package/components/FSDialogMenu.vue +80 -0
  9. package/components/FSDialogSubmit.vue +0 -1
  10. package/components/FSEditImage.vue +196 -34
  11. package/components/FSImage.vue +21 -7
  12. package/components/FSLink.vue +4 -2
  13. package/components/FSOptionGroup.vue +61 -72
  14. package/components/FSOptionItem.vue +22 -7
  15. package/components/FSRadioGroup.vue +11 -3
  16. package/components/FSToggleSet.vue +22 -60
  17. package/components/FSWindow.vue +2 -0
  18. package/components/autocompletes/FSAutocompleteLanguage.vue +28 -22
  19. package/components/autocompletes/FSAutocompleteTimeZone.vue +117 -17
  20. package/components/buttons/FSButtonFileMini.vue +6 -1
  21. package/components/fields/FSAutocompleteField.vue +139 -72
  22. package/components/fields/FSBaseField.vue +134 -0
  23. package/components/fields/FSColorField.vue +1 -1
  24. package/components/fields/FSDateField.vue +124 -35
  25. package/components/fields/FSDateTimeField.vue +171 -63
  26. package/components/fields/FSIconField.vue +4 -2
  27. package/components/fields/FSNumberField.vue +9 -3
  28. package/components/fields/FSPasswordField.vue +15 -5
  29. package/components/fields/FSRichTextField.vue +34 -18
  30. package/components/fields/FSSearchField.vue +24 -8
  31. package/components/fields/FSSelectField.vue +254 -93
  32. package/components/fields/FSTagField.vue +15 -9
  33. package/components/fields/FSTextArea.vue +31 -59
  34. package/components/fields/FSTextField.vue +22 -70
  35. package/components/fields/FSTimeField.vue +20 -55
  36. package/components/fields/FSTimeSlotField.vue +13 -59
  37. package/components/lists/FSDataIteratorItem.vue +16 -4
  38. package/components/lists/FSDataTableUI.vue +433 -181
  39. package/components/lists/FSDraggable.vue +26 -13
  40. package/components/lists/FSFilterButton.vue +10 -4
  41. package/components/lists/FSHeaderButton.vue +3 -1
  42. package/components/lists/FSHiddenButton.vue +3 -1
  43. package/composables/useAutocomplete.ts +6 -7
  44. package/composables/useSlots.ts +6 -18
  45. package/package.json +4 -4
  46. package/styles/components/fs_base_field.scss +12 -0
  47. package/styles/components/fs_dialog.scss +10 -2
  48. package/styles/components/fs_dialog_menu.scss +11 -0
  49. package/styles/components/fs_draggable.scss +12 -0
  50. package/styles/components/fs_edit_image.scss +29 -2
  51. package/styles/components/fs_text_area.scss +0 -13
  52. package/styles/components/fs_text_field.scss +1 -14
  53. package/styles/components/index.scss +2 -0
  54. package/styles/globals/overrides.scss +4 -0
  55. package/components/autocompletes/FSAutocompleteOrganisation.vue +0 -77
@@ -0,0 +1,134 @@
1
+ <template>
2
+ <FSCol>
3
+ <slot
4
+ v-if="!$props.hideHeader"
5
+ name="label"
6
+ >
7
+ <FSRow
8
+ :wrap="false"
9
+ >
10
+ <FSSpan
11
+ class="fs-base-field-label"
12
+ font="text-overline"
13
+ :style="style"
14
+ >
15
+ {{ $props.label }}
16
+ </FSSpan>
17
+ <FSSpan
18
+ v-if="$props.label && $props.required"
19
+ class="fs-base-field-label"
20
+ style="margin-left: -8px;"
21
+ font="text-overline"
22
+ :ellipsis="false"
23
+ :style="style"
24
+ >
25
+ *
26
+ </FSSpan>
27
+ <v-spacer
28
+ style="min-width: 40px;"
29
+ />
30
+ <FSSpan
31
+ v-if="$props.messages.length > 0"
32
+ class="fs-base-field-messages"
33
+ font="text-overline"
34
+ :style="style"
35
+ >
36
+ {{ $props.messages.join(", ") }}
37
+ </FSSpan>
38
+ </FSRow>
39
+ </slot>
40
+ <slot />
41
+ <slot
42
+ name="description"
43
+ >
44
+ <FSSpan
45
+ v-if="$props.description"
46
+ class="fs-base-field-description"
47
+ font="text-underline"
48
+ :style="style"
49
+ >
50
+ {{ $props.description }}
51
+ </FSSpan>
52
+ </slot>
53
+ </FSCol>
54
+ </template>
55
+
56
+ <script lang="ts">
57
+ import { computed, defineComponent, PropType } from "vue";
58
+
59
+ import { useColors, useSlots } from "@dative-gpi/foundation-shared-components/composables";
60
+ import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
61
+
62
+ import FSSpan from "../FSSpan.vue";
63
+ import FSCol from "../FSCol.vue";
64
+ import FSRow from "../FSRow.vue";
65
+
66
+ export default defineComponent({
67
+ name: "FSBaseField",
68
+ components: {
69
+ FSSpan,
70
+ FSCol,
71
+ FSRow
72
+ },
73
+ props: {
74
+ label: {
75
+ type: String as PropType<string | null>,
76
+ required: false,
77
+ default: null
78
+ },
79
+ description: {
80
+ type: String as PropType<string | null>,
81
+ required: false,
82
+ default: null
83
+ },
84
+ hideHeader: {
85
+ type: Boolean,
86
+ required: false,
87
+ default: false
88
+ },
89
+ required: {
90
+ type: Boolean,
91
+ required: false,
92
+ default: false
93
+ },
94
+ messages: {
95
+ type: Array,
96
+ required: false,
97
+ default: () => []
98
+ },
99
+ editable: {
100
+ type: Boolean,
101
+ required: false,
102
+ default: true
103
+ }
104
+ },
105
+ setup(props) {
106
+ const { getColors } = useColors();
107
+ const { slots } = useSlots();
108
+
109
+ delete slots.label;
110
+ delete slots.description;
111
+
112
+ const errors = getColors(ColorEnum.Error);
113
+ const lights = getColors(ColorEnum.Light);
114
+ const darks = getColors(ColorEnum.Dark);
115
+
116
+ const style = computed((): { [key: string] : string | undefined } => {
117
+ if (!props.editable) {
118
+ return {
119
+ "--fs-base-field-color": lights.dark
120
+ };
121
+ }
122
+ return {
123
+ "--fs-base-field-color" : darks.base,
124
+ "--fs-base-field-error-color": errors.base
125
+ };
126
+ });
127
+
128
+ return {
129
+ style,
130
+ slots
131
+ };
132
+ }
133
+ });
134
+ </script>
@@ -2,7 +2,7 @@
2
2
  <v-menu
3
3
  :closeOnContentClick="false"
4
4
  :modelValue="menu && $props.editable"
5
- @update:modelValue="(value) => menu = value"
5
+ @update:modelValue="menu = $event"
6
6
  >
7
7
  <template
8
8
  #activator="{ props }"
@@ -1,11 +1,7 @@
1
1
  <template>
2
- <v-menu
3
- :closeOnContentClick="false"
4
- :modelValue="menu && $props.editable"
5
- @update:modelValue="(value) => menu = value"
6
- >
2
+ <FSCol>
7
3
  <template
8
- #activator="{ props }"
4
+ v-if="isExtraSmall"
9
5
  >
10
6
  <FSTextField
11
7
  class="fs-date-field"
@@ -22,8 +18,8 @@
22
18
  :validationValue="$props.modelValue"
23
19
  :modelValue="epochToLongDateFormat($props.modelValue)"
24
20
  @update:modelValue="onClear"
21
+ @click="openMobileOverlay"
25
22
  @blur="blurred = true"
26
- v-bind="props"
27
23
  >
28
24
  <template
29
25
  #prepend-inner
@@ -36,6 +32,7 @@
36
32
  icon="mdi-calendar"
37
33
  :editable="$props.editable"
38
34
  :color="ColorEnum.Dark"
35
+ @click="openMobileOverlay"
39
36
  />
40
37
  </slot>
41
38
  </template>
@@ -49,38 +46,116 @@
49
46
  />
50
47
  </template>
51
48
  </FSTextField>
49
+ <FSDialogMenu
50
+ v-model="dialog"
51
+ >
52
+ <template
53
+ #body
54
+ >
55
+ <FSCol
56
+ width="hug"
57
+ >
58
+ <FSCalendar
59
+ :color="$props.color"
60
+ v-model="innerDate"
61
+ />
62
+ <FSButton
63
+ width="100%"
64
+ :color="$props.color"
65
+ :label="$tr('ui.common.validate', 'Validate')"
66
+ @click="onSubmit"
67
+ />
68
+ </FSCol>
69
+ </template>
70
+ </FSDialogMenu>
52
71
  </template>
53
- <FSCard
54
- padding="8px"
55
- width="346px"
56
- :elevation="true"
57
- :border="false"
72
+ <template
73
+ v-else
58
74
  >
59
- <FSCol
60
- width="fill"
75
+ <v-menu
76
+ :closeOnContentClick="false"
77
+ :modelValue="menu && $props.editable"
78
+ @update:modelValue="menu = $event"
61
79
  >
62
- <FSCalendar
63
- :color="$props.color"
64
- v-model="innerDate"
65
- />
66
- <FSButton
67
- width="100%"
68
- :color="$props.color"
69
- :label="$tr('ui.date-menu.validate', 'Validate')"
70
- @click="onSubmit"
71
- />
72
- </FSCol>
73
- </FSCard>
74
- </v-menu>
80
+ <template
81
+ #activator="{ props }"
82
+ >
83
+ <FSTextField
84
+ class="fs-date-field"
85
+ :label="$props.label"
86
+ :description="$props.description"
87
+ :color="$props.color"
88
+ :hideHeader="$props.hideHeader"
89
+ :required="$props.required"
90
+ :editable="$props.editable"
91
+ :readonly="true"
92
+ :rules="$props.rules"
93
+ :messages="messages"
94
+ :validateOn="validateOn"
95
+ :validationValue="$props.modelValue"
96
+ :modelValue="epochToLongDateFormat($props.modelValue)"
97
+ @update:modelValue="onClear"
98
+ @blur="blurred = true"
99
+ v-bind="props"
100
+ >
101
+ <template
102
+ #prepend-inner
103
+ >
104
+ <slot
105
+ name="prepend-inner"
106
+ >
107
+ <FSButton
108
+ variant="icon"
109
+ icon="mdi-calendar"
110
+ :editable="$props.editable"
111
+ :color="ColorEnum.Dark"
112
+ />
113
+ </slot>
114
+ </template>
115
+ <template
116
+ v-for="(_, name) in $slots"
117
+ v-slot:[name]="slotData"
118
+ >
119
+ <slot
120
+ :name="name"
121
+ v-bind="slotData"
122
+ />
123
+ </template>
124
+ </FSTextField>
125
+ </template>
126
+ <FSCard
127
+ padding="8px"
128
+ :elevation="true"
129
+ :border="false"
130
+ >
131
+ <FSCol
132
+ width="hug"
133
+ >
134
+ <FSCalendar
135
+ :color="$props.color"
136
+ v-model="innerDate"
137
+ />
138
+ <FSButton
139
+ width="100%"
140
+ :color="$props.color"
141
+ :label="$tr('ui.common.validate', 'Validate')"
142
+ @click="onSubmit"
143
+ />
144
+ </FSCol>
145
+ </FSCard>
146
+ </v-menu>
147
+ </template>
148
+ </FSCol>
75
149
  </template>
76
150
 
77
151
  <script lang="ts">
78
152
  import { computed, defineComponent, PropType, ref } from "vue";
79
153
 
80
- import { useColors, useRules } from "@dative-gpi/foundation-shared-components/composables";
154
+ import { useBreakpoints, useColors, useRules } from "@dative-gpi/foundation-shared-components/composables";
81
155
  import { ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
82
156
  import { useAppTimeZone } from "@dative-gpi/foundation-shared-services/composables";
83
157
 
158
+ import FSDialogMenu from "../FSDialogMenu.vue";
84
159
  import FSTextField from "./FSTextField.vue";
85
160
  import FSCalendar from "../FSCalendar.vue";
86
161
  import FSButton from "../FSButton.vue";
@@ -90,6 +165,7 @@ import FSCol from "../FSCol.vue";
90
165
  export default defineComponent({
91
166
  name: "FSDateField",
92
167
  components: {
168
+ FSDialogMenu,
93
169
  FSTextField,
94
170
  FSCalendar,
95
171
  FSButton,
@@ -140,17 +216,19 @@ export default defineComponent({
140
216
  },
141
217
  emits: ["update:modelValue"],
142
218
  setup(props, { emit }) {
143
- const {validateOn, blurred, getMessages} = useRules();
219
+ const { validateOn, blurred, getMessages} = useRules();
144
220
  const { epochToLongDateFormat } = useAppTimeZone();
221
+ const { isExtraSmall } = useBreakpoints();
145
222
  const { getColors } = useColors();
146
223
 
224
+ const dialog = ref(false);
225
+ const menu = ref(false);
226
+ const innerDate = ref<number | null>(props.modelValue);
227
+
147
228
  const errors = getColors(ColorEnum.Error);
148
229
  const lights = getColors(ColorEnum.Light);
149
230
  const darks = getColors(ColorEnum.Dark);
150
231
 
151
- const menu = ref(false);
152
- const innerDate = ref<number | null>(props.modelValue);
153
-
154
232
  const style = computed((): { [key: string] : string | undefined } => {
155
233
  if (!props.editable) {
156
234
  return {
@@ -165,6 +243,13 @@ export default defineComponent({
165
243
 
166
244
  const messages = computed((): string[] => getMessages(props.modelValue, props.rules));
167
245
 
246
+ const openMobileOverlay = () => {
247
+ if (!props.editable) {
248
+ return;
249
+ }
250
+ dialog.value = true;
251
+ };
252
+
168
253
  const onClear = (): void => {
169
254
  emit("update:modelValue", null);
170
255
  innerDate.value = null;
@@ -172,20 +257,24 @@ export default defineComponent({
172
257
 
173
258
  const onSubmit = (): void => {
174
259
  emit("update:modelValue", innerDate.value);
260
+ dialog.value = false;
175
261
  menu.value = false;
176
262
  };
177
263
 
178
264
  return {
265
+ isExtraSmall,
266
+ validateOn,
179
267
  ColorEnum,
180
268
  innerDate,
181
- validateOn,
182
269
  messages,
183
270
  blurred,
271
+ dialog,
184
272
  style,
185
273
  menu,
186
- onClear,
274
+ epochToLongDateFormat,
275
+ openMobileOverlay,
187
276
  onSubmit,
188
- epochToLongDateFormat
277
+ onClear
189
278
  };
190
279
  }
191
280
  });