@dative-gpi/foundation-shared-components 1.0.107 → 1.0.109

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.
Files changed (31) hide show
  1. package/components/FSButton.vue +5 -3
  2. package/components/FSClickable.vue +5 -3
  3. package/components/FSLink.vue +17 -5
  4. package/components/FSRouterLink.vue +42 -0
  5. package/components/agenda/FSAgendaHeader.vue +1 -1
  6. package/components/agenda/FSAgendaHorizontalEvent.vue +1 -1
  7. package/components/agenda/FSAgendaHoursRow.vue +31 -7
  8. package/components/agenda/FSAgendaVerticalEvent.vue +1 -1
  9. package/components/agenda/FSDayAgenda.vue +0 -1
  10. package/components/agenda/FSMonthAgenda.vue +1 -6
  11. package/components/agenda/FSWeekAgenda.vue +1 -6
  12. package/components/fields/FSMagicConfigField.vue +3 -1
  13. package/components/fields/periodicField/FSPeriodicField.vue +4 -4
  14. package/components/fields/periodicField/FSPeriodicYearlyField.vue +4 -4
  15. package/components/lists/FSDataTableUI.vue +3 -6
  16. package/components/selects/FSSelectDashboardVariableType.vue +2 -1
  17. package/components/selects/chartSelectors/FSAggregationSelector.vue +52 -0
  18. package/components/selects/chartSelectors/FSAxisTypeSelector.vue +49 -0
  19. package/components/selects/chartSelectors/FSDisplayAsSelector.vue +53 -0
  20. package/components/selects/chartSelectors/FSFilterTypeSelector.vue +54 -0
  21. package/components/selects/chartSelectors/FSHeatmapRuleSelector.vue +54 -0
  22. package/components/selects/chartSelectors/FSOperationOnSelector.vue +53 -0
  23. package/components/selects/chartSelectors/FSPlanningTypeSelector.vue +53 -0
  24. package/components/selects/chartSelectors/FSPlotPerSelector.vue +52 -0
  25. package/components/selects/chartSelectors/FSSelectEntityType.vue +59 -0
  26. package/components/selects/chartSelectors/FSSerieTypeSelector.vue +53 -0
  27. package/composables/useMagicFieldProvider.ts +1 -0
  28. package/models/magicFields.ts +1 -0
  29. package/package.json +4 -4
  30. package/styles/components/fs_agenda_hours_row.scss +0 -8
  31. package/styles/components/fs_dialog.scss +2 -3
@@ -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
  },
@@ -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>
@@ -23,7 +23,7 @@
23
23
  >
24
24
  <FSSpan
25
25
  class="fs-agenda-header-text"
26
- font="text-h3"
26
+ font="text-button"
27
27
  >
28
28
  {{ epochToMonthYearOnlyFormat($props.start) }}
29
29
  </FSSpan>
