@dative-gpi/foundation-shared-components 0.0.8 → 0.0.10

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 (140) hide show
  1. package/{models/FSButtons.ts → aliases/FSButton.ts} +24 -21
  2. package/aliases/index.ts +1 -0
  3. package/components/FSAutocompleteField.vue +207 -0
  4. package/components/FSBadge.vue +38 -0
  5. package/components/FSBreadcrumbs.vue +49 -55
  6. package/components/FSButton.vue +116 -101
  7. package/components/FSCalendar.vue +52 -39
  8. package/components/FSCalendarTwin.vue +120 -102
  9. package/components/FSCard.vue +35 -21
  10. package/components/FSCarousel.vue +63 -0
  11. package/components/FSCheckbox.vue +111 -103
  12. package/components/FSChip.vue +140 -0
  13. package/components/FSClock.vue +149 -15
  14. package/components/FSCol.vue +104 -98
  15. package/components/FSColor.vue +61 -64
  16. package/components/FSColorIcon.vue +67 -0
  17. package/components/FSContainer.vue +64 -0
  18. package/components/FSDateField.vue +211 -0
  19. package/components/FSDateRangeField.vue +225 -0
  20. package/components/FSDateTimeField.vue +257 -0
  21. package/components/FSDateTimeRangeField.vue +286 -0
  22. package/components/FSDialog.vue +103 -0
  23. package/components/FSDivider.vue +39 -0
  24. package/components/FSFadeOut.vue +49 -59
  25. package/components/FSFileButton.vue +245 -0
  26. package/components/FSHeaderButton.vue +17 -0
  27. package/components/FSIcon.vue +23 -23
  28. package/components/FSIconField.vue +232 -0
  29. package/components/FSImage.vue +142 -0
  30. package/components/FSLoadTile.vue +93 -0
  31. package/components/FSNumberField.vue +51 -53
  32. package/components/FSPasswordField.vue +99 -101
  33. package/components/FSRadio.vue +107 -109
  34. package/components/FSRadioGroup.vue +55 -57
  35. package/components/FSRemoveDialog.vue +123 -0
  36. package/components/FSRichTextField.vue +26 -33
  37. package/components/FSRow.vue +110 -104
  38. package/components/FSSearchField.vue +35 -27
  39. package/components/FSSelectField.vue +188 -0
  40. package/components/FSSlideGroup.vue +45 -49
  41. package/components/FSSlider.vue +31 -33
  42. package/components/FSSpan.vue +53 -37
  43. package/components/FSSubmitDialog.vue +165 -0
  44. package/components/FSSwitch.vue +110 -109
  45. package/components/FSTab.vue +61 -61
  46. package/components/FSTabs.vue +53 -55
  47. package/components/FSTag.vue +88 -84
  48. package/components/FSTagField.vue +32 -36
  49. package/components/FSTagGroup.vue +38 -45
  50. package/components/FSText.vue +74 -64
  51. package/components/FSTextArea.vue +187 -185
  52. package/components/FSTextField.vue +18 -20
  53. package/components/FSTile.vue +90 -0
  54. package/components/FSToggleSet.vue +282 -0
  55. package/components/FSTooltip.vue +21 -0
  56. package/components/FSWindow.vue +26 -16
  57. package/components/FSWrapGroup.vue +44 -47
  58. package/components/deviceOrganisations/FSConnectivity.vue +114 -0
  59. package/components/deviceOrganisations/FSStatus.vue +117 -0
  60. package/components/deviceOrganisations/FSStatusesCarousel.vue +105 -0
  61. package/components/deviceOrganisations/FSStatusesRow.vue +66 -0
  62. package/components/deviceOrganisations/FSWorstAlert.vue +165 -0
  63. package/components/lists/FSDataIteratorGroup.vue +7 -0
  64. package/components/lists/FSDataIteratorItem.vue +103 -0
  65. package/components/lists/FSDataTableUI.vue +982 -0
  66. package/components/lists/FSFilterButton.vue +177 -0
  67. package/components/lists/FSHeaderButton.vue +99 -0
  68. package/components/lists/FSHiddenButton.vue +81 -0
  69. package/components/tiles/FSDeviceOrganisationTileUI.vue +232 -0
  70. package/components/tiles/FSGroupTileUI.vue +192 -0
  71. package/composables/index.ts +1 -1
  72. package/composables/useBreakpoints.ts +23 -4
  73. package/composables/useColors.ts +53 -23
  74. package/composables/useSlots.ts +43 -0
  75. package/index.ts +6 -0
  76. package/models/breadcrumbs.ts +8 -0
  77. package/models/colors.ts +17 -0
  78. package/models/deviceAlerts.ts +10 -0
  79. package/models/deviceConnectivities.ts +11 -0
  80. package/models/deviceStatuses.ts +16 -0
  81. package/models/index.ts +9 -0
  82. package/models/modelStatuses.ts +11 -0
  83. package/models/rules.ts +50 -0
  84. package/models/tables.ts +33 -0
  85. package/models/toggleSets.ts +7 -0
  86. package/package.json +6 -4
  87. package/plugins/colorPlugin.ts +2 -2
  88. package/shims-plugin.d.ts +1 -1
  89. package/styles/components/fs_autocomplete_field.scss +123 -0
  90. package/styles/components/fs_button.scss +4 -6
  91. package/styles/components/fs_calendar.scss +24 -1
  92. package/styles/components/fs_card.scss +2 -5
  93. package/styles/components/fs_carousel.scss +4 -0
  94. package/styles/components/fs_chip.scss +33 -0
  95. package/styles/components/fs_clock.scss +43 -0
  96. package/styles/components/fs_col.scss +2 -0
  97. package/styles/components/fs_color_icon.scss +37 -0
  98. package/styles/components/fs_container.scss +16 -0
  99. package/styles/components/fs_data_iterator_item.scss +19 -0
  100. package/styles/components/fs_data_table.scss +97 -0
  101. package/styles/components/fs_date_field.scss +8 -0
  102. package/styles/components/fs_dialog.scss +30 -0
  103. package/styles/components/fs_divider.scss +5 -0
  104. package/styles/components/fs_fade_out.scss +10 -2
  105. package/styles/components/fs_filter_button.scss +21 -0
  106. package/styles/components/fs_header_button.scss +4 -0
  107. package/styles/components/fs_hidden_button.scss +12 -0
  108. package/styles/components/fs_icon.scss +19 -3
  109. package/styles/components/fs_icon_field.scss +12 -0
  110. package/styles/components/fs_image.scss +7 -0
  111. package/styles/components/fs_load_tile.scss +49 -0
  112. package/styles/components/fs_password_field.scss +2 -2
  113. package/styles/components/fs_row.scss +4 -1
  114. package/styles/components/fs_select_field.scss +71 -0
  115. package/styles/components/fs_slide_group.scss +6 -0
  116. package/styles/components/fs_slider.scss +29 -9
  117. package/styles/components/fs_span.scss +8 -0
  118. package/styles/components/fs_submit_dialog.scss +9 -0
  119. package/styles/components/fs_tabs.scss +4 -0
  120. package/styles/components/fs_tag_field.scss +0 -11
  121. package/styles/components/fs_text_field.scss +23 -15
  122. package/styles/components/fs_tile.scss +33 -0
  123. package/styles/components/fs_tooltip.scss +5 -0
  124. package/styles/components/fs_wrap_group.scss +7 -8
  125. package/styles/components/index.scss +22 -1
  126. package/styles/globals/breakpoints.scss +7 -0
  127. package/styles/globals/overrides.scss +20 -7
  128. package/styles/globals/text_fonts.scss +8 -8
  129. package/themes/default.ts +1 -11
  130. package/utils/css.ts +11 -0
  131. package/utils/icons.ts +75416 -0
  132. package/utils/index.ts +5 -1
  133. package/utils/levenshtein.ts +97 -0
  134. package/utils/sort.ts +9 -0
  135. package/components/FSDatePicker.vue +0 -226
  136. package/composables/useDates.ts +0 -39
  137. package/models/FSTags.ts +0 -8
  138. package/models/FSTextFields.ts +0 -23
  139. package/styles/components/fs_date_picker.scss +0 -0
  140. /package/utils/{FSRichTextField.ts → lexical.ts} +0 -0
