@dative-gpi/foundation-shared-components 1.0.107 → 1.0.108-fix

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.
@@ -129,7 +129,7 @@
129
129
  <template
130
130
  v-else-if="$props.to"
131
131
  >
132
- <router-link
132
+ <FSRouterLink
133
133
  :to="$props.to"
134
134
  >
135
135
  <FSIcon
@@ -143,7 +143,7 @@
143
143
  >
144
144
  {{ $props.label }}
145
145
  </FSSpan>
146
- </router-link>
146
+ </FSRouterLink>
147
147
  </template>
148
148
  <template
149
149
  v-else
@@ -170,6 +170,7 @@ import { type RouteLocation } from "vue-router";
170
170
  import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
171
171
  import { useColors } from "@dative-gpi/foundation-shared-components/composables";
172
172
 
173
+ import FSRouterLink from "./FSRouterLink.vue";
173
174
  import FSClickable from "./FSClickable.vue";
174
175
  import FSSpan from "./FSSpan.vue";
175
176
  import FSIcon from "./FSIcon.vue";
@@ -185,6 +186,7 @@ const DEFAULT_PADDING = PADDING_ICON_LABEL;
185
186
  export default defineComponent({
186
187
  name: "FSButton",
187
188
  components: {
189
+ FSRouterLink,
188
190
  FSClickable,
189
191
  FSSpan,
190
192
  FSIcon,
@@ -198,7 +200,7 @@ export default defineComponent({
198
200
  default: DEFAULT_PADDING
199
201
  },
200
202
  to: {
201
- type: [String, Object] as PropType<string | RouteLocation | null>,
203
+ type: Object as PropType<RouteLocation | null>,
202
204
  required: false,
203
205
  default: null
204
206
  },
@@ -40,7 +40,7 @@
40
40
  />
41
41
  </template>
42
42
  </a>
43
- <router-link
43
+ <FSRouterLink
44
44
  v-else-if="$props.to"
45
45
  :style="style"
46
46
  :to="$props.to"
@@ -80,7 +80,7 @@
80
80
  :color="loadColor"
81
81
  />
82
82
  </template>
83
- </router-link>
83
+ </FSRouterLink>
84
84
  <button
85
85
  v-else
86
86
  :type="$props.type"
@@ -134,11 +134,13 @@ import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-compone
134
134
  import { useColors } from "@dative-gpi/foundation-shared-components/composables";
135
135
  import { sizeToVar } from "@dative-gpi/foundation-shared-components/utils";
136
136
 
137
+ import FSRouterLink from "./FSRouterLink.vue";
137
138
  import FSCard from "./FSCard.vue";
138
139
 
139
140
  export default defineComponent({
140
141
  name: "FSClickable",
141
142
  components: {
143
+ FSRouterLink,
142
144
  FSCard
143
145
  },
144
146
  props: {
@@ -163,7 +165,7 @@ export default defineComponent({
163
165
  default: null
164
166
  },
165
167
  to: {
166
- type: [String, Object] as PropType<string | RouteLocation | null>,
168
+ type: Object as PropType<RouteLocation | null>,
167
169
  required: false,
168
170
  default: null
169
171
  },
@@ -11,12 +11,14 @@
11
11
  #body
12
12
  >
13
13
  <FSDialogFormBody
14
+ ref="bodyRef"
14
15
  v-bind="$attrs"
15
16
  :subtitle="$props.subtitle"
16
17
  :validation="$props.validation"
17
18
  @click:cancelButton="$emit('update:modelValue', false)"
18
19
  @click:submitButton="$emit('click:submitButton')"
19
20
  @click:validateButton="onValidate"
21
+ @update:validForm="validForm = $event"
20
22
  >
21
23
  <template
22
24
  v-for="(_, name) in $slots"
@@ -33,8 +35,8 @@
33
35
  </template>
34
36
 
35
37
  <script lang="ts">
36
- import type { PropType} from "vue";
37
- import { defineComponent } from "vue";
38
+ import type { PropType } from "vue";
39
+ import { defineComponent, ref } from "vue";
38
40
 
39
41
  import FSDialogFormBody from "./FSDialogFormBody.vue";
40
42
  import FSDialog from "./FSDialog.vue";
@@ -74,6 +76,8 @@ export default defineComponent({
74
76
  },
75
77
  emits: ["update:modelValue", "click:validateButton", "click:submitButton"],
76
78
  setup(props, { emit }) {
79
+ const bodyRef = ref<typeof FSDialogFormBody | null>(null);
80
+ const validForm = ref(false);
77
81
 
78
82
  const onClose = () => {
79
83
  if (props.validation) {
@@ -87,8 +91,24 @@ export default defineComponent({
87
91
  emit("update:modelValue", false);
88
92
  };
89
93
 
94
+ const resetFormValidation = () => {
95
+ if (bodyRef.value) {
96
+ bodyRef.value.resetFormValidation();
97
+ }
98
+ };
99
+
100
+ const validateForm = async () => {
101
+ if (bodyRef.value) {
102
+ await bodyRef.value.validateForm();
103
+ }
104
+ };
105
+
90
106
  return {
107
+ resetFormValidation,
108
+ validateForm,
91
109
  onValidate,
110
+ validForm,
111
+ bodyRef,
92
112
  onClose
93
113
  };
94
114
  }
@@ -6,7 +6,7 @@
6
6
  ref="formRef"
7
7
  :variant="$props.variant"
8
8
  @submit="onSubmit"
9
- v-model="valid"
9
+ v-model="validForm"
10
10
  >
11
11
  <FSCol
12
12
  gap="24px"
@@ -89,7 +89,7 @@
89
89
  </template>
90
90
 
91
91
  <script lang="ts">
92
- import { computed, defineComponent, type PropType, ref } from "vue";
92
+ import { computed, defineComponent, type PropType, ref, watch } from "vue";
93
93
 
94
94
  import { useTranslations as useTranslationsProvider } from "@dative-gpi/bones-ui/composables";
95
95
  import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
@@ -114,11 +114,6 @@ export default defineComponent({
114
114
  required: false,
115
115
  default: "submit"
116
116
  },
117
- modelValue: {
118
- type: Boolean,
119
- required: false,
120
- default: false
121
- },
122
117
  subtitle: {
123
118
  type: String as PropType<string | null>,
124
119
  required: false,
@@ -225,13 +220,13 @@ export default defineComponent({
225
220
  default: true
226
221
  }
227
222
  },
228
- emits: ["click:cancelButton", "click:submitButton", "click:validateButton"],
223
+ emits: ["click:cancelButton", "click:submitButton", "click:validateButton", "update:validForm"],
229
224
  setup(props, { emit }) {
230
225
  const { isMobileSized } = useBreakpoints();
231
226
  const { $tr } = useTranslationsProvider();
232
227
 
233
- const formRef = ref<HTMLElement | null>(null);
234
- const valid = ref(false);
228
+ const formRef = ref<typeof FSForm | null>(null);
229
+ const validForm = ref(false);
235
230
 
236
231
  const maxHeight = computed(() => {
237
232
  const other = 24 + 24 // Paddings
@@ -253,8 +248,20 @@ export default defineComponent({
253
248
  return props.validateButtonLabel ?? $tr("ui.button.validate", "Done");
254
249
  });
255
250
 
251
+ const resetFormValidation = () => {
252
+ if (formRef.value) {
253
+ formRef.value.resetValidation();
254
+ }
255
+ };
256
+
257
+ const validateForm = async () => {
258
+ if (formRef.value) {
259
+ await formRef.value.validate();
260
+ }
261
+ };
262
+
256
263
  const onSubmit = () => {
257
- if (valid.value) {
264
+ if (validForm.value) {
258
265
  emit("click:submitButton");
259
266
  }
260
267
  };
@@ -262,17 +269,23 @@ export default defineComponent({
262
269
  const onValidate = () => {
263
270
  emit("click:validateButton");
264
271
  };
272
+
273
+ watch(() => validForm.value, () => {
274
+ emit("update:validForm", validForm.value);
275
+ }, { immediate: true });
265
276
 
266
277
  return {
278
+ resetFormValidation,
267
279
  validateLabel,
280
+ validateForm,
268
281
  cancelLabel,
269
282
  submitLabel,
283
+ onValidate,
270
284
  ColorEnum,
271
285
  maxHeight,
272
- formRef,
273
- valid,
274
- onValidate,
275
- onSubmit
286
+ validForm,
287
+ onSubmit,
288
+ formRef
276
289
  };
277
290
  }
278
291
  });
@@ -2,13 +2,16 @@
2
2
  <a
3
3
  v-if="$props.href"
4
4
  :href="$props.href"
5
+ :class="classes"
5
6
  :style="style"
6
7
  >
7
8
  <slot>
8
- {{ $props.label }}
9
+ <FSSpan>
10
+ {{ $props.label }}
11
+ </FSSpan>
9
12
  </slot>
10
13
  </a>
11
- <router-link
14
+ <FSRouterLink
12
15
  v-else-if="$props.to"
13
16
  :to="$props.to"
14
17
  :class="classes"
@@ -19,9 +22,11 @@
19
22
  <slot
20
23
  v-bind="props"
21
24
  >
22
- {{ $props.label }}
25
+ <FSSpan>
26
+ {{ $props.label }}
27
+ </FSSpan>
23
28
  </slot>
24
- </router-link>
29
+ </FSRouterLink>
25
30
  </template>
26
31
 
27
32
  <script lang="ts">
@@ -31,8 +36,15 @@ import { type RouteLocation } from "vue-router";
31
36
  import { useBreakpoints, useColors, useSlots } from "@dative-gpi/foundation-shared-components/composables";
32
37
  import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-components/models";
33
38
 
39
+ import FSRouterLink from "./FSRouterLink.vue";
40
+ import FSSpan from "./FSSpan.vue";
41
+
34
42
  export default defineComponent({
35
43
  name: "FSLink",
44
+ components: {
45
+ FSRouterLink,
46
+ FSSpan
47
+ },
36
48
  props: {
37
49
  label: {
38
50
  type: String as PropType<string | null>,
@@ -40,7 +52,7 @@ export default defineComponent({
40
52
  default: null
41
53
  },
42
54
  to: {
43
- type: [String, Object] as PropType<string | RouteLocation | null>,
55
+ type: Object as PropType<RouteLocation | null>,
44
56
  required: false,
45
57
  default: null
46
58
  },
@@ -0,0 +1,42 @@
1
+ <template>
2
+ <router-link
3
+ :to="$props.to"
4
+ @auxclick="handleRoutingEvent($event, $props.to)"
5
+ @click="handleRoutingEvent($event, $props.to)"
6
+ v-bind="$attrs"
7
+ >
8
+ <template
9
+ v-for="(_, name) in $slots"
10
+ v-slot:[name]="slotData"
11
+ >
12
+ <slot
13
+ :name="name"
14
+ v-bind="{ ...slotData }"
15
+ />
16
+ </template>
17
+ </router-link>
18
+ </template>
19
+
20
+ <script lang="ts">
21
+ import { defineComponent, type PropType } from "vue";
22
+ import { type RouteLocation } from "vue-router";
23
+
24
+ import { useRouting } from "@dative-gpi/foundation-shared-services/composables";
25
+
26
+ export default defineComponent({
27
+ name: "FSRouterLink",
28
+ props: {
29
+ to: {
30
+ type: Object as PropType<RouteLocation>,
31
+ required: true
32
+ }
33
+ },
34
+ setup() {
35
+ const { handleRoutingEvent } = useRouting();
36
+
37
+ return {
38
+ handleRoutingEvent
39
+ };
40
+ }
41
+ });
42
+ </script>
@@ -46,7 +46,7 @@
46
46
  </template>
47
47
 
48
48
  <script lang="ts">
49
- import { ref, defineComponent, onMounted, type PropType, watch } from "vue";
49
+ import { ref, defineComponent, type PropType, watch } from "vue";
50
50
 
51
51
  import { useTranslations as useTranslationsProvider } from "@dative-gpi/bones-ui";
52
52
 
@@ -71,7 +71,7 @@ export default defineComponent({
71
71
  },
72
72
  props: {
73
73
  modelValue: {
74
- type: String as PropType<"daily" | "weekly" | "monthly" | "yearly">,
74
+ type: String as PropType<string>,
75
75
  required: true
76
76
  },
77
77
  editable: {
@@ -118,9 +118,9 @@ export default defineComponent({
118
118
  emit('update:modelValue', period.item.default);
119
119
  });
120
120
 
121
- onMounted(() => {
121
+ watch(() => props.modelValue, () => {
122
122
  selectedPeriod.value = getPeriod(props.modelValue);
123
- });
123
+ }, { immediate: true });
124
124
 
125
125
  return {
126
126
  availablePeriod,
@@ -100,7 +100,7 @@ export default defineComponent({
100
100
  if (isNaN(parseInt(props.modelValue[3]))) {
101
101
  return 0;
102
102
  }
103
- return parseInt(props.modelValue[3]) - 1;
103
+ return parseInt(props.modelValue[3]);
104
104
  });
105
105
 
106
106
  const time = computed((): number => {
@@ -113,19 +113,19 @@ export default defineComponent({
113
113
  const onUpdateDay = (value: number): void => {
114
114
  const hours = Math.floor(value / (60 * 60 * 1000));
115
115
  const minutes = Math.floor(value / (60 * 1000) % 60);
116
- emit("update:modelValue", [`${minutes}`, `${hours}`, `${value}`, `${month.value + 1}`, "*"]);
116
+ emit("update:modelValue", [`${minutes}`, `${hours}`, `${value}`, `${month.value}`, "*"]);
117
117
  };
118
118
 
119
119
  const onUpdateHours = (value: number): void => {
120
120
  const hours = Math.floor(value / (60 * 60 * 1000));
121
121
  const minutes = Math.floor(value / (60 * 1000) % 60);
122
- emit("update:modelValue", [`${minutes}`, `${hours}`, `${day.value}`, `${month.value + 1}`, "*"]);
122
+ emit("update:modelValue", [`${minutes}`, `${hours}`, `${day.value}`, `${month.value}`, "*"]);
123
123
  };
124
124
 
125
125
  const onUpdateMonth = (value: number): void => {
126
126
  const hours = Math.floor(value / (60 * 60 * 1000));
127
127
  const minutes = Math.floor(value / (60 * 1000) % 60);
128
- emit("update:modelValue", [`${minutes}`, `${hours}`, `${day.value}`, `${value + 1}`, "*"]);
128
+ emit("update:modelValue", [`${minutes}`, `${hours}`, `${day.value}`, `${value}`, "*"]);
129
129
  };
130
130
 
131
131
  return {
@@ -696,6 +696,7 @@ import { useRouter } from "vue-router";
696
696
  import { ColorEnum, type FSDataTableColumn, type FSDataTableFilter, type FSDataTableOrder, type FSToggle } from "@dative-gpi/foundation-shared-components/models";
697
697
  import { useBreakpoints, useColors, useSlots } from "@dative-gpi/foundation-shared-components/composables";
698
698
  import { useTranslations as useTranslationsProvider } from "@dative-gpi/bones-ui/composables";
699
+ import { useRouting } from "@dative-gpi/foundation-shared-services/composables";
699
700
  import { uuidv4 } from "@dative-gpi/bones-ui/tools/uuid"
700
701
 
701
702
  import { alphanumericSort, containsSearchTerm, sizeToVar } from "../../utils";
@@ -888,6 +889,7 @@ export default defineComponent({
888
889
  },
889
890
  emits: ["update:modelValue", "update:headers", "update:showFilters", "update:filters", "update:mode", "update:sortBy", "update:rowsPerPage", "update:page", "update:include", "update:items", "click:row"],
890
891
  setup(props, { emit }) {
892
+ const { handleRoutingEvent } = useRouting();
891
893
  const { isExtraSmall } = useBreakpoints();
892
894
  const { $tr } = useTranslationsProvider();
893
895
  const { getColors } = useColors();
@@ -1107,12 +1109,7 @@ export default defineComponent({
1107
1109
  clickable: true,
1108
1110
  row: (event: PointerEvent, row: any) => {
1109
1111
  if (props.itemTo && router) {
1110
- if (event.metaKey || event.ctrlKey || event.button === 1) {
1111
- window.open(router.resolve(props.itemTo(row.item)).href, "_blank");
1112
- }
1113
- else {
1114
- router.push(props.itemTo(row.item));
1115
- }
1112
+ handleRoutingEvent(event, props.itemTo(row.item), true);
1116
1113
  }
1117
1114
  else {
1118
1115
  emit("click:row", row.item);
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.107",
4
+ "version": "1.0.108-fix",
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.107",
14
- "@dative-gpi/foundation-shared-services": "1.0.107"
13
+ "@dative-gpi/foundation-shared-domain": "1.0.108-fix",
14
+ "@dative-gpi/foundation-shared-services": "1.0.108-fix"
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": "eb566a0c7b51ca46c2d469196aa8e6e83b70bae3"
38
+ "gitHead": "1ad1f8f4c83daf22b3cf40273e22c11b9c964d3a"
39
39
  }
@@ -1,9 +1,8 @@
1
1
  .fs-dialog-mobile > .v-overlay__content {
2
- flex-direction: column-reverse !important;
3
-
4
2
  max-height: 100vh !important;
5
3
  max-width: 100vw !important;
6
- height: 100% !important;
7
4
  width: 100% !important;
8
5
  margin: 0 !important;
6
+ position: absolute;
7
+ bottom: 0;
9
8
  }