@xen-orchestra/web-core 0.20.1 → 0.21.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.
- package/lib/components/backup-state/VtsBackupState.vue +20 -17
- package/lib/components/cell-object/VtsCellObject.vue +4 -1
- package/lib/components/console/VtsActionsConsole.vue +7 -4
- package/lib/components/console/VtsClipboardConsole.vue +9 -6
- package/lib/components/copy-button/VtsCopyButton.vue +7 -14
- package/lib/components/dropdown/DropdownTitle.vue +5 -2
- package/lib/components/icon/NewVtsIcon.vue +49 -0
- package/lib/components/input-group/VtsInputGroup.vue +41 -0
- package/lib/components/input-wrapper/VtsInputWrapper.vue +2 -2
- package/lib/components/layout/VtsLayoutSidebar.vue +6 -3
- package/lib/components/linear-chart/VtsLinearChart.vue +4 -0
- package/lib/components/object-icon/VtsObjectIcon.vue +22 -0
- package/lib/components/quick-info-card/VtsQuickInfoCard.vue +4 -1
- package/lib/components/select/VtsOption.vue +10 -6
- package/lib/components/select/VtsSelect.vue +74 -50
- package/lib/components/state-hero/VtsAllDoneHero.vue +4 -1
- package/lib/components/state-hero/VtsAllGoodHero.vue +4 -1
- package/lib/components/state-hero/VtsComingSoonHero.vue +4 -1
- package/lib/components/state-hero/VtsErrorNoDataHero.vue +4 -1
- package/lib/components/state-hero/VtsLoadingHero.vue +4 -1
- package/lib/components/state-hero/VtsNoDataHero.vue +4 -1
- package/lib/components/state-hero/VtsNoSelectionHero.vue +4 -1
- package/lib/components/state-hero/VtsObjectNotFoundHero.vue +4 -1
- package/lib/components/state-hero/VtsOfflineHero.vue +4 -1
- package/lib/components/state-hero/VtsPageNotFoundHero.vue +4 -1
- package/lib/components/table/ColumnTitle.vue +2 -2
- package/lib/components/task/VtsQuickTaskButton.vue +4 -1
- package/lib/components/task/VtsQuickTaskList.vue +5 -2
- package/lib/components/task/VtsQuickTaskTabBar.vue +8 -5
- package/lib/components/ui/card-numbers/UiCardNumbers.vue +4 -1
- package/lib/components/ui/character-limit/UiCharacterLimit.vue +4 -1
- package/lib/components/ui/input/UiInput.vue +2 -2
- package/lib/components/ui/label/UiLabel.vue +4 -1
- package/lib/components/ui/progress-bar/UiProgressBar.vue +5 -2
- package/lib/components/ui/query-search-bar/UiQuerySearchBar.vue +9 -6
- package/lib/components/ui/quick-task-item/UiQuickTaskItem.vue +6 -3
- package/lib/components/ui/stacked-bar/StackedBarSegment.vue +4 -1
- package/lib/components/ui/table-pagination/UiTablePagination.vue +6 -3
- package/lib/components/ui/text-area/UiTextarea.vue +4 -1
- package/lib/components/ui/top-bottom-table/UiTopBottomTable.vue +6 -3
- package/lib/components/ui/tree-item-label/UiTreeItemLabel.vue +4 -1
- package/lib/composables/local-time-ago.composable.ts +53 -0
- package/lib/composables/locale-time-ago.composable.ts +53 -0
- package/lib/icons/fa-icons.ts +164 -0
- package/lib/icons/index.ts +15 -0
- package/lib/icons/legacy-icons.ts +80 -0
- package/lib/icons/object-icons.ts +187 -0
- package/lib/layouts/CoreLayout.vue +7 -3
- package/lib/locales/cs.json +0 -1
- package/lib/locales/de.json +1 -1
- package/lib/locales/en.json +32 -4
- package/lib/locales/es.json +1 -1
- package/lib/locales/fr.json +31 -3
- package/lib/locales/it.json +1 -1
- package/lib/locales/nl.json +1 -1
- package/lib/locales/ru.json +1 -1
- package/lib/locales/sv.json +1 -2
- package/lib/packages/collection/README.md +23 -18
- package/lib/packages/collection/create-collection.ts +22 -21
- package/lib/packages/collection/create-item.ts +21 -20
- package/lib/packages/collection/create-use-subset.ts +23 -0
- package/lib/packages/collection/guess-item-id.ts +26 -16
- package/lib/packages/collection/index.ts +4 -0
- package/lib/packages/collection/types.ts +65 -37
- package/lib/packages/collection/use-collection.ts +68 -18
- package/lib/packages/collection/use-flag-registry.ts +38 -17
- package/lib/packages/form-select/guess-label.ts +45 -0
- package/lib/packages/form-select/guess-value.ts +23 -0
- package/lib/packages/form-select/index.ts +6 -0
- package/lib/packages/form-select/normalize-search-term.ts +11 -0
- package/lib/packages/form-select/types.ts +90 -42
- package/lib/packages/form-select/use-form-option-controller.ts +7 -3
- package/lib/packages/form-select/use-form-select-controller.ts +38 -27
- package/lib/packages/form-select/use-form-select-keyboard-navigation.ts +1 -1
- package/lib/packages/form-select/use-form-select.ts +308 -130
- package/lib/packages/icon/DisplayIcon.vue +25 -0
- package/lib/packages/icon/DisplayIconAny.vue +16 -0
- package/lib/packages/icon/DisplayIconSingle.vue +35 -0
- package/lib/packages/icon/DisplayIconStack.vue +34 -0
- package/lib/packages/icon/README.md +286 -0
- package/lib/packages/icon/create-icon-bindings.ts +27 -0
- package/lib/packages/icon/define-icon-pack.ts +23 -0
- package/lib/packages/icon/define-icon-single.ts +17 -0
- package/lib/packages/icon/define-icon-stack.ts +20 -0
- package/lib/packages/icon/define-icon.ts +40 -0
- package/lib/packages/icon/generate-icon-variants.ts +17 -0
- package/lib/packages/icon/index.ts +8 -0
- package/lib/packages/icon/is-icon-stack.ts +5 -0
- package/lib/packages/icon/merge-icons.ts +25 -0
- package/lib/packages/icon/merge-transforms.ts +12 -0
- package/lib/packages/icon/normalize-icon.ts +25 -0
- package/lib/packages/icon/to-tuple.ts +7 -0
- package/lib/packages/icon/types.ts +72 -0
- package/lib/packages/job/README.md +2 -2
- package/lib/packages/mapper/README.md +166 -0
- package/lib/packages/mapper/convert-to-map.ts +5 -0
- package/lib/packages/mapper/create-mapper.ts +30 -0
- package/lib/packages/mapper/index.ts +4 -0
- package/lib/packages/mapper/types.ts +1 -0
- package/lib/packages/mapper/use-mapper.ts +31 -0
- package/lib/stores/sidebar.store.ts +1 -1
- package/lib/types/chart.ts +2 -2
- package/lib/types/utility.type.ts +9 -0
- package/lib/utils/object.util.ts +16 -0
- package/lib/utils/size.util.ts +4 -2
- package/package.json +2 -1
- package/lib/components/backup-item/VtsBackupItem.vue +0 -47
- package/lib/composables/mapper.composable.md +0 -74
- package/lib/composables/mapper.composable.ts +0 -18
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
</template>
|
|
17
17
|
<UiButtonIcon
|
|
18
18
|
v-if="hasToggle"
|
|
19
|
-
v-tooltip="isExpanded ?
|
|
19
|
+
v-tooltip="isExpanded ? t('core.close') : t('core.open')"
|
|
20
20
|
class="toggle"
|
|
21
21
|
accent="brand"
|
|
22
22
|
:icon="isExpanded ? faAngleDown : faAngleRight"
|
|
@@ -47,6 +47,7 @@ import { IK_TREE_ITEM_EXPANDED, IK_TREE_ITEM_HAS_CHILDREN, IK_TREE_LIST_DEPTH }
|
|
|
47
47
|
import type { IconDefinition } from '@fortawesome/fontawesome-common-types'
|
|
48
48
|
import { faAngleDown, faAngleRight } from '@fortawesome/free-solid-svg-icons'
|
|
49
49
|
import { inject, ref, useAttrs } from 'vue'
|
|
50
|
+
import { useI18n } from 'vue-i18n'
|
|
50
51
|
import type { RouteLocationRaw } from 'vue-router'
|
|
51
52
|
|
|
52
53
|
defineOptions({
|
|
@@ -69,6 +70,8 @@ defineSlots<{
|
|
|
69
70
|
addons?(): any
|
|
70
71
|
}>()
|
|
71
72
|
|
|
73
|
+
const { t } = useI18n()
|
|
74
|
+
|
|
72
75
|
const attrs = useAttrs()
|
|
73
76
|
|
|
74
77
|
const hasToggle = inject(IK_TREE_ITEM_HAS_CHILDREN, ref(false))
|
|
@@ -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,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 ?
|
|
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="
|
|
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 {
|
|
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()
|
package/lib/locales/cs.json
CHANGED
|
@@ -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",
|
package/lib/locales/de.json
CHANGED
|
@@ -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": "
|
|
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",
|