bfg-common 1.6.3 → 1.6.4

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 (65) hide show
  1. package/assets/localization/local_be.json +56 -4
  2. package/assets/localization/local_en.json +61 -9
  3. package/assets/localization/local_hy.json +57 -5
  4. package/assets/localization/local_kk.json +56 -4
  5. package/assets/localization/local_ru.json +60 -8
  6. package/assets/localization/local_zh.json +56 -4
  7. package/assets/scss/common/theme.scss +2 -2
  8. package/components/atoms/stack/StackBlock.vue +1 -1
  9. package/components/common/adapterManager/addAdapterModal/AddAdapterModalNew.vue +1 -1
  10. package/components/common/adapterManager/addAdapterWarningModal/AddAdapterWarningModalNew.vue +0 -1
  11. package/components/common/adapterManager/ui/table/adapters/AdaptersNew.vue +1 -0
  12. package/components/common/configure/physicalAdapters/PhysicalAdapters.vue +6 -0
  13. package/components/common/configure/physicalAdapters/PhysicalAdaptersNew.vue +219 -192
  14. package/components/common/configure/physicalAdapters/PhysicalAdaptersOld.vue +6 -4
  15. package/components/common/configure/physicalAdapters/buttons/Buttons.vue +1 -0
  16. package/components/common/configure/physicalAdapters/modals/edit/Edit.vue +26 -1
  17. package/components/common/configure/physicalAdapters/modals/edit/EditNew.vue +30 -1
  18. package/components/common/configure/physicalAdapters/modals/edit/lib/models/interfaces.ts +5 -0
  19. package/components/common/configure/physicalAdapters/modals/edit/lib/validations/validations.ts +19 -0
  20. package/components/common/configure/physicalAdapters/tableView/TableViewNew.vue +12 -1
  21. package/components/common/configure/physicalAdapters/tableView/lib/config/physicalAdaptersTableConfigNew.ts +21 -21
  22. package/components/common/configure/physicalAdapters/tableView/lib/config/settings.ts +12 -5
  23. package/components/common/configure/physicalAdapters/tableView/lib/models/interfaces.ts +4 -1
  24. package/components/common/diagramMain/DiagramMain.vue +6 -0
  25. package/components/common/diagramMain/modals/Modals.vue +4 -0
  26. package/components/common/diagramMain/modals/editSettings/tabs/NetworkProperties.vue +2 -2
  27. package/components/common/diagramMain/modals/lib/config/vmKernelAdapter.ts +1 -1
  28. package/components/common/diagramMain/modals/migrateVmkernelAdapter/MigrateVmkernelAdapter.vue +2 -2
  29. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/common.ts +1 -1
  30. package/components/common/layout/theHeader/userMenu/modals/preferences/view/Old.vue +5 -9
  31. package/components/common/monitor/utilization/New.vue +5 -0
  32. package/components/common/monitor/utilization/Old.vue +79 -0
  33. package/components/common/monitor/utilization/Utilization.vue +51 -0
  34. package/components/common/monitor/utilization/infoBlock/InfoBlock.vue +23 -0
  35. package/components/common/monitor/utilization/infoBlock/New.vue +5 -0
  36. package/components/common/monitor/utilization/infoBlock/Old.vue +185 -0
  37. package/components/common/monitor/utilization/lib/models/enums.ts +4 -0
  38. package/components/common/monitor/utilization/lib/models/interfaces.ts +25 -0
  39. package/components/common/monitor/utilization/lib/utils/index.ts +31 -0
  40. package/components/common/noDataProvided/NoDataProvidedNew.vue +1 -1
  41. package/components/common/pages/tasks/Tasks.vue +4 -1
  42. package/components/common/split/vertical/New.vue +11 -6
  43. package/components/common/vm/actions/add/New.vue +21 -6
  44. package/components/common/vm/actions/common/select/options/New.vue +10 -19
  45. package/components/common/vm/actions/common/select/storage/new/lib/config/table.ts +13 -15
  46. package/components/common/vm/snapshots/DetailView.vue +6 -6
  47. package/components/common/wizards/common/steps/name/New.vue +1 -1
  48. package/components/common/wizards/datastore/add/New.vue +6 -0
  49. package/components/common/wizards/datastore/add/steps/nameAndDevice/NameAndDeviceNew.vue +1 -1
  50. package/components/common/wizards/datastore/add/steps/nameAndDevice/advancedOptions/New.vue +1 -1
  51. package/components/common/wizards/network/add/Add.vue +13 -2
  52. package/components/common/wizards/network/add/AddNew.vue +22 -26
  53. package/components/common/wizards/network/add/lib/config/initialData.ts +4 -4
  54. package/components/common/wizards/network/add/lib/utils/utils.ts +1 -1
  55. package/components/common/wizards/network/add/steps/ipFourSettings/IpFourSettingsNew.vue +2 -8
  56. package/components/common/wizards/network/add/steps/portProperties/PortPropertiesNew.vue +2 -8
  57. package/components/common/wizards/network/add/steps/selectTargetDevice/SelectTargetDeviceNew.vue +10 -3
  58. package/components/common/wizards/network/add/steps/selectTargetDevice/modals/new/SelectNetwork.vue +5 -1
  59. package/components/common/wizards/network/add/validations/common.ts +1 -1
  60. package/components/common/wizards/vm/migrate/steps/computeResource/tableView/new/New.vue +31 -13
  61. package/components/common/wizards/vm/migrate/steps/computeResource/tableView/new/lib/config/clusterTable.ts +340 -0
  62. package/components/common/wizards/vm/migrate/steps/computeResource/tableView/new/lib/config/hostTable.ts +3 -1
  63. package/lib/models/store/tasks/enums.ts +2 -0
  64. package/package.json +2 -2
  65. package/store/tasks/actions.ts +26 -8
