@dative-gpi/foundation-shared-components 0.0.229 → 0.1.68

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 (228) hide show
  1. package/components/FSAccordionPanel.vue +8 -10
  2. package/components/FSBadge.vue +2 -4
  3. package/components/FSBreadcrumbs.vue +9 -10
  4. package/components/FSButton.vue +81 -31
  5. package/components/FSCalendar.vue +35 -33
  6. package/components/FSCalendarTwin.vue +77 -84
  7. package/components/FSCard.vue +29 -16
  8. package/components/FSCardPlaceholder.vue +1 -2
  9. package/components/FSCheckbox.vue +5 -7
  10. package/components/FSChip.vue +9 -11
  11. package/components/FSClickable.vue +67 -57
  12. package/components/FSClock.vue +4 -4
  13. package/components/FSCol.vue +2 -3
  14. package/components/FSColor.vue +13 -31
  15. package/components/FSColorIcon.vue +25 -9
  16. package/components/FSDialog.vue +1 -2
  17. package/components/FSDialogFormBody.vue +4 -4
  18. package/components/FSDialogMenu.vue +2 -4
  19. package/components/FSDialogMultiFormBody.vue +63 -50
  20. package/components/FSDialogRemove.vue +1 -0
  21. package/components/FSDialogSubmit.vue +5 -7
  22. package/components/FSDivider.vue +7 -9
  23. package/components/FSEditImage.vue +27 -274
  24. package/components/FSEditImageUI.vue +303 -0
  25. package/components/FSErrorToast.vue +3 -4
  26. package/components/FSFadeOut.vue +18 -13
  27. package/components/FSGrid.vue +6 -9
  28. package/components/FSGridMosaic.vue +1 -2
  29. package/components/FSIcon.vue +7 -8
  30. package/components/FSIconCard.vue +23 -30
  31. package/components/FSIconCheck.vue +1 -2
  32. package/components/FSImage.vue +21 -193
  33. package/components/FSImageCard.vue +2 -2
  34. package/components/FSImageUI.vue +212 -0
  35. package/components/FSLabel.vue +18 -20
  36. package/components/FSLink.vue +19 -21
  37. package/components/FSLoader.vue +10 -14
  38. package/components/FSOptionGroup.vue +58 -12
  39. package/components/FSPagination.vue +3 -5
  40. package/components/FSRadio.vue +5 -7
  41. package/components/FSRadioGroup.vue +2 -4
  42. package/components/FSRow.vue +3 -4
  43. package/components/FSSlideGroup.vue +15 -4
  44. package/components/FSSlider.vue +9 -11
  45. package/components/FSSpan.vue +11 -9
  46. package/components/FSSwitch.vue +65 -37
  47. package/components/FSTab.vue +2 -4
  48. package/components/FSTabs.vue +36 -16
  49. package/components/FSTag.vue +23 -14
  50. package/components/FSTagGroup.vue +3 -5
  51. package/components/FSText.vue +8 -12
  52. package/components/FSWindow.vue +11 -5
  53. package/components/FSWrapGroup.vue +15 -4
  54. package/components/agenda/FSAgenda.vue +204 -0
  55. package/components/agenda/FSAgendaDialogCalendar.vue +76 -0
  56. package/components/agenda/FSAgendaHeader.vue +190 -0
  57. package/components/agenda/FSAgendaHorizontalEvent.vue +162 -0
  58. package/components/agenda/FSAgendaHorizontalTimeLineMarker.vue +46 -0
  59. package/components/agenda/FSAgendaHoursCol.vue +103 -0
  60. package/components/agenda/FSAgendaHoursRow.vue +124 -0
  61. package/components/agenda/FSAgendaVerticalEvent.vue +160 -0
  62. package/components/agenda/FSAgendaVerticalTimeLineMarker.vue +46 -0
  63. package/components/agenda/FSDayAgenda.vue +200 -0
  64. package/components/agenda/FSMonthAgenda.vue +257 -0
  65. package/components/agenda/FSSelectAgendaMode.vue +54 -0
  66. package/components/agenda/FSWeekAgenda.vue +328 -0
  67. package/components/autocompletes/FSAutocompleteLanguage.vue +18 -39
  68. package/components/autocompletes/FSAutocompleteTimeZone.vue +20 -38
  69. package/components/buttons/FSButtonCancelMini.vue +1 -0
  70. package/components/buttons/FSButtonCopy.vue +28 -0
  71. package/components/buttons/FSButtonCopyIcon.vue +28 -0
  72. package/components/buttons/FSButtonCopyLabel.vue +27 -0
  73. package/components/buttons/FSButtonCopyMini.vue +28 -0
  74. package/components/buttons/FSButtonDragIcon.vue +27 -0
  75. package/components/buttons/FSButtonDuplicateMini.vue +1 -0
  76. package/components/buttons/FSButtonEditMini.vue +1 -0
  77. package/components/buttons/FSButtonFileMini.vue +1 -0
  78. package/components/buttons/FSButtonNextMini.vue +1 -0
  79. package/components/buttons/FSButtonPreviousMini.vue +1 -0
  80. package/components/buttons/FSButtonRedoMini.vue +1 -0
  81. package/components/buttons/FSButtonRemoveMini.vue +1 -0
  82. package/components/buttons/FSButtonSaveMini.vue +1 -0
  83. package/components/buttons/FSButtonSearchMini.vue +1 -0
  84. package/components/buttons/FSButtonUndoMini.vue +1 -0
  85. package/components/buttons/FSButtonUpdateMini.vue +1 -0
  86. package/components/buttons/FSButtonValidateMini.vue +1 -0
  87. package/components/deviceOrganisations/FSConnectivity.vue +11 -1
  88. package/components/deviceOrganisations/FSConnectivityCard.vue +20 -49
  89. package/components/deviceOrganisations/FSStatus.vue +11 -1
  90. package/components/deviceOrganisations/FSStatusCard.vue +40 -60
  91. package/components/deviceOrganisations/FSStatusesCarousel.vue +1 -0
  92. package/components/deviceOrganisations/FSStatusesRow.vue +10 -5
  93. package/components/deviceOrganisations/FSWorstAlert.vue +19 -13
  94. package/components/deviceOrganisations/FSWorstAlertCard.vue +36 -47
  95. package/components/fields/FSAutocompleteField.vue +501 -323
  96. package/components/fields/FSAutocompleteTag.vue +100 -0
  97. package/components/fields/FSBaseField.vue +26 -16
  98. package/components/fields/FSColorField.vue +63 -55
  99. package/components/fields/FSCommentField.vue +93 -0
  100. package/components/fields/FSDateField.vue +2 -2
  101. package/components/fields/FSDateRangeField.vue +2 -2
  102. package/components/fields/FSDateTimeField.vue +4 -3
  103. package/components/fields/FSDateTimeRangeField.vue +7 -6
  104. package/components/fields/FSEntityFieldUI.vue +271 -0
  105. package/components/fields/FSGradientField.vue +27 -33
  106. package/components/fields/FSIconField.vue +2 -3
  107. package/components/fields/FSMagicConfigField.vue +28 -19
  108. package/components/fields/FSMagicField.vue +25 -17
  109. package/components/fields/FSNumberField.vue +9 -7
  110. package/components/fields/FSPasswordField.vue +2 -3
  111. package/components/fields/FSRichTextField.vue +32 -5
  112. package/components/fields/FSSearchField.vue +2 -2
  113. package/components/fields/FSSelectField.vue +483 -251
  114. package/components/fields/FSTagField.vue +4 -6
  115. package/components/fields/FSTermField.vue +25 -13
  116. package/components/fields/FSTextArea.vue +18 -6
  117. package/components/fields/FSTextField.vue +13 -10
  118. package/components/fields/FSTimeField.vue +1 -1
  119. package/components/fields/FSTimeSlotField.vue +3 -4
  120. package/components/fields/FSTimeStepField.vue +157 -0
  121. package/components/fields/FSTranslateField.vue +3 -2
  122. package/components/fields/FSTranslateRichTextField.vue +4 -3
  123. package/components/fields/FSTranslateTextArea.vue +233 -0
  124. package/components/fields/FSTreeViewField.vue +7 -9
  125. package/components/fields/periodicField/FSPeriodicDailyField.vue +120 -0
  126. package/components/fields/periodicField/FSPeriodicField.vue +131 -0
  127. package/components/fields/periodicField/FSPeriodicMonthlyField.vue +222 -0
  128. package/components/fields/periodicField/FSPeriodicWeeklyField.vue +120 -0
  129. package/components/fields/periodicField/FSPeriodicYearlyField.vue +144 -0
  130. package/components/lists/FSDataIteratorItem.vue +8 -10
  131. package/components/lists/FSDataTableUI.vue +47 -39
  132. package/components/lists/FSFilterButton.vue +20 -22
  133. package/components/lists/FSHiddenButton.vue +10 -12
  134. package/components/lists/FSLoadDataTable.vue +4 -6
  135. package/components/lists/FSSimpleList.vue +229 -0
  136. package/components/map/FSMap.vue +256 -405
  137. package/components/map/FSMapFeatureGroup.vue +51 -0
  138. package/components/map/FSMapLayerButton.vue +6 -3
  139. package/components/map/FSMapMarker.vue +116 -0
  140. package/components/map/FSMapMarkerClusterGroup.vue +72 -0
  141. package/components/map/FSMapOverlay.vue +69 -83
  142. package/components/map/FSMapPolygon.vue +81 -0
  143. package/components/map/FSMapTileLayer.vue +50 -0
  144. package/components/map/keys.ts +4 -0
  145. package/components/selects/FSSelectAutoRefresh.vue +1 -1
  146. package/components/selects/FSSelectDashboardVariableType.vue +1 -1
  147. package/components/selects/FSSelectDateSetting.vue +3 -3
  148. package/components/selects/FSSelectDays.vue +1 -1
  149. package/components/selects/FSSelectListMode.vue +51 -0
  150. package/components/selects/FSSelectMonths.vue +67 -0
  151. package/components/tiles/FSChartTileUI.vue +116 -0
  152. package/components/tiles/FSCommentTileUI.vue +149 -0
  153. package/components/tiles/FSDashboardOrganisationTileUI.vue +6 -8
  154. package/components/tiles/FSDashboardOrganisationTypeTileUI.vue +6 -8
  155. package/components/tiles/FSDashboardShallowTileUI.vue +6 -8
  156. package/components/tiles/FSDeviceOrganisationTileUI.vue +30 -18
  157. package/components/tiles/FSFolderTileUI.vue +6 -6
  158. package/components/tiles/FSGroupTileUI.vue +31 -22
  159. package/components/tiles/FSLoadTile.vue +5 -7
  160. package/components/tiles/FSLocationTileUI.vue +157 -0
  161. package/components/tiles/FSModelTileUI.vue +18 -0
  162. package/components/tiles/FSServiceAccountOrganisationTileUI.vue +142 -0
  163. package/components/tiles/FSSimpleTileUI.vue +57 -36
  164. package/components/tiles/FSTile.vue +115 -55
  165. package/components/tiles/FSUserOrganisationTileUI.vue +25 -35
  166. package/components/toggleSets/FSToggleSetPosition.vue +1 -1
  167. package/components/views/FSEntityHeader.vue +343 -0
  168. package/components/views/FSEntityView.vue +163 -0
  169. package/components/views/FSListHeader.vue +83 -0
  170. package/components/views/FSListView.vue +83 -0
  171. package/components/views/FSSkeletonView.vue +100 -0
  172. package/composables/useAddress.ts +2 -2
  173. package/composables/useColors.ts +15 -5
  174. package/composables/useMagicFieldProvider.ts +7 -6
  175. package/composables/useSlots.ts +51 -28
  176. package/models/agenda.ts +9 -0
  177. package/models/deviceAlerts.ts +1 -1
  178. package/models/deviceConnectivities.ts +1 -1
  179. package/models/index.ts +1 -0
  180. package/models/magicFields.ts +1 -0
  181. package/models/map.ts +2 -2
  182. package/models/rules.ts +10 -5
  183. package/models/tables.ts +3 -1
  184. package/package.json +4 -4
  185. package/styles/components/fs_agenda.scss +32 -0
  186. package/styles/components/fs_agenda_event.scss +41 -0
  187. package/styles/components/fs_agenda_hours_col.scss +4 -0
  188. package/styles/components/fs_agenda_hours_row.scss +13 -0
  189. package/styles/components/fs_agenda_time_line_marker.scss +19 -0
  190. package/styles/components/fs_card.scss +0 -1
  191. package/styles/components/fs_clickable.scss +5 -3
  192. package/styles/components/fs_color_field.scss +1 -0
  193. package/styles/components/fs_data_table.scss +2 -0
  194. package/styles/components/fs_dialog.scss +11 -15
  195. package/styles/components/fs_edit_image.scss +8 -0
  196. package/styles/components/fs_fade_out.scss +2 -1
  197. package/styles/components/fs_filter_button.scss +1 -6
  198. package/styles/components/fs_gradient_field.scss +11 -11
  199. package/styles/components/fs_magic_config_field.scss +2 -2
  200. package/styles/components/fs_map.scss +36 -30
  201. package/styles/components/fs_option_group.scss +15 -5
  202. package/styles/components/fs_radio.scss +11 -0
  203. package/styles/components/fs_rich_text_field.scss +2 -1
  204. package/styles/components/fs_search_field.scss +3 -0
  205. package/styles/components/fs_select_date_settings.scss +3 -0
  206. package/styles/components/fs_slide_group.scss +5 -0
  207. package/styles/components/fs_span.scss +2 -1
  208. package/styles/components/fs_switch.scss +1 -0
  209. package/styles/components/fs_tabs.scss +9 -0
  210. package/styles/components/fs_text_area.scss +15 -1
  211. package/styles/components/fs_tile.scss +22 -6
  212. package/styles/components/fs_window.scss +5 -0
  213. package/styles/components/fs_wrap_group.scss +4 -0
  214. package/styles/components/index.scss +6 -1
  215. package/styles/globals/overrides.scss +22 -19
  216. package/styles/globals/text_fonts.scss +17 -55
  217. package/tools/alertsTools.ts +54 -0
  218. package/tools/chartsTools.ts +300 -0
  219. package/tools/index.ts +2 -0
  220. package/utils/badge.ts +9 -0
  221. package/utils/filter.ts +18 -0
  222. package/utils/index.ts +2 -0
  223. package/utils/leafletMarkers.ts +8 -2
  224. package/utils/statuses.ts +1 -1
  225. package/utils/time.ts +27 -1
  226. package/components/autocompletes/FSAutocompleteTag.vue +0 -138
  227. package/components/map/FSMapEditPointAddressOverlay.vue +0 -164
  228. package/styles/components/fs_map_overlay.scss +0 -38
