@dative-gpi/foundation-shared-components 1.0.135 → 1.0.136-maps

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.
@@ -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>
@@ -22,7 +22,6 @@
22
22
  :color="ColorEnum.Primary"
23
23
  :latlng="gpsPosition"
24
24
  />
25
-
26
25
  <FSMapFeatureGroup
27
26
  v-if="$props.areas"
28
27
  :expected-layers="$props.areas.length"
@@ -36,7 +35,6 @@
36
35
  @click="$emit('update:selectedAreaId', area.id)"
37
36
  />
38
37
  </FSMapFeatureGroup>
39
-
40
38
  <FSMapMarkerClusterGroup
41
39
  v-if="$props.locations"
42
40
  :expected-layers="$props.locations.length"
@@ -54,6 +52,7 @@
54
52
  @click="$emit('update:selectedLocationId', location.id)"
55
53
  />
56
54
  </FSMapMarkerClusterGroup>
55
+ <slot />
57
56
  </template>
58
57
  </div>
59
58
 
@@ -87,15 +87,15 @@ export default {
87
87
  icon = divIcon({
88
88
  html: locationMarkerHtml(props.icon, getColors(props.color).base, props.label),
89
89
  iconSize: [size, size],
90
- className: props.selected ? 'fs-map-location fs-map-location-selected' : 'fs-map-location',
90
+ className: props.selected ? 'fs-map-marker fs-map-location fs-map-location-selected' : 'fs-map-marker fs-map-location',
91
91
  iconAnchor: [size / 2, size / 2],
92
92
  });
93
93
  } else {
94
- const size = 20;
94
+ const size = 16;
95
95
  icon = divIcon({
96
- html: pinMarkerHtml(getColors(props.color).base),
96
+ html: pinMarkerHtml(getColors(props.color).base, props.label),
97
97
  iconSize: [size, size],
98
- className: props.selected ? 'fs-map-location fs-map-location-selected' : 'fs-map-location',
98
+ className: props.selected ? 'fs-map-marker fs-map-pin fs-map-pin-selected' : 'fs-map-marker fs-map-pin',
99
99
  iconAnchor: [size / 2, size / 2],
100
100
  });
101
101
  }
