@xen-orchestra/web-core 0.20.1 → 0.22.0

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 (116) hide show
  1. package/lib/assets/css/_typography.pcss +6 -0
  2. package/lib/assets/no-selection-old.svg +70 -0
  3. package/lib/assets/no-selection.svg +85 -70
  4. package/lib/components/backup-state/VtsBackupState.vue +20 -17
  5. package/lib/components/card/VtsCardRowKeyValue.vue +4 -0
  6. package/lib/components/cell-object/VtsCellObject.vue +4 -1
  7. package/lib/components/console/VtsActionsConsole.vue +7 -4
  8. package/lib/components/console/VtsClipboardConsole.vue +9 -6
  9. package/lib/components/copy-button/VtsCopyButton.vue +9 -15
  10. package/lib/components/dropdown/DropdownTitle.vue +5 -2
  11. package/lib/components/icon/NewVtsIcon.vue +49 -0
  12. package/lib/components/input-group/VtsInputGroup.vue +41 -0
  13. package/lib/components/input-wrapper/VtsInputWrapper.vue +2 -2
  14. package/lib/components/layout/VtsLayoutSidebar.vue +6 -3
  15. package/lib/components/linear-chart/VtsLinearChart.vue +4 -0
  16. package/lib/components/object-icon/VtsObjectIcon.vue +22 -0
  17. package/lib/components/quick-info-card/VtsQuickInfoCard.vue +4 -1
  18. package/lib/components/select/VtsOption.vue +10 -6
  19. package/lib/components/select/VtsSelect.vue +74 -50
  20. package/lib/components/state-hero/VtsAllDoneHero.vue +4 -1
  21. package/lib/components/state-hero/VtsAllGoodHero.vue +4 -1
  22. package/lib/components/state-hero/VtsComingSoonHero.vue +4 -1
  23. package/lib/components/state-hero/VtsErrorNoDataHero.vue +4 -1
  24. package/lib/components/state-hero/VtsLoadingHero.vue +4 -1
  25. package/lib/components/state-hero/VtsNoDataHero.vue +4 -1
  26. package/lib/components/state-hero/VtsNoSelectionHero.vue +4 -1
  27. package/lib/components/state-hero/VtsObjectNotFoundHero.vue +4 -1
  28. package/lib/components/state-hero/VtsOfflineHero.vue +4 -1
  29. package/lib/components/state-hero/VtsPageNotFoundHero.vue +4 -1
  30. package/lib/components/table/ColumnTitle.vue +2 -2
  31. package/lib/components/task/VtsQuickTaskButton.vue +4 -1
  32. package/lib/components/task/VtsQuickTaskList.vue +5 -2
  33. package/lib/components/task/VtsQuickTaskTabBar.vue +8 -5
  34. package/lib/components/ui/card-numbers/UiCardNumbers.vue +4 -1
  35. package/lib/components/ui/character-limit/UiCharacterLimit.vue +4 -1
  36. package/lib/components/ui/input/UiInput.vue +2 -2
  37. package/lib/components/ui/label/UiLabel.vue +4 -1
  38. package/lib/components/ui/panel/UiPanel.vue +16 -3
  39. package/lib/components/ui/progress-bar/UiProgressBar.vue +5 -2
  40. package/lib/components/ui/query-search-bar/UiQuerySearchBar.vue +9 -6
  41. package/lib/components/ui/quick-task-item/UiQuickTaskItem.vue +6 -3
  42. package/lib/components/ui/quoteCode/UiQuoteCode.vue +104 -0
  43. package/lib/components/ui/stacked-bar/StackedBarSegment.vue +4 -1
  44. package/lib/components/ui/table-pagination/UiTablePagination.vue +6 -3
  45. package/lib/components/ui/text-area/UiTextarea.vue +4 -1
  46. package/lib/components/ui/top-bottom-table/UiTopBottomTable.vue +6 -3
  47. package/lib/components/ui/tree-item-label/UiTreeItemLabel.vue +4 -1
  48. package/lib/composables/local-time-ago.composable.ts +53 -0
  49. package/lib/composables/locale-time-ago.composable.ts +53 -0
  50. package/lib/icons/fa-icons.ts +164 -0
  51. package/lib/icons/index.ts +15 -0
  52. package/lib/icons/legacy-icons.ts +80 -0
  53. package/lib/icons/object-icons.ts +187 -0
  54. package/lib/layouts/CoreLayout.vue +7 -3
  55. package/lib/locales/cs.json +0 -1
  56. package/lib/locales/de.json +1 -1
  57. package/lib/locales/en.json +40 -4
  58. package/lib/locales/es.json +1 -1
  59. package/lib/locales/fr.json +39 -3
  60. package/lib/locales/it.json +1 -1
  61. package/lib/locales/nl.json +1 -1
  62. package/lib/locales/ru.json +1 -1
  63. package/lib/locales/sv.json +1 -2
  64. package/lib/packages/collection/README.md +23 -18
  65. package/lib/packages/collection/create-collection.ts +22 -21
  66. package/lib/packages/collection/create-item.ts +21 -20
  67. package/lib/packages/collection/create-use-subset.ts +23 -0
  68. package/lib/packages/collection/guess-item-id.ts +26 -16
  69. package/lib/packages/collection/index.ts +4 -0
  70. package/lib/packages/collection/types.ts +65 -37
  71. package/lib/packages/collection/use-collection.ts +68 -18
  72. package/lib/packages/collection/use-flag-registry.ts +38 -17
  73. package/lib/packages/form-select/guess-label.ts +45 -0
  74. package/lib/packages/form-select/guess-value.ts +23 -0
  75. package/lib/packages/form-select/index.ts +6 -0
  76. package/lib/packages/form-select/normalize-search-term.ts +11 -0
  77. package/lib/packages/form-select/types.ts +90 -42
  78. package/lib/packages/form-select/use-form-option-controller.ts +7 -3
  79. package/lib/packages/form-select/use-form-select-controller.ts +38 -27
  80. package/lib/packages/form-select/use-form-select-keyboard-navigation.ts +1 -1
  81. package/lib/packages/form-select/use-form-select.ts +308 -130
  82. package/lib/packages/icon/DisplayIcon.vue +25 -0
  83. package/lib/packages/icon/DisplayIconAny.vue +16 -0
  84. package/lib/packages/icon/DisplayIconSingle.vue +35 -0
  85. package/lib/packages/icon/DisplayIconStack.vue +34 -0
  86. package/lib/packages/icon/README.md +286 -0
  87. package/lib/packages/icon/create-icon-bindings.ts +27 -0
  88. package/lib/packages/icon/define-icon-pack.ts +23 -0
  89. package/lib/packages/icon/define-icon-single.ts +17 -0
  90. package/lib/packages/icon/define-icon-stack.ts +20 -0
  91. package/lib/packages/icon/define-icon.ts +40 -0
  92. package/lib/packages/icon/generate-icon-variants.ts +17 -0
  93. package/lib/packages/icon/index.ts +8 -0
  94. package/lib/packages/icon/is-icon-stack.ts +5 -0
  95. package/lib/packages/icon/merge-icons.ts +25 -0
  96. package/lib/packages/icon/merge-transforms.ts +12 -0
  97. package/lib/packages/icon/normalize-icon.ts +25 -0
  98. package/lib/packages/icon/to-tuple.ts +7 -0
  99. package/lib/packages/icon/types.ts +72 -0
  100. package/lib/packages/job/README.md +2 -2
  101. package/lib/packages/mapper/README.md +166 -0
  102. package/lib/packages/mapper/convert-to-map.ts +5 -0
  103. package/lib/packages/mapper/create-mapper.ts +30 -0
  104. package/lib/packages/mapper/index.ts +4 -0
  105. package/lib/packages/mapper/types.ts +1 -0
  106. package/lib/packages/mapper/use-mapper.ts +31 -0
  107. package/lib/stores/sidebar.store.ts +1 -1
  108. package/lib/types/chart.ts +2 -2
  109. package/lib/types/utility.type.ts +9 -0
  110. package/lib/utils/object.util.ts +16 -0
  111. package/lib/utils/size.util.ts +14 -3
  112. package/package.json +2 -1
  113. package/lib/assets/zoom.svg +0 -85
  114. package/lib/components/backup-item/VtsBackupItem.vue +0 -47
  115. package/lib/composables/mapper.composable.md +0 -74
  116. package/lib/composables/mapper.composable.ts +0 -18
