@xen-orchestra/web-core 0.54.0 → 0.56.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 (107) hide show
  1. package/lib/components/button-group/VtsButtonGroup.vue +11 -1
  2. package/lib/components/card-object-title/VtsCardObjectTitle.vue +36 -0
  3. package/lib/components/code-snippet/VtsCodeSnippet.vue +11 -5
  4. package/lib/components/drawer/VtsDrawer.vue +89 -0
  5. package/lib/components/drawer/VtsDrawerButton.vue +22 -0
  6. package/lib/components/drawer/VtsDrawerCancelButton.vue +33 -0
  7. package/lib/components/drawer/VtsDrawerConfirmButton.vue +32 -0
  8. package/lib/components/drawer/VtsDrawerList.vue +34 -0
  9. package/lib/components/icon/VtsIcon.vue +3 -1
  10. package/lib/components/layout/VtsContentSidePanel.vue +41 -0
  11. package/lib/components/layout/VtsLayoutSidebar.vue +5 -2
  12. package/lib/components/menu/VtsActionsMenu.vue +37 -3
  13. package/lib/components/modal/VtsModalButton.vue +0 -1
  14. package/lib/components/operation-card/VtsOperationCard.vue +2 -1
  15. package/lib/components/panel/VtsPanel.vue +80 -0
  16. package/lib/components/panel/VtsSidePanel.vue +140 -0
  17. package/lib/components/query-builder/VtsQueryBuilderModal.vue +0 -1
  18. package/lib/components/select/VtsSelect.vue +1 -0
  19. package/lib/components/state-hero/VtsStateHero.vue +26 -24
  20. package/lib/components/table/VtsTable.vue +2 -1
  21. package/lib/components/table/cells/VtsActionCell.vue +7 -0
  22. package/lib/components/table/cells/VtsHeaderCell.vue +1 -17
  23. package/lib/components/table/cells/VtsLinkCell.vue +3 -1
  24. package/lib/components/table/cells/VtsTagCell.vue +4 -2
  25. package/lib/components/tree/VtsTreeItem.vue +9 -3
  26. package/lib/components/tree/VtsTreeList.vue +6 -3
  27. package/lib/components/tree/VtsTreeLoadingItem.vue +3 -3
  28. package/lib/components/ui/drawer/UiDrawer.vue +123 -0
  29. package/lib/components/ui/head-bar/UiHeadBar.vue +1 -1
  30. package/lib/components/ui/input/UiInput.vue +3 -1
  31. package/lib/components/ui/link/UiLink.vue +3 -1
  32. package/lib/components/ui/modal/UiModal.vue +10 -18
  33. package/lib/components/ui/panel/UiPanel.vue +7 -24
  34. package/lib/components/ui/tree-item-label/UiTreeItemLabel.vue +1 -1
  35. package/lib/composables/default-tab.composable.ts +4 -0
  36. package/lib/composables/table-state.composable.ts +1 -1
  37. package/lib/icons/action-icons.ts +20 -2
  38. package/lib/icons/custom-icons.ts +16 -0
  39. package/lib/icons/object-icons.ts +33 -18
  40. package/lib/locales/cs.json +110 -11
  41. package/lib/locales/da.json +1 -3
  42. package/lib/locales/de.json +1 -12
  43. package/lib/locales/en.json +76 -12
  44. package/lib/locales/es.json +15 -6
  45. package/lib/locales/fa.json +0 -1
  46. package/lib/locales/fr.json +76 -12
  47. package/lib/locales/it.json +0 -1
  48. package/lib/locales/ko.json +0 -2
  49. package/lib/locales/nb-NO.json +18 -20
  50. package/lib/locales/nl.json +0 -11
  51. package/lib/locales/pt-BR.json +0 -4
  52. package/lib/locales/pt.json +0 -4
  53. package/lib/locales/ru.json +0 -1
  54. package/lib/locales/sk.json +110 -11
  55. package/lib/locales/sv.json +2 -13
  56. package/lib/locales/uk.json +0 -1
  57. package/lib/locales/zh-Hans.json +79 -16
  58. package/lib/packages/drawer/DrawerProvider.vue +17 -0
  59. package/lib/packages/drawer/README.md +189 -0
  60. package/lib/packages/drawer/create-drawer-opener.ts +119 -0
  61. package/lib/packages/drawer/drawer.store.ts +22 -0
  62. package/lib/packages/drawer/types.ts +93 -0
  63. package/lib/packages/drawer/use-drawer.ts +53 -0
  64. package/lib/packages/modal/create-modal-opener.ts +12 -10
  65. package/lib/packages/remote-resource/define-remote-resource.ts +64 -29
  66. package/lib/packages/tree/types.ts +6 -0
  67. package/lib/packages/tree/use-tree.ts +38 -37
  68. package/lib/stores/panel.store.ts +56 -5
  69. package/lib/tables/column-definitions/action-column.ts +22 -10
  70. package/lib/tables/column-definitions/address-column.ts +1 -1
  71. package/lib/tables/column-definitions/button-column.ts +1 -1
  72. package/lib/tables/column-definitions/button-icon-column.ts +1 -1
  73. package/lib/tables/column-definitions/collapsed-list-column.ts +1 -1
  74. package/lib/tables/column-definitions/date-column.ts +1 -1
  75. package/lib/tables/column-definitions/double-link-column.ts +1 -1
  76. package/lib/tables/column-definitions/info-column.ts +1 -1
  77. package/lib/tables/column-definitions/input-column.ts +1 -5
  78. package/lib/tables/column-definitions/link-column.ts +1 -1
  79. package/lib/tables/column-definitions/link-or-text-column.ts +1 -1
  80. package/lib/tables/column-definitions/literal-column.ts +1 -1
  81. package/lib/tables/column-definitions/number-column.ts +1 -1
  82. package/lib/tables/column-definitions/percent-column.ts +1 -1
  83. package/lib/tables/column-definitions/progress-bar-column.ts +1 -1
  84. package/lib/tables/column-definitions/select-column.ts +1 -1
  85. package/lib/tables/column-definitions/status-column.ts +2 -2
  86. package/lib/tables/column-definitions/tag-column.ts +3 -2
  87. package/lib/tables/column-definitions/text-column.ts +1 -1
  88. package/lib/tables/column-definitions/truncated-text-column.ts +1 -1
  89. package/lib/tables/column-sets/backup-job-schedule-columns.ts +2 -2
  90. package/lib/tables/column-sets/backup-log-columns.ts +1 -1
  91. package/lib/tables/column-sets/new-vm-network-columns.ts +0 -2
  92. package/lib/tables/column-sets/new-vm-sr-columns.ts +0 -1
  93. package/lib/tables/column-sets/server-columns.ts +1 -1
  94. package/lib/tables/column-sets/snapshot-columns.ts +1 -1
  95. package/lib/tables/column-sets/sr-columns.ts +2 -2
  96. package/lib/tables/column-sets/traffic-rules-columns.ts +5 -7
  97. package/lib/tables/column-sets/vif-network-columns.ts +24 -0
  98. package/lib/tables/column-sets/vm-columns.ts +2 -3
  99. package/lib/tables/helpers/render-head-cell.ts +2 -4
  100. package/lib/tables/types.ts +0 -2
  101. package/lib/types/connection.ts +14 -0
  102. package/lib/types/state-hero.type.ts +19 -0
  103. package/lib/types/storage-repository.type.ts +14 -0
  104. package/lib/types/vue-virtual-scroller.d.ts +8 -2
  105. package/lib/utils/injection-keys.util.ts +1 -1
  106. package/lib/utils/sr.utils.ts +34 -0
  107. package/package.json +4 -4
