@dative-gpi/foundation-shared-components 1.0.131 → 1.0.132
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/FSDialogMenu.vue +17 -8
- package/components/FSDialogRemove.vue +1 -1
- package/components/FSFadeOut.vue +1 -1
- package/components/FSSpan.vue +8 -5
- package/components/FSText.vue +7 -5
- package/components/fields/FSAutocompleteField.vue +36 -52
- package/components/fields/FSSelectField.vue +36 -52
- package/components/fields/FSTranslateRichTextField.vue +17 -2
- package/components/lists/FSDataTableUI.vue +22 -14
- package/components/map/FSMap.vue +18 -8
- package/components/map/FSMapOverlay.vue +34 -19
- package/components/tiles/FSLocationTileUI.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 +11 -7
- package/styles/components/fs_password_field.scss +4 -2
- package/styles/components/fs_span.scss +12 -4
- package/styles/components/fs_tabs.scss +9 -5
- package/styles/components/fs_tag.scss +9 -7
- 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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<v-breadcrumbs
|
|
3
3
|
class="fs-breadcrumbs"
|
|
4
|
-
:items="
|
|
4
|
+
:items="items"
|
|
5
5
|
:style="style"
|
|
6
6
|
v-bind="$attrs"
|
|
7
7
|
>
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
#title="{ item }"
|
|
10
10
|
>
|
|
11
11
|
<FSSpan
|
|
12
|
-
|
|
12
|
+
class="fs-breadcrumbs-label"
|
|
13
13
|
>
|
|
14
14
|
{{ item.title }}
|
|
15
15
|
</FSSpan>
|
|
@@ -31,7 +31,9 @@
|
|
|
31
31
|
import { computed, defineComponent, type PropType, type StyleValue } from "vue";
|
|
32
32
|
|
|
33
33
|
import { ColorEnum, type FSBreadcrumbItem } from "@dative-gpi/foundation-shared-components/models";
|
|
34
|
-
import { useColors } from "@dative-gpi/foundation-shared-components/composables";
|
|
34
|
+
import { useBreakpoints, useColors } from "@dative-gpi/foundation-shared-components/composables";
|
|
35
|
+
|
|
36
|
+
import { sizeToVar } from "../utils";
|
|
35
37
|
|
|
36
38
|
import FSSpan from "./FSSpan.vue";
|
|
37
39
|
import FSIcon from "./FSIcon.vue";
|
|
@@ -49,28 +51,34 @@ export default defineComponent({
|
|
|
49
51
|
default: () => []
|
|
50
52
|
}
|
|
51
53
|
},
|
|
52
|
-
setup() {
|
|
54
|
+
setup(props) {
|
|
55
|
+
const { isExtraSmall } = useBreakpoints();
|
|
53
56
|
const { getColors } = useColors();
|
|
54
57
|
|
|
55
58
|
const darks = getColors(ColorEnum.Dark);
|
|
56
59
|
|
|
57
60
|
const style = computed((): StyleValue => ({
|
|
61
|
+
"--fs-breadcrumbs-height" : sizeToVar(["20px", "16px"]),
|
|
58
62
|
"--fs-breadcrumbs-color" : darks.dark,
|
|
59
63
|
"--fs-breadcrumbs-active-color" : darks.base,
|
|
60
64
|
"--fs-breadcrumbs-disabled-color": darks.soft
|
|
61
65
|
}));
|
|
62
66
|
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
+
const items = computed((): FSBreadcrumbItem[] => {
|
|
68
|
+
if (isExtraSmall.value && props.items.length > 3) {
|
|
69
|
+
const mobileItems: FSBreadcrumbItem[] = [0, -2, -1].map((index) => props.items.at(index)!)
|
|
70
|
+
mobileItems.splice(1, 0, {
|
|
71
|
+
title : "...",
|
|
72
|
+
disabled : true
|
|
73
|
+
});
|
|
74
|
+
return mobileItems;
|
|
67
75
|
}
|
|
68
|
-
return
|
|
69
|
-
};
|
|
76
|
+
return props.items;
|
|
77
|
+
});
|
|
70
78
|
|
|
71
79
|
return {
|
|
72
|
-
|
|
73
|
-
|
|
80
|
+
items,
|
|
81
|
+
style
|
|
74
82
|
};
|
|
75
83
|
}
|
|
76
84
|
});
|
|
@@ -5,9 +5,8 @@
|
|
|
5
5
|
v-bind="$attrs"
|
|
6
6
|
>
|
|
7
7
|
<FSCard
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
gap="24px"
|
|
8
|
+
:padding="$props.padding"
|
|
9
|
+
:gap="$props.gap"
|
|
11
10
|
:color="$props.color"
|
|
12
11
|
:class="classes"
|
|
13
12
|
>
|
|
@@ -38,11 +37,21 @@ export default defineComponent({
|
|
|
38
37
|
FSCard
|
|
39
38
|
},
|
|
40
39
|
props: {
|
|
41
|
-
|
|
40
|
+
classes: {
|
|
42
41
|
type: [Array, String] as PropType<string[] | string | null>,
|
|
43
42
|
required: false,
|
|
44
43
|
default: null
|
|
45
44
|
},
|
|
45
|
+
padding: {
|
|
46
|
+
type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
|
|
47
|
+
required: false,
|
|
48
|
+
default: "8px"
|
|
49
|
+
},
|
|
50
|
+
gap: {
|
|
51
|
+
type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>,
|
|
52
|
+
required: false,
|
|
53
|
+
default: "24px"
|
|
54
|
+
},
|
|
46
55
|
modelValue: {
|
|
47
56
|
type: Boolean,
|
|
48
57
|
required: false,
|
|
@@ -60,12 +69,12 @@ export default defineComponent({
|
|
|
60
69
|
|
|
61
70
|
const classes = computed((): string[] => {
|
|
62
71
|
const classNames = ["fs-dialog-menu"];
|
|
63
|
-
if (props.
|
|
64
|
-
if (Array.isArray(props.
|
|
65
|
-
classNames.push(...props.
|
|
72
|
+
if (props.classes) {
|
|
73
|
+
if (Array.isArray(props.classes)) {
|
|
74
|
+
classNames.push(...props.classes);
|
|
66
75
|
}
|
|
67
76
|
else {
|
|
68
|
-
classNames.push(props.
|
|
77
|
+
classNames.push(props.classes);
|
|
69
78
|
}
|
|
70
79
|
}
|
|
71
80
|
return classNames;
|
package/components/FSFadeOut.vue
CHANGED
|
@@ -87,7 +87,7 @@ export default defineComponent({
|
|
|
87
87
|
|
|
88
88
|
const elementId = `id${uuidv4()}`;
|
|
89
89
|
|
|
90
|
-
const showOutsideScrollbar = computed(() => props.scrollOutside && !isTouchScreenEnabled);
|
|
90
|
+
const showOutsideScrollbar = computed(() => props.scrollOutside && !isTouchScreenEnabled.value);
|
|
91
91
|
|
|
92
92
|
const style = computed((): {[index: string]: string} => ({
|
|
93
93
|
"--fs-fade-out-height" : props.height ? sizeToVar(props.height) : "initial",
|
package/components/FSSpan.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">
|
|
@@ -49,6 +51,7 @@ export default defineComponent({
|
|
|
49
51
|
const { slots } = useSlots();
|
|
50
52
|
|
|
51
53
|
const style = computed((): StyleValue => ({
|
|
54
|
+
"--fs-span-text-align": props.align,
|
|
52
55
|
"--fs-span-line-clamp": props.lineClamp.toString(),
|
|
53
56
|
...fontStyles.value
|
|
54
57
|
}));
|
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">
|
|
@@ -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>
|
|
@@ -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,
|
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
style="position: relative;"
|
|
5
5
|
>
|
|
6
6
|
<FSRow
|
|
7
|
-
v-if="$props.showSearch || (!
|
|
7
|
+
v-if="$props.showSearch || (!isMobileSized && ($slots['prepend-toolbar'] || $slots['toolbar'] || $slots['append-toolbar'])) || (!$props.disableTable && !$props.disableIterator)"
|
|
8
8
|
align="bottom-left"
|
|
9
|
-
:wrap="
|
|
9
|
+
:wrap="isMobileSized ? false : true"
|
|
10
10
|
width="fill"
|
|
11
11
|
>
|
|
12
12
|
<slot
|
|
13
|
-
v-if="!
|
|
13
|
+
v-if="!isMobileSized"
|
|
14
14
|
name="prepend-toolbar"
|
|
15
15
|
/>
|
|
16
16
|
<template
|
|
@@ -28,16 +28,22 @@
|
|
|
28
28
|
/>
|
|
29
29
|
</template>
|
|
30
30
|
<slot
|
|
31
|
-
v-if="!
|
|
31
|
+
v-if="!isMobileSized"
|
|
32
32
|
name="toolbar"
|
|
33
33
|
/>
|
|
34
34
|
<template
|
|
35
|
-
v-if="!$props.disableTable && !$props.disableIterator"
|
|
35
|
+
v-if="$slots['append-toolbar'] || (!$props.disableTable && !$props.disableIterator)"
|
|
36
36
|
>
|
|
37
37
|
<FSRow
|
|
38
38
|
align="center-right"
|
|
39
|
+
:width="isExtraSmall ? 'hug' : 'fill'"
|
|
39
40
|
>
|
|
41
|
+
<slot
|
|
42
|
+
v-if="!isMobileSized"
|
|
43
|
+
name="append-toolbar"
|
|
44
|
+
/>
|
|
40
45
|
<FSOptionGroup
|
|
46
|
+
v-if="!$props.disableTable && !$props.disableIterator"
|
|
41
47
|
:values="modeOptions"
|
|
42
48
|
:singleColor="true"
|
|
43
49
|
:required="true"
|
|
@@ -48,13 +54,19 @@
|
|
|
48
54
|
</template>
|
|
49
55
|
</FSRow>
|
|
50
56
|
<FSRow
|
|
51
|
-
v-if="
|
|
57
|
+
v-if="isMobileSized && ($slots['prepend-toolbar'] || $slots['toolbar'] || $slots['append-toolbar'])"
|
|
52
58
|
>
|
|
53
|
-
<
|
|
59
|
+
<FSSlideGroup>
|
|
60
|
+
<slot
|
|
61
|
+
name="prepend-toolbar"
|
|
62
|
+
/>
|
|
54
63
|
<slot
|
|
55
64
|
name="toolbar"
|
|
56
65
|
/>
|
|
57
|
-
|
|
66
|
+
<slot
|
|
67
|
+
name="append-toolbar"
|
|
68
|
+
/>
|
|
69
|
+
</FSSlideGroup>
|
|
58
70
|
</FSRow>
|
|
59
71
|
<FSRow
|
|
60
72
|
v-if="showFiltersRow"
|
|
@@ -900,8 +912,8 @@ export default defineComponent({
|
|
|
900
912
|
},
|
|
901
913
|
emits: ["update:modelValue", "update:headers", "update:search", "update:showFilters", "update:filters", "update:mode", "update:sortBy", "update:rowsPerPage", "update:page", "update:include", "update:items", "click:row"],
|
|
902
914
|
setup(props, { emit }) {
|
|
915
|
+
const { isExtraSmall, isMobileSized } = useBreakpoints();
|
|
903
916
|
const { handleRoutingEvent } = useRouting();
|
|
904
|
-
const { isExtraSmall } = useBreakpoints();
|
|
905
917
|
const { $tr } = useTranslationsProvider();
|
|
906
918
|
const { getColors } = useColors();
|
|
907
919
|
const router = useRouter();
|
|
@@ -962,10 +974,6 @@ export default defineComponent({
|
|
|
962
974
|
|
|
963
975
|
});
|
|
964
976
|
|
|
965
|
-
const hasToolbar = computed((): boolean => {
|
|
966
|
-
return !!useSlots().slots["toolbar"];
|
|
967
|
-
});
|
|
968
|
-
|
|
969
977
|
const innerSlots = computed((): { [label: string]: Slot<any> } => {
|
|
970
978
|
const slots = { ...useSlots().slots };
|
|
971
979
|
delete slots["toolbar"];
|
|
@@ -1577,7 +1585,6 @@ export default defineComponent({
|
|
|
1577
1585
|
innerMode,
|
|
1578
1586
|
modeOptions,
|
|
1579
1587
|
innerPage,
|
|
1580
|
-
hasToolbar,
|
|
1581
1588
|
pageOptions,
|
|
1582
1589
|
innerShowFilters,
|
|
1583
1590
|
showFiltersRow,
|
|
@@ -1596,6 +1603,7 @@ export default defineComponent({
|
|
|
1596
1603
|
classes,
|
|
1597
1604
|
style,
|
|
1598
1605
|
size,
|
|
1606
|
+
isMobileSized,
|
|
1599
1607
|
isExtraSmall,
|
|
1600
1608
|
draggableDisabled,
|
|
1601
1609
|
elementId,
|
package/components/map/FSMap.vue
CHANGED
|
@@ -100,17 +100,18 @@
|
|
|
100
100
|
</FSCol>
|
|
101
101
|
|
|
102
102
|
<FSMapOverlay
|
|
103
|
-
v-if="$slots['overlay']"
|
|
104
103
|
:mode="$props.overlayMode"
|
|
105
104
|
@update:mode="$emit('update:overlayMode', $event)"
|
|
106
105
|
@update:height="(height) => overlayHeight = height"
|
|
107
106
|
@update:width="(width) => overlayWidth = width"
|
|
108
107
|
>
|
|
109
108
|
<template
|
|
110
|
-
|
|
109
|
+
v-for="(_, name) in overlaySlots"
|
|
110
|
+
v-slot:[name]="slotData"
|
|
111
111
|
>
|
|
112
112
|
<slot
|
|
113
|
-
name="overlay"
|
|
113
|
+
:name="'overlay-' + name"
|
|
114
|
+
v-bind="slotData"
|
|
114
115
|
/>
|
|
115
116
|
</template>
|
|
116
117
|
</FSMapOverlay>
|
|
@@ -126,7 +127,7 @@ import { map as createMap, control, tileLayer, latLngBounds, latLng, type LatLng
|
|
|
126
127
|
import { useTranslations as useTranslationsProvider } from "@dative-gpi/bones-ui/composables";
|
|
127
128
|
import { type FSArea } from '@dative-gpi/foundation-shared-domain/models';
|
|
128
129
|
|
|
129
|
-
import { useBreakpoints, useColors } from "../../composables";
|
|
130
|
+
import { useBreakpoints, useColors, useSlots } from "../../composables";
|
|
130
131
|
import { ColorEnum, type FSLocation, type MapLayer } from "../../models";
|
|
131
132
|
|
|
132
133
|
import FSMapLayerButton from "./FSMapLayerButton.vue";
|
|
@@ -231,8 +232,9 @@ export default defineComponent({
|
|
|
231
232
|
emits: ["update:modelValue", "update:selectedLocationId", "update:selectedAreaId", 'update:overlayMode', 'update:currentLayer', "click:latlng"],
|
|
232
233
|
setup(props, { emit }) {
|
|
233
234
|
const { $tr } = useTranslationsProvider();
|
|
234
|
-
const { getColors } = useColors();
|
|
235
235
|
const { isExtraSmall } = useBreakpoints();
|
|
236
|
+
const { getColors } = useColors();
|
|
237
|
+
const { slots } = useSlots();
|
|
236
238
|
|
|
237
239
|
const leafletContainer = ref<HTMLElement>();
|
|
238
240
|
const locationGroupBounds = ref<LatLngBounds>();
|
|
@@ -257,7 +259,7 @@ export default defineComponent({
|
|
|
257
259
|
name: "map",
|
|
258
260
|
label: $tr("ui.map-layer.map", "Map"),
|
|
259
261
|
image: new URL("../../assets/images/map/map.png", import.meta.url).href,
|
|
260
|
-
layer: tileLayer(`
|
|
262
|
+
layer: tileLayer(`https://{s}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}&key=${import.meta.env.VITE_GOOGLE_MAPS_API_KEY ?? ""}`, {
|
|
261
263
|
maxZoom: 22,
|
|
262
264
|
subdomains: ['mt0', 'mt1', 'mt2', 'mt3'],
|
|
263
265
|
attribution: '© Google Map Data'
|
|
@@ -267,7 +269,7 @@ export default defineComponent({
|
|
|
267
269
|
name: "imagery",
|
|
268
270
|
label: $tr("ui.map-layer.imagery", "Imagery"),
|
|
269
271
|
image: new URL("../../assets/images/map/imagery.png", import.meta.url).href,
|
|
270
|
-
layer: tileLayer(`
|
|
272
|
+
layer: tileLayer(`https://{s}.google.com/vt/lyrs=s,h&x={x}&y={y}&z={z}&key=${import.meta.env.VITE_GOOGLE_MAPS_API_KEY ?? ""}`, {
|
|
271
273
|
maxZoom: 22,
|
|
272
274
|
subdomains: ['mt0', 'mt1', 'mt2', 'mt3'],
|
|
273
275
|
attribution: '© Google Map Data'
|
|
@@ -314,6 +316,13 @@ export default defineComponent({
|
|
|
314
316
|
return bounds as LatLngBounds;
|
|
315
317
|
});
|
|
316
318
|
|
|
319
|
+
const overlaySlots = computed(() => {
|
|
320
|
+
return Object.keys(slots).filter((slot) => slot.startsWith("overlay-")).reduce((acc, slot) => {
|
|
321
|
+
acc[slot.replace("overlay-", "")] = slots[slot];
|
|
322
|
+
return acc;
|
|
323
|
+
}, {} as Record<string, unknown>);
|
|
324
|
+
});
|
|
325
|
+
|
|
317
326
|
const calculateTargetPosition = (target: L.LatLng, zoom?: number) => {
|
|
318
327
|
if(!map.value) {
|
|
319
328
|
return target;
|
|
@@ -468,7 +477,8 @@ export default defineComponent({
|
|
|
468
477
|
actualLayer,
|
|
469
478
|
mapLayers,
|
|
470
479
|
gpsPosition,
|
|
471
|
-
style
|
|
480
|
+
style,
|
|
481
|
+
overlaySlots
|
|
472
482
|
};
|
|
473
483
|
}
|
|
474
484
|
});
|