@@ -0,0 +1,53 @@
1
+ import { useTimestamp } from '@vueuse/core'
2
+ import { computed, type MaybeRefOrGetter, toValue } from 'vue'
3
+ import { useI18n } from 'vue-i18n'
4
+
5
+ export enum SECONDS {
6
+ MINUTE = 60,
7
+ HOUR = SECONDS.MINUTE * 60,
8
+ DAY = SECONDS.HOUR * 24,
9
+ WEEK = SECONDS.DAY * 7,
10
+ MONTH = SECONDS.DAY * 30,
11
+ YEAR = SECONDS.DAY * 365,
12
+ }
13
+
14
+ export type TimeThreshold = [number, Intl.RelativeTimeFormatUnit]
15
+
16
+ const timeThresholds: TimeThreshold[] = [
17
+ [SECONDS.MINUTE, 'second'],
18
+ [SECONDS.HOUR, 'minute'],
19
+ [SECONDS.DAY, 'hour'],
20
+ [SECONDS.WEEK, 'day'],
21
+ [SECONDS.MONTH, 'week'],
22
+ [SECONDS.YEAR, 'month'],
23
+ [Infinity, 'year'],
24
+ ]
25
+
26
+ export function useTimeAgo(referenceDate: MaybeRefOrGetter<Date | number | string>) {
27
+ const { locale } = useI18n()
28
+
29
+ const formatter = computed(() => new Intl.RelativeTimeFormat(locale.value, { numeric: 'auto' }))
30
+
31
+ const now = useTimestamp({ interval: 1000 })
32
+
33
+ const referenceTime = computed(() => new Date(toValue(referenceDate)).getTime())
34
+
35
+ const distance = computed(() => {
36
+ const diff = Math.trunc((referenceTime.value - now.value) / 1000)
37
+
38
+ if (Math.abs(diff) < 60) {
39
+ return Math.trunc(diff / 10) * 10 || 0 // Avoid recomputing when the value changes from 0 to -0
40
+ }
41
+
42
+ return timeThresholds.reduce(
43
+ (acc, [threshold]) => (Math.abs(acc) < threshold ? acc : Math.trunc(acc / threshold) * threshold),
44
+ diff
45
+ )
46
+ })
47
+
48
+ return computed(() => {
49
+ const index = timeThresholds.findIndex(([threshold]) => Math.abs(distance.value) < threshold)
50
+ const divisor = index > 0 ? timeThresholds[index - 1][0] : 1
51
+ return formatter.value.format(Math.trunc(distance.value / divisor), timeThresholds[index][1])
52
+ })
53
+ }
@@ -0,0 +1,164 @@
1
+ import { defineIconPack } from '@core/packages/icon/define-icon-pack.ts'
2
+ import { faBuilding, faFile, faFolderClosed, faFolderOpen, faSquareCheck } from '@fortawesome/free-regular-svg-icons'
3
+ import {
4
+ faAlignLeft,
5
+ faAngleDoubleLeft,
6
+ faAngleDoubleRight,
7
+ faAngleDown,
8
+ faAngleLeft,
9
+ faAngleRight,
10
+ faAngleUp,
11
+ faArrowDown,
12
+ faArrowRight,
13
+ faArrowRightFromBracket,
14
+ faArrowUp,
15
+ faArrowUpRightFromSquare,
16
+ faAt,
17
+ faBars,
18
+ faBarsProgress,
19
+ faBook,
20
+ faCamera,
21
+ faCaretDown,
22
+ faCaretUp,
23
+ faCheck,
24
+ faCircle,
25
+ faCircleCheck,
26
+ faCircleMinus,
27
+ faCircleNotch,
28
+ faCirclePlay,
29
+ faCircleXmark,
30
+ faCity,
31
+ faClose,
32
+ faCode,
33
+ faComments,
34
+ faCopy,
35
+ faDatabase,
36
+ faDesktop,
37
+ faDisplay,
38
+ faDownLeftAndUpRightToCenter,
39
+ faDownload,
40
+ faEarthAmericas,
41
+ faEdit,
42
+ faEllipsis,
43
+ faEllipsisVertical,
44
+ faExternalLink,
45
+ faEyeSlash,
46
+ faFileCsv,
47
+ faFileExport,
48
+ faFilter,
49
+ faFont,
50
+ faGear,
51
+ faHashtag,
52
+ faHeadset,
53
+ faKeyboard,
54
+ faLayerGroup,
55
+ faList,
56
+ faLock,
57
+ faLockOpen,
58
+ faMagnifyingGlass,
59
+ faMemory,
60
+ faMicrochip,
61
+ faMinus,
62
+ faMoon,
63
+ faNetworkWired,
64
+ faPause,
65
+ faPencil,
66
+ faPlay,
67
+ faPlug,
68
+ faPlus,
69
+ faPowerOff,
70
+ faRemove,
71
+ faRepeat,
72
+ faRotateLeft,
73
+ faRoute,
74
+ faSatellite,
75
+ faServer,
76
+ faSliders,
77
+ faTrash,
78
+ faUpRightAndDownLeftFromCenter,
79
+ faXmark,
80
+ } from '@fortawesome/free-solid-svg-icons'
81
+
82
+ export const faIcons = defineIconPack({
83
+ 'align-left': { icon: faAlignLeft },
84
+ 'angle-double-left': { icon: faAngleDoubleLeft },
85
+ 'angle-double-right': { icon: faAngleDoubleRight },
86
+ 'angle-down': { icon: faAngleDown },
87
+ 'angle-left': { icon: faAngleLeft },
88
+ 'angle-right': { icon: faAngleRight },
89
+ 'angle-up': { icon: faAngleUp },
90
+ 'arrow-down': { icon: faArrowDown },
91
+ 'arrow-right': { icon: faArrowRight },
92
+ 'arrow-right-from-bracket': { icon: faArrowRightFromBracket },
93
+ 'arrow-up': { icon: faArrowUp },
94
+ 'arrow-up-right-from-square': { icon: faArrowUpRightFromSquare },
95
+ at: { icon: faAt },
96
+ bars: { icon: faBars },
97
+ 'bars-progress': { icon: faBarsProgress },
98
+ book: { icon: faBook },
99
+ building: { icon: faBuilding },
100
+ camera: { icon: faCamera },
101
+ 'caret-down': { icon: faCaretDown },
102
+ 'caret-up': { icon: faCaretUp },
103
+ check: { icon: faCheck },
104
+ circle: { icon: faCircle },
105
+ 'circle-check': { icon: faCircleCheck },
106
+ 'circle-minus': { icon: faCircleMinus },
107
+ 'circle-notch': { icon: faCircleNotch },
108
+ 'circle-play': { icon: faCirclePlay },
109
+ 'circle-xmark': { icon: faCircleXmark },
110
+ city: { icon: faCity },
111
+ close: { icon: faClose },
112
+ code: { icon: faCode },
113
+ comments: { icon: faComments },
114
+ copy: { icon: faCopy },
115
+ database: { icon: faDatabase },
116
+ desktop: { icon: faDesktop },
117
+ display: { icon: faDisplay },
118
+ 'down-left-and-up-right-to-center': { icon: faDownLeftAndUpRightToCenter },
119
+ download: { icon: faDownload },
120
+ 'earth-americas': { icon: faEarthAmericas },
121
+ edit: { icon: faEdit },
122
+ ellipsis: { icon: faEllipsis },
123
+ 'ellipsis-vertical': { icon: faEllipsisVertical },
124
+ 'external-link': { icon: faExternalLink },
125
+ 'eye-slash': { icon: faEyeSlash },
126
+ file: { icon: faFile },
127
+ 'file-csv': { icon: faFileCsv },
128
+ 'file-export': { icon: faFileExport },
129
+ filter: { icon: faFilter },
130
+ 'folder-closed': { icon: faFolderClosed },
131
+ 'folder-open': { icon: faFolderOpen },
132
+ font: { icon: faFont },
133
+ gear: { icon: faGear },
134
+ hashtag: { icon: faHashtag },
135
+ headset: { icon: faHeadset },
136
+ keyboard: { icon: faKeyboard },
137
+ 'layer-group': { icon: faLayerGroup },
138
+ list: { icon: faList },
139
+ lock: { icon: faLock },
140
+ 'lock-open': { icon: faLockOpen },
141
+ 'magnifying-glass': { icon: faMagnifyingGlass },
142
+ memory: { icon: faMemory },
143
+ microchip: { icon: faMicrochip },
144
+ minus: { icon: faMinus },
145
+ moon: { icon: faMoon },
146
+ 'network-wired': { icon: faNetworkWired },
147
+ pause: { icon: faPause },
148
+ pencil: { icon: faPencil },
149
+ play: { icon: faPlay },
150
+ plug: { icon: faPlug },
151
+ plus: { icon: faPlus },
152
+ 'power-off': { icon: faPowerOff },
153
+ remove: { icon: faRemove },
154
+ repeat: { icon: faRepeat },
155
+ 'rotate-left': { icon: faRotateLeft },
156
+ route: { icon: faRoute },
157
+ satellite: { icon: faSatellite },
158
+ server: { icon: faServer },
159
+ sliders: { icon: faSliders },
160
+ 'square-check': { icon: faSquareCheck },
161
+ trash: { icon: faTrash },
162
+ 'up-right-and-down-left-from-center': { icon: faUpRightAndDownLeftFromCenter },
163
+ xmark: { icon: faXmark },
164
+ })
@@ -0,0 +1,15 @@
1
+ import { faIcons } from '@core/icons/fa-icons.ts'
2
+ import { legacyIcons } from '@core/icons/legacy-icons.ts'
3
+ import { objectIcons } from '@core/icons/object-icons.ts'
4
+ import { defineIconPack } from '@core/packages/icon/define-icon-pack.ts'
5
+ import type { ICON_SYMBOL } from '@core/packages/icon/types.ts'
6
+
7
+ export const icons = defineIconPack({
8
+ fa: faIcons,
9
+ legacy: legacyIcons,
10
+ object: objectIcons,
11
+ })
12
+
13
+ export type IconName = Exclude<keyof typeof icons, typeof ICON_SYMBOL>
14
+
15
+ export type ObjectIconName = Extract<IconName, `object:${string}`>
@@ -0,0 +1,80 @@
1
+ import { defineIconPack } from '@core/packages/icon/define-icon-pack.ts'
2
+ import { defineIcon } from '@core/packages/icon/define-icon.ts'
3
+ import { createMapper } from '@core/packages/mapper/create-mapper.ts'
4
+ import {
5
+ faCheck,
6
+ faCircle,
7
+ faCircleInfo,
8
+ faExclamation,
9
+ faInfo,
10
+ faMinus,
11
+ faPlay,
12
+ faStar,
13
+ faStop,
14
+ faXmark,
15
+ } from '@fortawesome/free-solid-svg-icons'
16
+
17
+ const getStatusIcon = createMapper(
18
+ {
19
+ info: faInfo,
20
+ success: faCheck,
21
+ warning: faExclamation,
22
+ danger: faXmark,
23
+ muted: faMinus,
24
+ },
25
+ 'muted'
26
+ )
27
+
28
+ const getStatusColor = createMapper(
29
+ {
30
+ info: 'var(--color-info-txt-item)',
31
+ success: 'var(--color-success-txt-item)',
32
+ warning: 'var(--color-warning-txt-item)',
33
+ danger: 'var(--color-danger-txt-item)',
34
+ muted: 'var(--color-neutral-txt-secondary)',
35
+ },
36
+ 'muted'
37
+ )
38
+
39
+ export const legacyIcons = defineIconPack({
40
+ 'circle-progress': defineIcon([['success', 'warning', 'danger']], accent => [
41
+ {
42
+ icon: accent === 'success' ? faCheck : faExclamation,
43
+ },
44
+ ]),
45
+ halted: {
46
+ icon: faStop,
47
+ color: 'var(--color-danger-item-base)',
48
+ },
49
+ info: {
50
+ icon: faCircleInfo,
51
+ color: 'var(--color-info-item-base)',
52
+ },
53
+ 'legend-circle': { icon: faCircle, size: 8 },
54
+ primary: [
55
+ {
56
+ icon: faCircle,
57
+ color: 'var(--color-info-item-base)',
58
+ },
59
+ {
60
+ icon: faStar,
61
+ color: 'var(--color-info-txt-item)',
62
+ size: 8,
63
+ },
64
+ ],
65
+ running: {
66
+ icon: faPlay,
67
+ color: 'var(--color-success-item-base)',
68
+ },
69
+ status: defineIcon([['info', 'success', 'warning', 'danger', 'muted']], accent => [
70
+ {
71
+ icon: faCircle,
72
+ color: accent === 'muted' ? 'var(--color-neutral-background-disabled)' : `var(--color-${accent}-item-base)`,
73
+ },
74
+ {
75
+ icon: getStatusIcon(accent),
76
+ color: getStatusColor(accent),
77
+ size: 8,
78
+ },
79
+ ]),
80
+ })
@@ -0,0 +1,187 @@
1
+ import { defineIconPack } from '@core/packages/icon/define-icon-pack.ts'
2
+ import { defineIcon } from '@core/packages/icon/define-icon.ts'
3
+ import type { IconTransforms } from '@core/packages/icon/types.ts'
4
+ import { createMapper } from '@core/packages/mapper/create-mapper.ts'
5
+ import {
6
+ faBan,
7
+ faCheck,
8
+ faCircle,
9
+ faDatabase,
10
+ faDesktop,
11
+ faMinus,
12
+ faMoon,
13
+ faNetworkWired,
14
+ faPause,
15
+ faPlay,
16
+ faQuestion,
17
+ faServer,
18
+ faStop,
19
+ faTriangleExclamation,
20
+ faWarehouse,
21
+ faXmark,
22
+ } from '@fortawesome/free-solid-svg-icons'
23
+
24
+ const defaultTransforms: IconTransforms = {
25
+ translate: 6,
26
+ size: 8,
27
+ borderColor: 'var(--color-neutral-background-primary)',
28
+ }
29
+
30
+ const getStatusIcon = createMapper(
31
+ {
32
+ running: defineIcon({
33
+ icon: faPlay,
34
+ color: 'var(--color-success-item-base)',
35
+ ...defaultTransforms,
36
+ }),
37
+ halted: defineIcon({
38
+ icon: faStop,
39
+ color: 'var(--color-danger-item-base)',
40
+ ...defaultTransforms,
41
+ }),
42
+ suspended: defineIcon(
43
+ [
44
+ {
45
+ icon: faCircle,
46
+ color: 'var(--color-neutral-border)',
47
+ },
48
+ {
49
+ icon: faMoon,
50
+ color: 'var(--color-neutral-txt-secondary)',
51
+ size: 12,
52
+ },
53
+ ],
54
+ defaultTransforms
55
+ ),
56
+ paused: defineIcon(
57
+ [
58
+ {
59
+ icon: faCircle,
60
+ color: 'var(--color-brand-item-base)',
61
+ },
62
+ {
63
+ icon: faPause,
64
+ color: 'var(--color-info-txt-item)',
65
+ size: 12,
66
+ },
67
+ ],
68
+ defaultTransforms
69
+ ),
70
+ muted: undefined,
71
+ unknown: defineIcon([
72
+ {
73
+ icon: faQuestion,
74
+ color: 'var(--color-neutral-txt-secondary)',
75
+ ...defaultTransforms,
76
+ },
77
+ ]),
78
+ maintenance: defineIcon([
79
+ {
80
+ icon: faTriangleExclamation,
81
+ color: 'var(--color-warning-item-base)',
82
+ ...defaultTransforms,
83
+ },
84
+ ]),
85
+ disabled: defineIcon(
86
+ [
87
+ {
88
+ icon: faCircle,
89
+ color: 'var(--color-neutral-border)',
90
+ },
91
+ {
92
+ icon: faBan,
93
+ color: 'var(--color-neutral-txt-secondary)',
94
+ size: 12,
95
+ },
96
+ ],
97
+ defaultTransforms
98
+ ),
99
+ connected: defineIcon(
100
+ [
101
+ {
102
+ icon: faCircle,
103
+ color: 'var(--color-success-item-base)',
104
+ },
105
+ {
106
+ icon: faCheck,
107
+ color: 'var(--color-success-txt-item)',
108
+ size: 12,
109
+ },
110
+ ],
111
+ defaultTransforms
112
+ ),
113
+ 'partially-connected': defineIcon(
114
+ [
115
+ {
116
+ icon: faCircle,
117
+ color: 'var(--color-warning-item-base)',
118
+ },
119
+ {
120
+ icon: faMinus,
121
+ color: 'var(--color-warning-txt-item)',
122
+ size: 12,
123
+ },
124
+ ],
125
+ defaultTransforms
126
+ ),
127
+ disconnected: defineIcon(
128
+ [
129
+ {
130
+ icon: faCircle,
131
+ color: 'var(--color-danger-item-base)',
132
+ },
133
+ {
134
+ icon: faXmark,
135
+ color: 'var(--color-danger-txt-item)',
136
+ size: 12,
137
+ },
138
+ ],
139
+ defaultTransforms
140
+ ),
141
+ },
142
+ 'unknown'
143
+ )
144
+
145
+ function getMainColor(state: string) {
146
+ return state === 'muted' || state === 'unknown'
147
+ ? 'var(--color-neutral-txt-secondary)'
148
+ : 'var(--color-neutral-txt-primary)'
149
+ }
150
+
151
+ export const objectIcons = defineIconPack({
152
+ vm: defineIcon([['running', 'halted', 'suspended', 'paused', 'muted']], state => [
153
+ {
154
+ icon: faDesktop,
155
+ color: getMainColor(state),
156
+ },
157
+ { icon: getStatusIcon(state) },
158
+ ]),
159
+ host: defineIcon([['running', 'halted', 'disabled', 'muted', 'unknown']], state => [
160
+ {
161
+ icon: faServer,
162
+ color: getMainColor(state),
163
+ },
164
+ { icon: getStatusIcon(state) },
165
+ ]),
166
+ sr: defineIcon([['connected', 'partially-connected', 'disconnected', 'muted']], state => [
167
+ {
168
+ icon: faDatabase,
169
+ color: getMainColor(state),
170
+ },
171
+ { icon: getStatusIcon(state) },
172
+ ]),
173
+ network: defineIcon([['connected', 'disconnected']], state => [
174
+ {
175
+ icon: faNetworkWired,
176
+ color: getMainColor(state),
177
+ },
178
+ { icon: getStatusIcon(state) },
179
+ ]),
180
+ 'backup-repository': defineIcon([['connected', 'disconnected']], state => [
181
+ {
182
+ icon: faWarehouse,
183
+ color: getMainColor(state),
184
+ },
185
+ { icon: getStatusIcon(state) },
186
+ ]),
187
+ })
@@ -4,13 +4,14 @@
4
4
  <slot name="app-logo" />