@@ -1,4 +1,4 @@
1
- <!-- v2 -->
1
+ <!-- v4 -->
2
2
  <template>
3
3
  <form :class="className" class="ui-modal" @click.self="emit('dismiss')">
4
4
  <div class="modal">
@@ -7,8 +7,8 @@
7
7
  :accent="closeIconAccent"
8
8
  :target-scale="2"
9
9
  class="dismiss-button"
10
- icon="fa:xmark"
11
- size="small"
10
+ icon="action:close-cancel-clear"
11
+ size="medium"
12
12
  @click="emit('dismiss')"
13
13
  />
14
14
  <main class="main">
@@ -36,7 +36,7 @@ import { useMapper } from '@core/packages/mapper'
36
36
  import { toVariants } from '@core/utils/to-variants.util.ts'
37
37
  import { computed } from 'vue'
38
38
 
39
- export type ModalAccent = 'info' | 'success' | 'warning' | 'danger'
39
+ export type ModalAccent = 'info' | 'warning' | 'danger'
40
40
 
41
41
  const { accent } = defineProps<{
42
42
  accent: ModalAccent
@@ -58,7 +58,6 @@ const closeIconAccent = useMapper(
58
58
  () => accent,
59
59
  {
60
60
  info: 'brand',
61
- success: 'brand',
62
61
  warning: 'warning',
63
62
  danger: 'danger',
64
63
  },
@@ -84,7 +83,10 @@ const className = computed(() => toVariants({ accent }))
84
83
  max-height: min(90vh, 80rem);
85
84
  padding: 3.2rem 2.4rem 2.4rem;
86
85
  gap: 2.4rem;
86
+ background-color: var(--color-neutral-background-secondary);
87
87
  border-radius: 1rem;
88
+ border-width: 0.1rem;
89
+ border-style: solid;
88
90
 
89
91
  &:not(:has(.buttons)) {
90
92
  padding-bottom: 3.2rem;
@@ -122,7 +124,7 @@ const className = computed(() => toVariants({ accent }))
122
124
 
123
125
  &.accent--info {
124
126
  .modal {
125
- background-color: var(--color-info-background-selected);
127
+ border-color: var(--color-info-item-base);
126
128
  }
127
129
 
128
130
  .main .icon {
@@ -130,19 +132,9 @@ const className = computed(() => toVariants({ accent }))
130
132
  }
131
133
  }
132
134
 
133
- &.accent--success {
134
- .modal {
135
- background-color: var(--color-success-background-selected);
136
- }
137
-
138
- .main .icon {
139
- color: var(--color-success-txt-base);
140
- }
141
- }
142
-
143
135
  &.accent--warning {
144
136
  .modal {
145
- background-color: var(--color-warning-background-selected);
137
+ border-color: var(--color-warning-item-base);
146
138
  }
147
139
 
148
140
  .main .icon {
@@ -152,7 +144,7 @@ const className = computed(() => toVariants({ accent }))
152
144
 
153
145
  &.accent--danger {
154
146
  .modal {
155
- background-color: var(--color-danger-background-selected);
147
+ border-color: var(--color-danger-item-base);
156
148
  }
157
149
 
158
150
  .main .icon {
@@ -1,6 +1,6 @@
1
- <!-- v2 -->
1
+ <!-- v5 -->
2
2
  <template>
3
- <div class="ui-panel" :class="{ error, 'mobile-drawer': uiStore.isSmall }">
3
+ <div class="ui-panel" :class="{ error }">
4
4
  <div v-if="slots.header" class="header">
5
5
  <slot name="header" />
6
6
  </div>
@@ -11,8 +11,6 @@
11
11
  </template>
12
12
 
13
13
  <script setup lang="ts">
14
- import { useUiStore } from '@core/stores/ui.store'
15
-
16
14
  defineProps<{
17
15
  error?: boolean
18
16
  }>()
@@ -21,31 +19,25 @@ const slots = defineSlots<{
21
19
  default(): any
22
20
  header?(): any
23
21
  }>()
24
-
25
- const uiStore = useUiStore()
26
22
  </script>
27
23
 
28
24
  <style scoped lang="postcss">
29
25
  .ui-panel {
30
- position: sticky;
31
- top: 0;
32
26
  display: flex;
33
27
  flex-direction: column;
34
28
  border-inline-start: 0.1rem solid var(--color-neutral-border);
29
+ border-block-end: 0.1rem solid var(--color-neutral-border);
30
+ border-end-start-radius: 0.8rem;
35
31
  background-color: var(--color-neutral-background-secondary);
36
32
 
37
- &:not(.mobile-drawer) {
38
- min-height: calc(100dvh - 16rem);
39
- }
40
-
41
33
  .header {
34
+ flex-shrink: 0;
35
+ padding: 0.4rem 1.6rem;
42
36
  border-bottom: 0.1rem solid var(--color-neutral-border);
43
37
  background-color: var(--color-neutral-background-primary);
44
38
  display: flex;
45
- justify-content: flex-end;
46
39
  align-items: center;
47
40
  gap: 1.6rem;
48
- padding: 0.4rem 1.6rem;
49
41
  }
50
42
 
51
43
  .content {
@@ -53,20 +45,11 @@ const uiStore = useUiStore()
53
45
  flex-direction: column;
54
46
  padding: 0.8rem;
55
47
  gap: 0.8rem;
56
- }
57
-
58
- &.mobile-drawer {
59
- .content {
60
- overflow: auto;
61
- }
48
+ scrollbar-width: thin;
62
49
  }
63
50
 
64
51
  &.error {
65
52
  background-color: var(--color-danger-background-selected);
66
-
67
- .content {
68
- padding-top: 15rem;
69
- }
70
53
  }
71
54
  }
72
55
  </style>
@@ -72,7 +72,7 @@ const hasToggle = inject(IK_TREE_ITEM_HAS_CHILDREN, ref(false))
72
72
 
73
73
  const isExpanded = inject(IK_TREE_ITEM_EXPANDED, ref(true))
74
74
 
75
- const depth = inject(IK_TREE_LIST_DEPTH, 0)
75
+ const depth = inject(IK_TREE_LIST_DEPTH, ref(0))
76
76
  </script>
77
77
 
78
78
  <style lang="postcss" scoped>
@@ -14,6 +14,10 @@ export function useDefaultTab(dispatcherRouteName: RouteRecordName & string, def
14
14
  watch(
15
15
  () => route.name as string,
16
16
  name => {
17
+ if (name == null) {
18
+ return
19
+ }
20
+
17
21
  if (name === dispatcherRouteName) {
18
22
  const isSameDispatcher = localStorage.getItem(TAB_MEMORY_DISPATCHER) === dispatcherRouteName
19
23
  const tabName = (isSameDispatcher ? localStorage.getItem(TAB_MEMORY_LAST) : null) ?? defaultTab
@@ -1,5 +1,5 @@
1
- import type { StateHeroType } from '@core/components/state-hero/VtsStateHero.vue'
2
1
  import type { TableState } from '@core/components/table/VtsTable.vue'
2
+ import type { StateHeroType } from '@core/types/state-hero.type.ts'
3
3
  import { computed, toValue, type MaybeRefOrGetter } from 'vue'
4
4
  import { useI18n } from 'vue-i18n'
5
5
 
@@ -1,11 +1,14 @@
1
+ import { slash } from '@core/icons/custom-icons.ts'
1
2
  import { defineIconPack, type IconSingleConfig } from '@core/packages/icon'
2
3
  import { faCopy, faSquare as checkboxEmpty, type IconDefinition } from '@fortawesome/free-regular-svg-icons'
3
4
  import {
4
5
  faAdd,
5
6
  faArrowCircleRight,
7
+ faArrowDownLong,
6
8
  faArrowRight,
7
9
  faArrowRotateLeft,
8
10
  faArrowRotateRight,
11
+ faArrowUpLong,
9
12
  faArrowUpRightFromSquare,
10
13
  faBan,
11
14
  faBars,
@@ -24,6 +27,7 @@ import {
24
27
  faLink,
25
28
  faLinkSlash,
26
29
  faMinus,
30
+ faPlug,
27
31
  faPowerOff,
28
32
  faRefresh,
29
33
  faRoute,
@@ -132,8 +136,10 @@ export const actionIcons = defineIconPack({
132
136
  fill: constructIcon(faFillDrip),
133
137
  duplicate: constructIcon(faClone),
134
138
  copy: constructIcon(faCopy),
135
- connect: constructIcon(faLink),
136
- disconnect: constructIcon(faLinkSlash),
139
+ attach: constructIcon(faLink),
140
+ detach: constructIcon(faLinkSlash),
141
+ connect: constructIcon(faPlug),
142
+ disconnect: [constructIcon(faPlug), { icon: slash }],
137
143
  forget: constructIcon(faEraser),
138
144
  delete: { icon: faTrash, color: 'var(--color-danger-txt-primary)' },
139
145
  'more-actions': constructIcon(faEllipsis),
@@ -142,6 +148,18 @@ export const actionIcons = defineIconPack({
142
148
  color: 'var(--color-neutral-txt-primary)',
143
149
  rotate: 90,
144
150
  },
151
+ 'import-export': [
152
+ {
153
+ icon: faArrowUpLong,
154
+ color: 'var(--color-neutral-txt-primary)',
155
+ translate: [-5, 0],
156
+ },
157
+ {
158
+ icon: faArrowDownLong,
159
+ color: 'var(--color-neutral-txt-primary)',
160
+ translate: [5, 0],
161
+ },
162
+ ],
145
163
  reboot: constructIcon(faArrowRotateRight),
146
164
  'force-reboot': [
147
165
  constructIcon(faArrowRotateRight),
@@ -0,0 +1,16 @@
1
+ import { defineIcon } from '@core/packages/icon'
2
+ import { faSlash } from '@fortawesome/free-solid-svg-icons'
3
+
4
+ export const slash = defineIcon([
5
+ {
6
+ icon: faSlash,
7
+ color: 'var(--color-neutral-background-primary)',
8
+ translate: [-0.5, 0.5],
9
+ size: 20,
10
+ },
11
+ {
12
+ icon: faSlash,
13
+ translate: [0.5, -0.5],
14
+ size: 20,
15
+ },
16
+ ])
@@ -1,3 +1,4 @@
1
+ import { slash } from '@core/icons/custom-icons.ts'
1
2
  import { statusIcons } from '@core/icons/status-icons.ts'
2
3
  import { defineIcon, type IconSingleConfig } from '@core/packages/icon'
3
4
  import { defineIconPack } from '@core/packages/icon/define-icon-pack.ts'
@@ -12,14 +13,13 @@ import {
12
13
  faClock,
13
14
  faDatabase,
14
15
  faDesktop,
15
- faEthernet,
16
16
  faHdd,
17
+ faMapPin,
17
18
  faNetworkWired,
18
19
  faPlay,
19
20
  faPuzzlePiece,
20
21
  faSatellite,
21
22
  faServer,
22
- faSlash,
23
23
  faUserCircle,
24
24
  faUsers,
25
25
  type IconDefinition,
@@ -48,21 +48,6 @@ function constructIcon(icon: IconDefinition): IconSingleConfig {
48
48
  }
49
49
  }
50
50
 
51
- const slash = defineIcon([
52
- {
53
- icon: faSlash,
54
- color: 'var(--color-neutral-background-primary)',
55
- translate: [-0.5, 0.5],
56
- size: 20,
57
- },
58
- {
59
- icon: faSlash,
60
- color: 'var(--color-neutral-txt-secondary)',
61
- translate: [0.5, -0.5],
62
- size: 20,
63
- },
64
- ])
65
-
66
51
  const runningNeutral = defineIcon([
67
52
  {
68
53
  icon: faCircle,
@@ -145,6 +130,7 @@ export const objectIcons = defineIconPack({
145
130
  },
146
131
  {
147
132
  icon: slash,
133
+ color: 'var(--color-neutral-txt-secondary)',
148
134
  },
149
135
  ],
150
136
  host: constructIcon(faServer),
@@ -155,6 +141,7 @@ export const objectIcons = defineIconPack({
155
141
  },
156
142
  {
157
143
  icon: slash,
144
+ color: 'var(--color-neutral-txt-secondary)',
158
145
  },
159
146
  ],
160
147
  'host:running': [constructIcon(faServer), ...constructCircleStatus('running-circle')],
@@ -169,6 +156,7 @@ export const objectIcons = defineIconPack({
169
156
  },
170
157
  {
171
158
  icon: slash,
159
+ color: 'var(--color-neutral-txt-secondary)',
172
160
  },
173
161
  ],
174
162
  'vm:running': [constructIcon(faDesktop), ...constructCircleStatus('running-circle')],
@@ -190,6 +178,7 @@ export const objectIcons = defineIconPack({
190
178
  },
191
179
  {
192
180
  icon: slash,
181
+ color: 'var(--color-neutral-txt-secondary)',
193
182
  },
194
183
  ],
195
184
  'sr:connected': [constructIcon(faDatabase), ...constructCircleStatus('success-circle')],
@@ -204,13 +193,37 @@ export const objectIcons = defineIconPack({
204
193
  },
205
194
  {
206
195
  icon: slash,
196
+ color: 'var(--color-neutral-txt-secondary)',
207
197
  },
208
198
  ],
209
199
  'vdi:attached': [constructIcon(faHdd), ...constructCircleStatus('success-circle')],
210
200
  'vdi:disabled': [constructIcon(faHdd), ...constructCircleStatus('disabled')],
211
201
  'vdi:warning': [constructIcon(faHdd), ...constructCircleStatus('warning-circle')],
212
202
  'vdi:detached': [constructIcon(faHdd), ...constructCircleStatus('danger-circle')],
213
- vif: constructIcon(faEthernet),
203
+ 'vdi-snapshot': [
204
+ constructIcon(faHdd),
205
+ {
206
+ icon: camera,
207
+ },
208
+ ],
209
+ vif: [
210
+ {
211
+ icon: faMapPin,
212
+ color: 'var(--color-neutral-txt-primary)',
213
+ },
214
+ {
215
+ icon: faCircle,
216
+ color: 'var(--color-neutral-txt-primary)',
217
+ translate: [0, -4],
218
+ size: 12,
219
+ },
220
+ {
221
+ icon: faCircle,
222
+ color: 'var(--color-neutral-background-primary)',
223
+ translate: [0, -4],
224
+ size: 8,
225
+ },
226
+ ],
214
227
  network: constructIcon(faNetworkWired),
215
228
  'network:unknown': [
216
229
  {
@@ -219,6 +232,7 @@ export const objectIcons = defineIconPack({
219
232
  },
220
233
  {
221
234
  icon: slash,
235
+ color: 'var(--color-neutral-txt-secondary)',
222
236
  },
223
237
  ],
224
238
  'network:connected': [constructIcon(faNetworkWired), ...constructCircleStatus('success-circle')],
@@ -232,6 +246,7 @@ export const objectIcons = defineIconPack({
232
246
  },
233
247
  {
234
248
  icon: slash,
249
+ color: 'var(--color-neutral-txt-secondary)',
235
250
  },
236
251
  ],
237
252
  'br:connected': [constructIcon(faBoxesStacked), ...constructCircleStatus('success-circle')],