@dative-gpi/foundation-shared-components 1.0.95 → 1.0.97

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 (32) hide show
  1. package/components/FSDialogContent.vue +11 -8
  2. package/components/FSFadeOut.vue +3 -10
  3. package/components/FSGrid.vue +0 -1
  4. package/components/FSTab.vue +15 -13
  5. package/components/agenda/FSAgendaHeader.vue +11 -3
  6. package/components/agenda/FSAgendaHorizontalEvent.vue +3 -1
  7. package/components/agenda/FSWeekAgenda.vue +2 -2
  8. package/components/fields/FSBaseField.vue +32 -22
  9. package/components/fields/FSIconField.vue +0 -1
  10. package/components/fields/FSNumberField.vue +5 -1
  11. package/components/fields/FSRichTextField.vue +4 -3
  12. package/components/lists/FSDataTableUI.vue +22 -20
  13. package/components/lists/FSLoadDataTable.vue +10 -7
  14. package/components/tiles/FSChartTile.vue +73 -0
  15. package/components/tiles/FSChartTileUI.vue +18 -23
  16. package/components/tiles/FSCommentTileUI.vue +13 -9
  17. package/components/views/desktop/FSBaseEntityDesktopView.vue +6 -7
  18. package/components/views/mobile/FSBaseEntityMobileView.vue +6 -7
  19. package/composables/useBreakpoints.ts +5 -0
  20. package/package.json +4 -4
  21. package/styles/components/fs_agenda.scss +4 -0
  22. package/styles/components/fs_autocomplete_field.scss +0 -13
  23. package/styles/components/fs_color_field.scss +0 -4
  24. package/styles/components/fs_magic_config_field.scss +1 -2
  25. package/styles/components/fs_select_field.scss +0 -13
  26. package/styles/components/index.scss +0 -4
  27. package/components/views/FSEntityHeader.vue +0 -343
  28. package/components/views/FSListHeader.vue +0 -83
  29. package/styles/components/fs_icon_field.scss +0 -12
  30. package/styles/components/fs_search_field.scss +0 -3
  31. package/styles/components/fs_tag_field.scss +0 -8
  32. package/styles/components/fs_time_field.scss +0 -12
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <FSCard
3
- padding="24px"
3
+ :padding="['24px', '16px', '16px 12px']"
4
4
  gap="24px"
5
5
  :class="$props.cardClasses"
6
6
  :color="$props.color"
@@ -19,13 +19,16 @@
19
19
  >
20
20
  {{ $props.title }}
21
21
  </FSText>
22
- <v-spacer />
23
- <FSButton
24
- icon="mdi-close"
25
- variant="icon"
26
- :color="ColorEnum.Dark"
27
- @click="$emit('update:modelValue', false)"
28
- />
22
+ <FSRow
23
+ align="center-right"
24
+ >
25
+ <FSButton
26
+ icon="mdi-close"
27
+ variant="icon"
28
+ :color="ColorEnum.Dark"
29
+ @click="$emit('update:modelValue', false)"
30
+ />
31
+ </FSRow>
29
32
  </FSRow>
30
33
  <FSText
31
34
  v-if="$props.subtitle"
@@ -117,20 +117,13 @@ export default defineComponent({
117
117
  else {
118
118
  topMaskHeight.value = sizeToVar(props.maskHeight);
119
119
  }
120
-
121
- // const event = {
122
- // target: fadeOutRef.value,
123
- // onTop: topMaskHeight.value === "0px",
124
- // onBottom: bottomMaskHeight.value === "0px",
125
- // goingUp: (fadeOutRef.value as any).scrollTop < lastScroll.value,
126
- // };
127
-
128
- // emit("scroll", event);
120
+
129
121
  lastScroll.value = (fadeOutRef.value as any).scrollTop;
130
122
  }
131
123
  };
132
124
 
133
- const debounceMasks = (): void => debounce(handleMasks, 1);
125
+ // Delay to wait for animations to end before computing masks
126
+ const debounceMasks = (): void => debounce(handleMasks, 280);
134
127
 