@@ -0,0 +1,100 @@
1
+ <template>
2
+ <FSAutocompleteField
3
+ :placeholder="innerPlaceholder"
4
+ :items="innerItems"
5
+ :showSearch="true"
6
+ :multiple="true"
7
+ :modelValue="modelValue?.map(m => m.id)"
8
+ @update:modelValue="onUpdateModelValue"
9
+ @add:item="onAddItem"
10
+ @keydown="onKeydown"
11
+ v-bind="$attrs"
12
+ >
13
+ <template
14
+ v-for="(_, name) in $slots"
15
+ v-slot:[name]="slotData"
16
+ >
17
+ <slot
18
+ :name="name"
19
+ v-bind="slotData"
20
+ />
21
+ </template>
22
+ </FSAutocompleteField>
23
+ </template>
24
+
25
+ <script lang="ts">
26
+ import { computed, defineComponent, type PropType, ref, watch } from "vue";
27
+
28
+ import { useTranslations as useTranslationsProvider, uuidv4 } from "@dative-gpi/bones-ui";
29
+
30
+ import FSAutocompleteField from "../fields/FSAutocompleteField.vue";
31
+
32
+ export default defineComponent({
33
+ components: {
34
+ FSAutocompleteField
35
+ },
36
+ props:{
37
+ placeholder: {
38
+ type: String as PropType<string | null>,
39
+ required: false,
40
+ default: null
41
+ },
42
+ items: {
43
+ type: Array as PropType<{id: string, label: string, isCustom: boolean}[]>,
44
+ required: false,
45
+ default: () => []
46
+ },
47
+ modelValue: {
48
+ type: Array as PropType<{id: string, label: string, isCustom: boolean}[] | null>,
49
+ required: false,
50
+ default: () => []
51
+ }
52
+ },
53
+ emits: ["update:modelValue"],
54
+ setup(props, {emit}) {
55
+ const { $tr } = useTranslationsProvider();
56
+
57
+ const tagValues = ref<{id : string, label : string, isCustom : boolean}[]>([]);
58
+
59
+ const innerItems = computed(() => props.items.concat(tagValues.value));
60
+
61
+ const innerPlaceholder = computed((): string | null => {
62
+ if (!props.modelValue || props.modelValue.length === 0) {
63
+ return null;
64
+ }
65
+ return props.placeholder ?? $tr("ui.autocomplete-tag.items-selected", "{0} item(s) selected", props.modelValue?.length ?? 0);
66
+ });
67
+
68
+ const onUpdateModelValue = (value: string[] | null): void => {
69
+ emit("update:modelValue", value?.map((v) => innerItems.value.find((i) => i.id === v)));
70
+ };
71
+
72
+ const onAddItem = (value: string): void => {
73
+ emit("update:modelValue", [
74
+ ...props.modelValue ?? [],
75
+ { id: uuidv4(), label: value, isCustom: true }
76
+ ]);
77
+ };
78
+
79
+ const onKeydown = (event: KeyboardEvent): void => {
80
+ if (event.key === "Backspace") {
81
+ emit("update:modelValue", [...props.modelValue ?? []]);
82
+ }
83
+ };
84
+
85
+ watch(() => props.modelValue, (newValue) => {
86
+ if (newValue) {
87
+ tagValues.value = props.modelValue?.filter(m=>m.isCustom) ?? [];
88
+ }
89
+ }, {immediate: true});
90
+
91
+ return {
92
+ innerPlaceholder,
93
+ innerItems,
94
+ onUpdateModelValue,
95
+ onAddItem,
96
+ onKeydown
97
+ };
98
+ }
99
+ });
100
+ </script>
@@ -1,5 +1,7 @@
1
1
  <template>