@@ -134,7 +134,7 @@ export default defineComponent({
134
134
  const width = computed(() => {
135
135
  let start = props.start - dayDurationOffset.value;
136
136
  let end = props.end - dayDurationOffset.value;
137
- if(props.variant === 'current') {
137
+ if(props.variant === 'current' && dayEnd.value > props.now) {
138
138
  end = props.now;
139
139
  } else if (props.end > dayEnd.value) {
140
140
  end = dayEnd.value - dayDurationOffset.value;
@@ -3,11 +3,11 @@
3
3
  gap="0"
4
4
  >
5
5
  <FSRow
6
+ :padding="`0 ${paddingRightHours} 0 ${paddingLeftHours}`"
6
7
  class="fs-agenda-hours-row"
7
8
  :wrap="false"
8
9
  gap="0"
9
10
  align="center-center"
10
- :style="style"
11
11
  >
12
12
  <FSRow
13
13
  v-for="hour in hours"
@@ -37,6 +37,7 @@
37
37
  </FSRow>
38
38
  </FSRow>
39
39
  <FSRow
40
+ :padding="`0 ${paddingRightMarkers} 0 ${paddingLeftMarkers}`"
40
41
  class="fs-agenda-hours-row-markers"
41
42
  :wrap="false"
42
43
  gap="0"
@@ -88,8 +89,12 @@ export default defineComponent({
88
89
  required: false,
89
90
  default: false,
90
91
  },
92
+ firstColumnWidth: {
93
+ type: String,
94
+ required: true,
95
+ },
91
96
  },
92
- setup() {
97
+ setup(props) {
93
98
  const { getColors } = useColors();
94
99
  const { isMobileSized } = useBreakpoints();
95
100
 
@@ -108,12 +113,27 @@ export default defineComponent({
108
113
  return Array.from({ length: hoursToShow.value }, (_, i) => i * (24 / hoursToShow.value));
109
114
  });
110
115
 
111
- const style = computed((): StyleValue => {
112
- return {
113
- '--fs-agenda-hours-row-transform': `translateX(calc(-${2.4 * 24 / hoursToShow.value}%))`,
114
- }
116
+ const paddingLeftHours = computed(() => {
117
+ // ((100% - ${props.firstColumnWidth}) / ${hoursToShow.value}) is the width of each hour slot (2 hour if 12 hours are shown, 1 hour if 24 hours are shown)
118
+ // 0.5 * ((100% - ${props.firstColumnWidth}) / ${hoursToShow.value}) is half of the width of each hour slot
119
+ // So we have : ${props.firstColumnWidth} - Half of the width of each hour slot
120
+ return `calc(${props.firstColumnWidth} - 0.5 * ((100% - ${props.firstColumnWidth}) / ${hoursToShow.value}))`;
121
+ });
122
+
123
+ const paddingRightHours = computed(() => {
124
+ return `calc(0.5 * ((100% - ${props.firstColumnWidth}) / ${hoursToShow.value}))`;
115
125
  });
116
126
 
127
+ const paddingLeftMarkers = computed(() => {
128
+ return `calc(${props.firstColumnWidth} - 0.5 * ((100% - ${props.firstColumnWidth}) / 24))`;
129
+ });
130
+
131
+ const paddingRightMarkers = computed(() => {
132
+ return `calc(0.5 * ((100% - ${props.firstColumnWidth}) / 24))`;
133
+ });
134
+
135
+
136
+
117
137
  const getMarkerStyle = (isNowHour: boolean): StyleValue => {
118
138
  if(isNowHour) {
119
139
  return {
@@ -129,8 +149,12 @@ export default defineComponent({
129
149
 
130
150
  return {
131
151
  hours,
132
- style,
133
152
  fontColor,
153
+ hoursToShow,
154
+ paddingLeftHours,
155
+ paddingRightHours,
156
+ paddingLeftMarkers,
157
+ paddingRightMarkers,
134
158
  getMarkerStyle,
135
159
  to2Digits
136
160
  };
@@ -131,7 +131,7 @@ export default defineComponent({
131
131
  const height = computed(() => {
132
132
  let start = props.start - dayDurationOffset.value;
133
133
  let end = props.end - dayDurationOffset.value;
134
- if (props.variant === 'current') {
134
+ if (props.variant === 'current' && dayEnd.value > props.now) {
135
135
  end = props.now;
136
136
  } else if (props.end > dayEnd.value) {
137
137
  end = dayEnd.value - dayDurationOffset.value;
@@ -2,7 +2,6 @@
2
2
  <FSRow
3
3
  class="fs-day-agenda"
4
4
  height="100%"
5
- padding="8px 0 0 0"
6
5
  :wrap="false"
7
6
  gap="0px"
8
7
  :style="style"
@@ -9,13 +9,8 @@
9
9
  gap="0"
10
10
  :wrap="false"
11
11
  >
12
- <FSCol
13
- height="100%"
14
- :width="$props.firstColumnWidth"
15
- >
16
- </FSCol>
17
-
18
12
  <FSAgendaHoursRow
13
+ :firstColumnWidth="$props.firstColumnWidth"
19
14
  :displayNow="$props.nowIsInSelectedRange"
20
15
  :modelValue="nowHour"
21
16
  />
@@ -9,13 +9,8 @@
9
9
  gap="0"
10
10
  :wrap="false"
11
11
  >
12
- <FSCol
13
- height="100%"
14
- :width="$props.firstColumnWidth"
15
- >
16
- </FSCol>
17
-
18
12
  <FSAgendaHoursRow
13
+ :firstColumnWidth="$props.firstColumnWidth"
19
14
  :displayNow="$props.nowIsInSelectedRange"
20
15
  :modelValue="nowHour"
21
16
  />
@@ -42,7 +42,7 @@
42
42
  <script lang="ts">
43
43
  import { computed, defineComponent, type PropType } from "vue";
44
44
 
45
- import { DateRules, IconRules, NumberRules, TextRules, TimeRules, TimeStepRules } from "../../models";
45
+ import { DateRules, IconRules, NumberRules, TextRules, TimeRules, TimeStepRules, AutocompleteRules } from "../../models";
46
46
  import { useMagicFieldProvider } from "../../composables";
47
47
  import { MagicFieldType } from "../../models/magicFields";
48
48
 
@@ -104,6 +104,8 @@ export default defineComponent({
104
104
  return [TimeRules.required()];
105
105
  case MagicFieldType.TimeStepField:
106
106
  return [TimeStepRules.required()];
107
+ case MagicFieldType.PlotPerField:
108
+ return [AutocompleteRules.required()];
107
109
  }
108
110
  return [];
109
111
  });
@@ -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);
@@ -36,7 +36,8 @@ export default defineComponent({
36
36
  const dashboardVariableTypes = computed((): { id: DashboardVariableType; label: string }[] => ([
37
37
  { id: DashboardVariableType.Number, label: $tr("ui.dashboard-variable-type.number", "Number") },
38
38
  { id: DashboardVariableType.String, label: $tr("ui.dashboard-variable-type.string", "String") },
39
- { id: DashboardVariableType.TimeStep, label: $tr("ui.dashboard-variable-type.time-step", "Time step") }
39
+ { id: DashboardVariableType.TimeStep, label: $tr("ui.dashboard-variable-type.time-step", "Time step")},
40
+ { id: DashboardVariableType.PlotPer, label: $tr("ui.dashboard-variable-type.plot-per", "Plot per")}
40
41
  ]));
41
42
 
42
43
  return {
@@ -0,0 +1,52 @@
1
+ <template>
2
+ <FSAutocompleteField
3
+ :label="label ?? $tr('ui.common.aggregation-type','Aggregation')"
4
+ :items="aggregationTypeItems"
5
+ :modelValue="modelValue"
6
+ @update:modelValue="$emit('update:modelValue', $event)"
7
+ v-bind="$attrs"
8
+ />
9
+ </template>
10
+
11
+ <script lang="ts">
12
+ import { computed, defineComponent, type PropType } from "vue";
13
+
14
+ import { AggregationType } from "@dative-gpi/foundation-shared-domain/enums";
15
+
16
+ import { getEnumEntries } from "@dative-gpi/foundation-shared-domain/tools";
17
+ import { aggregationTypeLabel } from "@dative-gpi/foundation-shared-components/tools";
18
+
19
+ import FSAutocompleteField from "@dative-gpi/foundation-shared-components/components/fields/FSAutocompleteField.vue";
20
+
21
+ export default defineComponent({
22
+ components: {
23
+ FSAutocompleteField
24
+ },
25
+ props: {
26
+ modelValue : {
27
+ type: Number as PropType<AggregationType>,
28
+ required: false
29
+ },
30
+ label : {
31
+ type: String,
32
+ required: false
33
+ }
34
+ },
35
+ emits: ['update:modelValue'],
36
+ setup() {
37
+
38
+ const aggregationTypeItems = computed(()=>{
39
+ return getEnumEntries(AggregationType).filter(f=>f.value != AggregationType.None).map((f)=>{
40
+ return {
41
+ id: f.value,
42
+ label: aggregationTypeLabel(f.value)
43
+ }
44
+ })
45
+ });
46
+
47
+ return {
48
+ aggregationTypeItems
49
+ }
50
+ }
51
+ })
52
+ </script>
@@ -0,0 +1,49 @@
1
+ <template>
2
+ <FSToggleSet
3
+ :hideHeader="true"
4
+ :values="axisTypeItems"
5
+ :modelValue="modelValue"
6
+ @update:modelValue="$emit('update:modelValue', $event)"
7
+ v-bind="$attrs"
8
+ />
9
+ </template>
10
+
11
+ <script lang="ts">
12
+ import { computed, defineComponent, type PropType } from "vue";
13
+
14
+ import {AxisType} from "@dative-gpi/foundation-shared-domain/enums";
15
+
16
+ import { getEnumEntries } from "@dative-gpi/foundation-shared-domain/tools";
17
+ import { axisTypeLabel } from "@dative-gpi/foundation-shared-components/tools";
18
+
19
+ import FSToggleSet from "@dative-gpi/foundation-shared-components/components/FSToggleSet.vue";
20
+
21
+
22
+ export default defineComponent({
23
+ components: {
24
+ FSToggleSet
25
+ },
26
+ props: {
27
+ modelValue: {
28
+ type: Number as PropType<AxisType>,
29
+ required: false
30
+ }
31
+ },
32
+ emits: ['update:modelValue'],
33
+ setup() {
34
+
35
+ const axisTypeItems = computed(()=>{
36
+ return getEnumEntries(AxisType).map((f)=>{
37
+ return {
38
+ id: f.value,
39
+ label: axisTypeLabel(f.value)
40
+ }
41
+ })
42
+ });
43
+
44
+ return {
45
+ axisTypeItems
46
+ }
47
+ }
48
+ })
49
+ </script>
@@ -0,0 +1,53 @@
1
+ <template>
2
+ <FSAutocompleteField
3
+ :label="label ?? $tr('ui.common.display-as','Display as')"
4
+ :items="displayAsItems"
5
+ :modelValue="modelValue"
6
+ @update:modelValue="$emit('update:modelValue', $event)"
7
+ v-bind="$attrs"
8
+ />
9
+ </template>
10
+
11
+ <script lang="ts">
12
+ import { computed, defineComponent, type PropType } from "vue";
13
+
14
+ import {DisplayAs} from "@dative-gpi/foundation-shared-domain/enums";
15
+
16
+ import { getEnumEntries } from "@dative-gpi/foundation-shared-domain/tools";
17
+ import { displayAsLabel } from "@dative-gpi/foundation-shared-components/tools";
18
+
19
+ import FSAutocompleteField from "@dative-gpi/foundation-shared-components/components/fields/FSAutocompleteField.vue";
20
+
21
+ export default defineComponent({
22
+ components: {
23
+ FSAutocompleteField
24
+ },
25
+ props: {
26
+ modelValue: {
27
+ type: Number as PropType<DisplayAs>,
28
+ required: false
29
+ },
30
+ label: {
31
+ type: String,
32
+ required: false
33
+ }
34
+
35
+ },
36
+ emits: ['update:modelValue'],
37
+ setup() {
38
+
39
+ const displayAsItems = computed(()=>{
40
+ return getEnumEntries(DisplayAs).filter(f=>f.value != DisplayAs.None).map((f)=>{
41
+ return {
42
+ id: f.value,
43
+ label: displayAsLabel(f.value)
44
+ }
45
+ })
46
+ });
47
+
48
+ return {
49
+ displayAsItems,
50
+ }
51
+ }
52
+ })
53
+ </script>
@@ -0,0 +1,54 @@
1
+ <template>
2
+ <FSAutocompleteField
3
+ :label="label ?? $tr('ui.common.filter-type','Filter type')"
4
+ :toggleSet="true"
5
+ :items="filterTypeItems"
6
+ :modelValue="modelValue"
7
+ @update:modelValue="$emit('update:modelValue', $event)"
8
+ v-bind="$attrs"
9
+ />
10
+ </template>
11
+
12
+ <script lang="ts">
13
+ import { computed, defineComponent, type PropType } from "vue";
14
+
15
+ import {FilterType} from "@dative-gpi/foundation-shared-domain/enums";
16
+
17
+ import { getEnumEntries } from "@dative-gpi/foundation-shared-domain/tools";
18
+ import { filterTypeLabel } from "@dative-gpi/foundation-shared-components/tools";
19
+
20
+ import FSAutocompleteField from "@dative-gpi/foundation-shared-components/components/fields/FSAutocompleteField.vue";
21
+
22
+ export default defineComponent({
23
+ components: {
24
+ FSAutocompleteField
25
+ },
26
+ props: {
27
+ modelValue: {
28
+ type: Number as PropType<FilterType>,
29
+ required: false,
30
+ default : FilterType.None
31
+ },
32
+ label: {
33
+ type: String,
34
+ required: false
35
+ }
36
+ },
37
+ emits: ['update:modelValue'],
38
+ setup() {
39
+
40
+ const filterTypeItems = computed(()=>{
41
+ return getEnumEntries(FilterType).filter(f=>f.value != FilterType.None).map((f)=>{
42
+ return {
43
+ id: f.value,
44
+ label: filterTypeLabel(f.value)
45
+ }
46
+ })
47
+ });
48
+
49
+ return {
50
+ filterTypeItems
51
+ }
52
+ }
53
+ })
54
+ </script>
@@ -0,0 +1,54 @@
1
+ <template>
2
+ <FSAutocompleteField
3
+ :label="label ?? $tr('ui.common.heat-rule','Heat rule')"
4
+ :items="heatmapRuleItems"
5
+ :modelValue="modelValue"
6
+ @update:modelValue="$emit('update:modelValue', $event)"
7
+ v-bind="$attrs"
8
+ />
9
+ </template>
10
+
11
+ <script lang="ts">
12
+ import { computed, defineComponent, type PropType } from "vue";
13
+
14
+ import {HeatmapRule} from "@dative-gpi/foundation-shared-domain/enums";
15
+
16
+ import { getEnumEntries } from "@dative-gpi/foundation-shared-domain/tools";
17
+ import { heatmapRuleLabel } from "@dative-gpi/foundation-shared-components/tools";
18
+
19
+ import FSAutocompleteField from "@dative-gpi/foundation-shared-components/components/fields/FSAutocompleteField.vue";
20
+
21
+
22
+ export default defineComponent({
23
+ components: {
24
+ FSAutocompleteField
25
+ },
26
+ props: {
27
+ modelValue: {
28
+ type: Number as PropType<HeatmapRule>,
29
+ required: false
30
+ },
31
+ label: {
32
+ type: String,
33
+ required: false
34
+ }
35
+
36
+ },
37
+ emits: ['update:modelValue'],
38
+ setup() {
39
+
40
+ const heatmapRuleItems = computed(()=>{
41
+ return getEnumEntries(HeatmapRule).filter(f=>f.value != HeatmapRule.None).map((f)=>{
42
+ return {
43
+ id: f.value,
44
+ label: heatmapRuleLabel(f.value)
45
+ }
46
+ })
47
+ });
48
+
49
+ return {
50
+ heatmapRuleItems
51
+ }
52
+ }
53
+ })
54
+ </script>
@@ -0,0 +1,53 @@
1
+ <template>
2
+ <FSAutocompleteField
3
+ :label="label ?? $tr('ui.common.operation-on','Operation on')"
4
+ :items="operationOnItems"
5
+ :modelValue="modelValue"
6
+ @update:modelValue="$emit('update:modelValue', $event)"
7
+ v-bind="$attrs"
8
+ />
9
+ </template>
10
+
11
+ <script lang="ts">
12
+ import { computed, defineComponent, type PropType } from "vue";
13
+
14
+ import {OperationOn} from "@dative-gpi/foundation-shared-domain/enums";
15
+
16
+ import { getEnumEntries } from "@dative-gpi/foundation-shared-domain/tools";
17
+ import { operationOnLabel} from "@dative-gpi/foundation-shared-components/tools";
18
+
19
+ import FSAutocompleteField from "@dative-gpi/foundation-shared-components/components/fields/FSAutocompleteField.vue";
20
+
21
+
22
+ export default defineComponent({
23
+ components: {
24
+ FSAutocompleteField
25
+ },
26
+ props: {
27
+ modelValue: {
28
+ type: Number as PropType<OperationOn>,
29
+ required: false
30
+ },
31
+ label : {
32
+ type: String,
33
+ required: false
34
+ }
35
+ },
36
+ emits: ['update:modelValue'],
37
+ setup() {
38
+
39
+ const operationOnItems = computed(()=>{
40
+ return getEnumEntries(OperationOn).filter(f=>f.value != OperationOn.None).map((f)=>{
41
+ return {
42
+ id: f.value,
43
+ label: operationOnLabel(f.value)
44
+ }
45
+ })
46
+ });
47
+
48
+ return {
49
+ operationOnItems
50
+ }
51
+ }
52
+ })
53
+ </script>
@@ -0,0 +1,53 @@
1
+ <template>
2
+ <FSAutocompleteField
3
+ :label="label ?? $tr('ui.common.planning-type','Planning type')"
4
+ :items="planningTypeItems"
5
+ :modelValue="modelValue"
6
+ @update:modelValue="$emit('update:modelValue', $event)"
7
+ v-bind="$attrs"
8
+ />
9
+ </template>
10
+
11
+ <script lang="ts">
12
+ import { computed, defineComponent, type PropType } from "vue";
13
+
14
+ import {PlanningType} from "@dative-gpi/foundation-shared-domain/enums";
15
+
16
+ import { getEnumEntries } from "@dative-gpi/foundation-shared-domain/tools";
17
+ import { planningTypeLabel } from "@dative-gpi/foundation-shared-components/tools";
18
+
19
+ import FSAutocompleteField from "@dative-gpi/foundation-shared-components/components/fields/FSAutocompleteField.vue";
20
+
21
+
22
+ export default defineComponent({
23
+ components: {
24
+ FSAutocompleteField
25
+ },
26
+ props: {
27
+ modelValue: {
28
+ type: Number as PropType<PlanningType>,
29
+ required: false
30
+ },
31
+ label: {
32
+ type: String,
33
+ required: false
34
+ }
35
+ },
36
+ emits: ['update:modelValue'],
37
+ setup() {
38
+
39
+ const planningTypeItems = computed(()=>{
40
+ return getEnumEntries(PlanningType).filter(f=>f.value != PlanningType.None).map((f)=>{
41
+ return {
42
+ id: f.value,
43
+ label: planningTypeLabel(f.value)
44
+ }
45
+ })
46
+ });
47
+
48
+ return {
49
+ planningTypeItems
50
+ }
51
+ }
52
+ })
53
+ </script>
@@ -0,0 +1,52 @@
1
+ <template>
2
+ <FSAutocompleteField
3
+ :label="label ?? $tr('ui.common.plot-per','Plot per')"
4
+ :items="plotPerItems"
5
+ :modelValue="modelValue"
6
+ @update:modelValue="$emit('update:modelValue', $event)"
7
+ v-bind="$attrs"
8
+ />
9
+ </template>
10
+
11
+ <script lang="ts">
12
+ import { computed, defineComponent, type PropType } from "vue";
13
+
14
+ import {PlotPer} from "@dative-gpi/foundation-shared-domain/enums";
15
+
16
+ import { getEnumEntries } from "@dative-gpi/foundation-shared-domain/tools";
17
+ import { plotPerLabel } from "@dative-gpi/foundation-shared-components/tools";
18
+
19
+ import FSAutocompleteField from "@dative-gpi/foundation-shared-components/components/fields/FSAutocompleteField.vue";
20
+
21
+ export default defineComponent({
22
+ components: {
23
+ FSAutocompleteField
24
+ },
25
+ props: {
26
+ modelValue: {
27
+ type: Number as PropType<PlotPer>,
28
+ required: false
29
+ },
30
+ label: {
31
+ type: String,
32
+ required: false
33
+ }
34
+ },
35
+ emits: ['update:modelValue'],
36
+ setup() {
37
+
38
+ const plotPerItems = computed(()=>{
39
+ return getEnumEntries(PlotPer).filter(f=>f.value != PlotPer.None).map((f)=>{
40
+ return {
41
+ id: f.value,
42
+ label: plotPerLabel(f.value)
43
+ }
44
+ })
45
+ });
46
+
47
+ return {
48
+ plotPerItems
49
+ }
50
+ }
51
+ })
52
+ </script>
@@ -0,0 +1,59 @@
1
+ <template>
2
+ <FSSelectField
3
+ :items="entityTypes"
4
+ :clearable="false"
5
+ :modelValue="$props.modelValue"
6
+ @update:modelValue="$emit('update:modelValue', $event)"
7
+ v-bind="$attrs"
8
+ />
9
+ </template>
10
+
11
+ <script lang="ts">
12
+ import type { PropType} from "vue";
13
+ import { computed, defineComponent } from "vue";
14
+
15
+ import { useTranslations as useTranslationsProvider } from "@dative-gpi/bones-ui/composables";
16
+ import { EntityType } from "@dative-gpi/foundation-shared-domain/enums";
17
+
18
+ import FSSelectField from "@dative-gpi/foundation-shared-components/components/fields/FSSelectField.vue";
19
+
20
+ export default defineComponent({
21
+ name: "FSSelectEntityType",
22
+ components: {
23
+ FSSelectField
24
+ },
25
+ props: {
26
+ modelValue: {
27
+ type: Number as PropType<EntityType>,
28
+ required: false,
29
+ default: EntityType.Device
30
+ },
31
+ useNone: {
32
+ type: Boolean,
33
+ required: false,
34
+ default: false
35
+ }
36
+ },
37
+ emits: ["update:modelValue"],
38
+ setup(props) {
39
+ const { $tr } = useTranslationsProvider();
40
+
41
+ const entityTypes = computed((): { id: EntityType; label: string }[] => {
42
+ const items = [
43
+ { id: EntityType.Model, label: $tr("ui.entity-type.models", "Models") },
44
+ { id: EntityType.Device, label: $tr("ui.entity-type.devices", "Devices") },
45
+ { id: EntityType.Group, label: $tr("ui.entity-type.groups", "Groups") },
46
+ { id: EntityType.Location, label: $tr("ui.entity-type.locations", "Locations") }
47
+ ];
48
+ if (props.useNone) {
49
+ items.unshift({ id: EntityType.None, label: $tr("ui.entity-type.none", "None") });
50
+ }
51
+ return items;
52
+ });
53
+
54
+ return {
55
+ entityTypes
56
+ };
57
+ }
58
+ });
59
+ </script>
@@ -0,0 +1,53 @@
1
+ <template>
2
+ <FSAutocompleteField
3
+ :label="label ?? $tr('ui.common.serie-type','Serie type')"
4
+ :items="serieTypeItems"
5
+ :modelValue="modelValue"
6
+ @update:modelValue="$emit('update:modelValue', $event)"
7
+ v-bind="$attrs"
8
+ />
9
+ </template>
10
+
11
+ <script lang="ts">
12
+ import { computed, defineComponent, type PropType } from "vue";
13
+
14
+ import {SerieType} from "@dative-gpi/foundation-shared-domain/enums";
15
+
16
+ import { getEnumEntries } from "@dative-gpi/foundation-shared-domain/tools";
17
+ import { serieTypeLabel } from "@dative-gpi/foundation-shared-components/tools";
18
+
19
+ import FSAutocompleteField from "@dative-gpi/foundation-shared-components/components/fields/FSAutocompleteField.vue";
20
+
21
+
22
+ export default defineComponent({
23
+ components: {
24
+ FSAutocompleteField
25
+ },
26
+ props: {
27
+ modelValue: {
28
+ type: Number as PropType<SerieType>,
29
+ required: false
30
+ },
31
+ label: {
32
+ type: String,
33
+ required: false
34
+ }
35
+ },
36
+ emits: ['update:modelValue'],
37
+ setup() {
38
+
39
+ const serieTypeItems = computed(()=>{
40
+ return getEnumEntries(SerieType).filter(f=>f.value != SerieType.None).map((f)=>{
41
+ return {
42
+ id: f.value,
43
+ label: serieTypeLabel(f.value)
44
+ }
45
+ })
46
+ });
47
+
48
+ return {
49
+ serieTypeItems
50
+ }
51
+ }
52
+ })
53
+ </script>
@@ -10,6 +10,7 @@ const FIELDS = {
10
10
  [MagicFieldType.IconField] : defineAsyncComponent(() => import("../components/fields/FSIconField.vue")),
11
11
  [MagicFieldType.TimeField] : defineAsyncComponent(() => import("../components/fields/FSTimeField.vue")),
12
12
  [MagicFieldType.TimeStepField] : defineAsyncComponent(() => import("../components/fields/FSTimeStepField.vue")),
13
+ [MagicFieldType.PlotPerField] : defineAsyncComponent(() => import("../components/selects/chartSelectors/FSPlotPerSelector.vue")),
13
14
  };
14
15
 
15
16
  export const useMagicFieldProvider = () => {
@@ -7,4 +7,5 @@ export enum MagicFieldType {
7
7
  IconField = 5,
8
8
  TimeField = 6,
9
9
  TimeStepField = 7,
10
+ PlotPerField = 8,
10
11
  }
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.109",
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.109",
14
+ "@dative-gpi/foundation-shared-services": "1.0.109"
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": "4c6fede4689135f15a5af1ed120a816c1aed111c"
39
39
  }
@@ -1,11 +1,3 @@
1
- .fs-agenda-hours-row {
2
- transform: var(--fs-agenda-hours-row-transform);
3
- }
4
-
5
- .fs-agenda-hours-row-markers {
6
- transform: translateX(calc(-2.4% + 1px)); // 1px is the border width
7
- }
8
-
9
1
  .fs-agenda-hours-row-marker {
10
2
  height: 4px;
11
3
  border-right: solid 1px var(--fs-agenda-hours-row-marker-color);
@@ -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
  }