5
5
  <UiButtonIcon
6
6
  v-tooltip="{
7
- content: sidebarStore.isExpanded ? $t('core.sidebar.close') : $t('core.sidebar.open'),
7
+ content: sidebarStore.isExpanded ? t('core.sidebar.close') : t('core.sidebar.open'),
8
8
  placement: 'right',
9
9
  }"
10
10
  accent="brand"
11
11
  size="medium"
12
- :icon="sidebarStore.isExpanded ? faAngleDoubleLeft : faBars"
12
+ :icon="faBars"
13
13
  class="sidebar-toggle"
14
+ :target-scale="1.8"
14
15
  @click="sidebarStore.toggleExpand()"
15
16
  />
16
17
  <slot name="app-header" />
@@ -47,7 +48,10 @@ import UiButtonIcon from '@core/components/ui/button-icon/UiButtonIcon.vue'
47
48
  import { vTooltip } from '@core/directives/tooltip.directive'
48
49
  import { useSidebarStore } from '@core/stores/sidebar.store'
49
50
  import { useUiStore } from '@core/stores/ui.store'
50
- import { faAngleDoubleLeft, faBars } from '@fortawesome/free-solid-svg-icons'
51
+ import { faBars } from '@fortawesome/free-solid-svg-icons'
52
+ import { useI18n } from 'vue-i18n'
53
+
54
+ const { t } = useI18n()
51
55
 
52
56
  const uiStore = useUiStore()
53
57
  const sidebarStore = useSidebarStore()
@@ -397,7 +397,6 @@
397
397
  "power-on-mode": "Režim zapínání",
398
398
  "power-on-vm-for-console": "Konzole virt. stroje bude přístupná až po jeho zapnutí",
399
399
  "power-state": "Stav napájení",
400
- "primary-host": "Hlavní hostitel",
401
400
  "professional-support": "Profesionální podpora",
402
401
  "properties": "Vlastnosti",
403
402
  "property": "Vlastnost",
@@ -191,7 +191,7 @@
191
191
  "hosts-status.running": "Gestartet",
192
192
  "hosts-status.unknown": "Unbekannt",
193
193
  "hosts-status.unknown.tooltip": "Host-Metriken sind nicht erreichbar",
194
- "id": "Id",
194
+ "id": "ID",
195
195
  "in-last-three-jobs": "In ihren letzten drei Jobs",
196
196
  "invalid-field": "Ungültiges Feld",
197
197
  "ip-addresses": "IP-Adressen",