@@ -45,7 +45,7 @@ export default {
45
45
 
46
46
  return divIcon({
47
47
  html: clusterMarkerHtml(cluster.getChildCount()),
48
- className: 'fs-map-location fs-map-location-full',
48
+ className: 'fs-map-marker fs-map-cluster-marker',
49
49
  iconSize: [size, size],
50
50
  iconAnchor: [size / 2, size / 2],
51
51
  });
@@ -97,6 +97,13 @@
97
97
  :imageId="$props.imageId"
98
98
  :width="imageSize"
99
99
  />
100
+ <FSIconCard
101
+ v-else-if="$props.icon"
102
+ backgroundVariant="standard"
103
+ :backgroundColor="ColorEnum.Background"
104
+ :icon="$props.icon"
105
+ :size="imageSize"
106
+ />
100
107
  </FSRow>
101
108
  </FSCol>
102
109
  </FSTile>
@@ -108,6 +115,7 @@ import { computed, defineComponent, type PropType } from "vue";
108
115
  import { useBreakpoints } from "@dative-gpi/foundation-shared-components/composables";
109
116
  import { ColorEnum } from "@dative-gpi/foundation-shared-components/models";
110
117
 
118
+ import FSIconCard from "../FSIconCard.vue";
111
119
  import FSImage from "../FSImage.vue";
112
120
  import FSColor from "../FSColor.vue";
113
121
  import FSSpan from "../FSSpan.vue";
@@ -118,6 +126,7 @@ import FSRow from "../FSRow.vue";
118
126
  export default defineComponent({
119
127
  name: "FSGroupTileUI",
120
128
  components: {
129
+ FSIconCard,
121
130
  FSImage,
122
131
  FSColor,
123
132
  FSSpan,
@@ -131,6 +140,10 @@ export default defineComponent({
131
140
  required: false,
132
141
  default: null
133
142
  },
143
+ icon: {
144
+ type: String,
145
+ required: false
146
+ },
134
147
  label: {
135
148
  type: String as PropType<string | null>,
136
149
  required: false,
@@ -183,7 +196,7 @@ export default defineComponent({
183
196
  });
184
197
 
185
198
  const infoWidth = computed((): string => {
186
- if (!props.imageId) {
199
+ if (!props.imageId && !props.icon) {
187
200
  return "100%";
188
201
  }
189
202
  return `calc(100% - ${imageSize.value}px - 24px)`;
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.135",
4
+ "version": "1.0.136-maps",
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.135",
14
- "@dative-gpi/foundation-shared-services": "1.0.135"
13
+ "@dative-gpi/foundation-shared-domain": "1.0.136-maps",
14
+ "@dative-gpi/foundation-shared-services": "1.0.136-maps"
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": "a8b8d2c285134ca72edf1bb0d3e224815f04c131"
38
+ "gitHead": "e5804d19ea9d2d1f215ddab730d72f0256841295"
39
39
  }
@@ -77,17 +77,10 @@
77
77
  }
78
78
  }
79
79
 
80
- .fs-map-point-pin {
81
- background-color: var(--fs-map-point-pin-color);
82
- border-radius: 100%;
83
- }
84
-
85
- .fs-map-location > div {
80
+ .fs-map-marker > div {
86
81
  display: flex;
87
82
  height: 100%;
88
- color: var(--fs-map-location-pin-color);
89
83
  border-radius: 50%;
90
- background-color: white;
91
84
  filter: drop-shadow(0px 2px 4px rgba(0, 0, 0, 0.4));
92
85
  align-items: center;
93
86
  justify-content: center;
@@ -103,7 +96,7 @@
103
96
  }
104
97
  }
105
98
 
106
- .fs-map-location-full > div {
99
+ .fs-map-cluster-marker > div {
107
100
  background-color: var(--fs-map-location-pin-color);
108
101
  color: white;
109
102
  }
@@ -126,6 +119,41 @@
126
119
  }
127
120
  }
128
121
 
122
+ .fs-map-location > div {
123
+ color: var(--fs-map-location-pin-color);
124
+ background-color: white;
125
+ }
126
+
127
+ .fs-map-pin > div {
128
+ background-color: var(--fs-map-point-pin-color);
129
+ position: relative;
130
+
131
+ transition: transform 0.28s cubic-bezier(0.4, 0, 0.2, 1);
132
+ }
133
+
134
+ .fs-map-pin > div::before {
135
+ content: "";
136
+ position: absolute;
137
+ top: -4px;
138
+ left: -4px;
139
+ width: calc(100% + 8px);
140
+ height: calc(100% + 8px);
141
+ border-radius: 50%;
142
+ border: 2px solid var(--fs-map-point-pin-color);
143
+ opacity: 0.4;
144
+
145
+ @include clickscreen {
146
+ &:hover {
147
+ opacity: 1;
148
+ }
149
+ }
150
+ }
151
+
152
+ .fs-map-pin-selected > div {
153
+ transform: scale(1.35);
154
+ }
155
+
156
+
129
157
  .fs-map-site {
130
158
  opacity: 0.6;
131
159
  transition: opacity 0.28s cubic-bezier(0.4, 0, 0.2, 1);
@@ -0,0 +1,13 @@
1
+ .fs-status-rich-card {
2
+ position: relative;
3
+ flex-grow: 1;
4
+ background-color: var(--fs-status-rich-card-background-color);
5
+ border-color: var(--fs-status-rich-card-border-color);
6
+ }
7
+
8
+ .fs-status-rich-card-corner {
9
+ position: absolute;
10
+ display: flex;
11
+ right: 2px;
12
+ top: 2px;
13
+ }
@@ -55,6 +55,7 @@
55
55
  @import "fs_slide_group.scss";
56
56
  @import "fs_slider.scss";
57
57
  @import "fs_span.scss";
58
+ @import "fs_status_rich_card.scss";
58
59
  @import "fs_switch.scss";
59
60
  @import "fs_tag.scss";
60
61
  @import "fs_tabs.scss";