2
- <FSCol>
2
+ <FSCol
3
+ :style="style"
4
+ >
3
5
  <slot
4
6
  v-if="!$props.hideHeader"
5
7
  name="label"
@@ -10,7 +12,6 @@
10
12
  <FSSpan
11
13
  class="fs-base-field-label"
12
14
  font="text-overline"
13
- :style="style"
14
15
  >
15
16
  {{ $props.label }}
16
17
  </FSSpan>
@@ -27,14 +28,18 @@
27
28
  <v-spacer
28
29
  style="min-width: 40px;"
29
30
  />
30
- <FSSpan
31
- v-if="$props.messages.length > 0"
32
- class="fs-base-field-messages"
33
- font="text-overline"
34
- :style="style"
31
+ <template
32
+ v-if="$props.messages"
35
33
  >
36
- {{ $props.messages.join(", ") }}
37
- </FSSpan>
34
+ <FSSpan
35
+ v-if="$props.messages.length > 0"
36
+ class="fs-base-field-messages"
37
+ font="text-overline"
38
+ :style="style"
39
+ >
40
+ {{ $props.messages.join(", ") }}
41
+ </FSSpan>
42
+ </template>
38
43
  </FSRow>
39
44
  </slot>
40
45
  <slot />
@@ -44,8 +49,7 @@
44
49
  <FSSpan