@@ -0,0 +1,185 @@
1
+ <template>
2
+ <div class="utilization-info-block">
3
+ <div class="header-block">
4
+ <p class="title">{{ props.infoData.title }}</p>
5
+ </div>
6
+ <div class="body-block">
7
+ <div class="bar">
8
+ <div :title="currentTitle" class="track">
9
+ <div
10
+ :style="{
11
+ width: animated ? barPercent + '%' : '0%',
12
+ background: consumedItem?.color,
13
+ boxShadow: `0 0 6px ${consumedItem?.color}88`,
14
+ }"
15
+ class="fill"
16
+ />
17
+ </div>
18
+ </div>
19
+ <div class="footer-body-block">
20
+ <p>0 {{ localization.common.gb }}</p>
21
+ <p>{{ maxItem?.value }}</p>
22
+ </div>
23
+ </div>
24
+ <div class="footer-block">
25
+ <div
26
+ v-for="(item, key) in props.infoData.data"
27
+ :key="key"
28
+ class="footer-item"
29
+ >
30
+ <div class="left-block">
31
+ <div
32
+ v-if="item.color"
33
+ :style="`background-color: ${item.color}`"
34
+ class="color-block"
35
+ ></div>
36
+ <p class="name">{{ item.label }}</p>
37
+ </div>
38
+ <p class="value">{{ item.value }}</p>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ </template>
43
+
44
+ <script setup lang="ts">
45
+ import type {
46
+ UI_I_UtilizationDataItem,
47
+ UI_I_UtilizationDataItems,
48
+ } from '~/components/common/monitor/utilization/lib/models/interfaces'
49
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
50
+
51
+ const props = defineProps<{
52
+ infoData: UI_I_UtilizationDataItem
53
+ }>()
54
+
55
+ const localization = computed<UI_I_Localization>(() => useLocal())
56
+
57
+ const animated = ref<boolean>(false)
58
+
59
+ const maxItem = computed<UI_I_UtilizationDataItems | null>(
60
+ () =>
61
+ props.infoData.data.find((item) =>
62
+ item.label.toLowerCase().includes('capacity')
63
+ ) || null
64
+ )
65
+
66
+ const consumedItem = computed<UI_I_UtilizationDataItems | null>(
67
+ () =>
68
+ props.infoData.data.find((item) =>
69
+ item.label.toLowerCase().includes('consumed')
70
+ ) || null
71
+ )
72
+
73
+ const usageItem = computed<UI_I_UtilizationDataItems | null>(
74
+ () =>
75
+ props.infoData.data.find((item) =>
76
+ item.label.toLowerCase().includes('usagepercent')
77
+ ) || null
78
+ )
79
+ const currentTitle = computed<string>(
80
+ () =>
81
+ `${consumedItem.value?.value} / ${maxItem.value?.value} - ${usageItem.value?.value}`
82
+ )
83
+
84
+ const barPercent = computed<string>(() => {
85
+ const parse = (v: string) => parseFloat(v.replace(/[^\d.]/g, '')) || 0
86
+ if (!maxItem.value || !consumedItem.value) return '0'
87
+ return String(
88
+ Math.min(
89
+ (parse(consumedItem.value.value) / parse(maxItem.value.value)) * 100,
90
+ 100
91
+ )
92
+ )
93
+ })
94
+
95
+ onMounted(() => {
96
+ setTimeout(() => (animated.value = true), 100)
97
+ })
98
+ </script>
99
+
100
+ <style scoped lang="scss">
101
+ .utilization-info-block {
102
+ width: 522px;
103
+ padding: 20px;
104
+ border: 1px solid #ccc;
105
+ border-radius: 4px;
106
+ box-shadow: 0px 0px 2px #ccc;
107
+
108
+ .header-block {
109
+ margin-bottom: 20px;
110
+
111
+ .title {
112
+ font-size: 16px;
113
+ font-weight: 500;
114
+ }
115
+ }
116
+
117
+ .body-block {
118
+ display: flex;
119
+ flex-direction: column;
120
+ gap: 8px;
121
+ margin-bottom: 20px;
122
+
123
+ .bar {
124
+ .track {
125
+ height: 18px;
126
+ background: #e5e7eb;
127
+ border-radius: 4px;
128
+ overflow: hidden;
129
+ border: 1px solid gray;
130
+ }
131
+
132
+ .fill {
133
+ height: 100%;
134
+ border-radius: 2px;
135
+ transition: width 0.8s cubic-bezier(0.4, 0, 0.2, 1);
136
+ }
137
+ }
138
+ .footer-body-block {
139
+ display: flex;
140
+ align-items: center;
141
+ justify-content: space-between;
142
+
143
+ p {
144
+ font-size: 11px;
145
+ }
146
+ }
147
+ }
148
+
149
+ .footer-block {
150
+ display: grid;
151
+ grid-row-gap: 5px;
152
+ width: 70%;
153
+
154
+ .footer-item {
155
+ display: grid;
156
+ align-items: center;
157
+ gap: 5px;
158
+ grid-template-columns: 70% 30%;
159
+
160
+ .left-block {
161
+ display: flex;
162
+ align-items: center;
163
+ gap: 5px;
164
+
165
+ .color-block {
166
+ width: 15px;
167
+ height: 15px;
168
+ border: 1px solid black;
169
+ border-radius: 4px;
170
+ }
171
+
172
+ .name {
173
+ font-size: 14px;
174
+ font-weight: 500;
175
+ }
176
+ }
177
+
178
+ .value {
179
+ font-size: 14px;
180
+ font-weight: 500;
181
+ }
182
+ }
183
+ }
184
+ }
185
+ </style>
@@ -0,0 +1,4 @@
1
+ export enum UI_E_UtilizationBlockCurrentKeys {
2
+ cpuUtilization = 'hostCpu',
3
+ hostMemoryUtilization = 'hostMem',
4
+ }
@@ -0,0 +1,25 @@
1
+ export interface API_UI_I_UtilizationDataItems {
2
+ label: string
3
+ value: string
4
+ }
5
+
6
+ export interface API_UI_I_UtilizationDataItem {
7
+ items: API_UI_I_UtilizationDataItems[]
8
+ }
9
+
10
+ export interface API_UI_I_UtilizationData {
11
+ [key: string]: API_UI_I_UtilizationDataItem
12
+ }
13
+
14
+ export interface UI_I_UtilizationDataItems {
15
+ label: string
16
+ value: string
17
+ color: string
18
+ }
19
+
20
+ export interface UI_I_UtilizationDataItem {
21
+ id: string
22
+ isShow: boolean
23
+ title: string
24
+ data: UI_I_UtilizationDataItems[]
25
+ }
@@ -0,0 +1,31 @@
1
+ import type {
2
+ API_UI_I_UtilizationData,
3
+ UI_I_UtilizationDataItem,
4
+ } from '~/components/common/monitor/utilization/lib/models/interfaces'
5
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
6
+ import { UI_E_UtilizationBlockCurrentKeys } from '~/components/common/monitor/utilization/lib/models/enums'
7
+
8
+ export const constructApiData = (
9
+ apiData: API_UI_I_UtilizationData,
10
+ localization: UI_I_Localization
11
+ ): UI_I_UtilizationDataItem[] => {
12
+ const result: UI_I_UtilizationDataItem[] = []
13
+ Object.keys(apiData).forEach((key) => {
14
+ result.push({
15
+ id: key,
16
+ isShow: true,
17
+ title: localization.common[UI_E_UtilizationBlockCurrentKeys[key]],
18
+ data: apiData[key].items.map((item) => {
19
+ item.color = !item.label.toLowerCase().includes('capacity')
20
+ ? '#' +
21
+ Math.floor(Math.random() * 0xffffff)
22
+ .toString(16)
23
+ .padStart(6, '0')
24
+ : ''
25
+
26
+ return item
27
+ }),
28
+ })
29
+ })
30
+ return result
31
+ }
@@ -43,7 +43,7 @@ const localization = computed<UI_I_Localization>(() => useLocal())
43
43
  }