package/utils/index.ts CHANGED
@@ -1 +1,5 @@
1
- export * from "./FSRichTextField";
1
+ export * from "./css";
2
+ export * from "./icons";
3
+ export * from "./levenshtein";
4
+ export * from "./lexical";
5
+ export * from "./sort";
@@ -0,0 +1,97 @@
1
+
2
+ const InnerMin = (d0: number, d1: number, d2: number, bx: number, ay: number) => {
3
+ return d0 < d1 || d2 < d1 ? d0 > d2 ? d2 + 1 : d0 + 1 : bx === ay ? d1 : d1 + 1;
4
+ };
5
+
6
+ export const levenshteinDistance = (a: string, b: string) => {
7
+ if (a === b) {
8
+ return 0;
9
+ }
10
+
11
+ if (a.length > b.length) {
12
+ let tmp = a;
13
+ a = b;
14
+ b = tmp;
15
+ }
16
+
17
+ let la = a.length;
18
+ let lb = b.length;
19
+
20
+ while (la > 0 && (a.charCodeAt(la - 1) === b.charCodeAt(lb - 1))) {
21
+ la--;
22
+ lb--;
23
+ }
24
+
25
+ let offset = 0;
26
+
27
+ while (offset < la && (a.charCodeAt(offset) === b.charCodeAt(offset))) {
28
+ offset++;
29
+ }
30
+
31
+ la -= offset;
32
+ lb -= offset;
33
+
34
+ if (la === 0 || lb < 3) {
35
+ return lb;
36
+ }
37
+
38
+ let dd = 0;
39
+ let x = 0;
40
+ let y: number;
41
+ let d0: number;
42
+ let d1: number;
43
+ let d2: number;
44
+ let d3: number;
45
+ let dy: number;
46
+ let ay: number;
47
+ let bx0: number;
48
+ let bx1: number;
49
+ let bx2: number;
50
+ let bx3: number;
51
+
52
+ let vector: number[] = [];
53
+
54
+ for (y = 0; y < la; y++) {
55
+ vector.push(y + 1);
56
+ vector.push(a.charCodeAt(offset + y));
57
+ }
58
+
59
+ let len = vector.length - 1;
60
+
61
+ for (; x < lb - 3;) {
62
+ bx0 = b.charCodeAt(offset + (d0 = x));
63
+ bx1 = b.charCodeAt(offset + (d1 = x + 1));
64
+ bx2 = b.charCodeAt(offset + (d2 = x + 2));
65
+ bx3 = b.charCodeAt(offset + (d3 = x + 3));
66
+ dd = (x += 4);
67
+ for (y = 0; y < len; y += 2) {
68
+ dy = vector[y];
69
+ ay = vector[y + 1];
70
+ d0 = InnerMin(dy, d0, d1, bx0, ay);
71
+ d1 = InnerMin(d0, d1, d2, bx1, ay);
72
+ d2 = InnerMin(d1, d2, d3, bx2, ay);
73
+ dd = InnerMin(d2, d3, dd, bx3, ay);
74
+ vector[y] = dd;
75
+ d3 = d2;
76
+ d2 = d1;
77
+ d1 = d0;
78
+ d0 = dy;
79
+ }
80
+ }
81
+
82
+ for (; x < lb;) {
83
+ bx0 = b.charCodeAt(offset + (d0 = x));
84
+ dd = ++x;
85
+ for (y = 0; y < len; y += 2) {
86
+ dy = vector[y];
87
+ vector[y] = dd = InnerMin(dy, d0, dd, bx0, vector[y + 1]);
88
+ d0 = dy;
89
+ }
90
+ }
91
+
92
+ return dd;
93
+ };
94
+
95
+ export const sortByLevenshteinDistance = (a: string, b: string, ref: string) => {
96
+ return levenshteinDistance(a, ref) - levenshteinDistance(b, ref);
97
+ };
package/utils/sort.ts ADDED
@@ -0,0 +1,9 @@
1
+ export const alphanumericSort = (a: any, b: any) => {
2
+ if (typeof(a) !== 'string') {
3
+ a = JSON.stringify(a);
4
+ }
5
+ if (typeof(b) !== 'string') {
6
+ b = JSON.stringify(b);
7
+ }
8
+ return a.localeCompare(b, undefined, { numeric: true });
9
+ }
@@ -1,226 +0,0 @@
1
- <template>
2
- <v-menu :closeOnContentClick="false">
3
- <template #activator="{ props }">
4
- <FSTextField
5
- class="fs-date-picker"
6
- :label="$props.label"
7
- :description="$props.description"
8
- :color="$props.color"
9
- :required="$props.required"
10
- :editable="$props.editable"
11
- :error="messages.length > 0"
12
- :readonly="true"
13
- >
14
- <template #label>
15
- <slot name="label">
16
- <FSRow :wrap="false">
17
- <FSSpan
18
- v-if="$props.label"
19
- class="fs-date-picker-label"
20
- font="text-overline"
21
- :style="style"
22
- >
23
- {{ $props.label }}
24
- </FSSpan>
25
- <FSSpan
26
- v-if="$props.label && $props.required"
27
- class="fs-date-picker-label"
28
- style="margin-left: -8px;"
29
- font="text-overline"
30
- :ellipsis="false"
31
- :style="style"
32
- >
33
- *
34
- </FSSpan>
35
- <v-spacer style="min-width: 40px;" />
36
- <FSSpan
37
- v-if="messages.length > 0"
38
- class="fs-date-picker-messages"
39
- font="text-overline"
40
- :style="style"
41
- >
42
- {{ messages.join(", ") }}
43
- </FSSpan>
44
- </FSRow>
45
- </slot>
46
- </template>
47
- <template #prepend-inner>
48
- <slot name="prepend-inner">
49
- <FSIcon :color="prependColor">
50
- {{ $props.prependIcon }}
51
- </FSIcon>
52
- </slot>
53
- </template>
54
- <template #append>
55
- <slot name="append">
56
- <FSButton
57
- :prependIcon="$props.buttonPrependIcon"
58
- :label="$props.buttonLabel"
59
- :appendIcon="$props.buttonAppendIcon"
60
- :variant="$props.buttonVariant"
61
- :color="$props.buttonColor"
62
- :editable="$props.editable"
63
- v-bind="props"
64
- />
65
- </slot>
66
- </template>
67
- <template v-for="(_, name) in $slots" v-slot:[name]="slotData">
68
- <slot :name="name" v-bind="slotData" />
69
- </template>
70
- </FSTextField>
71
- </template>
72
- <FSCol>
73
- <FSCalendar
74
- label="test"
75
- :color="$props.color"
76
- :buttonColor="$props.buttonColor"
77
- :modelValue="$props.modelValue"
78
- @update:modelValue="(value) => $emit('update:modelValue', value)"
79
- />
80
- <FSClock
81
- :color="$props.color"
82
- :buttonColor="$props.buttonColor"
83
- :modelValue="$props.modelValue"
84
- @update:modelValue="(value) => $emit('update:modelValue', value)"
85
- />
86
- </FSCol>
87
- </v-menu>
88
- </template>
89
-
90
- <script lang="ts">
91
- import { computed, defineComponent, PropType, toRefs } from "vue";
92
-
93
- import { useColors } from "@dative-gpi/foundation-shared-components/composables";
94
- import { ColorBase } from "@dative-gpi/foundation-shared-components/themes";
95
-
96
- import FSTextField from "./FSTextField.vue";
97
- import FSCalendar from "./FSCalendarTwin.vue";
98
- import FSButton from "./FSButton.vue";
99
- import FSClock from "./FSClock.vue";
100
- import FSIcon from "./FSIcon.vue";
101
- import FSCol from "./FSCol.vue";
102
-
103
- export default defineComponent({
104
- name: "FSDatePicker",
105
- components: {
106
- FSTextField,
107
- FSCalendar,
108
- FSButton,
109
- FSClock,
110
- FSIcon,
111
- FSCol
112
- },
113
- props: {
114
- label: {
115
- type: String,
116
- required: false,
117
- default: null
118
- },
119
- description: {
120
- type: String,
121
- required: false,
122
- default: null
123
- },
124
- prependIcon: {
125
- type: String,
126
- required: false,
127
- default: "mdi-calendar"
128
- },
129
- buttonPrependIcon: {
130
- type: String,
131
- required: false,
132
- default: "mdi-pencil"
133
- },
134
- buttonLabel: {
135
- type: String,
136
- required: false,
137
- default: null
138
- },
139
- buttonAppendIcon: {
140
- type: String,
141
- required: false,
142
- default: null
143
- },
144
- buttonVariant: {
145
- type: String as PropType<"standard" | "full" | "icon">,
146
- required: false,
147
- default: "standard"
148
- },
149
- modelValue: {
150
- type: Array as PropType<Array<number>>,
151
- required: false,
152
- default: null
153
- },
154
- color: {
155
- type: String as PropType<ColorBase>,
156
- required: false,
157
- default: ColorBase.Dark
158
- },
159
- buttonColor: {
160
- type: String as PropType<ColorBase>,
161
- required: false,
162
- default: ColorBase.Primary
163
- },
164
- required: {
165
- type: Boolean,
166
- required: false,
167
- default: false
168
- },
169
- rules: {
170
- type: Array as PropType<Function[]>,
171
- required: false,
172
- default: () => []
173
- },
174
- editable: {
175
- type: Boolean,
176
- required: false,
177
- default: true
178
- }
179
- },
180
- setup(props) {
181
- const { color, rules, editable } = toRefs(props);
182
-
183
- const colors = useColors().getColors(color.value);
184
-
185
- const backgrounds = useColors().getColors(ColorBase.Background);
186
- const lights = useColors().getColors(ColorBase.Light);
187
- const darks = useColors().getColors(ColorBase.Dark);
188
-
189
- const prependColor = computed((): string => {
190
- if (!editable.value) {
191
- return lights.dark;
192
- }
193
- return darks.base;
194
- });
195
-
196
- const style = computed((): {[code: string]: string} & Partial<CSSStyleDeclaration> => {
197
- if (!editable.value) {
198
- return {};
199
- }
200
- return {
201
- "--fs-date-picker-background-color" : backgrounds.base,
202
- "--fs-date-picker-border-color" : colors.base,
203
- "--fs-date-picker-color" : darks.base,
204
- "--fs-date-picker-active-color" : lights.base,
205
- };
206
- });
207
-
208
- const messages = computed((): string[] => {
209
- const messages = [];
210
- for (const rule of rules.value) {
211
- const message = rule(props.modelValue ?? "");
212
- if (typeof(message) === "string") {
213
- messages.push(message);
214
- }
215
- }
216
- return messages;
217
- });
218
-
219
- return {
220
- prependColor,
221
- style,
222
- messages
223
- };
224
- }
225
- });
226
- </script>
@@ -1,39 +0,0 @@
1
- import { useTimeZone } from "@dative-gpi/foundation-shared-services/composables";
2
-
3
- export const useDates = () => {
4
- const { getMachineOffset, getMachineOffsetMillis, getUserOffset, getUserOffsetMillis } = useTimeZone();
5
-
6
- const pickerToEpoch = (value: Date[]): number[] => {
7
- // FSCalendar is always in machine time zone, so we need to convert it to user time zone
8
- return value.slice()
9
- .map(date => date.getTime() + getMachineOffsetMillis() - getUserOffsetMillis())
10
- .sort();
11
- };
12
-
13
- const epochToPicker = (value: number[]): Date[] => {
14
- // Epoch is always without time zone, so we need to convert it to user time zone
15
- return value.slice()
16
- .sort((a, b) => b - a)
17
- .map(epoch => {
18
- const date = new Date(0);
19
- date.setUTCMilliseconds(epoch - getMachineOffsetMillis() + getUserOffsetMillis());
20
- return date;
21
- });
22
- };
23
-
24
- const epochToPickerHeader = (value: number): { d: number, m: number, y: number } => {
25
- const date = new Date(0);
26
- date.setUTCMilliseconds(value - getMachineOffsetMillis() + getUserOffsetMillis());
27
- return { d: date.getDate(), m: date.getMonth(), y: date.getFullYear() };
28
- };
29
-
30
- return {
31
- getUserOffset,
32
- getUserOffsetMillis,
33
- getMachineOffset,
34
- getMachineOffsetMillis,
35
- pickerToEpoch,
36
- epochToPicker,
37
- epochToPickerHeader
38
- };
39
- }
package/models/FSTags.ts DELETED
@@ -1,8 +0,0 @@
1
- import { ColorBase } from "@dative-gpi/foundation-shared-components/themes";
2
-
3
- export interface FSTagItem {
4
- label: string,
5
- variant: "standard" | "full",
6
- color: ColorBase,
7
- editable: boolean
8
- }
@@ -1,23 +0,0 @@
1
- export const TextRules = {
2
- required: (message: string) => (value: string) => !!value || (message ?? "Required"),
3
- min: (length: number, message: string) => (value: string) => value.length >= length || (message ?? `Must be at least ${length} characters`),
4
- max: (length: number, message: string) => (value: string) => value.length <= length || (message ?? `Must be at most ${length} characters`),
5
- email: (message: string) => (value: string) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value) || (message ?? "Must be a valid email"),
6
- digit: (message: string) => (value: string) => /(?=.*\d)/.test(value) || (message ?? "Must contain a digit"),
7
- uppercase: (message: string) => (value: string) => /(?=.*[A-Z])/.test(value) || (message ?? "Must contain an uppercase letter"),
8
- lowercase: (message: string) => (value: string) => /(?=.*[a-z])/.test(value) || (message ?? "Must contain a lowercase letter"),
9
- special: (message: string) => (value: string) => /(?=.*[!@#$%^&*])/.test(value) || (message ?? "Must contain a special character")
10
- };
11
-
12
- export const TagRules = {
13
- required: (message: string) => (value: string[]) => value.length > 0 || (message ?? "Required"),
14
- min: (min: number, message: string) => (value: string[]) => value.length >= min || (message ?? `Must contain at least ${min} elements`),
15
- max: (max: number, message: string) => (value: string[]) => value.length <= max || (message ?? `Must contain at most ${max} elements`)
16
- };
17
-
18
- export const NumberRules = {
19
- required: (message: string) => (value: string) => (!!value && !isNaN(parseFloat(value))) || (message ?? "Required"),
20
- min: (min: number, message: string) => (value: string) => (!!value && !isNaN(parseFloat(value)) && parseFloat(value) >= min) || (message ?? `Must be at least ${min}`),
21
- max: (max: number, message: string) => (value: string) => (!!value && !isNaN(parseFloat(value)) && parseFloat(value) <= max) || (message ?? `Must be at most ${max}`),
22
- integer: (message: string) => (value: string) => (!!value && !isNaN(parseFloat(value)) && Number.isInteger(parseFloat(value))) || (message ?? "Must be an integer")
23
- };
File without changes
File without changes