@dative-gpi/foundation-shared-components 1.0.129 → 1.0.130-maps2
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.
- package/components/FSBreadcrumbs.vue +20 -12
- package/components/FSChip.vue +2 -2
- package/components/FSDialogMenu.vue +17 -8
- package/components/FSDialogRemove.vue +1 -1
- package/components/FSFadeOut.vue +1 -1
- package/components/FSIconCard.vue +26 -3
- package/components/FSInstantPicker.vue +266 -0
- package/components/FSPlayButtons.vue +72 -0
- package/components/FSProgressBar.vue +94 -0
- package/components/FSSpan.vue +8 -5
- package/components/FSText.vue +7 -5
- package/components/deviceOrganisations/FSStatusRichCard.vue +170 -0
- package/components/fields/FSAutocompleteField.vue +36 -52
- package/components/fields/FSDateField.vue +1 -0
- package/components/fields/FSSelectField.vue +41 -53
- package/components/fields/FSTermField.vue +11 -8
- package/components/fields/FSTranslateRichTextField.vue +17 -2
- package/components/fields/periodicField/FSPeriodicWeeklyField.vue +21 -11
- package/components/lists/FSDataTableUI.vue +30 -19
- package/components/map/FSMap.vue +19 -10
- package/components/map/FSMapMarker.vue +4 -4
- package/components/map/FSMapMarkerClusterGroup.vue +1 -1
- package/components/map/FSMapOverlay.vue +34 -19
- package/components/tiles/FSGroupTileUI.vue +14 -1
- package/components/tiles/FSLocationTileUI.vue +1 -1
- package/components/tiles/FSSimpleTileUI.vue +1 -1
- package/components/views/desktop/FSBaseDefaultDesktopView.vue +8 -7
- package/components/views/desktop/FSBaseEntityDesktopView.vue +1 -0
- package/components/views/mobile/FSBaseDefaultMobileView.vue +8 -7
- package/components/views/mobile/FSBaseEntityMobileView.vue +1 -0
- package/composables/useSlots.ts +2 -1
- package/models/rules.ts +5 -2
- package/package.json +4 -4
- package/styles/components/fs_breadcrumbs.scss +19 -31
- package/styles/components/fs_button.scss +7 -5
- package/styles/components/fs_chip.scss +8 -6
- package/styles/components/fs_clickable.scss +14 -12
- package/styles/components/fs_data_iterator_item.scss +12 -10
- package/styles/components/fs_dialog.scss +1 -1
- package/styles/components/fs_dialog_menu.scss +4 -2
- package/styles/components/fs_image_card.scss +5 -3
- package/styles/components/fs_map.scss +48 -16
- package/styles/components/fs_password_field.scss +4 -2
- package/styles/components/fs_progress_bar.scss +14 -0
- package/styles/components/fs_select_field.scss +4 -0
- package/styles/components/fs_span.scss +12 -4
- package/styles/components/fs_status_rich_card.scss +13 -0
- package/styles/components/fs_tabs.scss +9 -5
- package/styles/components/fs_tag.scss +9 -7
- package/styles/components/index.scss +2 -0
- package/styles/globals/overrides.scss +11 -4
- package/styles/globals/scrollbars.scss +10 -0
- package/utils/index.ts +1 -0
- package/utils/operations.ts +69 -0
package/components/FSText.vue
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<
|
|
2
|
+
<div
|
|
3
3
|
:class="classes"
|
|
4
4
|
:style="style"
|
|
5
5
|
v-bind="$attrs"
|
|
6
6
|
>
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
<span>
|
|
8
|
+
<slot>
|
|
9
|
+
{{ $props.label }}
|
|
10
|
+
</slot>
|
|
11
|
+
</span>
|
|
12
|
+
</div>
|
|
11
13
|
</template>
|
|
12
14
|
|
|
13
15
|
<script lang="ts">
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<component
|
|
3
|
+
v-if="$props.modelStatus"
|
|
4
|
+
class="fs-status-rich-card"
|
|
5
|
+
variant="standard"
|
|
6
|
+
:is="$attrs.onClick ? FSClickable : FSCard"
|
|
7
|
+
:padding="$props.padding"
|
|
8
|
+
:height="$props.height"
|
|
9
|
+
:width="$props.width"
|
|
10
|
+
:color="color"
|
|
11
|
+
:style="style"
|
|
12
|
+
>
|
|
13
|
+
<FSCol
|
|
14
|
+
align="center-center"
|
|
15
|
+
:gap="$props.gap"
|
|
16
|
+
>
|
|
17
|
+
<FSRow
|
|
18
|
+
align="top-center"
|
|
19
|
+
>
|
|
20
|
+
<FSIcon
|
|
21
|
+
v-if="icon"
|
|
22
|
+
>
|
|
23
|
+
{{ icon }}
|
|
24
|
+
</FSIcon>
|
|
25
|
+
<FSText
|
|
26
|
+
v-if="value"
|
|
27
|
+
font="text-button"
|
|
28
|
+
>
|
|
29
|
+
{{ value }}
|
|
30
|
+
</FSText>
|
|
31
|
+
</FSRow>
|
|
32
|
+
<FSText
|
|
33
|
+
font="text-overline"
|
|
34
|
+
align="center"
|
|
35
|
+
:lineClamp="$props.titleClamp"
|
|
36
|
+
>
|
|
37
|
+
{{ title }}
|
|
38
|
+
</FSText>
|
|
39
|
+
<slot
|
|
40
|
+
name="footer"
|
|
41
|
+
v-bind="{ color }"
|
|
42
|
+
/>
|
|
43
|
+
</FSCol>
|
|
44
|
+
<div
|
|
45
|
+
class="fs-status-rich-card-corner"
|
|
46
|
+
>
|
|
47
|
+
<slot
|
|
48
|
+
name="corner"
|
|
49
|
+
v-bind="{ color }"
|
|
50
|
+
/>
|
|
51
|
+
</div>
|
|
52
|
+
</component>
|
|
53
|
+
</template>
|
|
54
|
+
|
|
55
|
+
<script lang="ts">
|
|
56
|
+
import { computed, defineComponent, type PropType, type StyleValue } from "vue";
|
|
57
|
+
|
|
58
|
+
import { ColorEnum, type FSDeviceStatusGroup, type FSModelStatus } from "@dative-gpi/foundation-shared-components/models";
|
|
59
|
+
import { useColors } from "@dative-gpi/foundation-shared-components/composables";
|
|
60
|
+
|
|
61
|
+
import FSClickable from "../FSClickable.vue";
|
|
62
|
+
import FSCard from "../FSCard.vue";
|
|
63
|
+
import FSIcon from "../FSChip.vue";
|
|
64
|
+
import FSText from "../FSText.vue";
|
|
65
|
+
import FSCol from "../FSCol.vue";
|
|
66
|
+
|
|
67
|
+
export default defineComponent({
|
|
68
|
+
name: "FSStatusRichCard",
|
|
69
|
+
components: {
|
|
70
|
+
FSClickable,
|
|
71
|
+
FSCard,
|
|
72
|
+
FSIcon,
|
|
73
|
+
FSText,
|
|
74
|
+
FSCol
|
|
75
|
+
},
|
|
76
|
+
props: {
|
|
77
|
+
height: {
|
|
78
|
+
type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
|
|
79
|
+
required: false,
|
|
80
|
+
default: "100px"
|
|
81
|
+
},
|
|
82
|
+
width: {
|
|
83
|
+
type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
|
|
84
|
+
required: false,
|
|
85
|
+
default: "160px"
|
|
86
|
+
},
|
|
87
|
+
padding: {
|
|
88
|
+
type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
|
|
89
|
+
required: false,
|
|
90
|
+
default: "12px"
|
|
91
|
+
},
|
|
92
|
+
gap: {
|
|
93
|
+
type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
|
|
94
|
+
required: false,
|
|
95
|
+
default: "8px"
|
|
96
|
+
},
|
|
97
|
+
title: {
|
|
98
|
+
type: [String, null] as PropType<string | null>,
|
|
99
|
+
required: false,
|
|
100
|
+
default: null
|
|
101
|
+
},
|
|
102
|
+
titleClamp: {
|
|
103
|
+
type: Number,
|
|
104
|
+
required: false,
|
|
105
|
+
default: 2
|
|
106
|
+
},
|
|
107
|
+
color: {
|
|
108
|
+
type: [String, null] as PropType<string | null>,
|
|
109
|
+
required: false,
|
|
110
|
+
default: null
|
|
111
|
+
},
|
|
112
|
+
fillBackground: {
|
|
113
|
+
type: Boolean,
|
|
114
|
+
required: false,
|
|
115
|
+
default: false
|
|
116
|
+
},
|
|
117
|
+
modelStatus: {
|
|
118
|
+
type: Object as PropType<FSModelStatus | undefined>,
|
|
119
|
+
required: true
|
|
120
|
+
},
|
|
121
|
+
statusGroup: {
|
|
122
|
+
type: Object as PropType<FSDeviceStatusGroup | undefined>,
|
|
123
|
+
required: true
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
setup(props) {
|
|
127
|
+
const { getColors } = useColors();
|
|
128
|
+
|
|
129
|
+
const color = computed((): string => {
|
|
130
|
+
return props.color ?? props.statusGroup?.color ?? props.modelStatus?.colorDefault ?? ColorEnum.Primary;
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
const icon = computed((): string | null => {
|
|
134
|
+
return props.statusGroup?.icon ?? props.modelStatus?.iconDefault ?? null;
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
const title = computed((): string => {
|
|
138
|
+
return props.title ?? props.modelStatus?.label;
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
const value = computed((): string | null => {
|
|
142
|
+
if (props.statusGroup?.label) {
|
|
143
|
+
return props.statusGroup.label;
|
|
144
|
+
}
|
|
145
|
+
if (props.statusGroup?.value && !isNaN(parseFloat(props.statusGroup?.value))) {
|
|
146
|
+
return `${parseFloat(props.statusGroup.value).toLocaleString("fullwide", { maximumFractionDigits: 2 })} ${props.statusGroup.unit}`;
|
|
147
|
+
}
|
|
148
|
+
if (props.statusGroup?.value) {
|
|
149
|
+
return `${props.statusGroup?.value} ${props.statusGroup?.unit}`;
|
|
150
|
+
}
|
|
151
|
+
return null;
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
const style = computed((): StyleValue => ({
|
|
155
|
+
"--fs-status-rich-card-background-color": props.fillBackground ? getColors(color.value).light : "transparent",
|
|
156
|
+
"--fs-status-rich-card-border-color": props.fillBackground ? getColors(color.value).base : getColors(ColorEnum.Light).dark
|
|
157
|
+
}));
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
FSClickable,
|
|
161
|
+
FSCard,
|
|
162
|
+
color,
|
|
163
|
+
style,
|
|
164
|
+
title,
|
|
165
|
+
value,
|
|
166
|
+
icon
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
</script>
|
|
@@ -121,6 +121,7 @@
|
|
|
121
121
|
</FSCard>
|
|
122
122
|
</FSSlideGroup>
|
|
123
123
|
<FSDialogMenu
|
|
124
|
+
padding="16px"
|
|
124
125
|
v-model="dialog"
|
|
125
126
|
>
|
|
126
127
|
<template
|
|
@@ -139,69 +140,52 @@
|
|
|
139
140
|
>
|
|
140
141
|
<FSRow
|
|
141
142
|
v-for="(item, index) in searchItems"
|
|
143
|
+
align="center-left"
|
|
144
|
+
height="36px"
|
|
145
|
+
:wrap="false"
|
|
142
146
|
:key="index"
|
|
147
|
+
@click="$props.multiple ?
|
|
148
|
+
onCheckboxChange(item[$props.itemValue!]) :
|
|
149
|
+
onRadioChange(item[$props.itemValue!])
|
|
150
|
+
"
|
|
143
151
|
>
|
|
144
|
-
<
|
|
145
|
-
|
|
146
|
-
:
|
|
147
|
-
:editable="$props.editable"
|
|
148
|
-
:modelValue="$props.modelValue?.includes(item[$props.itemValue!])"
|
|
149
|
-
@update:modelValue="() => onCheckboxChange(item[$props.itemValue!])"
|
|
150
|
-
>
|
|
151
|
-
<template
|
|
152
|
-
#label="{ font }"
|
|
153
|
-
>
|
|
154
|
-
<FSRow
|
|
155
|
-
align="center-left"
|
|
156
|
-
:wrap="false"
|
|
157
|
-
>
|
|
158
|
-
<slot
|
|
159
|
-
name="item-prepend"
|
|
160
|
-
v-bind="{ item }"
|
|
161
|
-
/>
|
|
162
|
-
<FSSpan
|
|
163
|
-
:font="font"
|
|
164
|
-
>
|
|
165
|
-
{{ item[$props.itemTitle!] }}
|
|
166
|
-
</FSSpan>
|
|
167
|
-
</FSRow>
|
|
168
|
-
</template>
|
|
169
|
-
</FSCheckbox>
|
|
170
|
-
<FSRadio
|
|
171
|
-
v-else
|
|
172
|
-
:selected="$props.modelValue === item[$props.itemValue!]"
|
|
173
|
-
:label="item[$props.itemTitle!]"
|
|
174
|
-
:editable="$props.editable"
|
|
175
|
-
:item="item"
|
|
176
|
-
:modelValue="item[$props.itemValue!]"
|
|
177
|
-
@update:modelValue="() => onRadioChange(item[$props.itemValue!])"
|
|
152
|
+
<FSRow
|
|
153
|
+
style="min-width: 0;"
|
|
154
|
+
:wrap="false"
|
|
178
155
|
>
|
|
179
|
-
<
|
|
180
|
-
|
|
156
|
+
<slot
|
|
157
|
+
name="item-prepend"
|
|
158
|
+
v-bind="{ item }"
|
|
159
|
+
/>
|
|
160
|
+
<FSSpan
|
|
161
|
+
:font="selectedItems.includes(item) ? 'text-button' : 'text-body'"
|
|
181
162
|
>
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
>
|
|
186
|
-
<slot
|
|
187
|
-
name="item-prepend"
|
|
188
|
-
v-bind="{ item }"
|
|
189
|
-
/>
|
|
190
|
-
<FSSpan
|
|
191
|
-
:font="font"
|
|
192
|
-
>
|
|
193
|
-
{{ item[$props.itemTitle!] }}
|
|
194
|
-
</FSSpan>
|
|
195
|
-
</FSRow>
|
|
196
|
-
</template>
|
|
197
|
-
</FSRadio>
|
|
163
|
+
{{ item[$props.itemTitle!] }}
|
|
164
|
+
</FSSpan>
|
|
165
|
+
</FSRow>
|
|
198
166
|
<FSRow
|
|
199
167
|
align="center-right"
|
|
168
|
+
width="hug"
|
|
169
|
+
:wrap="false"
|
|
200
170
|
>
|
|
201
171
|
<slot
|
|
202
172
|
name="item-append"
|
|
203
173
|
v-bind="{ item }"
|
|
204
174
|
/>
|
|
175
|
+
<FSCheckbox
|
|
176
|
+
v-if="$props.multiple"
|
|
177
|
+
:editable="$props.editable"
|
|
178
|
+
:modelValue="$props.modelValue?.includes(item[$props.itemValue!])"
|
|
179
|
+
@update:modelValue="onCheckboxChange(item[$props.itemValue!])"
|
|
180
|
+
/>
|
|
181
|
+
<FSRadio
|
|
182
|
+
v-else
|
|
183
|
+
:selected="$props.modelValue === item[$props.itemValue!]"
|
|
184
|
+
:editable="$props.editable"
|
|
185
|
+
:item="item"
|
|
186
|
+
:modelValue="item[$props.itemValue!]"
|
|
187
|
+
@update:modelValue="onRadioChange(item[$props.itemValue!])"
|
|
188
|
+
/>
|
|
205
189
|
</FSRow>
|
|
206
190
|
</FSRow>
|
|
207
191
|
</FSCol>
|
|
@@ -122,6 +122,7 @@
|
|
|
122
122
|
</FSCard>
|
|
123
123
|
</FSSlideGroup>
|
|
124
124
|
<FSDialogMenu
|
|
125
|
+
padding="16px"
|
|
125
126
|
v-model="dialog"
|
|
126
127
|
>
|
|
127
128
|
<template
|
|
@@ -135,69 +136,52 @@
|
|
|
135
136
|
>
|
|
136
137
|
<FSRow
|
|
137
138
|
v-for="(item, index) in $props.items"
|
|
139
|
+
align="center-left"
|
|
140
|
+
height="36px"
|
|
141
|
+
:wrap="false"
|
|
138
142
|
:key="index"
|
|
143
|
+
@click="$props.multiple ?
|
|
144
|
+
onCheckboxChange(item[$props.itemValue!]) :
|
|
145
|
+
onRadioChange(item[$props.itemValue!])
|
|
146
|
+
"
|
|
139
147
|
>
|
|
140
|
-
<
|
|
141
|
-
|
|
142
|
-
:
|
|
143
|
-
:editable="$props.editable"
|
|
144
|
-
:modelValue="$props.modelValue?.includes(item[$props.itemValue!])"
|
|
145
|
-
@update:modelValue="() => onCheckboxChange(item[$props.itemValue!])"
|
|
146
|
-
>
|
|
147
|
-
<template
|
|
148
|
-
#label="{ font }"
|
|
149
|
-
>
|
|
150
|
-
<FSRow
|
|
151
|
-
align="center-left"
|
|
152
|
-
:wrap="false"
|
|
153
|
-
>
|
|
154
|
-
<slot
|
|
155
|
-
name="item-prepend"
|
|
156
|
-
v-bind="{ item }"
|
|
157
|
-
/>
|
|
158
|
-
<FSSpan
|
|
159
|
-
:font="font"
|
|
160
|
-
>
|
|
161
|
-
{{ item[$props.itemTitle!] }}
|
|
162
|
-
</FSSpan>
|
|
163
|
-
</FSRow>
|
|
164
|
-
</template>
|
|
165
|
-
</FSCheckbox>
|
|
166
|
-
<FSRadio
|
|
167
|
-
v-else
|
|
168
|
-
:selected="$props.modelValue === item[$props.itemValue!]"
|
|
169
|
-
:label="item[$props.itemTitle!]"
|
|
170
|
-
:editable="$props.editable"
|
|
171
|
-
:item="item"
|
|
172
|
-
:modelValue="item[$props.itemValue!]"
|
|
173
|
-
@update:modelValue="() => onRadioChange(item[$props.itemValue!])"
|
|
148
|
+
<FSRow
|
|
149
|
+
style="min-width: 0;"
|
|
150
|
+
:wrap="false"
|
|
174
151
|
>
|
|
175
|
-
<
|
|
176
|
-
|
|
152
|
+
<slot
|
|
153
|
+
name="item-prepend"
|
|
154
|
+
v-bind="{ item }"
|
|
155
|
+
/>
|
|
156
|
+
<FSSpan
|
|
157
|
+
:font="selectedItems.includes(item) ? 'text-button' : 'text-body'"
|
|
177
158
|
>
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
>
|
|
182
|
-
<slot
|
|
183
|
-
name="item-prepend"
|
|
184
|
-
v-bind="{ item }"
|
|
185
|
-
/>
|
|
186
|
-
<FSSpan
|
|
187
|
-
:font="font"
|
|
188
|
-
>
|
|
189
|
-
{{ item[$props.itemTitle!] }}
|
|
190
|
-
</FSSpan>
|
|
191
|
-
</FSRow>
|
|
192
|
-
</template>
|
|
193
|
-
</FSRadio>
|
|
159
|
+
{{ item[$props.itemTitle!] }}
|
|
160
|
+
</FSSpan>
|
|
161
|
+
</FSRow>
|
|
194
162
|
<FSRow
|
|
195
163
|
align="center-right"
|
|
164
|
+
width="hug"
|
|
165
|
+
:wrap="false"
|
|
196
166
|
>
|
|
197
167
|
<slot
|
|
198
168
|
name="item-append"
|
|
199
169
|
v-bind="{ item }"
|
|
200
170
|
/>
|
|
171
|
+
<FSCheckbox
|
|
172
|
+
v-if="$props.multiple"
|
|
173
|
+
:editable="$props.editable"
|
|
174
|
+
:modelValue="$props.modelValue?.includes(item[$props.itemValue!])"
|
|
175
|
+
@update:modelValue="onCheckboxChange(item[$props.itemValue!])"
|
|
176
|
+
/>
|
|
177
|
+
<FSRadio
|
|
178
|
+
v-else
|
|
179
|
+
:selected="$props.modelValue === item[$props.itemValue!]"
|
|
180
|
+
:editable="$props.editable"
|
|
181
|
+
:item="item"
|
|
182
|
+
:modelValue="item[$props.itemValue!]"
|
|
183
|
+
@update:modelValue="onRadioChange(item[$props.itemValue!])"
|
|
184
|
+
/>
|
|
201
185
|
</FSRow>
|
|
202
186
|
</FSRow>
|
|
203
187
|
</FSCol>
|
|
@@ -215,6 +199,7 @@
|
|
|
215
199
|
</FSCol>
|
|
216
200
|
<FSBaseField
|
|
217
201
|
v-else
|
|
202
|
+
:style="style"
|
|
218
203
|
:description="$props.description"
|
|
219
204
|
:hideHeader="$props.hideHeader"
|
|
220
205
|
:required="$props.required"
|
|
@@ -262,7 +247,6 @@
|
|
|
262
247
|
:rules="$props.rules"
|
|
263
248
|
:hideDetails="true"
|
|
264
249
|
:menuIcon="null"
|
|
265
|
-
:style="style"
|
|
266
250
|
:modelValue="$props.modelValue"
|
|
267
251
|
@update:modelValue="onSingleChange"
|
|
268
252
|
v-bind="$attrs"
|
|
@@ -401,6 +385,7 @@
|
|
|
401
385
|
</v-select>
|
|
402
386
|
<FSSlideGroup
|
|
403
387
|
v-if="$props.multiple && Array.isArray($props.modelValue)"
|
|
388
|
+
class="fs-select-field-multiple-slide-group"
|
|
404
389
|
>
|
|
405
390
|
<FSCard
|
|
406
391
|
v-for="(item, index) in $props.items.filter((item: any) => $props.modelValue.includes(item[$props.itemValue!]))"
|
|
@@ -428,6 +413,7 @@
|
|
|
428
413
|
<FSButton
|
|
429
414
|
icon="mdi-close"
|
|
430
415
|
variant="icon"
|
|
416
|
+
:editable="$props.editable"
|
|
431
417
|
:color="ColorEnum.Dark"
|
|
432
418
|
@click="() => onCheckboxChange(item[$props.itemValue!])"
|
|
433
419
|
/>
|
|
@@ -582,6 +568,7 @@ export default defineComponent({
|
|
|
582
568
|
"--fs-select-field-border-color" : lights.base,
|
|
583
569
|
"--fs-select-field-color" : lights.dark,
|
|
584
570
|
"--fs-select-field-active-border-color": lights.base,
|
|
571
|
+
"--fs-select-field-multiple-opacity" : "var(--v-disabled-opacity)",
|
|
585
572
|
"--fs-base-field-input-height" : isMobileSized.value ? "34px" : "38px",
|
|
586
573
|
...fontStyles.value
|
|
587
574
|
};
|
|
@@ -593,6 +580,7 @@ export default defineComponent({
|
|
|
593
580
|
"--fs-select-field-color" : darks.base,
|
|
594
581
|
"--fs-select-field-active-border-color": darks.dark,
|
|
595
582
|
"--fs-select-field-error-border-color" : errors.base,
|
|
583
|
+
"--fs-select-field-multiple-opacity" : "1",
|
|
596
584
|
"--fs-base-field-input-height" : isMobileSized.value ? "34px" : "38px",
|
|
597
585
|
...fontStyles.value
|
|
598
586
|
};
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
</template>
|
|
85
85
|
|
|
86
86
|
<script lang="ts">
|
|
87
|
-
import { computed, defineComponent, type PropType, ref, watch } from "vue";
|
|
87
|
+
import { computed, defineComponent, onMounted, type PropType, ref, watch } from "vue";
|
|
88
88
|
import _ from "lodash";
|
|
89
89
|
|
|
90
90
|
import { DateRules, NumberRules, TextRules } from "@dative-gpi/foundation-shared-components/models";
|
|
@@ -189,8 +189,8 @@ export default defineComponent({
|
|
|
189
189
|
});
|
|
190
190
|
|
|
191
191
|
const actualValue = computed(() => {
|
|
192
|
-
const dates = [parseForPicker(innerStartDate.value), parseForPicker(innerEndDate.value)]
|
|
193
|
-
if(dates.some(d => d == null)) {
|
|
192
|
+
const dates = [parseForPicker(innerStartDate.value), parseForPicker(innerEndDate.value)];
|
|
193
|
+
if (dates.some(d => d == null)) {
|
|
194
194
|
return null;
|
|
195
195
|
}
|
|
196
196
|
return dates as [number, number];
|
|
@@ -650,14 +650,17 @@ export default defineComponent({
|
|
|
650
650
|
innerDateValue.value = 1;
|
|
651
651
|
};
|
|
652
652
|
|
|
653
|
+
// This watcher is called once even if both value are set at the same time
|
|
653
654
|
watch([() => props.startDate, () => props.endDate], () => {
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
innerEndDate.value !== props.endDate
|
|
657
|
-
) {
|
|
655
|
+
// Having one of those different from the inner value means something up the chain is updating
|
|
656
|
+
if (props.startDate !== innerStartDate.value || props.endDate !== innerEndDate.value) {
|
|
658
657
|
reset();
|
|
659
658
|
}
|
|
660
|
-
}
|
|
659
|
+
});
|
|
660
|
+
|
|
661
|
+
onMounted((): void => {
|
|
662
|
+
reset();
|
|
663
|
+
});
|
|
661
664
|
|
|
662
665
|
return {
|
|
663
666
|
innerDateSetting,
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
</template>
|
|
78
78
|
|
|
79
79
|
<script lang="ts">
|
|
80
|
-
import { defineComponent, type PropType, ref } from 'vue';
|
|
80
|
+
import { defineComponent, type PropType, ref, watch } from 'vue';
|
|
81
81
|
|
|
82
82
|
import { useAppLanguages } from "@dative-gpi/foundation-shared-services/composables";
|
|
83
83
|
|
|
@@ -134,7 +134,10 @@ export default defineComponent({
|
|
|
134
134
|
setup(props, { emit }) {
|
|
135
135
|
const { languages } = useAppLanguages();
|
|
136
136
|
|
|
137
|
-
const innerTranslations = ref
|
|
137
|
+
const innerTranslations = ref<{
|
|
138
|
+
languageCode: string;
|
|
139
|
+
[key: string]: string | object | null;
|
|
140
|
+
}[]>([]);
|
|
138
141
|
|
|
139
142
|
const getTranslation = (languageCode: string): string | object => {
|
|
140
143
|
if (!innerTranslations.value) {
|
|
@@ -178,6 +181,18 @@ export default defineComponent({
|
|
|
178
181
|
emit('update:translationsExpanded', false);
|
|
179
182
|
};
|
|
180
183
|
|
|
184
|
+
watch(() => props.translations, (newTranslations) => {
|
|
185
|
+
innerTranslations.value = newTranslations.map((translation) => {
|
|
186
|
+
if(typeof translation[props.property] === 'string'){
|
|
187
|
+
return translation;
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
...translation,
|
|
191
|
+
[props.property]: JSON.stringify(translation[props.property])
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
}, { immediate: true, deep: true });
|
|
195
|
+
|
|
181
196
|
return {
|
|
182
197
|
languages,
|
|
183
198
|
onCancelTranslations,
|
|
@@ -17,10 +17,13 @@
|
|
|
17
17
|
{{ $tr("ui.common.every", "Every") }}
|
|
18
18
|
</FSSpan>
|
|
19
19
|
<FSSelectDays
|
|
20
|
+
width="200px"
|
|
21
|
+
:placeholder="$tr('ui.common.selected-days', '{0} selected day(s)', days.length)"
|
|
20
22
|
:editable="$props.editable"
|
|
23
|
+
:multiple="true"
|
|
21
24
|
:useAllDays="false"
|
|
22
25
|
:hideHeader="true"
|
|
23
|
-
:modelValue="
|
|
26
|
+
:modelValue="days"
|
|
24
27
|
@update:modelValue="onUpdateDay($event)"
|
|
25
28
|
/>
|
|
26
29
|
<FSSpan
|
|
@@ -80,11 +83,13 @@ export default defineComponent({
|
|
|
80
83
|
|
|
81
84
|
const selectedConfiguration = ref("custom");
|
|
82
85
|
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
return
|
|
86
|
+
const days = computed((): number[] => {
|
|
87
|
+
try {
|
|
88
|
+
return props.modelValue[4].split(",").map((day) => parseInt(day) - 1);
|
|
89
|
+
} catch (error) {
|
|
90
|
+
console.error("Error parsing days:", error);
|
|
91
|
+
return [];
|
|
86
92
|
}
|
|
87
|
-
return parseInt(props.modelValue[4]) - 1;
|
|
88
93
|
});
|
|
89
94
|
|
|
90
95
|
const time = computed((): number => {
|
|
@@ -94,16 +99,21 @@ export default defineComponent({
|
|
|
94
99
|
return ((parseInt(props.modelValue[0])) + (parseInt(props.modelValue[1]) * 60)) * 60 * 1000;
|
|
95
100
|
});
|
|
96
101
|
|
|
97
|
-
const onUpdateDay = (value: number): void => {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
102
|
+
const onUpdateDay = (value: number[]): void => {
|
|
103
|
+
if(value.length === 0) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const hours = Math.floor(time.value / (60 * 60 * 1000));
|
|
107
|
+
const minutes = Math.floor(time.value / (60 * 1000) % 60);
|
|
108
|
+
const daysCron = value.map((day) => day + 1).join(",");
|
|
109
|
+
emit("update:modelValue", [`${minutes}`, `${hours}`, `*`, `*`, `${daysCron}`]);
|
|
101
110
|
};
|
|
102
111
|
|
|
103
112
|
const onUpdateHours = (value: number): void => {
|
|
104
113
|
const hours = Math.floor(value / (60 * 60 * 1000));
|
|
105
114
|
const minutes = Math.floor(value / (60 * 1000) % 60);
|
|
106
|
-
|
|
115
|
+
const daysCron = days.value.map((day) => day + 1).join(",");
|
|
116
|
+
emit("update:modelValue", [`${minutes}`, `${hours}`, `*`, `*`, `${daysCron}`]);
|
|
107
117
|
};
|
|
108
118
|
|
|
109
119
|
return {
|
|
@@ -111,7 +121,7 @@ export default defineComponent({
|
|
|
111
121
|
selectedConfiguration,
|
|
112
122
|
ColorEnum,
|
|
113
123
|
time,
|
|
114
|
-
|
|
124
|
+
days,
|
|
115
125
|
onUpdateHours,
|
|
116
126
|
onUpdateDay
|
|
117
127
|
};
|