@dative-gpi/foundation-shared-components 1.1.2 → 1.1.3-sandbox-1
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.
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
:color="$props.color"
|
|
11
11
|
:class="classes"
|
|
12
12
|
>
|
|
13
|
+
<FSCol>
|
|
14
|
+
<slot
|
|
15
|
+
name="body"
|
|
16
|
+
/>
|
|
17
|
+
</FSCol>
|
|
13
18
|
<template
|
|
14
19
|
v-for="(_, name) in $slots"
|
|
15
20
|
v-slot:[name]="slotData"
|
|
@@ -30,11 +35,13 @@ import { type ColorBase, ColorEnum } from "@dative-gpi/foundation-shared-compone
|
|
|
30
35
|
import { useBreakpoints } from "@dative-gpi/foundation-shared-components/composables";
|
|
31
36
|
|
|
32
37
|
import FSCard from "./FSCard.vue";
|
|
38
|
+
import FSCol from "./FSCol.vue";
|
|
33
39
|
|
|
34
40
|
export default defineComponent({
|
|
35
41
|
name: "FSDialogMenu",
|
|
36
42
|
components: {
|
|
37
|
-
FSCard
|
|
43
|
+
FSCard,
|
|
44
|
+
FSCol
|
|
38
45
|
},
|
|
39
46
|
props: {
|
|
40
47
|
classes: {
|
|
@@ -48,26 +48,30 @@ export default {
|
|
|
48
48
|
to: {
|
|
49
49
|
type: Object as PropType<RouteLocation | null>,
|
|
50
50
|
required: false
|
|
51
|
+
},
|
|
52
|
+
html: {
|
|
53
|
+
type: [String, HTMLElement] as PropType<string | HTMLElement>,
|
|
54
|
+
required: false
|
|
51
55
|
}
|
|
52
56
|
},
|
|
53
57
|
emits: ['click', 'auxclick'],
|
|
54
58
|
setup(props, { emit }) {
|
|
55
59
|
const map = inject<Ref<Map | null>>(MAP);
|
|
56
60
|
const markerClusterGroup = inject<Ref<MarkerClusterGroup | null>>(MARKERCLUSTERGROUP, ref(null));
|
|
57
|
-
|
|
61
|
+
|
|
58
62
|
const { getColors } = useColors();
|
|
59
63
|
const { handleRoutingEvent } = useRouting();
|
|
60
64
|
|
|
61
|
-
if(!map) {
|
|
65
|
+
if (!map) {
|
|
62
66
|
throw new Error('FSMapTileLayer must be used inside a FSMap component');
|
|
63
67
|
}
|
|
64
68
|
|
|
65
|
-
if(!map.value) {
|
|
69
|
+
if (!map.value) {
|
|
66
70
|
throw new Error('FSMapTileLayer must be used inside a FSMap component with a map');
|
|
67
71
|
}
|
|
68
|
-
|
|
72
|
+
|
|
69
73
|
const getMarkerIcon = () => {
|
|
70
|
-
if(props.variant === 'gps') {
|
|
74
|
+
if (props.variant === 'gps') {
|
|
71
75
|
const size = 16;
|
|
72
76
|
return divIcon({
|
|
73
77
|
html: gpsMarkerHtml(),
|
|
@@ -77,7 +81,7 @@ export default {
|
|
|
77
81
|
});
|
|
78
82
|
}
|
|
79
83
|
|
|
80
|
-
if(props.variant === 'location') {
|
|
84
|
+
if (props.variant === 'location') {
|
|
81
85
|
const size = 36;
|
|
82
86
|
return divIcon({
|
|
83
87
|
html: locationMarkerHtml(props.icon ?? "mdi-map-marker", getColors(props.color).base, props.label),
|
|
@@ -89,7 +93,7 @@ export default {
|
|
|
89
93
|
|
|
90
94
|
const size = 16;
|
|
91
95
|
return divIcon({
|
|
92
|
-
html: pinMarkerHtml(getColors(props.color).base, props.label),
|
|
96
|
+
html: props.html ?? pinMarkerHtml(getColors(props.color).base, props.label),
|
|
93
97
|
iconSize: [size, size],
|
|
94
98
|
className: props.selected ? 'fs-map-marker fs-map-pin fs-map-pin-selected' : 'fs-map-marker fs-map-pin',
|
|
95
99
|
iconAnchor: [size / 2, size / 2],
|
|
@@ -103,11 +107,11 @@ export default {
|
|
|
103
107
|
});
|
|
104
108
|
|
|
105
109
|
const onClick = (event: MouseEvent) => {
|
|
106
|
-
if(props.to) {
|
|
110
|
+
if (props.to) {
|
|
107
111
|
handleRoutingEvent(event, props.to, true);
|
|
108
112
|
return;
|
|
109
113
|
}
|
|
110
|
-
|
|
114
|
+
|
|
111
115
|
emit('click', {
|
|
112
116
|
...event,
|
|
113
117
|
latlng: props.latlng
|
|
@@ -115,7 +119,7 @@ export default {
|
|
|
115
119
|
}
|
|
116
120
|
|
|
117
121
|
const onAuxClick = (event: MouseEvent) => {
|
|
118
|
-
if(props.to) {
|
|
122
|
+
if (props.to) {
|
|
119
123
|
handleRoutingEvent(event, props.to);
|
|
120
124
|
return;
|
|
121
125
|
}
|
|
@@ -127,19 +131,19 @@ export default {
|
|
|
127
131
|
}
|
|
128
132
|
|
|
129
133
|
watch(map, () => {
|
|
130
|
-
if(!map.value) {
|
|
134
|
+
if (!map.value) {
|
|
131
135
|
return;
|
|
132
136
|
}
|
|
133
137
|
|
|
134
|
-
if(markerClusterGroup && markerClusterGroup.value) {
|
|
138
|
+
if (markerClusterGroup && markerClusterGroup.value) {
|
|
135
139
|
actualMarker.value.addTo(markerClusterGroup.value);
|
|
136
140
|
} else {
|
|
137
141
|
actualMarker.value.addTo(map.value);
|
|
138
142
|
}
|
|
139
143
|
}, { immediate: true });
|
|
140
144
|
|
|
141
|
-
watch([() => props.variant, () => props.color, () => props.selected], () => {
|
|
142
|
-
if(!actualMarker.value || !map.value) {
|
|
145
|
+
watch([() => props.variant, () => props.color, () => props.selected, () => props.html], () => {
|
|
146
|
+
if (!actualMarker.value || !map.value) {
|
|
143
147
|
return;
|
|
144
148
|
}
|
|
145
149
|
|
|
@@ -148,7 +152,7 @@ export default {
|
|
|
148
152
|
});
|
|
149
153
|
|
|
150
154
|
watch([() => props.latlng?.lat, () => props.latlng?.lng], () => {
|
|
151
|
-
if(!actualMarker.value || !map.value || !props.latlng) {
|
|
155
|
+
if (!actualMarker.value || !map.value || !props.latlng) {
|
|
152
156
|
return;
|
|
153
157
|
}
|
|
154
158
|
|
|
@@ -156,7 +160,7 @@ export default {
|
|
|
156
160
|
});
|
|
157
161
|
|
|
158
162
|
watch(markerElement, (newMarkerElement) => {
|
|
159
|
-
if(!newMarkerElement) {
|
|
163
|
+
if (!newMarkerElement) {
|
|
160
164
|
return;
|
|
161
165
|
}
|
|
162
166
|
|
|
@@ -165,8 +169,8 @@ export default {
|
|
|
165
169
|
}, { immediate: true });
|
|
166
170
|
|
|
167
171
|
onUnmounted(() => {
|
|
168
|
-
if(actualMarker.value && map.value) {
|
|
169
|
-
if(markerClusterGroup && markerClusterGroup.value) {
|
|
172
|
+
if (actualMarker.value && map.value) {
|
|
173
|
+
if (markerClusterGroup && markerClusterGroup.value) {
|
|
170
174
|
markerClusterGroup.value.removeLayer(actualMarker.value as Marker);
|
|
171
175
|
} else {
|
|
172
176
|
map.value.removeLayer(actualMarker.value as Marker);
|
package/composables/index.ts
CHANGED
|
@@ -5,8 +5,10 @@ export * from "./useBreakpoints";
|
|
|
5
5
|
export * from "./useColors";
|
|
6
6
|
export * from "./useCountUp";
|
|
7
7
|
export * from "./useDebounce";
|
|
8
|
+
export * from "./useDynamicVNode";
|
|
8
9
|
export * from "./useElementVisibility";
|
|
9
10
|
export * from "./useMapLayers";
|
|
11
|
+
export * from "./useResize";
|
|
10
12
|
export * from "./useRules";
|
|
11
13
|
export * from "./useSlots";
|
|
12
14
|
export * from "./useTables";
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { h, render, getCurrentInstance, onBeforeUnmount, type Component, type VNode } from "vue";
|
|
2
|
+
|
|
3
|
+
export function useDynamicVNode<TProps extends Record<string, any>>(component: Component<TProps>) {
|
|
4
|
+
|
|
5
|
+
let vnode: VNode | null = null;
|
|
6
|
+
let container: HTMLElement | null = null;
|
|
7
|
+
let mountPoint: HTMLElement | null = null;
|
|
8
|
+
|
|
9
|
+
const instance = getCurrentInstance();
|
|
10
|
+
if (!instance) {
|
|
11
|
+
throw new Error("useDynamicVNode must be used inside setup()");
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const appContext = instance.appContext;
|
|
15
|
+
|
|
16
|
+
const mount = async (props: TProps) => {
|
|
17
|
+
if (!mountPoint) {
|
|
18
|
+
throw new Error(`You must call getElement() first to create the mount point`);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (!container) {
|
|
22
|
+
container = document.createElement("div");
|
|
23
|
+
mountPoint.appendChild(container);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
vnode = h(component, props);
|
|
27
|
+
vnode.appContext = appContext;
|
|
28
|
+
|
|
29
|
+
render(vnode, container);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const unmount = () => {
|
|
33
|
+
if (container) {
|
|
34
|
+
render(null, container);
|
|
35
|
+
container.remove();
|
|
36
|
+
}
|
|
37
|
+
vnode = null;
|
|
38
|
+
container = null;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const getElement = (style?: Partial<CSSStyleDeclaration>): HTMLElement => {
|
|
42
|
+
if (!mountPoint) {
|
|
43
|
+
mountPoint = document.createElement("div");
|
|
44
|
+
}
|
|
45
|
+
mountPoint = document.createElement("div");
|
|
46
|
+
Object.assign(mountPoint.style, style ?? {});
|
|
47
|
+
return mountPoint;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const destroy = () => {
|
|
51
|
+
unmount();
|
|
52
|
+
mountPoint = null;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
onBeforeUnmount(destroy);
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
mount,
|
|
59
|
+
unmount,
|
|
60
|
+
getElement
|
|
61
|
+
};
|
|
62
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { onMounted, onBeforeUnmount } from 'vue';
|
|
2
|
+
|
|
3
|
+
export function useResize(
|
|
4
|
+
getElement: () => HTMLElement | null | undefined,
|
|
5
|
+
onResize: () => void
|
|
6
|
+
) {
|
|
7
|
+
let resizeObserver: ResizeObserver | null = null;
|
|
8
|
+
|
|
9
|
+
onMounted(() => {
|
|
10
|
+
if (typeof ResizeObserver !== 'undefined') {
|
|
11
|
+
resizeObserver = new ResizeObserver(() => {
|
|
12
|
+
onResize();
|
|
13
|
+
});
|
|
14
|
+
const element = getElement();
|
|
15
|
+
if (element) {
|
|
16
|
+
resizeObserver.observe(element);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
window.addEventListener('resize', onResize);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
onBeforeUnmount(() => {
|
|
24
|
+
window.removeEventListener('resize', onResize);
|
|
25
|
+
resizeObserver?.disconnect();
|
|
26
|
+
resizeObserver = null;
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
resize: onResize
|
|
31
|
+
};
|
|
32
|
+
}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"url": "https://github.com/Dative-GPI/foundation-shared-ui.git"
|
|
5
5
|
},
|
|
6
6
|
"sideEffects": false,
|
|
7
|
-
"version": "1.1.
|
|
7
|
+
"version": "1.1.3-sandbox-1",
|
|
8
8
|
"description": "",
|
|
9
9
|
"publishConfig": {
|
|
10
10
|
"access": "public"
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
"author": "",
|
|
14
14
|
"license": "ISC",
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@dative-gpi/foundation-shared-domain": "1.1.
|
|
17
|
-
"@dative-gpi/foundation-shared-services": "1.1.
|
|
16
|
+
"@dative-gpi/foundation-shared-domain": "1.1.3-sandbox-1",
|
|
17
|
+
"@dative-gpi/foundation-shared-services": "1.1.3-sandbox-1"
|
|
18
18
|
},
|
|
19
19
|
"peerDependencies": {
|
|
20
20
|
"@dative-gpi/bones-ui": "^1.0.0",
|
|
@@ -38,5 +38,5 @@
|
|
|
38
38
|
"sass": "1.71.1",
|
|
39
39
|
"sass-loader": "13.3.2"
|
|
40
40
|
},
|
|
41
|
-
"gitHead": "
|
|
41
|
+
"gitHead": "8857dc338d7d3ec5f09ce9f67b0b359ae25e8e40"
|
|
42
42
|
}
|