@dative-gpi/foundation-shared-components 0.0.229 → 0.1.68
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/FSAccordionPanel.vue +8 -10
- package/components/FSBadge.vue +2 -4
- package/components/FSBreadcrumbs.vue +9 -10
- package/components/FSButton.vue +81 -31
- package/components/FSCalendar.vue +35 -33
- package/components/FSCalendarTwin.vue +77 -84
- package/components/FSCard.vue +29 -16
- package/components/FSCardPlaceholder.vue +1 -2
- package/components/FSCheckbox.vue +5 -7
- package/components/FSChip.vue +9 -11
- package/components/FSClickable.vue +67 -57
- package/components/FSClock.vue +4 -4
- package/components/FSCol.vue +2 -3
- package/components/FSColor.vue +13 -31
- package/components/FSColorIcon.vue +25 -9
- package/components/FSDialog.vue +1 -2
- package/components/FSDialogFormBody.vue +4 -4
- package/components/FSDialogMenu.vue +2 -4
- package/components/FSDialogMultiFormBody.vue +63 -50
- package/components/FSDialogRemove.vue +1 -0
- package/components/FSDialogSubmit.vue +5 -7
- package/components/FSDivider.vue +7 -9
- package/components/FSEditImage.vue +27 -274
- package/components/FSEditImageUI.vue +303 -0
- package/components/FSErrorToast.vue +3 -4
- package/components/FSFadeOut.vue +18 -13
- package/components/FSGrid.vue +6 -9
- package/components/FSGridMosaic.vue +1 -2
- package/components/FSIcon.vue +7 -8
- package/components/FSIconCard.vue +23 -30
- package/components/FSIconCheck.vue +1 -2
- package/components/FSImage.vue +21 -193
- package/components/FSImageCard.vue +2 -2
- package/components/FSImageUI.vue +212 -0
- package/components/FSLabel.vue +18 -20
- package/components/FSLink.vue +19 -21
- package/components/FSLoader.vue +10 -14
- package/components/FSOptionGroup.vue +58 -12
- package/components/FSPagination.vue +3 -5
- package/components/FSRadio.vue +5 -7
- package/components/FSRadioGroup.vue +2 -4
- package/components/FSRow.vue +3 -4
- package/components/FSSlideGroup.vue +15 -4
- package/components/FSSlider.vue +9 -11
- package/components/FSSpan.vue +11 -9
- package/components/FSSwitch.vue +65 -37
- package/components/FSTab.vue +2 -4
- package/components/FSTabs.vue +36 -16
- package/components/FSTag.vue +23 -14
- package/components/FSTagGroup.vue +3 -5
- package/components/FSText.vue +8 -12
- package/components/FSWindow.vue +11 -5
- package/components/FSWrapGroup.vue +15 -4
- package/components/agenda/FSAgenda.vue +204 -0
- package/components/agenda/FSAgendaDialogCalendar.vue +76 -0
- package/components/agenda/FSAgendaHeader.vue +190 -0
- package/components/agenda/FSAgendaHorizontalEvent.vue +162 -0
- package/components/agenda/FSAgendaHorizontalTimeLineMarker.vue +46 -0
- package/components/agenda/FSAgendaHoursCol.vue +103 -0
- package/components/agenda/FSAgendaHoursRow.vue +124 -0
- package/components/agenda/FSAgendaVerticalEvent.vue +160 -0
- package/components/agenda/FSAgendaVerticalTimeLineMarker.vue +46 -0
- package/components/agenda/FSDayAgenda.vue +200 -0
- package/components/agenda/FSMonthAgenda.vue +257 -0
- package/components/agenda/FSSelectAgendaMode.vue +54 -0
- package/components/agenda/FSWeekAgenda.vue +328 -0
- package/components/autocompletes/FSAutocompleteLanguage.vue +18 -39
- package/components/autocompletes/FSAutocompleteTimeZone.vue +20 -38
- package/components/buttons/FSButtonCancelMini.vue +1 -0
- package/components/buttons/FSButtonCopy.vue +28 -0
- package/components/buttons/FSButtonCopyIcon.vue +28 -0
- package/components/buttons/FSButtonCopyLabel.vue +27 -0
- package/components/buttons/FSButtonCopyMini.vue +28 -0
- package/components/buttons/FSButtonDragIcon.vue +27 -0
- package/components/buttons/FSButtonDuplicateMini.vue +1 -0
- package/components/buttons/FSButtonEditMini.vue +1 -0
- package/components/buttons/FSButtonFileMini.vue +1 -0
- package/components/buttons/FSButtonNextMini.vue +1 -0
- package/components/buttons/FSButtonPreviousMini.vue +1 -0
- package/components/buttons/FSButtonRedoMini.vue +1 -0
- package/components/buttons/FSButtonRemoveMini.vue +1 -0
- package/components/buttons/FSButtonSaveMini.vue +1 -0
- package/components/buttons/FSButtonSearchMini.vue +1 -0
- package/components/buttons/FSButtonUndoMini.vue +1 -0
- package/components/buttons/FSButtonUpdateMini.vue +1 -0
- package/components/buttons/FSButtonValidateMini.vue +1 -0
- package/components/deviceOrganisations/FSConnectivity.vue +11 -1
- package/components/deviceOrganisations/FSConnectivityCard.vue +20 -49
- package/components/deviceOrganisations/FSStatus.vue +11 -1
- package/components/deviceOrganisations/FSStatusCard.vue +40 -60
- package/components/deviceOrganisations/FSStatusesCarousel.vue +1 -0
- package/components/deviceOrganisations/FSStatusesRow.vue +10 -5
- package/components/deviceOrganisations/FSWorstAlert.vue +19 -13
- package/components/deviceOrganisations/FSWorstAlertCard.vue +36 -47
- package/components/fields/FSAutocompleteField.vue +501 -323
- package/components/fields/FSAutocompleteTag.vue +100 -0
- package/components/fields/FSBaseField.vue +26 -16
- package/components/fields/FSColorField.vue +63 -55
- package/components/fields/FSCommentField.vue +93 -0
- package/components/fields/FSDateField.vue +2 -2
- package/components/fields/FSDateRangeField.vue +2 -2
- package/components/fields/FSDateTimeField.vue +4 -3
- package/components/fields/FSDateTimeRangeField.vue +7 -6
- package/components/fields/FSEntityFieldUI.vue +271 -0
- package/components/fields/FSGradientField.vue +27 -33
- package/components/fields/FSIconField.vue +2 -3
- package/components/fields/FSMagicConfigField.vue +28 -19
- package/components/fields/FSMagicField.vue +25 -17
- package/components/fields/FSNumberField.vue +9 -7
- package/components/fields/FSPasswordField.vue +2 -3
- package/components/fields/FSRichTextField.vue +32 -5
- package/components/fields/FSSearchField.vue +2 -2
- package/components/fields/FSSelectField.vue +483 -251
- package/components/fields/FSTagField.vue +4 -6
- package/components/fields/FSTermField.vue +25 -13
- package/components/fields/FSTextArea.vue +18 -6
- package/components/fields/FSTextField.vue +13 -10
- package/components/fields/FSTimeField.vue +1 -1
- package/components/fields/FSTimeSlotField.vue +3 -4
- package/components/fields/FSTimeStepField.vue +157 -0
- package/components/fields/FSTranslateField.vue +3 -2
- package/components/fields/FSTranslateRichTextField.vue +4 -3
- package/components/fields/FSTranslateTextArea.vue +233 -0
- package/components/fields/FSTreeViewField.vue +7 -9
- package/components/fields/periodicField/FSPeriodicDailyField.vue +120 -0
- package/components/fields/periodicField/FSPeriodicField.vue +131 -0
- package/components/fields/periodicField/FSPeriodicMonthlyField.vue +222 -0
- package/components/fields/periodicField/FSPeriodicWeeklyField.vue +120 -0
- package/components/fields/periodicField/FSPeriodicYearlyField.vue +144 -0
- package/components/lists/FSDataIteratorItem.vue +8 -10
- package/components/lists/FSDataTableUI.vue +47 -39
- package/components/lists/FSFilterButton.vue +20 -22
- package/components/lists/FSHiddenButton.vue +10 -12
- package/components/lists/FSLoadDataTable.vue +4 -6
- package/components/lists/FSSimpleList.vue +229 -0
- package/components/map/FSMap.vue +256 -405
- package/components/map/FSMapFeatureGroup.vue +51 -0
- package/components/map/FSMapLayerButton.vue +6 -3
- package/components/map/FSMapMarker.vue +116 -0
- package/components/map/FSMapMarkerClusterGroup.vue +72 -0
- package/components/map/FSMapOverlay.vue +69 -83
- package/components/map/FSMapPolygon.vue +81 -0
- package/components/map/FSMapTileLayer.vue +50 -0
- package/components/map/keys.ts +4 -0
- package/components/selects/FSSelectAutoRefresh.vue +1 -1
- package/components/selects/FSSelectDashboardVariableType.vue +1 -1
- package/components/selects/FSSelectDateSetting.vue +3 -3
- package/components/selects/FSSelectDays.vue +1 -1
- package/components/selects/FSSelectListMode.vue +51 -0
- package/components/selects/FSSelectMonths.vue +67 -0
- package/components/tiles/FSChartTileUI.vue +116 -0
- package/components/tiles/FSCommentTileUI.vue +149 -0
- package/components/tiles/FSDashboardOrganisationTileUI.vue +6 -8
- package/components/tiles/FSDashboardOrganisationTypeTileUI.vue +6 -8
- package/components/tiles/FSDashboardShallowTileUI.vue +6 -8
- package/components/tiles/FSDeviceOrganisationTileUI.vue +30 -18
- package/components/tiles/FSFolderTileUI.vue +6 -6
- package/components/tiles/FSGroupTileUI.vue +31 -22
- package/components/tiles/FSLoadTile.vue +5 -7
- package/components/tiles/FSLocationTileUI.vue +157 -0
- package/components/tiles/FSModelTileUI.vue +18 -0
- package/components/tiles/FSServiceAccountOrganisationTileUI.vue +142 -0
- package/components/tiles/FSSimpleTileUI.vue +57 -36
- package/components/tiles/FSTile.vue +115 -55
- package/components/tiles/FSUserOrganisationTileUI.vue +25 -35
- package/components/toggleSets/FSToggleSetPosition.vue +1 -1
- package/components/views/FSEntityHeader.vue +343 -0
- package/components/views/FSEntityView.vue +163 -0
- package/components/views/FSListHeader.vue +83 -0
- package/components/views/FSListView.vue +83 -0
- package/components/views/FSSkeletonView.vue +100 -0
- package/composables/useAddress.ts +2 -2
- package/composables/useColors.ts +15 -5
- package/composables/useMagicFieldProvider.ts +7 -6
- package/composables/useSlots.ts +51 -28
- package/models/agenda.ts +9 -0
- package/models/deviceAlerts.ts +1 -1
- package/models/deviceConnectivities.ts +1 -1
- package/models/index.ts +1 -0
- package/models/magicFields.ts +1 -0
- package/models/map.ts +2 -2
- package/models/rules.ts +10 -5
- package/models/tables.ts +3 -1
- package/package.json +4 -4
- package/styles/components/fs_agenda.scss +32 -0
- package/styles/components/fs_agenda_event.scss +41 -0
- package/styles/components/fs_agenda_hours_col.scss +4 -0
- package/styles/components/fs_agenda_hours_row.scss +13 -0
- package/styles/components/fs_agenda_time_line_marker.scss +19 -0
- package/styles/components/fs_card.scss +0 -1
- package/styles/components/fs_clickable.scss +5 -3
- package/styles/components/fs_color_field.scss +1 -0
- package/styles/components/fs_data_table.scss +2 -0
- package/styles/components/fs_dialog.scss +11 -15
- package/styles/components/fs_edit_image.scss +8 -0
- package/styles/components/fs_fade_out.scss +2 -1
- package/styles/components/fs_filter_button.scss +1 -6
- package/styles/components/fs_gradient_field.scss +11 -11
- package/styles/components/fs_magic_config_field.scss +2 -2
- package/styles/components/fs_map.scss +36 -30
- package/styles/components/fs_option_group.scss +15 -5
- package/styles/components/fs_radio.scss +11 -0
- package/styles/components/fs_rich_text_field.scss +2 -1
- package/styles/components/fs_search_field.scss +3 -0
- package/styles/components/fs_select_date_settings.scss +3 -0
- package/styles/components/fs_slide_group.scss +5 -0
- package/styles/components/fs_span.scss +2 -1
- package/styles/components/fs_switch.scss +1 -0
- package/styles/components/fs_tabs.scss +9 -0
- package/styles/components/fs_text_area.scss +15 -1
- package/styles/components/fs_tile.scss +22 -6
- package/styles/components/fs_window.scss +5 -0
- package/styles/components/fs_wrap_group.scss +4 -0
- package/styles/components/index.scss +6 -1
- package/styles/globals/overrides.scss +22 -19
- package/styles/globals/text_fonts.scss +17 -55
- package/tools/alertsTools.ts +54 -0
- package/tools/chartsTools.ts +300 -0
- package/tools/index.ts +2 -0
- package/utils/badge.ts +9 -0
- package/utils/filter.ts +18 -0
- package/utils/index.ts +2 -0
- package/utils/leafletMarkers.ts +8 -2
- package/utils/statuses.ts +1 -1
- package/utils/time.ts +27 -1
- package/components/autocompletes/FSAutocompleteTag.vue +0 -138
- package/components/map/FSMapEditPointAddressOverlay.vue +0 -164
- package/styles/components/fs_map_overlay.scss +0 -38
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import { AxisType, ColorSets, SerieType, ChartType, TimeUnit } from "@dative-gpi/foundation-shared-domain/enums";
|
|
2
|
+
|
|
3
|
+
import { serieTypeLabel, getEnumEntries } from "@dative-gpi/foundation-core-components/utils";
|
|
4
|
+
import { useTranslations as useTranslationsProvider } from "@dative-gpi/bones-ui/composables";
|
|
5
|
+
|
|
6
|
+
const { $tr } = useTranslationsProvider();
|
|
7
|
+
|
|
8
|
+
export const chartTypeLabel = (value: ChartType): string => {
|
|
9
|
+
switch (value) {
|
|
10
|
+
case ChartType.Gauge: return $tr("ui.common.gauge", "Gauge");
|
|
11
|
+
case ChartType.Heatmap: return $tr("ui.common.heatmap", "Heatmap");
|
|
12
|
+
case ChartType.Pie: return $tr("ui.common.pie", "Pie");
|
|
13
|
+
case ChartType.ScoreCard: return $tr("ui.common.scorecard", "Scorecard");
|
|
14
|
+
case ChartType.Slider: return $tr("ui.common.slider", "Slider");
|
|
15
|
+
case ChartType.Table: return $tr("ui.common.table", "Table");
|
|
16
|
+
case ChartType.XY: return $tr("ui.common.xy", "XY");
|
|
17
|
+
default: return $tr("ui.common.none", "None");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const colorSetLabel = (value: ColorSets | number): string => {
|
|
22
|
+
switch (value) {
|
|
23
|
+
case ColorSets.Default: return $tr("ui.common.am-charts", "Am Charts");
|
|
24
|
+
case ColorSets.Grafana: return $tr("ui.common.grafana", "Grafana");
|
|
25
|
+
case ColorSets.Armytage: return $tr("ui.common.armytage", "Armytage");
|
|
26
|
+
case ColorSets.Hash: return $tr("ui.common.hash", "Hash");
|
|
27
|
+
case ColorSets.Kelly: return $tr("ui.common.material", "Kelly");
|
|
28
|
+
case ColorSets.ZeileisHornikMurrell: return $tr("ui.common.material", "ZeileisHornikMurrell");
|
|
29
|
+
default: return $tr("ui.common.none", "None");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
export const chartIcon = (value: ChartType): string => {
|
|
35
|
+
switch (value) {
|
|
36
|
+
case ChartType.Gauge: return "mdi-gauge";
|
|
37
|
+
case ChartType.Heatmap: return "mdi-blur-linear";
|
|
38
|
+
case ChartType.Pie: return "mdi-chart-pie";
|
|
39
|
+
case ChartType.ScoreCard: return "mdi-counter";
|
|
40
|
+
case ChartType.Slider: return "mdi-ruler";
|
|
41
|
+
case ChartType.Table: return "mdi-table";
|
|
42
|
+
case ChartType.XY: return "mdi-chart-line";
|
|
43
|
+
default: return $tr("ui.common.none", "None");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export const serieTypeIcon = (serieType: SerieType): string => {
|
|
48
|
+
switch (serieType) {
|
|
49
|
+
case SerieType.Lines: return "mdi-chart-line";
|
|
50
|
+
case SerieType.Area: return "mdi-chart-areaspline";
|
|
51
|
+
case SerieType.Range: return "mdi-chart-line-stacked";
|
|
52
|
+
case SerieType.Histogram: return "mdi-chart-histogram";
|
|
53
|
+
case SerieType.Operation: return "mdi-division";
|
|
54
|
+
case SerieType.Planning: return "mdi-chart-timeline";
|
|
55
|
+
case SerieType.ScatterPlot: return "mdi-chart-scatter-plot";
|
|
56
|
+
case SerieType.Top: return "mdi-podium-gold";
|
|
57
|
+
case SerieType.Bars: return "mdi-chart-bar";
|
|
58
|
+
case SerieType.StackedBars: return "mdi-chart-bar-stacked";
|
|
59
|
+
case SerieType.Pie: return "mdi-chart-pie";
|
|
60
|
+
case SerieType.Heatmap: return "mdi-blur-linear";
|
|
61
|
+
case SerieType.Slider: return "mdi-blur-linear";
|
|
62
|
+
case SerieType.Gauge: return "mdi-gauge";
|
|
63
|
+
case SerieType.ScoreCard: return "mdi-counter";
|
|
64
|
+
case SerieType.Table: return "mdi-table";
|
|
65
|
+
default: return "";
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export const showModifiers = (serieType: SerieType) => {
|
|
70
|
+
switch (serieType) {
|
|
71
|
+
case SerieType.Lines:
|
|
72
|
+
return { showData: true, showFirst: true, firstLabel: $tr('ui.common.group-by', 'Group by') };
|
|
73
|
+
case SerieType.Area:
|
|
74
|
+
return { showData: true, showFirst: true, firstLabel: $tr('ui.common.group-by', 'Group by') };
|
|
75
|
+
case SerieType.Range:
|
|
76
|
+
return { showData: true, showFirst: true, firstLabel: $tr('ui.common.group-by', 'Group by') };
|
|
77
|
+
case SerieType.Histogram:
|
|
78
|
+
return { showData: true, showFirst: true, firstLabel: $tr('ui.common.group-by', 'Group by') };
|
|
79
|
+
case SerieType.Operation:
|
|
80
|
+
return { showData: true, showFirst: true, firstLabel: $tr('ui.common.group-by', 'Group by') };
|
|
81
|
+
case SerieType.Planning:
|
|
82
|
+
return {
|
|
83
|
+
showData: true, showY: true, showFirst: true, showSecond: true,
|
|
84
|
+
ylabel: $tr('ui.common.y-axis-categories', 'Y Axis categories'),
|
|
85
|
+
firstLabel: $tr('ui.common.group-by', 'Group by'),
|
|
86
|
+
secondLabel: $tr('ui.common.elapsed-time-by', 'Elapsed time by'),
|
|
87
|
+
};
|
|
88
|
+
case SerieType.ScatterPlot:
|
|
89
|
+
return {
|
|
90
|
+
showX: true, showY: true, showFirst: true, showSecond: true,
|
|
91
|
+
xlabel: $tr('ui.common.x-axis-data', 'X axis data'),
|
|
92
|
+
ylabel: $tr('ui.common.y-axis-data', 'Y axis data'),
|
|
93
|
+
firstLabel: $tr('ui.common.group-by', 'Group by'),
|
|
94
|
+
secondLabel: $tr('ui.common.size-by', 'Size by')
|
|
95
|
+
};
|
|
96
|
+
case SerieType.Top:
|
|
97
|
+
return {
|
|
98
|
+
showData: true, showY: true, showFirst: true,
|
|
99
|
+
ylabel: $tr('ui.common.y-axis-categories', 'Y Axis categories'),
|
|
100
|
+
firstLabel: $tr('ui.common.group-by', 'Group by')
|
|
101
|
+
};
|
|
102
|
+
case SerieType.Bars:
|
|
103
|
+
return { showData: true, showFirst: true, firstLabel: $tr('ui.common.group-by', 'Group by') };
|
|
104
|
+
case SerieType.StackedBars:
|
|
105
|
+
return {
|
|
106
|
+
showData: true, showFirst: true, showSecond: true,
|
|
107
|
+
firstLabel: $tr('ui.common.group-by', 'Group by'),
|
|
108
|
+
secondLabel: $tr('ui.common.stack-by', 'Stack by')
|
|
109
|
+
};
|
|
110
|
+
case SerieType.Pie:
|
|
111
|
+
return { showData: true, showFirst: true, firstLabel: $tr('ui.common.group-by', 'Group by') };
|
|
112
|
+
case SerieType.Heatmap:
|
|
113
|
+
return {
|
|
114
|
+
showData: true, showX: true, showY: true,
|
|
115
|
+
xlabel: $tr('ui.common.x-axis-categories', 'X Axis categories'),
|
|
116
|
+
ylabel: $tr('ui.common.y-axis-categories', 'Y Axis categories')
|
|
117
|
+
};
|
|
118
|
+
case SerieType.Slider:
|
|
119
|
+
return { showData: true, showFirst: true, firstLabel: $tr('ui.common.group-by', 'Group by') };
|
|
120
|
+
case SerieType.Gauge:
|
|
121
|
+
return { showData: true, showFirst: true, firstLabel: $tr('ui.common.group-by', 'Group by') };
|
|
122
|
+
case SerieType.ScoreCard:
|
|
123
|
+
return { showData: true, showFirst: true, firstLabel: $tr('ui.common.group-by', 'Group by') };
|
|
124
|
+
case SerieType.Table:
|
|
125
|
+
return { showData: true };
|
|
126
|
+
default:
|
|
127
|
+
return {};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export const chartTypeFromSerieType = (serieType: SerieType): ChartType => {
|
|
132
|
+
|
|
133
|
+
switch (serieType) {
|
|
134
|
+
case SerieType.Lines:
|
|
135
|
+
case SerieType.Area:
|
|
136
|
+
case SerieType.Range:
|
|
137
|
+
case SerieType.Histogram:
|
|
138
|
+
case SerieType.Operation:
|
|
139
|
+
case SerieType.Planning:
|
|
140
|
+
case SerieType.ScatterPlot:
|
|
141
|
+
case SerieType.Top:
|
|
142
|
+
case SerieType.Bars:
|
|
143
|
+
case SerieType.StackedBars:
|
|
144
|
+
return ChartType.XY;
|
|
145
|
+
case SerieType.Pie:
|
|
146
|
+
return ChartType.Pie;
|
|
147
|
+
case SerieType.Heatmap:
|
|
148
|
+
return ChartType.Heatmap;
|
|
149
|
+
case SerieType.Slider:
|
|
150
|
+
return ChartType.Slider;
|
|
151
|
+
case SerieType.Gauge:
|
|
152
|
+
return ChartType.Gauge;
|
|
153
|
+
case SerieType.ScoreCard:
|
|
154
|
+
return ChartType.ScoreCard;
|
|
155
|
+
case SerieType.Table:
|
|
156
|
+
return ChartType.Table;
|
|
157
|
+
default:
|
|
158
|
+
return ChartType.None;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export const xAxisTypeFromSerieType = (serieType: SerieType): AxisType[] => {
|
|
163
|
+
|
|
164
|
+
switch (serieType) {
|
|
165
|
+
case SerieType.Lines:
|
|
166
|
+
case SerieType.Area:
|
|
167
|
+
case SerieType.Range:
|
|
168
|
+
case SerieType.Histogram:
|
|
169
|
+
case SerieType.Operation:
|
|
170
|
+
case SerieType.Planning:
|
|
171
|
+
return [AxisType.Date];
|
|
172
|
+
|
|
173
|
+
case SerieType.ScatterPlot:
|
|
174
|
+
return [AxisType.Category, AxisType.Value];
|
|
175
|
+
|
|
176
|
+
case SerieType.Top:
|
|
177
|
+
return [AxisType.Value];
|
|
178
|
+
|
|
179
|
+
case SerieType.Bars:
|
|
180
|
+
case SerieType.StackedBars:
|
|
181
|
+
return [AxisType.Category];
|
|
182
|
+
|
|
183
|
+
case SerieType.Heatmap:
|
|
184
|
+
return [AxisType.Date, AxisType.Category];
|
|
185
|
+
|
|
186
|
+
case SerieType.Slider:
|
|
187
|
+
return [AxisType.Value];
|
|
188
|
+
|
|
189
|
+
case SerieType.Gauge:
|
|
190
|
+
case SerieType.ScoreCard:
|
|
191
|
+
case SerieType.Table:
|
|
192
|
+
case SerieType.Pie:
|
|
193
|
+
return [];
|
|
194
|
+
default:
|
|
195
|
+
return [];
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export const yAxisTypeFromSerieType = (serieType: SerieType): AxisType[] => {
|
|
200
|
+
|
|
201
|
+
switch (serieType) {
|
|
202
|
+
case SerieType.Lines:
|
|
203
|
+
case SerieType.Area:
|
|
204
|
+
case SerieType.Range:
|
|
205
|
+
case SerieType.Histogram:
|
|
206
|
+
case SerieType.Operation:
|
|
207
|
+
return [AxisType.Value];
|
|
208
|
+
|
|
209
|
+
case SerieType.ScatterPlot:
|
|
210
|
+
return [AxisType.Category, AxisType.Value];
|
|
211
|
+
|
|
212
|
+
case SerieType.Bars:
|
|
213
|
+
case SerieType.StackedBars:
|
|
214
|
+
return [AxisType.Value];
|
|
215
|
+
|
|
216
|
+
case SerieType.Top:
|
|
217
|
+
return [AxisType.Category];
|
|
218
|
+
|
|
219
|
+
case SerieType.Planning:
|
|
220
|
+
return [AxisType.Category];
|
|
221
|
+
|
|
222
|
+
case SerieType.Heatmap:
|
|
223
|
+
return [AxisType.Category];
|
|
224
|
+
|
|
225
|
+
case SerieType.Slider:
|
|
226
|
+
return [AxisType.Value];
|
|
227
|
+
|
|
228
|
+
case SerieType.Gauge:
|
|
229
|
+
case SerieType.ScoreCard:
|
|
230
|
+
case SerieType.Table:
|
|
231
|
+
case SerieType.Pie:
|
|
232
|
+
return [];
|
|
233
|
+
default:
|
|
234
|
+
return [];
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export const hasAxis = (chartType: ChartType) => {
|
|
239
|
+
switch (chartType) {
|
|
240
|
+
case ChartType.XY:
|
|
241
|
+
case ChartType.Heatmap:
|
|
242
|
+
return true;
|
|
243
|
+
default:
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
export const getAllowedSeries = (chartType: ChartType, xAxisType: AxisType, yAxisType: AxisType) => {
|
|
250
|
+
|
|
251
|
+
const items = getEnumEntries(SerieType).map(e => {
|
|
252
|
+
return {
|
|
253
|
+
value: e.value as SerieType,
|
|
254
|
+
text: serieTypeLabel(e.value),
|
|
255
|
+
icon: serieTypeIcon(e.value),
|
|
256
|
+
chartType: chartTypeFromSerieType(e.value),
|
|
257
|
+
xAxis: xAxisTypeFromSerieType(e.value),
|
|
258
|
+
yAxis: yAxisTypeFromSerieType(e.value)
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
const filteredItems = () => {
|
|
263
|
+
switch (chartType) {
|
|
264
|
+
case ChartType.XY: {
|
|
265
|
+
return items.filter(i => i.chartType === ChartType.XY && i.xAxis.includes(xAxisType) && i.yAxis.includes(yAxisType));
|
|
266
|
+
}
|
|
267
|
+
case ChartType.Pie:
|
|
268
|
+
case ChartType.Heatmap:
|
|
269
|
+
case ChartType.Gauge:
|
|
270
|
+
case ChartType.Slider:
|
|
271
|
+
case ChartType.ScoreCard:
|
|
272
|
+
case ChartType.Table: {
|
|
273
|
+
return items.filter(i => i.chartType === chartType);
|
|
274
|
+
}
|
|
275
|
+
default: {
|
|
276
|
+
return [];
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
return filteredItems();
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
export const timeMillisecond = (value: number | null | undefined, unit: TimeUnit | undefined): number => {
|
|
285
|
+
if (value === null || value === undefined || unit === undefined) {
|
|
286
|
+
return 0;
|
|
287
|
+
}
|
|
288
|
+
switch (unit) {
|
|
289
|
+
case TimeUnit.None: return 0;
|
|
290
|
+
case TimeUnit.Millisecond: return value;
|
|
291
|
+
case TimeUnit.Second: return value * 1000;
|
|
292
|
+
case TimeUnit.Minute: return value * 60000;
|
|
293
|
+
case TimeUnit.Hour: return value * 3600000;
|
|
294
|
+
case TimeUnit.Day: return value * 86400000;
|
|
295
|
+
case TimeUnit.Week: return value * 604800000;
|
|
296
|
+
case TimeUnit.Month: return value * 2628000000;
|
|
297
|
+
case TimeUnit.Year: return value * 31536000000;
|
|
298
|
+
default: return 0;
|
|
299
|
+
}
|
|
300
|
+
}
|
package/tools/index.ts
ADDED
package/utils/badge.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const getBadgeFromNumber = (value: number, parenthesis: boolean = false): string => {
|
|
2
|
+
if (value < 1) {
|
|
3
|
+
return "";
|
|
4
|
+
}
|
|
5
|
+
if (value > 99) {
|
|
6
|
+
return `${parenthesis ? '(' : ''}99+${parenthesis ? ')' : ''}`;
|
|
7
|
+
}
|
|
8
|
+
return `${parenthesis ? '(' : ''}${value.toString()}${parenthesis ? ')' : ''}`;
|
|
9
|
+
}
|
package/utils/filter.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const containsSearchTerm = (obj: any, searchTerm: string): boolean => {
|
|
2
|
+
if (obj == null) {
|
|
3
|
+
return false;
|
|
4
|
+
}
|
|
5
|
+
if (typeof obj === 'object') {
|
|
6
|
+
return Object.values(obj).some(value => containsSearchTerm(value, searchTerm));
|
|
7
|
+
}
|
|
8
|
+
if (Array.isArray(obj)) {
|
|
9
|
+
return obj.some(element => containsSearchTerm(element, searchTerm));
|
|
10
|
+
}
|
|
11
|
+
return String(obj).toLowerCase().includes(searchTerm);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export const filterItems = <T>(items: T[], filter: string): T[] => {
|
|
15
|
+
const searchTerm = filter.toLowerCase();
|
|
16
|
+
|
|
17
|
+
return items.filter(item => containsSearchTerm(item, searchTerm));
|
|
18
|
+
};
|
package/utils/index.ts
CHANGED
package/utils/leafletMarkers.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export const locationMarkerHtml = (icon: string, color: string) => {
|
|
2
2
|
const iconHtml = `
|
|
3
|
-
<div style="--fs-map-
|
|
3
|
+
<div style="--fs-map-location-pin-color-alpha:${color}50;--fs-map-location-pin-color: ${color}">
|
|
4
4
|
<i class="${icon} mdi notranslate v-theme--DefaultTheme fs-icon" aria-hidden="true" style="--fs-icon-font-size: 22px;" />
|
|
5
5
|
</div>`;
|
|
6
6
|
|
|
@@ -16,8 +16,14 @@ export const clusterMarkerHtml = (label: string) => {
|
|
|
16
16
|
return iconHtml;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
export const
|
|
19
|
+
export const gpsMarkerHtml = () => {
|
|
20
20
|
const iconHtml = `<div class="fs-map-mylocation-pin" />`;
|
|
21
21
|
|
|
22
|
+
return iconHtml;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const pinMarkerHtml = (color: string) => {
|
|
26
|
+
const iconHtml = `<div style="--fs-map-point-pin-color:${color}" class="fs-map-point-pin" />`;
|
|
27
|
+
|
|
22
28
|
return iconHtml;
|
|
23
29
|
}
|
package/utils/statuses.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useTranslations as useTranslationsProvider } from "@dative-gpi/bones-ui/composables";
|
|
2
|
-
import { ConnectivityStatus } from "@dative-gpi/foundation-shared-domain/
|
|
2
|
+
import { ConnectivityStatus } from "@dative-gpi/foundation-shared-domain/enums";
|
|
3
3
|
|
|
4
4
|
const { $tr } = useTranslationsProvider();
|
|
5
5
|
|
package/utils/time.ts
CHANGED
|
@@ -1,7 +1,33 @@
|
|
|
1
1
|
import { useTranslations as useTranslationsProvider } from "@dative-gpi/bones-ui/composables";
|
|
2
2
|
|
|
3
|
+
import { TimeUnit } from "@dative-gpi/foundation-shared-domain/enums"
|
|
4
|
+
|
|
3
5
|
const { $tr } = useTranslationsProvider();
|
|
4
6
|
|
|
7
|
+
export const timeSteps = [
|
|
8
|
+
{ id: TimeUnit.Second, label: $tr("ui.time-step.second.singular", "Second"), plural: $tr("ui.time-step.second.plural", "Seconds") },
|
|
9
|
+
{ id: TimeUnit.Minute, label: $tr("ui.time-step.minute.singular", "Minute"), plural: $tr("ui.time-step.minute.plural", "Minutes") },
|
|
10
|
+
{ id: TimeUnit.Hour, label: $tr("ui.time-step.hour.singular", "Hour"), plural: $tr("ui.time-step.hour.plural", "Hours") },
|
|
11
|
+
{ id: TimeUnit.Day, label: $tr("ui.time-step.day.singular", "Day"), plural: $tr("ui.time-step.day.plural", "Days") },
|
|
12
|
+
{ id: TimeUnit.Week, label: $tr("ui.time-step.week.singular", "Week"), plural: $tr("ui.time-step.week.plural", "Weeks") },
|
|
13
|
+
{ id: TimeUnit.Month, label: $tr("ui.time-step.month.singular", "Month"), plural: $tr("ui.time-step.month.plural", "Months") },
|
|
14
|
+
{ id: TimeUnit.Year, label: $tr("ui.time-step.year.singular", "Year"), plural: $tr("ui.time-step.year.plural", "Years") },
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
export const timeStepToString = (value: { value: number, unit: TimeUnit } | null): string => {
|
|
18
|
+
if (!value) {
|
|
19
|
+
return "";
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const unit = timeSteps.find(step => step.id === value.unit);
|
|
23
|
+
if (!unit) {
|
|
24
|
+
return "";
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return `${value.value} ${value.value === 1 ? unit.label.toLowerCase() : unit.plural.toLowerCase()}`;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// TODO : remove everything below this line
|
|
5
31
|
export const timeScale: any[] = [
|
|
6
32
|
{ id: 1, label: $tr("ui.time-field.second.singular", "Second"), plural: $tr("ui.time-field.second.plural", "Seconds") },
|
|
7
33
|
{ id: 60, label: $tr("ui.time-field.minute.singular", "Minute"), plural: $tr("ui.time-field.minute.plural", "Minutes") },
|
|
@@ -26,4 +52,4 @@ export const getTimeBestString = (value: number): string => {
|
|
|
26
52
|
const unit = getTimeScaleIndex(value);
|
|
27
53
|
const figure = value / timeScale[unit].id;
|
|
28
54
|
return `${figure} ${figure === 1 ? timeScale[unit].label.toLowerCase() : timeScale[unit].plural.toLowerCase()}`;
|
|
29
|
-
}
|
|
55
|
+
};
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<FSCol>
|
|
3
|
-
<FSAutocompleteField
|
|
4
|
-
v-if="variant=='standard'"
|
|
5
|
-
:label="label"
|
|
6
|
-
:items="innerItems"
|
|
7
|
-
:multiple="true"
|
|
8
|
-
:modelValue="modelValue?.map(m=>m.id)"
|
|
9
|
-
@update:modelValue="onUpdateModelValue"
|
|
10
|
-
@keydown="onKeydown"
|
|
11
|
-
v-binds="$attrs"
|
|
12
|
-
>
|
|
13
|
-
<template
|
|
14
|
-
#autocomplete-chip
|
|
15
|
-
>
|
|
16
|
-
</template>
|
|
17
|
-
</FSAutocompleteField>
|
|
18
|
-
<FSAutocompleteField
|
|
19
|
-
v-else
|
|
20
|
-
:label="label"
|
|
21
|
-
:items="innerItems"
|
|
22
|
-
:multiple="true"
|
|
23
|
-
:modelValue="modelValue?.map(m=>m.id)"
|
|
24
|
-
:showSearch="true"
|
|
25
|
-
@update:modelValue="onUpdateModelValue"
|
|
26
|
-
@add:item="onAddItem"
|
|
27
|
-
@keydown="onKeydown"
|
|
28
|
-
v-binds="$attrs"
|
|
29
|
-
>
|
|
30
|
-
<template
|
|
31
|
-
#autocomplete-chip
|
|
32
|
-
>
|
|
33
|
-
</template>
|
|
34
|
-
</FSAutocompleteField>
|
|
35
|
-
<FSTagGroup
|
|
36
|
-
v-if="modelValue != null"
|
|
37
|
-
:tags="modelValue?.map((v) => v.label) ?? []"
|
|
38
|
-
@remove="onRemoveValue($event)"
|
|
39
|
-
/>
|
|
40
|
-
</FSCol>
|
|
41
|
-
</template>
|
|
42
|
-
|
|
43
|
-
<script lang="ts">
|
|
44
|
-
import type { PropType } from "vue";
|
|
45
|
-
import { computed, defineComponent, ref, watch } from "vue";
|
|
46
|
-
|
|
47
|
-
import { uuidv4 } from '@dative-gpi/bones-ui';
|
|
48
|
-
|
|
49
|
-
import FSAutocompleteField from "../fields/FSAutocompleteField.vue";
|
|
50
|
-
import FSTagGroup from "../FSTagGroup.vue";
|
|
51
|
-
|
|
52
|
-
export default defineComponent({
|
|
53
|
-
components: {
|
|
54
|
-
FSAutocompleteField,
|
|
55
|
-
FSTagGroup,
|
|
56
|
-
},
|
|
57
|
-
props:{
|
|
58
|
-
modelValue: {
|
|
59
|
-
type: Array as PropType<{id : string, label : string, isCustom: boolean}[] | null>,
|
|
60
|
-
required: false,
|
|
61
|
-
default: () => []
|
|
62
|
-
},
|
|
63
|
-
items: {
|
|
64
|
-
type: Array as PropType<{id : string, label : string, isCustom: boolean}[]>,
|
|
65
|
-
required: false,
|
|
66
|
-
default: () => []
|
|
67
|
-
},
|
|
68
|
-
label : {
|
|
69
|
-
type: String,
|
|
70
|
-
required: false
|
|
71
|
-
},
|
|
72
|
-
variant: {
|
|
73
|
-
type: String as PropType<'standard' | 'tagged'>,
|
|
74
|
-
required: false,
|
|
75
|
-
default : 'standard'
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
emits: ["update:modelValue"],
|
|
79
|
-
setup(props, {emit}) {
|
|
80
|
-
|
|
81
|
-
const tagValues = ref<{id : string, label : string, isCustom : boolean}[]>([]);
|
|
82
|
-
|
|
83
|
-
const innerItems = computed(()=>{
|
|
84
|
-
|
|
85
|
-
if(props.variant === 'standard'){
|
|
86
|
-
return props.items
|
|
87
|
-
}
|
|
88
|
-
else{
|
|
89
|
-
return props.items.concat(tagValues.value);
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
const onUpdateModelValue = (value: string[] | null) => {
|
|
94
|
-
emit('update:modelValue', value?.map((v) => innerItems.value.find((i) => i.id === v)));
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const onRemoveValue = (value: string) => {
|
|
98
|
-
const idValue = innerItems.value.find((v) => v.label === value)?.id;
|
|
99
|
-
if (idValue) {
|
|
100
|
-
if(tagValues.value.map((v) => v.label).includes(value)){
|
|
101
|
-
tagValues.value = tagValues.value.filter((v) => v.label !== value);
|
|
102
|
-
}
|
|
103
|
-
emit('update:modelValue', [...props.modelValue?.filter((v) => v.id !== idValue) ?? []]);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const onAddItem = (value: string) => {
|
|
108
|
-
if (innerItems.value.map((v) => v.label).includes(value)) {
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
let item = {id: uuidv4(), label: value, isCustom: true};
|
|
112
|
-
tagValues.value.push(item);
|
|
113
|
-
emit('update:modelValue', [...props.modelValue?? [],item]);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
const onKeydown = (event: KeyboardEvent) => {
|
|
117
|
-
if (event.key === 'Backspace') {
|
|
118
|
-
emit('update:modelValue', [...props.modelValue ?? []]);
|
|
119
|
-
}
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
watch(() => props.modelValue, (newValue) => {
|
|
123
|
-
if (newValue) {
|
|
124
|
-
tagValues.value = props.modelValue?.filter(m=>m.isCustom) ?? [];
|
|
125
|
-
}
|
|
126
|
-
}, {immediate: true});
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
return {
|
|
130
|
-
innerItems,
|
|
131
|
-
onUpdateModelValue,
|
|
132
|
-
onAddItem,
|
|
133
|
-
onRemoveValue,
|
|
134
|
-
onKeydown
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
})
|
|
138
|
-
</script>
|