45
50
  v-if="$props.description"
46
51
  class="fs-base-field-description"
47
- font="text-underline"
48
- :style="style"
52
+ font="text-overline"
49
53
  >
50
54
  {{ $props.description }}
51
55
  </FSSpan>
@@ -54,8 +58,7 @@
54
58
  </template>
55
59
 
56
60
  <script lang="ts">
57
- import type { PropType } from "vue";
58
- import { computed, defineComponent } from "vue";
61
+ import { computed, defineComponent, type PropType, type StyleValue } from "vue";
59
62
 
60
63
  import { useColors, useSlots } from "@dative-gpi/foundation-shared-components/composables";
61
64
  import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
@@ -101,6 +104,11 @@ export default defineComponent({
101
104
  type: Boolean,
102
105
  required: false,
103
106
  default: true
107
+ },
108
+ minWidth: {
109
+ type: String,
110
+ required: false,
111
+ default: "120px"
104
112
  }
105
113
  },
106
114
  setup(props) {
@@ -114,15 +122,17 @@ export default defineComponent({
114
122
  const lights = getColors(ColorEnum.Light);
115
123
  const darks = getColors(ColorEnum.Dark);
116
124
 
117
- const style = computed((): { [key: string] : string | null | undefined } => {
125
+ const style = computed((): StyleValue => {
118
126
  if (!props.editable) {
119
127
  return {
120
- "--fs-base-field-color": lights.dark
128
+ "--fs-base-field-color" : lights.dark,
129
+ "--fs-base-field-min-width": props.minWidth
121
130
  };
122
131
  }
123
132
  return {
124
133
  "--fs-base-field-color" : darks.base,
125
- "--fs-base-field-error-color": errors.base
134
+ "--fs-base-field-error-color": errors.base,
135
+ "--fs-base-field-min-width" : props.minWidth
126
136
  };
127
137
  });
128
138
 
@@ -1,47 +1,47 @@
1
1
  <template>
2
+
3
+ <FSBaseField
4
+ class="fs-color-field"
5
+ :description="$props.description"
6
+ :hideHeader="$props.hideHeader"
7
+ :editable="$props.editable"
8
+ :required="$props.required"
9
+ :label="$props.label"
10
+ :width="$props.width"
11
+ :style="style"
12
+ :modelValue="innerColor"
13
+ v-bind="$attrs"
14
+ >
15
+ <FSCard
16
+ :id="activatorId"
17
+ padding="8px"
18
+ width="100%"
19
+ :class="{ 'fs-color-field-disabled': !$props.editable }"
20
+ >
21
+ <FSRow
22
+ align="center-center"
23
+ >
24
+ <FSIcon
25
+ icon="mdi-circle-half"
26
+ size="20px"
27
+ :color="innerColor"
28
+ />
29
+ <FSText
30
+ font="text-overline"
31
+ >
32
+ {{ innerColor }}
33
+ </FSText>
34
+ </FSRow>
35
+ </FSCard>
36
+ </FSBaseField>
2
37
  <v-menu
38
+ origin="top left"
39
+ min-width="300px"
40
+ :activator="`#${activatorId}`"
3
41
  :closeOnContentClick="false"
4
42
  :modelValue="menu && $props.editable"
5
43
  @update:modelValue="menu = $event"
6
44
  >
7
- <template
8
- #activator="{ props }"
9
- >
10
- <FSBaseField
11
- class="fs-color-field"
12
- :hideHeader="$props.hideHeader"
13
- :required="$props.required"
14
- :editable="$props.editable"
15
- :modelValue="innerColor"
16
- :description="$props.description"
17
- :label="$props.label"
18
- :style="style"
19
- :width="$props.width"
20
- v-bind="$attrs"
21
- >
22
- <FSCard
23
- width="100%"
24
- padding="8px"
25
- v-bind="props"
26
- :class="{ 'fs-color-field-disabled': !$props.editable }"
27
- >
28
- <FSRow
29
- align="center-center"
30
- >
31
- <FSIcon
32
- :color="innerColor"
33
- size="20px"
34
- icon="mdi-circle-half"
35
- />
36
- <FSText
37
- font="text-overline"
38
- >
39
- {{ innerColor }}
40
- </FSText>
41
- </FSRow>
42
- </FSCard>
43
- </FSBaseField>
44
- </template>
45
45
  <FSCard
46
46
  :elevation="true"
47
47
  :border="false"
@@ -53,23 +53,23 @@
53
53
  v-if="!$props.onlyBaseColors"
54
54
  class="fs-color-field-picker"
55
55
  mode="hexa"
56
- :elevation="0"
57
56
  :modes="allowOpacity ? ['hexa', 'rgba'] : ['hex', 'rgb']"
57
+ :elevation="0"
58
58
  :modelValue="fullColor"
59
59
  @update:modelValue="onSubmit"
60
60
  />
61
61
  <v-color-picker
62
62
  v-else
63
63
  class="fs-color-field-picker"
64
- :elevation="0"
65
- :modelValue="fullColor"
66
- @update:modelValue="onSubmit"
67
64
  swatches-max-height="400px"
68
65
  show-swatches
69
- hide-inputs
70
- hide-canvas
71
66
  hide-sliders
67
+ hide-canvas
68
+ hide-inputs
72
69
  :swatches="getBasePaletteColors()"
70
+ :elevation="0"
71
+ :modelValue="fullColor"
72
+ @update:modelValue="onSubmit"
73
73
  />
74
74
  </FSCol>
75
75
  </FSCard>
@@ -77,7 +77,7 @@
77
77
  </template>
78
78
 
79
79
  <script lang="ts">
80
- import { computed, defineComponent, type PropType, ref, watch } from "vue";
80
+ import { computed, defineComponent, type PropType, ref, type StyleValue, watch } from "vue";
81
81
 
82
82
  import { getPercentageFromHex, getHexFromPercentage } from "@dative-gpi/foundation-shared-components/utils";
83
83
  import { useColors, useSlots } from "@dative-gpi/foundation-shared-components/composables";
@@ -112,7 +112,7 @@ export default defineComponent({
112
112
  default: null
113
113
  },
114
114
  modelValue: {
115
- type: String,
115
+ type: String as PropType<string | null>,
116
116
  required: false,
117
117
  default: "#000000"
118
118
  },
@@ -156,6 +156,7 @@ export default defineComponent({
156
156
  setup(props, { emit }) {
157
157
  const { getColors, getBasePaletteColors } = useColors();
158
158
  const { slots } = useSlots();
159
+ const activatorId = `activator-${Math.random().toString(36).substring(7)}`;
159
160
 
160
161
  delete slots.description;
161
162
 
@@ -164,11 +165,11 @@ export default defineComponent({
164
165
 
165
166
  const menu = ref(false);
166
167
 
167
- const innerColor = ref(getColors(props.modelValue).base);
168
- const innerOpacity = ref(getHexFromPercentage(props.opacityValue));
169
- const fullColor = ref(innerColor.value + innerOpacity.value);
168
+ const innerColor = ref("#000000");
169
+ const innerOpacity = ref("00");
170
+ const fullColor = ref("#00000000");
170
171
 
171
- const style = computed((): { [key: string]: string | undefined } => {
172
+ const style = computed((): StyleValue => {
172
173
  if (!props.editable) {
173
174
  return {
174
175
  "--fs-color-field-cursor" : "default",
@@ -185,7 +186,6 @@ export default defineComponent({
185
186
  };
186
187
  });
187
188
 
188
-
189
189
  const onSubmit = (value: string) => {
190
190
  innerColor.value = value.substring(0, 7);
191
191
  innerOpacity.value = value.length === 9 ? value.substring(7, 9) : "FF";
@@ -195,19 +195,27 @@ export default defineComponent({
195
195
  };
196
196
 
197
197
  const reset = (): void => {
198
- innerColor.value = getColors(props.modelValue)['base'];
199
- innerOpacity.value = getHexFromPercentage(props.opacityValue);
200
- fullColor.value = innerColor.value + innerOpacity.value;
198
+ if (props.modelValue) {
199
+ innerColor.value = getColors(props.modelValue)['base'];
200
+ innerOpacity.value = getHexFromPercentage(props.opacityValue);
201
+ fullColor.value = innerColor.value + innerOpacity.value;
202
+ }
203
+ else {
204
+ innerColor.value = "#000000";
205
+ innerOpacity.value = "00";
206
+ fullColor.value = "#00000000";
207
+ }
201
208
  };
202
209
 
203
210
  watch(() => props.modelValue, () => {
204
211
  reset();
205
- });
212
+ }, { immediate: true });
206
213
 
207
214
  return {
208
215
  getPercentageFromHex,
209
216
  getBasePaletteColors,
210
217
  innerOpacity,
218
+ activatorId,
211
219
  innerColor,
212
220
  fullColor,
213
221
  ColorEnum,
@@ -0,0 +1,93 @@
1
+ <template>
2
+ <FSCol>
3
+ <FSRow
4
+ align="top-left"
5
+ >
6
+ <FSImage
7
+ :imageId="userImageId"
8
+ :width="32"
9
+ :height="32"
10
+ rounded="circle"
11
+ />
12
+ <FSTextArea
13
+ :rows="5"
14
+ :hideHeader="true"
15
+ :placeholder="$tr('ui.common.write-comment', 'Write a comment...')"
16
+ v-model="innertext"
17
+ />
18
+ </FSRow>
19
+ <FSRow>
20
+ <v-spacer></v-spacer>
21
+ <FSButtonCancel
22
+ v-if="showCancelButton"
23
+ @click="$emit('cancel')"
24
+ />
25
+ <FSButton
26
+ :color="ColorEnum.Primary"
27
+ :loading="creating"
28
+ prependIcon="mdi-send-outline"
29
+ :label="buttonLabel ?? $tr('ui.common.publish','Publish')"
30
+ @click="() => $emit('submit', innertext)"
31
+ />
32
+ </FSRow>
33
+ </FSCol>
34
+ </template>
35
+
36
+ <script lang="ts">
37
+ import type { PropType} from "vue";
38
+ import { defineComponent, ref } from "vue";
39
+
40
+ import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
41
+
42
+ import FSButtonCancel from "../buttons/FSButtonCancel.vue";
43
+ import FSTextArea from "./FSTextArea.vue";
44
+ import FSButton from "../FSButton.vue";
45
+ import FSImage from "../FSImage.vue";
46
+ import FSRow from "../FSRow.vue";
47
+ import FSCol from "../FSCol.vue";
48
+
49
+ export default defineComponent({
50
+ name: "FSCommentField",
51
+ components: {
52
+ FSButton,
53
+ FSButtonCancel,
54
+ FSImage,
55
+ FSTextArea,
56
+ FSRow,
57
+ FSCol,
58
+ },
59
+ props: {
60
+ buttonLabel: {
61
+ type: String,
62
+ required: false,
63
+ },
64
+ creating: {
65
+ type: Boolean,
66
+ required: false,
67
+ },
68
+ userImageId: {
69
+ type: String as PropType<string | null>,
70
+ required: false,
71
+ },
72
+ text: {
73
+ type: String,
74
+ required: false,
75
+ },
76
+ showCancelButton: {
77
+ type: Boolean,
78
+ required: false,
79
+ default: false,
80
+ },
81
+ },
82
+ emits: ["submit","cancel"],
83
+ setup(props) {
84
+
85
+ const innertext = ref<string | undefined>(props.text);
86
+
87
+ return {
88
+ innertext,
89
+ ColorEnum
90
+ };
91
+ },
92
+ })
93
+ </script>
@@ -152,7 +152,7 @@ import _ from "lodash";
152
152
 
153
153
  import { useBreakpoints, useRules } from "@dative-gpi/foundation-shared-components/composables";
154
154
  import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
155
- import { useAppTimeZone } from "@dative-gpi/foundation-shared-services/composables";
155
+ import { useDateFormat } from "@dative-gpi/foundation-shared-services/composables";
156
156
 
157
157
  import FSDialogMenu from "../FSDialogMenu.vue";
158
158
  import FSTextField from "./FSTextField.vue";
@@ -215,7 +215,7 @@ export default defineComponent({
215
215
  },
216
216
  emits: ["update:modelValue"],
217
217
  setup(props, { emit }) {
218
- const { epochToLongDateFormat } = useAppTimeZone();
218
+ const { epochToLongDateFormat } = useDateFormat();
219
219
  const { validateOn, getMessages} = useRules();
220
220
  const { isExtraSmall } = useBreakpoints();
221
221
 
@@ -62,7 +62,7 @@ import { computed, defineComponent, type PropType, ref, watch } from "vue";
62
62
  import _ from "lodash";
63
63
 
64
64
  import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
65
- import { useAppTimeZone } from "@dative-gpi/foundation-shared-services/composables";
65
+ import { useDateFormat } from "@dative-gpi/foundation-shared-services/composables";
66
66
  import { useRules } from "@dative-gpi/foundation-shared-components/composables";
67
67
 
68
68
  import FSDialogSubmit from "../FSDialogSubmit.vue";
@@ -123,7 +123,7 @@ export default defineComponent({
123
123
  emits: ["update:modelValue"],
124
124
  setup(props, { emit }) {
125
125
  const { validateOn, getMessages } = useRules();
126
- const { epochToShortDateFormat } = useAppTimeZone();
126
+ const { epochToShortDateFormat } = useDateFormat();
127
127
 
128
128
  const dialog = ref(false);
129
129
 
@@ -197,7 +197,7 @@ import { computed, defineComponent, type PropType, ref, watch } from "vue";
197
197
 
198
198
  import { useBreakpoints, useRules } from "@dative-gpi/foundation-shared-components/composables";
199
199
  import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
200
- import { useAppTimeZone } from "@dative-gpi/foundation-shared-services/composables";
200
+ import { useAppTimeZone, useDateFormat } from "@dative-gpi/foundation-shared-services/composables";
201
201
 
202
202
  import FSDialogMenu from "../FSDialogMenu.vue";
203
203
  import FSTextField from "./FSTextField.vue";
@@ -264,7 +264,8 @@ export default defineComponent({
264
264
  },
265
265
  emits: ["update:modelValue"],
266
266
  setup(props, { emit }) {
267
- const { getUserOffsetMillis, epochToLongTimeFormat } = useAppTimeZone();
267
+ const { getUserOffset } = useAppTimeZone();
268
+ const { epochToLongTimeFormat } = useDateFormat();
268
269
  const { validateOn, getMessages } = useRules();
269
270
  const { isExtraSmall } = useBreakpoints();
270
271
 
@@ -300,7 +301,7 @@ export default defineComponent({
300
301
  if (props.modelValue) {
301
302
  // FSClock just gives two numbers without consideration for the time zone
302
303
  // We must adjust the time to the user's time zone
303
- innerTime.value = Math.floor((props.modelValue + getUserOffsetMillis()) % (24 * 60 * 60 * 1000));
304
+ innerTime.value = Math.floor((props.modelValue + getUserOffset()) % (24 * 60 * 60 * 1000));
304
305
  innerDate.value = props.modelValue - innerTime.value;
305
306
  }
306
307
  else {
@@ -79,7 +79,7 @@
79
79
  import { computed, defineComponent, type PropType, ref, watch } from "vue";
80
80
 
81
81
  import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
82
- import { useAppTimeZone } from "@dative-gpi/foundation-shared-services/composables";
82
+ import { useAppTimeZone, useDateFormat } from "@dative-gpi/foundation-shared-services/composables";
83
83
  import { useRules } from "@dative-gpi/foundation-shared-components/composables";
84
84
 
85
85
  import FSDialogSubmit from "../FSDialogSubmit.vue";
@@ -115,7 +115,7 @@ export default defineComponent({
115
115
  modelValue: {
116
116
  type: Array as PropType<number[] | null>,
117
117
  required: false,
118
- default: null
118
+ default: () => null
119
119
  },
120
120
  color: {
121
121
  type: String as PropType<ColorBase>,
@@ -145,7 +145,8 @@ export default defineComponent({
145
145
  },
146
146
  emits: ["update:modelValue"],
147
147
  setup(props, { emit }) {
148
- const { getUserOffsetMillis, epochToShortTimeFormat } = useAppTimeZone();
148
+ const { getUserOffset } = useAppTimeZone();
149
+ const { epochToShortTimeFormat } = useDateFormat();
149
150
  const { validateOn, getMessages } = useRules();
150
151
 
151
152
  const dialog = ref(false);
@@ -206,13 +207,13 @@ export default defineComponent({
206
207
  break;
207
208
  }
208
209
  case 1: {
209
- innerTimeLeft.value = Math.floor((props.modelValue[0] + getUserOffsetMillis()) % (24 * 60 * 60 * 1000));
210
+ innerTimeLeft.value = Math.floor((props.modelValue[0] + getUserOffset()) % (24 * 60 * 60 * 1000));
210
211
  innerDateRange.value = [props.modelValue[0] - innerTimeLeft.value];
211
212
  break;
212
213
  }
213
214
  default: {
214
- innerTimeLeft.value = Math.floor((props.modelValue[0] + getUserOffsetMillis()) % (24 * 60 * 60 * 1000));
215
- innerTimeRight.value = Math.floor((props.modelValue[1] + getUserOffsetMillis()) % (24 * 60 * 60 * 1000));
215
+ innerTimeLeft.value = Math.floor((props.modelValue[0] + getUserOffset()) % (24 * 60 * 60 * 1000));
216
+ innerTimeRight.value = Math.floor((props.modelValue[1] + getUserOffset()) % (24 * 60 * 60 * 1000));
216
217
  innerDateRange.value = [props.modelValue[0] - innerTimeLeft.value, props.modelValue[1] - innerTimeRight.value];
217
218
  break;
218
219
  }