135
128
  onMounted((): void => {
136
129
  debounceMasks();
@@ -52,7 +52,6 @@
52
52
  </template>
53
53
  </template>
54
54
  </FSCol>
55
- <v-spacer />
56
55
  <FSRow
57
56
  v-if="itemEndSlot(item.code)"
58
57
  align="center-right"
@@ -26,19 +26,6 @@
26
26
  {{ $props.label }}
27
27
  </FSSpan>
28
28
  </slot>
29
- <v-spacer
30
- v-if="$props.tag"
31
- />
32
- <slot
33
- name="tag"
34
- >
35
- <FSSpan
36
- v-if="$props.tag"
37
- class="fs-tab-tag"
38
- >
39
- {{ $props.tag }}
40
- </FSSpan>
41
- </slot>
42
29
  <slot
43
30
  name="append"
44
31
  >
@@ -49,6 +36,21 @@
49
36
  {{ $props.appendIcon }}
50
37
  </FSIcon>
51
38
  </slot>
39
+ <FSRow
40
+ align="center-right"
41
+ :wrap="false"
42
+ >
43
+ <slot
44
+ name="tag"
45
+ >
46
+ <FSSpan
47
+ v-if="$props.tag"
48
+ class="fs-tab-tag"
49
+ >
50
+ {{ $props.tag }}
51
+ </FSSpan>
52
+ </slot>
53
+ </FSRow>
52
54
  </FSRow>
53
55
  </slot>
54
56
  </v-tab>
@@ -16,12 +16,18 @@
16
16
  @click="onPrevious"
17
17
  />
18
18
  <FSButton
19
- width="180px"
19
+ width="220px"
20
20
  color="primary"
21
21
  :border="false"
22
- :label="epochToMonthYearOnlyFormat($props.start)"
23
22
  @click="showCalendarDialog = true"
24
- />
23
+ >
24
+ <FSSpan
25
+ class="fs-agenda-header-text"
26
+ font="text-h3"
27
+ >
28
+ {{ epochToMonthYearOnlyFormat($props.start) }}
29
+ </FSSpan>
30
+ </FSButton>
25
31
  <FSButton
26
32
  variant="icon"
27
33
  icon="mdi-chevron-right"
@@ -100,6 +106,7 @@ import FSRow from '../FSRow.vue';
100
106
  import FSButton from '../FSButton.vue';
101
107
  import FSSelectAgendaMode from './FSSelectAgendaMode.vue';
102
108
  import FSAgendaDialogCalendar from './FSAgendaDialogCalendar.vue';
109
+ import FSSpan from '../FSSpan.vue';
103
110
 
104
111
  export default defineComponent({
105
112
  name: 'FSAgendaHeader',
@@ -108,6 +115,7 @@ export default defineComponent({
108
115
  FSSelectAgendaMode,
109
116
  FSCol,
110
117
  FSButton,
118
+ FSSpan,
111
119
  FSRow
112
120
  },
113
121
  props: {
@@ -15,7 +15,7 @@
15
15
  @click="$emit('click', $props.id)"
16
16
  >
17
17
  <template
18
- #default="{ label, icon, timeStart, timeEnd, iconBis, variant }"
18
+ #default="{ label, icon, timeStart, timeEnd, iconBis, variant, width }"
19
19
  >
20
20
  <slot
21
21
  name="default"
@@ -25,6 +25,7 @@
25
25
  :timeStart="timeStart"
26
26
  :timeEnd="timeEnd"
27
27
  :variant="variant"
28
+ :width="width"
28
29
  />
29
30
  </template>
30
31
  </FSAgendaHorizontalEvent>
@@ -47,6 +48,7 @@
47
48
  :timeStart="epochToShortTimeOnlyFormat($props.start)"
48
49
  :timeEnd="epochToShortTimeOnlyFormat($props.end)"
49
50
  :variant="$props.variant"
51
+ :width="width"
50
52
  />
51
53
  </FSClickable>
52
54
  </template>
@@ -125,7 +125,7 @@
125
125
  @click="() => $emit('click:eventId', event.id)"
126
126
  >
127
127
  <template
128
- #default="{ label, icon, timeStart, timeEnd, iconBis, variant }"
128
+ #default="{ label, icon, timeStart, timeEnd, iconBis, variant, width }"
129
129
  >
130
130
  <FSRow
131
131
  align="center-left"
@@ -158,7 +158,7 @@
158
158
  </FSRow>
159
159
  </FSCol>
160
160
  <FSCol
161
- v-if="iconBis && variant !== 'current'"
161
+ v-if="iconBis && variant !== 'current' && width > 13"
162
162
  align="center-right"
163
163
  padding="8px 8px 8px 0"
164
164
  width="hug"
@@ -7,39 +7,43 @@
7
7
  name="label"
8
8
  >
9
9
  <FSRow
10
+ gap="40px"
10
11
  :wrap="false"
11
12
  >
12
- <FSSpan
13
- class="fs-base-field-label"
14
- font="text-overline"
13
+ <FSRow
14
+ gap="2px"
15
+ :width="widths.label"
16
+ :wrap="false"
15
17
  >
16
- {{ $props.label }}
17
- </FSSpan>
18
- <FSSpan
19
- v-if="$props.label && $props.required"
20
- class="fs-base-field-label"
21
- style="margin-left: -8px;"
22
- font="text-overline"
23
- :ellipsis="false"
24
- :style="style"
25
- >
26
- *
27
- </FSSpan>
28
- <v-spacer
29
- style="min-width: 40px;"
30
- />
31
- <template
32
- v-if="$props.messages"
18
+ <FSSpan
19
+ class="fs-base-field-label"
20
+ font="text-overline"
21
+ >
22
+ {{ $props.label }}
23
+ </FSSpan>
24
+ <FSSpan
25
+ v-if="$props.label && $props.required"
26
+ class="fs-base-field-label"
27
+ font="text-overline"
28
+ :ellipsis="false"
29
+ :style="style"
30
+ >
31
+ *
32
+ </FSSpan>
33
+ </FSRow>
34
+ <FSRow
35
+ align="center-right"
36
+ :width="widths.messages"
33
37
  >
34
38
  <FSSpan
35
- v-if="$props.messages.length > 0"
39
+ v-if="$props.messages && $props.messages.length > 0"
36
40
  class="fs-base-field-messages"
37
41
  font="text-overline"
38
42
  :style="style"
39
43
  >
40
44
  {{ $props.messages.join(", ") }}
41
45
  </FSSpan>
42
- </template>
46
+ </FSRow>
43
47
  </FSRow>
44
48
  </slot>
45
49
  <slot />
@@ -136,7 +140,13 @@ export default defineComponent({
136
140
  };
137
141
  });
138
142
 
143
+ const widths = computed(() => ({
144
+ label: props.messages && props.messages.length ? "calc(50% - 40px)" : "100%",
145
+ messages: props.messages && props.messages.length ? "50%" : "0"
146
+ }));
147
+
139
148
  return {
149
+ widths,
140
150
  style,
141
151
  slots
142
152
  };
@@ -28,7 +28,6 @@
28
28
  </template>
29
29
  </FSTextField>
30
30
  <FSToggleSet
31
- class="fs-icon-field-set"
32
31
  ref="toggleSetRef"
33
32
  variant="slide"
34
33
  :buttonColor="$props.buttonColor"
@@ -43,10 +43,14 @@ export default defineComponent({
43
43
  },
44
44
  emits: ["update:modelValue"],
45
45
  setup(_, { emit }) {
46
- const onUpdate = (value: string) => {
46
+ const onUpdate = (value: string | null | undefined) => {
47
47
  if (value === "-") {
48
48
  return;
49
49
  }
50
+ if(value === null || value === undefined) {
51
+ emit("update:modelValue", null);
52
+ return;
53
+ }
50
54
  const match = /[-]?([0-9 ]*[,.]?)?[0-9]*/.exec(value);
51
55
  if (match != null && !isNaN(parseFloat(match[0].replace(",", ".").replace(" ", "")))) {
52
56
  emit("update:modelValue", parseFloat(match[0].replace(",", ".").replace(" ", "")));
@@ -29,9 +29,10 @@
29
29
  </FSSpan>
30
30
  </FSRow>
31
31
  </slot>
32
- <v-spacer />
33
- <template
32
+ <FSRow
34
33
  v-if="$props.editable"
34
+ align="center-right"
35
+ :wrap="false"
35
36
  >
36
37
  <FSIcon
37
38
  class="fs-rich-text-field-icon"
@@ -177,7 +178,7 @@
177
178
  >
178
179
  mdi-format-align-justify
179
180
  </FSIcon>
180
- </template>
181
+ </FSRow>
181
182
  </FSRow>
182
183
  <FSText
183
184
  v-if="readonly && !$props.modelValue && $props.emptyLabel"
@@ -289,25 +289,29 @@
289
289
  <slot
290
290
  :name="`${header.slotName}-append`"
291
291
  />
292
- <v-spacer />
293
- <slot
294
- :name="`${header.slotName}-configuration`"
292
+ <FSRow
293
+ align="center-right"
294
+ :wrap="false"
295
295
  >
296
- <FSHeaderButton
297
- :first="index === 0"
298
- :last="index === headersSlots.length - 1"
299
- @update:hide="updateHeader(header, 'hidden', !header.hidden)"
300
- @update:left="updateHeader(header, 'index', -1)"
301
- @update:right="updateHeader(header, 'index', 1)"
302
- />
303
- <FSButton
304
- v-if="header.sortable"
305
- variant="icon"
306
- :color="sortColor(header, props)"
307
- :icon="sortIcon(header, props)"
308
- @click="toggleSort(header)"
309
- />
310
- </slot>
296
+ <slot
297
+ :name="`${header.slotName}-configuration`"
298
+ >
299
+ <FSHeaderButton
300
+ :first="index === 0"
301
+ :last="index === headersSlots.length - 1"
302
+ @update:hide="updateHeader(header, 'hidden', !header.hidden)"
303
+ @update:left="updateHeader(header, 'index', -1)"
304
+ @update:right="updateHeader(header, 'index', 1)"
305
+ />
306
+ <FSButton
307
+ v-if="header.sortable"
308
+ variant="icon"
309
+ :color="sortColor(header, props)"
310
+ :icon="sortIcon(header, props)"
311
+ @click="toggleSort(header)"
312
+ />
313
+ </slot>
314
+ </FSRow>
311
315
  </FSRow>
312
316
  </slot>
313
317
  </template>
@@ -370,7 +374,6 @@
370
374
  </FSText>
371
375
  </template>
372
376
  </template>
373
- <v-spacer />
374
377
  <FSRow
375
378
  align="center-right"
376
379
  width="hug"
@@ -544,7 +547,6 @@
544
547
  </FSText>
545
548
  </template>
546
549
  </template>
547
- <v-spacer />
548
550
  <FSRow
549
551
  align="center-right"
550
552
  :wrap="false"
@@ -13,13 +13,16 @@
13
13
  <FSLoader
14
14
  variant="button"
15
15
  />
16
- <v-spacer />
17
- <FSLoader
18
- variant="button"
19
- />
20
- <FSLoader
21
- variant="button"
22
- />
16
+ <FSRow
17
+ align="center-right"
18
+ >
19
+ <FSLoader
20
+ variant="button"
21
+ />
22
+ <FSLoader
23
+ variant="button"
24
+ />
25
+ </FSRow>
23
26
  </FSRow>
24
27
  <FSRow>
25
28
  <FSLoader
@@ -0,0 +1,73 @@
1
+ <template>
2
+ <FSChartTileUI
3
+ v-if="chart"
4
+ :label="chart.label"
5
+ :icon="chart.icon"
6
+ :type="chart.chartType"
7
+ :imageId="chart.imageId"
8
+ v-bind="$attrs"
9
+ />
10
+ </template>
11
+
12
+ <script lang="ts">
13
+ import { defineComponent, watch, computed } from "vue";
14
+ import type { PropType } from "vue";
15
+
16
+ import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
17
+ import { chartIcon } from "@dative-gpi/foundation-shared-components/tools";
18
+
19
+ import { useChartOrganisation, useChartOrganisationType } from "@dative-gpi/foundation-core-services/composables";
20
+
21
+ import { ApplicationScope } from "@dative-gpi/foundation-shared-domain/enums";
22
+ import FSChartTileUI from "./FSChartTileUI.vue";
23
+
24
+ export default defineComponent({
25
+ name: "FSChartTile",
26
+ components: {
27
+ FSChartTileUI
28
+ },
29
+ props: {
30
+ chartId: {
31
+ type: String,
32
+ required: true
33
+ },
34
+ scope: {
35
+ type: Object as PropType<ApplicationScope | number>,
36
+ required : true
37
+ }
38
+ },
39
+ setup(props) {
40
+
41
+ const {get : fetchChartOrganisation, entity : chartOrganisation } = useChartOrganisation();
42
+ const {get : fetchChartOrganisationType, entity : chartOrganisationType } = useChartOrganisationType();
43
+
44
+ const chart = computed(() =>{
45
+ if(props.scope == ApplicationScope.Organisation){
46
+ return chartOrganisation.value;
47
+ }
48
+ else if(props.scope == ApplicationScope.OrganisationType){
49
+ return chartOrganisationType.value;
50
+ }
51
+ else{
52
+ return null
53
+ }
54
+ })
55
+
56
+ watch(() => [props.chartId, props.scope], () =>{
57
+ if(props.scope == ApplicationScope.Organisation){
58
+ fetchChartOrganisation(props.chartId);
59
+ }
60
+ else if(props.scope == ApplicationScope.OrganisationType)
61
+ {
62
+ fetchChartOrganisationType(props.chartId)
63
+ }
64
+ }, {immediate : true})
65
+
66
+ return {
67
+ ColorEnum,
68
+ chart,
69
+ chartIcon
70
+ };
71
+ }
72
+ });
73
+ </script>
@@ -1,8 +1,8 @@
1
1
  <template>
2
- <FSClickable
3
- padding="16px"
2
+ <FSTile
4
3
  :width="['275px','336px']"
5
4
  :height="['124px','156px']"
5
+ borderRadius="8px"
6
6
  v-bind="$attrs"
7
7
  >
8
8
  <template
@@ -10,27 +10,26 @@
10
10
  >
11
11
  <FSRow
12
12
  align="center-left"
13
+ padding="4px 4px 4px 8px"
14
+ gap="16px"
13
15
  :wrap="false"
14
16
  >
15
17
  <FSCol
16
18
  align="center-left"
19
+ gap="4px"
17
20
  >
18
21
  <FSSpan
19
- font="text-button"
20
- :lineClamp="2"
22
+ font="text-overline"
23
+ :lineClamp="4"
21
24
  >
22
25
  {{ $props.label }}
23
26
  </FSSpan>
24
27
  <FSIcon
25
28
  :color="ColorEnum.Error"
29
+ size="18px"
26
30
  >
27
31
  {{ chartIcon(type) }}
28
32
  </FSIcon>
29
- <FSSpan
30
- font="text-overline"
31
- >
32
- {{ $props.categoryLabel }}
33
- </FSSpan>
34
33
  </FSCol>
35
34
  <FSCol
36
35
  align="center-right"
@@ -38,19 +37,19 @@
38
37
  >
39
38
  <FSImage
40
39
  v-if="$props.imageId"
41
- height="92px"
42
- width="92px"
40
+ :height="['82px','90px']"
41
+ :width="['82px','90px']"
43
42
  :imageId="$props.imageId"
44
43
  />
45
44
  <FSIcon
46
45
  v-else-if="$props.icon"
47
- size="92px"
46
+ :size="['82px','90px']"
48
47
  :icon="$props.icon"
49
48
  />
50
49
  </FSCol>
51
50
  </FSRow>
52
51
  </template>
53
- </FSClickable>
52
+ </FSTile>
54
53
  </template>
55
54
 
56
55
  <script lang="ts">
@@ -58,26 +57,27 @@ import { defineComponent } from "vue";
58
57
  import type { PropType } from "vue";
59
58
 
60
59
  import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
61
- import type { ChartType } from "@dative-gpi/foundation-shared-domain/enums";
60
+ import { ChartType } from "@dative-gpi/foundation-shared-domain/enums";
62
61
 
63
62
  import { chartIcon } from "@dative-gpi/foundation-shared-components/tools";
64
63
 
65
- import FSClickable from "../FSClickable.vue";
66
64
  import FSImage from "../FSImage.vue";
65
+ import FSTile from "./FSTile.vue";
67
66
  import FSSpan from "../FSSpan.vue";
68
67
  import FSIcon from "../FSIcon.vue";
69
68
  import FSRow from "../FSRow.vue";
70
69
  import FSCol from "../FSCol.vue";
71
70
 
71
+
72
72
  export default defineComponent({
73
73
  name: "FSChartTileUI",
74
74
  components: {
75
- FSIcon,
76
75
  FSImage,
76
+ FSTile,
77
+ FSIcon,
77
78
  FSRow,
78
79
  FSCol,
79
80
  FSSpan,
80
- FSClickable
81
81
  },
82
82
  props: {
83
83
  label: {
@@ -90,11 +90,6 @@ export default defineComponent({
90
90
  required: false,
91
91
  default: null
92
92
  },
93
- categoryLabel: {
94
- type: String as PropType<string | null>,
95
- required: false,
96
- default: null
97
- },
98
93
  icon: {
99
94
  type: String as PropType<string | null>,
100
95
  required: false,
@@ -103,7 +98,7 @@ export default defineComponent({
103
98
  type: {
104
99
  type: Number as PropType<ChartType>,
105
100
  required: false,
106
- default: null
101
+ default: ChartType.None
107
102
  }
108
103
  },
109
104
  setup() {
@@ -26,15 +26,19 @@
26
26
  -
27
27
  {{ timestamp }}
28
28
  </FSText>
29
- <v-spacer />
30
- <FSButtonEditIcon
31
- v-if="canEditRemove"
32
- @click="showEditComment = true"
33
- />
34
- <FSButtonRemoveIcon
35
- v-if="canEditRemove"
36
- @click="removeDialog = true"
37
- />
29
+ <FSRow
30
+ align="center-right"
31
+ :wrap="false"
32
+ >
33
+ <FSButtonEditIcon
34
+ v-if="canEditRemove"
35
+ @click="showEditComment = true"
36
+ />
37
+ <FSButtonRemoveIcon
38
+ v-if="canEditRemove"
39
+ @click="removeDialog = true"
40
+ />
41
+ </FSRow>
38
42
  </FSRow>
39
43
  </template>
40
44
  <template
@@ -30,9 +30,9 @@
30
30
  v-else-if="$props.icon"
31
31
  :backgroundVariant="$props.iconBackgroundVariant"
32
32
  :backgroundColor="$props.iconBackgroundColors"
33
+ :iconColor="$props.iconColor"
33
34
  :border="$props.iconBorder"
34
35
  :icon="$props.icon"
35
- :iconColor="$props.color"
36
36
  :size="actualImageSize"
37
37
  />
38
38
  <FSCol
@@ -144,16 +144,16 @@ export default defineComponent({
144
144
  required: false,
145
145
  default: () => ["124px", "96px", "80px"]
146
146
  },
147
- color: {
148
- type: String as PropType<ColorBase>,
149
- required: false,
150
- default: null
151
- },
152
147
  icon: {
153
148
  type: String as PropType<string>,
154
149
  required: false,
155
150
  default: "mdi-ab-testing"
156
151
  },
152
+ iconColor: {
153
+ type: String as PropType<ColorBase>,
154
+ required: false,
155
+ default: null
156
+ },
157
157
  iconBackgroundVariant: {
158
158
  type: String as PropType<"background" | "standard" | "full" | "gradient">,
159
159
  required: false,
@@ -195,7 +195,6 @@ export default defineComponent({
195
195
  topOffset.value = Math.max(0, Math.min(actualScrollTop, actualMinSize + 16 + 24));
196
196
  }
197
197
 
198
-
199
198
  delete slots.title;
200
199
 
201
200
  return {
@@ -22,9 +22,9 @@
22
22
  v-else-if="$props.icon"
23
23
  :backgroundVariant="$props.iconBackgroundVariant"
24
24
  :backgroundColor="$props.iconBackgroundColors"
25
+ :iconColor="$props.iconColor"
25
26
  :border="$props.iconBorder"
26
27
  :icon="$props.icon"
27
- :iconColor="$props.color"
28
28
  :size="actualImageSize"
29
29
  />
30
30
  <FSCol
@@ -134,16 +134,16 @@ export default defineComponent({
134
134
  required: false,
135
135
  default: () => ["124px", "96px", "80px"]
136
136
  },
137
- color: {
138
- type: String as PropType<ColorBase>,
139
- required: false,
140
- default: null
141
- },
142
137
  icon: {
143
138
  type: String as PropType<string>,
144
139
  required: false,
145
140
  default: "mdi-ab-testing"
146
141
  },
142
+ iconColor: {
143
+ type: String as PropType<ColorBase>,
144
+ required: false,
145
+ default: null
146
+ },
147
147
  iconBackgroundVariant: {
148
148
  type: String as PropType<"background" | "standard" | "full" | "gradient">,
149
149
  required: false,
@@ -185,7 +185,6 @@ export default defineComponent({
185
185
  topOffset.value = Math.max(0, Math.min(actualScrollTop, actualMinSize + 16 + 24));
186
186
  }
187
187
 
188
-
189
188
  delete slots.title;
190
189
 
191
190
  return {
@@ -12,6 +12,11 @@ export const useBreakpoints = () => {
12
12
  windowHeight.value = window.innerHeight;
13
13
  windowWidth.value = window.innerWidth;
14
14
 
15
+ // Bug in chromium based browsers where window.outerWidth is 0 when tab loads without focus
16
+ if (!window.document.hasFocus() && window.outerWidth === 0) {
17
+ windowOuterWidth.value = window.innerWidth;
18
+ return;
19
+ }
15
20
  windowOuterWidth.value = window.outerWidth;
16
21
  };
17
22
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dative-gpi/foundation-shared-components",
3
3
  "sideEffects": false,
4
- "version": "1.0.95",
4
+ "version": "1.0.97",
5
5
  "description": "",
6
6
  "publishConfig": {
7
7
  "access": "public"
@@ -10,8 +10,8 @@
10
10
  "author": "",
11
11
  "license": "ISC",
12
12
  "dependencies": {
13
- "@dative-gpi/foundation-shared-domain": "1.0.95",
14
- "@dative-gpi/foundation-shared-services": "1.0.95"
13
+ "@dative-gpi/foundation-shared-domain": "1.0.97",
14
+ "@dative-gpi/foundation-shared-services": "1.0.97"
15
15
  },
16
16
  "peerDependencies": {
17
17
  "@dative-gpi/bones-ui": "^1.0.0",
@@ -35,5 +35,5 @@
35
35
  "sass": "1.71.1",
36
36
  "sass-loader": "13.3.2"
37
37
  },
38
- "gitHead": "b02891a3803f79720eeaf9d4e57054e763d4ba1b"
38
+ "gitHead": "61194cd244a217ed5e865d288a6359bbd2f403ba"
39
39
  }
@@ -30,3 +30,7 @@
30
30
  width: 100%;
31
31
  height: 100%;
32
32
  }
33
+
34
+ .fs-agenda-header-text {
35
+ text-transform: capitalize !important;
36
+ }
@@ -22,19 +22,6 @@
22
22
  }
23
23
  }
24
24
 
25
- .fs-autocomplete-field-label {
26
- color: var(--fs-autocomplete-field-color);
27
- }
28
-
29
- .fs-autocomplete-field-messages {
30
- align-self: stretch;
31
- color: var(--fs-autocomplete-field-error-color);
32
- }
33
-
34
- .fs-autocomplete-field-description {
35
- color: var(--fs-autocomplete-field-color);
36
- }
37
-
38
25
  .v-overlay-container > .v-overlay > .v-autocomplete__content {
39
26
  box-shadow: 0px 5px 8px 0px #00000029;
40
27
  max-width: none !important;
@@ -17,8 +17,4 @@
17
17
  background: none !important;
18
18
  min-width: auto !important;
19
19
  width: 100% !important;
20
- }
21
-
22
- .fs-color-field-description {
23
- color: var(--fs-color-field-color);
24
20
  }
@@ -1,5 +1,4 @@
1
- .fs-magic-config-field > .fs-col:has(.v-switch) {
2
- margin: 0 0 6px 0;
1
+ .fs-magic-config-field > :has(.v-switch) {
3
2
  align-self: end;
4
3
  }
5
4
 
@@ -21,19 +21,6 @@
21
21
  }
22
22
  }
23
23
 
24
- .fs-select-field-label {
25
- color: var(--fs-select-field-color);
26
- }
27
-
28
- .fs-select-field-messages {
29
- align-self: stretch;
30
- color: var(--fs-select-field-error-color);
31
- }
32
-
33
- .fs-select-field-description {
34
- color: var(--fs-select-field-color);
35
- }
36
-
37
24
  .v-overlay-container > .v-overlay > .v-select__content > .v-list {
38
25
  @extend .fs-hide-y-scrollbar;
39
26
 
@@ -33,7 +33,6 @@
33
33
  @import "fs_grid.scss";
34
34
  @import "fs_header_button.scss";
35
35
  @import "fs_hidden_button.scss";
36
- @import "fs_icon_field.scss";
37
36
  @import "fs_icon.scss";
38
37
  @import "fs_image.scss";
39
38
  @import "fs_image_card.scss";
@@ -51,7 +50,6 @@
51
50
  @import "fs_radio.scss";
52
51
  @import "fs_rich_text_field.scss";
53
52
  @import "fs_row.scss";
54
- @import "fs_search_field.scss";
55
53
  @import "fs_select_field.scss";
56
54
  @import "fs_slide_group.scss";
57
55
  @import "fs_slider.scss";
@@ -59,12 +57,10 @@
59
57
  @import "fs_switch.scss";
60
58
  @import "fs_tag.scss";
61
59
  @import "fs_tabs.scss";
62
- @import "fs_tag_field.scss";
63
60
  @import "fs_text_area.scss";
64
61
  @import "fs_text_field.scss";
65
62
  @import "fs_text.scss";
66
63
  @import "fs_tile.scss";
67
- @import "fs_time_field.scss";
68
64
  @import "fs_tooltip.scss";
69
65
  @import "fs_translate_field.scss";
70
66
  @import "fs_tree_view_field.scss";
@@ -1,343 +0,0 @@
1
- <template>
2
- <template
3
- v-if="isExtraSmall"
4
- >
5
- <FSCol
6
- class="f-entity-header"
7
- padding="0 10px 0 0"
8
- align="center-left"
9
- gap="12px"
10
- >
11
- <FSRow
12
- align="center-left"
13
- gap="12px"
14
- :height="imageSize"
15
- :wrap="false"
16
- >
17
- <template
18
- v-if="$props.imageId"
19
- >
20
- <slot
21
- name="image"
22
- v-bind="{ imageSize }"
23
- >
24
- <FSImage
25
- :imageId="$props.imageId"
26
- :cover="imageCover"
27
- :height="imageSize"
28
- :width="imageSize"
29
- />
30
- </slot>
31
- </template>
32
- <FSIconCard
33
- v-else-if="$props.icon"
34
- :backgroundVariant="$props.iconBackgroundVariant"
35
- :backgroundColor="$props.iconBackgroundColors"
36
- :border="$props.iconBorder"
37
- :icon="$props.icon"
38
- :iconColor="$props.color"
39
- :size="imageSize"
40
- />
41
- <FSCol
42
- align="center-left"
43
- :width="`calc(100% - ${rightOverflow})`"
44
- >
45
- <template
46
- v-if="$props.subtitle && $props.description"
47
- >
48
- <FSText
49
- font="text-h3"
50
- >
51
- {{ $props.title }}
52
- </FSText>
53
- <FSCol
54
- align="center-left"
55
- gap="4px"
56
- >
57
- <FSText
58
- font="text-button"
59
- >
60
- {{ $props.subtitle }}
61
- </FSText>
62
- <FSText
63
- font="text-body"
64
- >
65
- {{ $props.description }}
66
- </FSText>
67
- </FSCol>
68
- </template>
69
- <template
70
- v-else-if="$props.subtitle && !$props.description"
71
- >
72
- <FSText
73
- font="text-h3"
74
- :lineClamp="2"
75
- >
76
- {{ $props.title }}
77
- </FSText>
78
- <FSText
79
- font="text-button"
80
- >
81
- {{ $props.subtitle }}
82
- </FSText>
83
- </template>
84
- <template
85
- v-else-if="!$props.subtitle && $props.description"
86
- >
87
- <FSText
88
- font="text-h3"
89
- :lineClamp="2"
90
- >
91
- {{ $props.title }}
92
- </FSText>
93
- <FSText
94
- font="text-body"
95
- :lineClamp="2"
96
- >
97
- {{ $props.description }}
98
- </FSText>
99
- </template>
100
- <template
101
- v-else
102
- >
103
- <FSText
104
- font="text-h3"
105
- :lineClamp="2"
106
- >
107
- {{ $props.title }}
108
- </FSText>
109
- </template>
110
- </FSCol>
111
- </FSRow>
112
- <template
113
- v-if="!$props.light"
114
- >
115
- <FSBreadcrumbs
116
- :items="$props.breadcrumbs"
117
- />
118
- <FSSlideGroup
119
- v-if="slots['toolbar']"
120
- >
121
- <slot
122
- name="toolbar"
123
- />
124
- </FSSlideGroup>
125
- <slot
126
- name="title-append"
127
- />
128
- </template>
129
- </FSCol>
130
- </template>
131
- <template
132
- v-else
133
- >
134
- <FSCol
135
- class="f-entity-header"
136
- padding="0 14px 0 0"
137
- align="center-left"
138
- gap="16px"
139
- >
140
- <FSRow
141
- align="center-left"
142
- gap="16px"
143
- :height="imageSize"
144
- :wrap="false"
145
- >
146
-
147
- <template
148
- v-if="$props.imageId"
149
- >
150
- <slot
151
- name="image"
152
- v-bind="{ imageSize }"
153
- >
154
- <FSImage
155
- :imageId="$props.imageId"
156
- :cover="imageCover"
157
- :height="imageSize"
158
- :width="imageSize"
159
- />
160
- </slot>
161
- </template>
162
- <FSIconCard
163
- v-else-if="$props.icon"
164
- iconSize="70px"
165
- :backgroundVariant="$props.iconBackgroundVariant"
166
- :backgroundColor="$props.iconBackgroundColors"
167
- :border="$props.iconBorder"
168
- :iconColor="$props.color"
169
- :icon="$props.icon"
170
- :size="imageSize"
171
- />
172
- <FSCol
173
- align="center-left"
174
- >
175
- <FSText
176
- :font="$props.light ? 'text-h3' : 'text-h2'"
177
- >
178
- {{ $props.title }}
179
- </FSText>
180
- <FSCol
181
- v-if="!$props.light && ($props.subtitle || $props.description)"
182
- gap="4px"
183
- >
184
- <FSText
185
- v-if="$props.subtitle"
186
- font="text-button"
187
- >
188
- {{ $props.subtitle }}
189
- </FSText>
190
- <FSText
191
- v-if="$props.description"
192
- font="text-body"
193
- :lineClamp="2"
194
- >
195
- {{ $props.description }}
196
- </FSText>
197
- </FSCol>
198
- </FSCol>
199
- <FSRow
200
- v-if="!$props.light"
201
- align="center-right"
202
- >
203
- <slot
204
- name="title-append"
205
- />
206
- </FSRow>
207
- </FSRow>
208
- <template
209
- v-if="!$props.light"
210
- >
211
- <FSBreadcrumbs
212
- :items="$props.breadcrumbs"
213
- />
214
- <FSSlideGroup
215
- v-if="slots['toolbar']"
216
- >
217
- <slot
218
- name="toolbar"
219
- />
220
- </FSSlideGroup>
221
- </template>
222
- </FSCol>
223
- </template>
224
- </template>
225
-
226
- <script lang="ts">
227
- import { computed, defineComponent, type PropType } from "vue";
228
-
229
- import { type ColorBase, type FSBreadcrumbItem } from "@dative-gpi/foundation-shared-components/models";
230
- import { useBreakpoints, useSlots } from "@dative-gpi/foundation-shared-components/composables";
231
-
232
- import FSBreadcrumbs from "../FSBreadcrumbs.vue";
233
- import FSSlideGroup from "../FSSlideGroup.vue";
234
- import FSIconCard from "../FSIconCard.vue";
235
- import FSImage from "../FSImage.vue";
236
- import FSText from "../FSText.vue";
237
- import FSCol from "../FSCol.vue";
238
- import FSRow from "../FSRow.vue";
239
-
240
- export default defineComponent({
241
- name: "FSEntityHeader",
242
- components: {
243
- FSBreadcrumbs,
244
- FSSlideGroup,
245
- FSIconCard,
246
- FSImage,
247
- FSText,
248
- FSCol,
249
- FSRow
250
- },
251
- props: {
252
- imageId: {
253
- type: String as PropType<string | null>,
254
- required: false,
255
- default: null
256
- },
257
- color: {
258
- type: String as PropType<ColorBase>,
259
- required: false,
260
- default: null
261
- },
262
- icon: {
263
- type: String as PropType<string>,
264
- required: false,
265
- default: "mdi-ab-testing"
266
- },
267
- iconBackgroundVariant: {
268
- type: String as PropType<"background" | "standard" | "full" | "gradient">,
269
- required: false,
270
- default: "background"
271
- },
272
- iconBackgroundColors: {
273
- type: Array as PropType<string[]>,
274
- required: false,
275
- default: () => []
276
- },
277
- iconBorder: {
278
- type: Boolean as PropType<boolean>,
279
- required: false,
280
- default: true
281
- },
282
- title: {
283
- type: String as PropType<string | null>,
284
- required: false,
285
- default: null
286
- },
287
- subtitle: {
288
- type: String as PropType<string | null>,
289
- required: false,
290
- default: null
291
- },
292
- description: {
293
- type: String as PropType<string | null>,
294
- required: false,
295
- default: null
296
- },
297
- breadcrumbs: {
298
- type: Array as PropType<Array<FSBreadcrumbItem>>,
299
- required: false,
300
- default: () => []
301
- },
302
- light: {
303
- type: Boolean,
304
- required: false,
305
- default: false
306
- },
307
- imageCover: {
308
- type: Boolean,
309
- required: false,
310
- default: true
311
- }
312
- },
313
- setup(props) {
314
- const { isExtraSmall, isMobileSized } = useBreakpoints();
315
- const { slots } = useSlots();
316
-
317
- const imageSize = computed((): string[] | string => {
318
- if (props.light) {
319
- return ["40px", "36px"];
320
- }
321
- return ["124px", "96px", "80px"];
322
- });
323
-
324
- const rightOverflow = computed(() => {
325
- let result = imageSize.value[0];
326
- if (isExtraSmall.value && imageSize.value[2]) {
327
- result = imageSize.value[2];
328
- }
329
- if ((isExtraSmall.value || isMobileSized.value) && imageSize.value[1]) {
330
- result = imageSize.value[1];
331
- }
332
- return result;
333
- });
334
-
335
- return {
336
- rightOverflow,
337
- isExtraSmall,
338
- imageSize,
339
- slots
340
- };
341
- }
342
- });
343
- </script>
@@ -1,83 +0,0 @@
1
- <template>
2
- <template
3
- v-if="isExtraSmall"
4
- >
5
- <FSCol
6
- gap="12px"
7
- >
8
- <FSText
9
- font="text-h3"
10
- >
11
- {{ $props.title }}
12
- </FSText>
13
- <FSBreadcrumbs
14
- :items="$props.breadcrumbs"
15
- />
16
- </FSCol>
17
- </template>
18
- <template
19
- v-else
20
- >
21
- <FSCol
22
- gap="16px"
23
- >
24
- <FSText
25
- font="text-h2"
26
- >
27
- {{ $props.title }}
28
- </FSText>
29
- <FSBreadcrumbs
30
- :items="$props.breadcrumbs"
31
- />
32
- <FSSlideGroup
33
- v-if="$slots['toolbar']"
34
- style="min-width: 100%;"
35
- >
36
- <slot
37
- name="toolbar"
38
- />
39
- </FSSlideGroup>
40
- </FSCol>
41
- </template>
42
- </template>
43
-
44
- <script lang="ts">
45
- import { defineComponent, type PropType } from "vue";
46
-
47
- import { type FSBreadcrumbItem } from "@dative-gpi/foundation-shared-components/models";
48
- import { useBreakpoints } from "@dative-gpi/foundation-shared-components/composables";
49
-
50
- import FSBreadcrumbs from "../FSBreadcrumbs.vue";
51
- import FSSlideGroup from "../FSSlideGroup.vue";
52
- import FSText from "../FSText.vue";
53
- import FSCol from "../FSCol.vue";
54
-
55
- export default defineComponent({
56
- name: "FSListHeader",
57
- components: {
58
- FSBreadcrumbs,
59
- FSSlideGroup,
60
- FSText,
61
- FSCol
62
- },
63
- props: {
64
- title: {
65
- type: String as PropType<string | null>,
66
- required: false,
67
- default: null
68
- },
69
- breadcrumbs: {
70
- type: Array as PropType<Array<FSBreadcrumbItem>>,
71
- required: false,
72
- default: () => []
73
- },
74
- },
75
- setup() {
76
- const { isExtraSmall } = useBreakpoints();
77
-
78
- return {
79
- isExtraSmall
80
- };
81
- }
82
- });
83
- </script>
@@ -1,12 +0,0 @@
1
- .fs-icon-field-label {
2
- color: var(--fs-icon-field-color);
3
- }
4
-
5
- .fs-icon-field-messages {
6
- align-self: stretch;
7
- color: var(--fs-icon-field-error-color);
8
- }
9
-
10
- .fs-icon-field-set {
11
- max-width: 100%;
12
- }
@@ -1,3 +0,0 @@
1
- .fs-search-field {
2
- max-width: 500px;
3
- }
@@ -1,8 +0,0 @@
1
- .fs-tag-field-label {
2
- color: var(--fs-tag-field-color);
3
- }
4
-
5
- .fs-tag-field-messages {
6
- align-self: stretch;
7
- color: var(--fs-tag-field-error-color);
8
- }
@@ -1,12 +0,0 @@
1
- .fs-time-field-label {
2
- color: var(--fs-time-field-color);
3
- }
4
-
5
- .fs-time-field-messages {
6
- align-self: stretch;
7
- color: var(--fs-time-field-error-color);
8
- }
9
-
10
- .fs-time-field-description {
11
- color: var(--fs-time-field-color);
12
- }