44
44
 
45
45
  .ui-no-data-provided-title {
46
- font-weight: 500;
46
+ font-weight: 400;
47
47
  font-size: 16px;
48
48
  line-height: 19px;
49
49
  letter-spacing: 0;
@@ -58,7 +58,10 @@ const getTasks = async (): Promise<void> => {
58
58
  sortBy: sort.value || '',
59
59
  filter: filter.value || '',
60
60
  }
61
- await $store.dispatch('tasks/A_GET_TASKS', payload)
61
+ await $store.dispatch('tasks/A_GET_TASKS', {
62
+ data: payload,
63
+ project: props.project,
64
+ })
62
65
  }
63
66
  const onUpdatePagination = (event: UI_I_Pagination): void => {
64
67
  pagination.value = event
@@ -52,10 +52,14 @@ const props = defineProps<{
52
52
  </style>
53
53
 
54
54
  <style scoped lang="scss">
55
- .fill-parent {
55
+ .vertical {
56
56
  &.dragging {
57
57
  .gutter-vertical.gutter {
58
- background-color: var(--gutter-active-bg-color);
58
+ background-color: var(--new-gutter-active-bg-color);
59
+
60
+ &::before {
61
+ background-color: var(--new-gutter-active-before-bg-color);
62
+ }
59
63
  }
60
64
  }
61
65
 
@@ -95,11 +99,11 @@ const props = defineProps<{
95
99
  //}
96
100
 
97
101
  &:hover {
98
- background-color: var(--gutter-hover-bg-color);
102
+ background-color: var(--new-gutter-hover-bg-color);
99
103
  cursor: row-resize;
100
104
 
101
105
  &:before {
102
- background-color: var(--gutter-handler-active-bg-color);
106
+ background-color: var(--new-gutter-active-before-bg-color);
103
107
  }
104
108
  }
105
109
 
@@ -112,8 +116,9 @@ const props = defineProps<{
112
116
  transition-duration: 0.25s;
113
117
  width: 24px;
114
118
  height: 2px;
115
- left: calc(50% - 12px);
116
- top: calc(50% - 1px);
119
+ left: 50%;
120
+ top: 50%;
121
+ transform: translate(-50%, -50%);
117
122
  border-radius: 4px;
118
123
  }
119
124
  }
@@ -55,13 +55,13 @@
55
55
  <div ref="subTitleBlockName">
56
56
  <div class="subtitle-block">
57
57
  <div
58
- id="name-alert-wrapper"
59
- :class="[{ 'mb-4': !isNameAlertWrapperEmpty }]"
58
+ id="name-alert-wrapper"
59
+ :class="[{ 'mb-4': !isNameAlertWrapperEmpty }]"
60
60
  ></div>
61
61
  <ui-wizard-subtitle
62
- :sub-title="
63
- localization.vmWizard.specifyUniqueNameAndTargetLocationForVm
64
- "
62
+ :sub-title="
63
+ localization.vmWizard.specifyUniqueNameAndTargetLocationForVm
64
+ "
65
65
  />
66
66
  </div>
67
67
  </div>
@@ -153,7 +153,8 @@
153
153
  :datastore="props.datastore"
154
154
  :is-datastore-loading="props.isDatastoreLoading"
155
155
  :get-datastore-table-func="props.getDatastoreTableFunc"
156
- :storage="props.vmtSettings?.storage"
156
+ :storage="storageLocal"
157
+ @change-storage="setSelectedStorageIdLocal"
157
158
  @submit="emits('change-storage', $event)"
158
159
  @has-errors="isStorageAlertWrapperEmpty = $event"
159
160
  />
@@ -593,6 +594,20 @@ const isNameAlertWrapperEmpty = ref<boolean>(false)
593
594
  // const isComputeResourceAlertWrapperEmpty = ref<boolean>(false)
594
595
  const isStorageAlertWrapperEmpty = ref<boolean>(false)
595
596
  const isCompatibilityAlertWrapperEmpty = ref<boolean>(false)
597
+
598
+ const storageLocal = computed<UI_I_DatastoreTableItem | undefined>(() => {
599
+ return selectedStorageLocal.value ?? props.vmtSettings?.storage
600
+ })
601
+
602
+ /* TODO: В дальнейшем необходимо вынести все данные наружу и передавать его через v-model */
603
+ // рефакторинг. При возврате на шаг выбора хранилища ранее выбранное хранилище не отображается как выбранное.
604
+ // Для хранилища в v-model необходимо сохранять ID хранилища, а не ключ индекса.
605
+ const selectedStorageLocal = ref<UI_I_DatastoreTableItem | null>(null)
606
+ const setSelectedStorageIdLocal = (datastore: UI_I_DatastoreTableItem) => {
607
+ selectedStorageLocal.value = {
608
+ id: datastore.id,
609
+ } as UI_I_DatastoreTableItem
610
+ }
596
611
  </script>
597
612
 
598
613
  <style>
@@ -8,6 +8,7 @@
8
8
  ]"
9
9
  >
10
10
  <div
11
+ v-if="!props.isNewVmFromTemplate"
11
12
  :class="[
12
13
  'checkbox-container',
13
14
  { checked: isCustomizeOs },
@@ -59,35 +60,24 @@
59
60
  </p>
60
61
  </div>
61
62
  <div
62
- :class="[
63
- 'checkbox-container',
64
- { checked: isPowerOn },
65
- { disabled: props.isNewVmFromTemplate },
66
- ]"
63
+ :class="['checkbox-container', { checked: isPowerOn }]"
67
64
  @click.stop.prevent="onTogglePowerOn"
68
65
  >
69
- <!-- :disabled="props.isNewVmFromTemplate"-->
70
66
  <ui-checkbox
71
67
  v-model="isPowerOn"
72
68
  :label-text="localization.vmWizard.autoPowerOn"
73
- :title="localization.vmWizard.autoPowerOn"
74
- :disabled="props.isNewVmFromTemplate"
75
69
  test-id="power-on"
76
70
  size="md"
77
71
  />
78
- <!-- { disabled: props.isNewVmFromTemplate },-->
79
- <p
80
- :class="[
81
- 'checkbox-block-description mt-2 ml-7',
82
- { disabled: props.isNewVmFromTemplate },
83
- ]"
84
- >
72
+ <p class="checkbox-block-description mt-2 ml-7">
85
73
  {{ localization.vmWizard.powerVMAfterCreation }}
86
74
  </p>
87
75
  </div>
88
- <div v-if="props.isNewVmFromTemplate" class="checkbox-container">
76
+ <div
77
+ v-if="props.isNewVmFromTemplate && props.project === 'sphere'"
78
+ class="checkbox-container"
79
+ >
89
80
  <ui-input
90
- v-if="props.project === 'sphere'"
91
81
  v-model="maxParallel"
92
82
  :placeholder="localization.vmWizard.maxParallel"
93
83
  test-id="max-parallel"
@@ -180,7 +170,7 @@ const onToggleCustomizeHardware = (): void => {
180
170
  }
181
171
 
182
172
  const onTogglePowerOn = (): void => {
183
- if (props.isNewVmFromTemplate) return
173
+ // if (props.isNewVmFromTemplate) return
184
174
 
185
175
  isPowerOn.value = !isPowerOn.value
186
176
  if (isPowerOn.value) {
@@ -223,7 +213,8 @@ watch(
223
213
 
224
214
  <style scoped lang="scss">
225
215
  .select-options {
226
- grid-template-columns: 1fr 1fr;
216
+ //grid-template-columns: 1fr 1fr;
217
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
227
218
  grid-template-rows: max-content;
228
219
  overflow-y: auto;
229
220
  padding-bottom: 16px;
@@ -9,9 +9,7 @@ import type { UI_I_StatusData } from '~/components/common/vm/actions/common/sele
9
9
  import { datastoreLocalizationByState } from '~/components/common/lib/config/states'
10
10
  import { getStatus } from '~/components/common/vm/actions/common/select/storage/new/lib/utils/utils'
11
11
 
12
- export const tableDataFunc = (
13
- localization: UI_I_Localization
14
- ): UI_I_DataTable => ({
12
+ export const tableDataFunc = (localization: UI_I_Localization): UI_I_DataTable => ({
15
13
  id: 'select-storage',
16
14
  header: [
17
15
  {
@@ -31,7 +29,7 @@ export const tableDataFunc = (
31
29
  text: localization.inventorySummary.state,
32
30
  isSortable: false,
33
31
  sort: 'asc',
34
- sortColumn: true,
32
+ sortColumn: false,
35
33
  width: '160px',
36
34
  show: true,
37
35
  filter: true,
@@ -42,7 +40,7 @@ export const tableDataFunc = (
42
40
  text: localization.common.capacity,
43
41
  isSortable: false,
44
42
  sort: 'asc',
45
- sortColumn: true,
43
+ sortColumn: false,
46
44
  width: '150px',
47
45
  show: true,
48
46
  filter: true,
@@ -53,7 +51,7 @@ export const tableDataFunc = (
53
51
  text: localization.common.provisioned,
54
52
  isSortable: false,
55
53
  sort: 'asc',
56
- sortColumn: true,
54
+ sortColumn: false,
57
55
  width: '150px',
58
56
  show: true,
59
57
  filter: true,
@@ -64,7 +62,7 @@ export const tableDataFunc = (
64
62
  text: localization.common.free,
65
63
  isSortable: false,
66
64
  sort: 'asc',
67
- sortColumn: true,
65
+ sortColumn: false,
68
66
  width: '150px',
69
67
  show: true,
70
68
  filter: true,
@@ -75,7 +73,7 @@ export const tableDataFunc = (
75
73
  text: localization.common.used,
76
74
  isSortable: false,
77
75
  sort: 'asc',
78
- sortColumn: true,
76
+ sortColumn: false,
79
77
  width: '150px',
80
78
  show: true,
81
79
  filter: true,
@@ -86,7 +84,7 @@ export const tableDataFunc = (
86
84
  text: localization.common.type,
87
85
  isSortable: false,
88
86
  sort: 'asc',
89
- sortColumn: true,
87
+ sortColumn: false,
90
88
  width: '120px',
91
89
  show: true,
92
90
  filter: true,
@@ -97,7 +95,7 @@ export const tableDataFunc = (
97
95
  text: localization.common.thinProvisioning,
98
96
  isSortable: false,
99
97
  sort: 'asc',
100
- sortColumn: true,
98
+ sortColumn: false,
101
99
  width: '160px',
102
100
  show: true,
103
101
  filter: true,
@@ -108,7 +106,7 @@ export const tableDataFunc = (
108
106
  text: localization.common.access,
109
107
  isSortable: false,
110
108
  sort: 'asc',
111
- sortColumn: true,
109
+ sortColumn: false,
112
110
  width: '120px',
113
111
  show: true,
114
112
  filter: true,
@@ -119,7 +117,7 @@ export const tableDataFunc = (
119
117
  text: localization.common.hardwareAcceleration,
120
118
  isSortable: false,
121
119
  sort: 'asc',
122
- sortColumn: true,
120
+ sortColumn: false,
123
121
  width: '200px',
124
122
  show: true,
125
123
  filter: true,
@@ -130,7 +128,7 @@ export const tableDataFunc = (
130
128
  text: localization.common.driverType,
131
129
  isSortable: false,
132
130
  sort: 'asc',
133
- sortColumn: true,
131
+ sortColumn: false,
134
132
  width: '150px',
135
133
  show: true,
136
134
  filter: true,
@@ -141,7 +139,7 @@ export const tableDataFunc = (
141
139
  text: localization.common.device,
142
140
  isSortable: false,
143
141
  sort: 'asc',
144
- sortColumn: true,
142
+ sortColumn: false,
145
143
  width: '150px',
146
144
  show: true,
147
145
  filter: true,
@@ -152,7 +150,7 @@ export const tableDataFunc = (
152
150
  text: localization.common.storageIoControl,
153
151
  isSortable: false,
154
152
  sort: 'asc',
155
- sortColumn: true,
153
+ sortColumn: false,
156
154
  width: '180px',
157
155
  show: true,
158
156
  filter: true,
@@ -7,13 +7,13 @@
7
7
  >
8
8
  <tbody>
9
9
  <tr>
10
- <td class="left">{{ localization.common.name }}</td>
10
+ <td class="left" data-id="vm-snapshot-name-label">{{ localization.common.name }}</td>
11
11
  <td class="left snapshot-name-label" data-id="vm-snapshot-name">
12
12
  {{ detailData.name }}
13
13
  </td>
14
14
  </tr>
15
15
  <tr>
16
- <td class="left">{{ localization.common.description }}</td>
16
+ <td class="left" data-id="vm-snapshot-description-label">{{ localization.common.description }}</td>
17
17
  <td
18
18
  class="left snapshot-name-label"
19
19
  data-id="vm-snapshot-description"
@@ -22,17 +22,17 @@
22
22
  </td>
23
23
  </tr>
24
24
  <tr>
25
- <td class="left">{{ localization.snapshots.timestamp }}</td>
25
+ <td class="left" data-id="vm-snapshot-timestamp-label">{{ localization.snapshots.timestamp }}</td>
26
26
  <td class="left snapshot-name-label" data-id="vm-snapshot-timestamp">
27
27
  {{ detailData.timestamp }}
28
28
  </td>
29
29
  </tr>
30
30
  <tr>
31
- <td class="left">{{ localization.common.size }}</td>
31
+ <td class="left" data-id="vm-snapshot-size-label">{{ localization.common.size }}</td>
32
32
  <td class="left snapshot-name-label">{{ detailData.size }}</td>
33
33
  </tr>
34
34
  <tr>
35
- <td class="left">
35
+ <td class="left" data-id="vm-snapshot-of-memory-label">
36
36
  {{ localization.common.snapshotTheVirtualMachinesMemory }}
37
37
  </td>
38
38
  <td class="left snapshot-name-label" data-id="vm-snapshot-of-memory">
@@ -40,7 +40,7 @@
40
40
  </td>
41
41
  </tr>
42
42
  <tr>
43
- <td class="left">
43
+ <td class="left" data-id="vm-snapshot-file-system-label">
44
44
  {{ localization.common.quiesceGuestFileSystem }}
45
45
  </td>
46
46
  <td
@@ -163,7 +163,7 @@ onMounted(() => {
163
163
  align-items: center;
164
164
  column-gap: 16px;
165
165
 
166
- :deep(.tooltip) {
166
+ :deep(.tooltip-container-hover .tooltip) {
167
167
  background-color: var(--select-name-tooltip-bg);
168
168
  backdrop-filter: blur(0.5px);
169
169
  }
@@ -256,4 +256,10 @@ const onCreateDatastore = (): void => emits('submit')
256
256
  padding: 10px 12px;
257
257
  }
258
258
  }
259
+ :deep(.ui-wizard-content-right-container) {
260
+ padding: 0 30px;
261
+ }
262
+ :deep(.ui-wizard-subtitle-container) + *, :deep(.ui-wizard-subtitle-container) {
263
+ padding-left: 2px;
264
+ }
259
265
  </style>
@@ -179,7 +179,7 @@ const onSelectHost = (event: string): void => {
179
179
  display: flex;
180
180
  flex-direction: column;
181
181
  row-gap: 16px;
182
- margin: 16px 0 16px 2px;
182
+ margin: 16px 0;
183
183
 
184
184
  &__alert {
185
185
  align-items: flex-start;
@@ -3,7 +3,7 @@
3
3
  <ui-button
4
4
  variant="text"
5
5
  test-id="advanced-options-button"
6
- class="advanced-options-btn btn btn-link"
6
+ class="advanced-options-btn"
7
7
  @click="isShowAdvancedOptions = !isShowAdvancedOptions"
8
8
  >
9
9
  <template #icon>
@@ -618,9 +618,20 @@ const finalValidationFunc = async (
618
618
  const stepId = wizard.getStepIdByFieldName(fieldName)
619
619
 
620
620
  if (stepId !== -1) {
621
+ let message = ''
622
+
623
+ if (validationFields[fieldName]) {
624
+ message = `${validationFields[
625
+ fieldName
626
+ ][0].toUpperCase()}${validationFields[fieldName].substring(1)}`
627
+
628
+ message =
629
+ message.charAt(message.length - 1) !== '.' ? message + '.' : message
630
+ }
631
+
621
632
  stepHasError = wizard.setValidation(stepId, fieldName, {
622
- fieldMessage: validationFields[fieldName],
623
- alertMessage: validationFields[fieldName],
633
+ fieldMessage: message,
634
+ alertMessage: message,
624
635
  })
625
636
  }
626
637
  }