bfg-common 1.5.161 → 1.5.162

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 (120) hide show
  1. package/CODE_STYLE.md +109 -109
  2. package/components/atoms/TheIcon3.vue +50 -50
  3. package/components/atoms/perPage/PerPage.vue +58 -58
  4. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  5. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  6. package/components/atoms/tabs/VerticalTabs.vue +105 -105
  7. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  8. package/components/common/context/lib/models/interfaces.ts +31 -31
  9. package/components/common/context/recursion/RecursionNew.vue +238 -238
  10. package/components/common/diagramMain/DiagramMain.vue +897 -897
  11. package/components/common/diagramMain/Header.vue +214 -214
  12. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  13. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  14. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/lib/config/utils.ts +1040 -1040
  15. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  16. package/components/common/pages/home/headline/Headline.vue +45 -45
  17. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  18. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  19. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  20. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  21. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  22. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  23. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  24. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  25. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  26. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  27. package/components/common/pages/packages/Packages.vue +208 -208
  28. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  29. package/components/common/readyToComplete/New.vue +66 -66
  30. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  31. package/components/common/recursionTree/RecursionTree.vue +223 -223
  32. package/components/common/select/button/ButtonDropdown.vue +108 -108
  33. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  34. package/components/common/vm/actions/add/Add.vue +785 -785
  35. package/components/common/vm/actions/add/New.vue +556 -556
  36. package/components/common/vm/actions/add/Old.vue +371 -371
  37. package/components/common/vm/actions/add/folderTreeView/FolderTreeView.vue +72 -72
  38. package/components/common/vm/actions/add/folderTreeView/New.vue +40 -40
  39. package/components/common/vm/actions/add/folderTreeView/Old.vue +50 -50
  40. package/components/common/vm/actions/add/lib/config/steps.ts +263 -263
  41. package/components/common/vm/actions/clone/Clone.vue +810 -810
  42. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -291
  43. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +626 -626
  44. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  45. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  46. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  47. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +100 -100
  48. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  49. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  50. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  51. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  52. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  53. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  54. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  55. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  56. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  57. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +375 -375
  58. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/Location.vue +149 -149
  59. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationNew.vue +74 -74
  60. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationOld.vue +83 -83
  61. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +288 -288
  62. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +94 -94
  63. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  64. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  65. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  66. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  67. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  68. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  69. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  70. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  71. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  72. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  73. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  74. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  75. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  76. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  77. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  78. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  79. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  80. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  81. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  82. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  83. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  84. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  85. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  86. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  87. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +39 -39
  88. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  89. package/components/common/vm/actions/common/lib/utils/capabilities.ts +52 -52
  90. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  91. package/components/common/vm/actions/common/select/computeResource/ComputeResource.vue +134 -134
  92. package/components/common/vm/actions/common/select/computeResource/treeView/New.vue +44 -44
  93. package/components/common/vm/actions/common/select/computeResource/treeView/TreeView.vue +118 -118
  94. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -38
  95. package/components/common/vm/actions/common/select/createType/New.vue +84 -84
  96. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  97. package/components/common/vm/actions/common/select/name/Name.vue +167 -167
  98. package/components/common/vm/actions/common/select/os/New.vue +122 -122
  99. package/components/common/vm/actions/common/select/os/Old.vue +152 -152
  100. package/components/common/vm/actions/common/select/os/Os.vue +139 -139
  101. package/components/common/vm/actions/common/select/storage/Storage.vue +129 -129
  102. package/components/common/vm/actions/common/select/storage/new/lib/config/table.ts +326 -326
  103. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  104. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  105. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  106. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  107. package/components/common/wizards/vm/migrate/lib/config/steps.ts +157 -157
  108. package/components/common/wizards/vm/migrate/lib/validations.ts +68 -68
  109. package/components/common/wizards/vm/migrate/select/computeResource/tableView/TableView.vue +137 -137
  110. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  111. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  112. package/composables/productNameLocal.ts +30 -30
  113. package/composables/useAppVersion.ts +21 -21
  114. package/package.json +2 -2
  115. package/plugins/date.ts +233 -233
  116. package/public/spice-console/lib/images/bitmap.js +203 -203
  117. package/public/spice-console/network/spicechannel.js +383 -383
  118. package/store/main/mutations.ts +7 -7
  119. package/store/main/state.ts +7 -7
  120. package/store/tasks/mappers/recentTasks.ts +64 -64
@@ -1,810 +1,810 @@
1
- <template>
2
- <div class="clone-vm">
3
- <atoms-wizard
4
- show
5
- :wizard="wizard"
6
- :selected-scheme="selectedScheme"
7
- :title="title"
8
- :localization="localization"
9
- @change-steps="onChangeSteps"
10
- @hide="onHideModal"
11
- @submit="onFinish"
12
- >
13
- <template #modalBody="{ selectedStep }">
14
- <atoms-loader v-show="!vmSettings" id="loader" />
15
- <div v-if="vmSettings" class="vm-context">
16
- <common-pages-scheduled-tasks-modals-common-new-task-form
17
- v-show="selectedStep.id === dynamicSteps.scheduledTasks"
18
- v-model="newTaskForm"
19
- :target="selectedVirtualMachine"
20
- class="new-task-form"
21
- />
22
- <common-vm-actions-common-select-name
23
- v-show="
24
- selectedStep.id === dynamicSteps.selectName ||
25
- selectedStep.id === dynamicSteps.selectNameFolder
26
- "
27
- :show="
28
- selectedStep.id === dynamicSteps.selectName ||
29
- selectedStep.id === dynamicSteps.selectNameFolder
30
- "
31
- :name-form-submit="nameFormSubmit"
32
- :project="props.project"
33
- :data-center="props.dataCenter"
34
- @submit="onChangeName(...$event)"
35
- @check-name="emits('check-name', $event)"
36
- />
37
- <common-vm-actions-common-select-compute-resource
38
- v-if="isSphere"
39
- v-show="selectedStep.id === dynamicSteps.selectComputeResource"
40
- v-model="computeResource"
41
- :compute-resource-submit="computeResourceSubmit"
42
- :data-center="vmForm.dataCenter"
43
- :compute-resource="props.computeResource"
44
- :compute-resource-tree="props.computeResourceTree"
45
- @submit="onChangeComputeResource"
46
- @select-compute-resource-tree="onSelectComputeResourceTree"
47
- @get-compute-resource-tree="
48
- emits('get-compute-resource-tree', $event)
49
- "
50
- @show-compute-resource-tree="
51
- emits('show-compute-resource-tree', $event)
52
- "
53
- @clear-compute-resource-tree="emits('clear-compute-resource-tree')"
54
- />
55
- <common-vm-actions-common-select-storage
56
- v-show="selectedStep.id === dynamicSteps.selectStorage"
57
- :storage-submit="storageSubmit"
58
- :datastore="props.datastore"
59
- :storage="vmForm.storage"
60
- :get-datastore-table-func="props.getDatastoreTableFunc"
61
- @submit="onChangeStorage"
62
- />
63
- <common-vm-actions-common-select-options
64
- v-show="selectedStep.id === dynamicSteps.selectOptions"
65
- @change="onChangeSelectOptions"
66
- />
67
- <common-vm-actions-common-select-os
68
- v-show="selectedStep.id === dynamicSteps.selectGuestOSMachineType"
69
- v-model:machine-type="vmForm.guestMachineType"
70
- v-model:guest-os-family="vmForm.guestOsFamily"
71
- v-model:guest-os-version="vmForm.guestOsVersion"
72
- :families-options="guestOsFamilies"
73
- :versions-options="guestOsVersions"
74
- :machine-types-options="machineTypes"
75
- :error-validation-fields="props.errorValidationFields"
76
- @remove-error-by-title="emits('remove-error-by-title', $event)"
77
- />
78
- <common-vm-actions-common-customize-hardware
79
- v-show="selectedStep.id === dynamicSteps.customizeHardware"
80
- v-model:vm-name="vmName"
81
- v-model:guest-machine-type="vmSettings.guestMachineType"
82
- v-model:guest-os-family="vmSettings.guestOsFamily"
83
- v-model:guest-os-version="vmSettings.guestOsVersion"
84
- :storage="vmForm.storage"
85
- :hard-disks-for-boot-options="virtualHardwareHardDisksLocal"
86
- :cd-dvd-drives-for-boot-options="virtualHardwareCdDvdDrivesLocal"
87
- :networks-for-boot-options="virtualHardwareNetworksLocal"
88
- :cd-dvd-drives="vmSettings.cdDvdDrives"
89
- :hard-disks="vmSettings.hardDisks"
90
- :networks="vmSettings.networks"
91
- :customize-hardware-submit="customizeHardwareSubmit"
92
- :max-cpus="vmSettings.maxCpus"
93
- :max-memory="vmSettings.maxMemory"
94
- :cpu-models="vmSettings.cpuModels"
95
- :cpu="vmSettings.cpu"
96
- :memory="vmSettings.memory"
97
- :video-card="vmSettings.videoCard"
98
- :usb-controller="vmSettings.usbController"
99
- :pci-devices="vmSettings.pciDevices"
100
- :selected-nav-item="selectedNavItem"
101
- :hard-disks-for-edit="vmSettings.hardDisks"
102
- :options="vmSettings.options"
103
- :nodes="props.nodes"
104
- :files="props.files"
105
- :networks-table="props.networksTable"
106
- :error-validation-fields="props.errorValidationFields"
107
- :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
108
- :passthrough-devices="props.passthroughDevices"
109
- :mediated-devices="props.mediatedDevices"
110
- :get-datastore-table-func="props.getDatastoreTableFunc"
111
- :datastore="props.datastore"
112
- :project="props.project"
113
- is-clone
114
- @change-boot-order="onChangeBootOrder"
115
- @send-data="onChangeCustomizeHardware"
116
- @get-storage="emits('get-storage', $event)"
117
- @get-folders-or-files="emits('get-folders-or-files', $event)"
118
- @get-active-device-child="emits('get-active-device-child', $event)"
119
- @show-datastore-child="emits('show-datastore-child', $event)"
120
- @get-networks-table="emits('get-networks-table', $event)"
121
- @get-pci-devices="emits('get-pci-devices')"
122
- />
123
- <common-ready-to-complete
124
- v-show="selectedStep.id === dynamicSteps.readyComplete"
125
- :data="props.readyCompleteTableInfo"
126
- />
127
- </div>
128
- </template>
129
- </atoms-wizard>
130
- </div>
131
- </template>
132
-
133
- <script setup lang="ts">
134
- import type {
135
- UI_I_DatastoreTableItem,
136
- UI_I_FolderOrFileTreePayload,
137
- } from '~/lib/models/store/storage/interfaces'
138
- import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
139
- import type { API_UI_I_Error } from '~/lib/models/store/interfaces'
140
- import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
141
- import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
142
- import type {
143
- UI_I_ArbitraryObject,
144
- UI_I_Localization,
145
- } from '~/lib/models/interfaces'
146
- import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
147
- import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
148
- import type {
149
- UI_I_SendDataCpu,
150
- UI_I_SendDataMemory,
151
- UI_I_SendDataNewCdDvdDrive,
152
- UI_I_SendDataNewHardDisk,
153
- UI_I_SendDataNewNetwork,
154
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
155
- import type { UI_T_SelectedNavItem } from '~/components/common/vm/actions/common/lib/models/types'
156
- import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
157
- import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
158
- import type { UI_T_Project } from '~/lib/models/types'
159
- import type {
160
- UI_I_MediatedDevice,
161
- UI_I_PciDevice,
162
- UI_I_VmSettings,
163
- } from '~/lib/models/store/vm/interfaces'
164
- import type { UI_I_VmForm } from '~/components/common/vm/actions/common/lib/models/interfaces'
165
- import type {
166
- UI_I_ValidationReturn,
167
- UI_I_WizardStep,
168
- } from '~/components/atoms/wizard/lib/models/interfaces'
169
- import type { UI_I_Capabilities } from '~/components/common/vm/actions/common/lib/models/interfaces'
170
- import type { UI_I_ScheduleNewTasksForm } from '~/components/common/pages/scheduledTasks/modals/lib/models/interfaces'
171
- import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
172
- import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
173
- import {
174
- stepsSchemeInitial,
175
- stepsFunc,
176
- dynamicSteps,
177
- } from '~/components/common/vm/actions/clone/lib/config/steps'
178
- import Wizard from '~/components/atoms/wizard/lib/utils/utils'
179
- import { mapCapabilities } from '~/components/common/vm/actions/common/lib/utils/capabilities'
180
- import { scheduledTaskDefaultFormFunc } from '~/components/common/pages/scheduledTasks/modals/lib/config/createScheduledTask'
181
- import { capabilities } from '~/components/common/vm/actions/common/lib/config/capabilities'
182
-
183
- const props = defineProps<{
184
- project: UI_T_Project
185
- vmSettings: UI_I_VmSettings | null
186
- nodes: UI_I_FileTreeNode[]
187
- files: UI_I_FileTreeNode[]
188
- networksTable: UI_I_NetworkTableItem[]
189
- datastore: UI_I_DatastoreTableItem[]
190
- errorValidationFields: UI_I_ErrorValidationField[]
191
- readyCompleteTableInfo: UI_I_TableInfoItem[]
192
- vmCpuHelpTextSecond: string
193
- finishFunc: any
194
- getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
195
- validateSendDataFunc: any
196
- passthroughDevices: UI_I_PciDevice[]
197
- mediatedDevices: UI_I_MediatedDevice[]
198
- vmNameInWizard: string
199
- capabilities?: UI_I_Capabilities
200
- schedulerTask?: any // TODO надо interface переместить глобално
201
- selectedVirtualMachine?: UI_I_Capabilities
202
- dataCenter?: UI_I_TreeNode // для сферы
203
- computeResource?: UI_I_TreeNode // для сферы
204
- computeResourceTree?: UI_I_TreeNode[] // для сферы
205
- }>()
206
-
207
- const emits = defineEmits<{
208
- (event: 'check-name', value: [string, (error: API_UI_I_Error) => void]): void
209
- (event: 'get-storage', value: UI_I_TablePayload): void
210
- (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
211
- (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
212
- (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
213
- (event: 'remove-error-by-title', value: string): void
214
- (event: 'get-networks-table', value: UI_I_TablePayload): void
215
- (event: 'get-pci-devices'): void
216
- (event: 'hide'): void
217
- (
218
- event: 'get-compute-resource-tree',
219
- value: { id: string | number; cb: () => void }
220
- ): void // для сферы
221
- (event: 'show-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
222
- (event: 'select-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
223
- (event: 'clear-compute-resource-tree'): void // для сферы
224
- }>()
225
-
226
- const { $recursion } = useNuxtApp()
227
-
228
- const localization = computed<UI_I_Localization>(() => useLocal())
229
-
230
- const isSphere = computed<boolean>(() => props.project === 'sphere')
231
-
232
- const isScheduledTasks = computed<boolean>(
233
- () => props.schedulerTask.isSchedulerTask
234
- )
235
-
236
- const title = computed<string>(() => {
237
- const { scheduleNewTasks, scheduleTaskEdit, cloneExistingVirtualMachine } =
238
- localization.value.common
239
-
240
- let result = cloneExistingVirtualMachine
241
- if (isScheduledTasks.value) {
242
- const schedulerMode = props.schedulerTask.editTask
243
- ? scheduleTaskEdit
244
- : scheduleNewTasks
245
-
246
- result = `${schedulerMode} (${cloneExistingVirtualMachine})`
247
- }
248
-
249
- return result
250
- })
251
-
252
- watch(
253
- () => props.capabilities,
254
- () => {
255
- if (props.capabilities) {
256
- mapCapabilities(props.capabilities)
257
- }
258
- },
259
- { deep: true, immediate: true }
260
- )
261
-
262
- const wizard: Wizard = new Wizard(
263
- stepsFunc(localization.value),
264
- stepsSchemeInitial
265
- )
266
- watch(
267
- isScheduledTasks,
268
- (newValue) => {
269
- if (newValue) {
270
- wizard.changeScheme(isSphere.value ? 12 : 4)
271
- } else {
272
- wizard.changeScheme(isSphere.value ? 8 : 0)
273
- wizard.selectStepHard(isSphere.value ? 2 : 1)
274
- }
275
- },
276
- { immediate: true }
277
- )
278
-
279
- // TODO move to common
280
- const newTaskForm = ref<UI_I_ScheduleNewTasksForm>(
281
- useDeepCopy(scheduledTaskDefaultFormFunc())
282
- )
283
- watch(
284
- newTaskForm,
285
- (newValue: UI_I_ScheduleNewTasksForm) => {
286
- if (isScheduledTasks.value) wizard.setDisabledNextButton(newValue.isValid)
287
- },
288
- { immediate: true, deep: true }
289
- )
290
-
291
- const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
292
-
293
- const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
294
- wizard.changeSteps(value, validationFunc, validateSendData)
295
- }
296
-
297
- const validationFunc = async (
298
- value: UI_I_WizardStep[],
299
- currentStep: UI_I_WizardStep,
300
- nextStep: UI_I_WizardStep
301
- ): Promise<UI_I_ValidationReturn> => {
302
- let stepHasError = false
303
- let stepShouldStop = {
304
- ifOnCurrentStep: false,
305
- ifFromAnyStep: false,
306
- stoppageStepId: -1,
307
- }
308
-
309
- wizard.setLoader(true)
310
- if (
311
- wizard.isValidateForStep(
312
- isSphere.value ? dynamicSteps.selectNameFolder : dynamicSteps.selectName,
313
- currentStep.id,
314
- nextStep.id
315
- )
316
- ) {
317
- const nameValidation = await checkName(value)
318
-
319
- value = nameValidation.newValue
320
- stepHasError = stepHasError || nameValidation.stepHasError
321
- } else if (
322
- isSphere.value &&
323
- wizard.isValidateForStep(
324
- dynamicSteps.selectComputeResource,
325
- currentStep.id,
326
- nextStep.id
327
- )
328
- ) {
329
- const computeResourceValidation = await checkComputeResource(value)
330
-
331
- value = computeResourceValidation.newValue
332
- stepHasError = stepHasError || computeResourceValidation.stepHasError
333
- } else if (
334
- wizard.isValidateForStep(
335
- dynamicSteps.selectStorage,
336
- currentStep.id,
337
- nextStep.id
338
- )
339
- ) {
340
- const storageValidation = await checkStorage(value)
341
-
342
- value = storageValidation.newValue
343
-
344
- stepHasError = stepHasError || storageValidation.stepHasError
345
- } else if (
346
- wizard.isValidateForStep(
347
- dynamicSteps.customizeHardware,
348
- currentStep.id,
349
- nextStep.id
350
- )
351
- ) {
352
- const customizeHardwareValidation = await checkCustomizeHardware(value)
353
-
354
- value = customizeHardwareValidation.newValue
355
-
356
- stepHasError = stepHasError || customizeHardwareValidation.stepHasError
357
- }
358
- wizard.setLoader(false)
359
-
360
- return {
361
- newValue: value,
362
- stepHasError,
363
- stepShouldStop,
364
- }
365
- }
366
- const checkName = async (
367
- value: UI_I_WizardStep[]
368
- ): Promise<UI_I_ValidationReturn> => {
369
- let stepHasError = false
370
-
371
- return new Promise((resolve) => {
372
- const step = isSphere.value
373
- ? dynamicSteps.selectNameFolder
374
- : dynamicSteps.selectName
375
- nameFormSubmit.value = (isValid: boolean) => {
376
- if (!isValid) {
377
- stepHasError = wizard.setValidation(step, 'name', {
378
- fieldMessage: 'aaa',
379
- alertMessage: 'aaa',
380
- })
381
- } else if (wizard.hasMessage(step, 'name')) {
382
- value = wizard.removeValidation(step, 'name', value)
383
- }
384
-
385
- resolve({
386
- stepHasError,
387
- newValue: value,
388
- })
389
- nameFormSubmit.value = null
390
- }
391
- })
392
- }
393
- const checkComputeResource = async (
394
- value: UI_I_WizardStep[]
395
- ): Promise<UI_I_ValidationReturn> => {
396
- let stepHasError = false
397
-
398
- return new Promise((resolve) => {
399
- computeResourceSubmit.value = (isValid: boolean) => {
400
- if (!isValid) {
401
- stepHasError = wizard.setValidation(
402
- dynamicSteps.selectComputeResource,
403
- 'computeResource',
404
- {
405
- fieldMessage: 'aaa',
406
- alertMessage: 'aaa',
407
- }
408
- )
409
- } else if (
410
- wizard.hasMessage(dynamicSteps.selectComputeResource, 'computeResource')
411
- ) {
412
- value = wizard.removeValidation(
413
- dynamicSteps.selectComputeResource,
414
- 'computeResource',
415
- value
416
- )
417
- }
418
-
419
- resolve({
420
- stepHasError,
421
- newValue: value,
422
- })
423
- computeResourceSubmit.value = null
424
- }
425
- })
426
- }
427
- const checkStorage = async (
428
- value: UI_I_WizardStep[]
429
- ): Promise<UI_I_ValidationReturn> => {
430
- let stepHasError = false
431
-
432
- return new Promise((resolve) => {
433
- storageSubmit.value = (isValid: boolean) => {
434
- if (!isValid) {
435
- stepHasError = wizard.setValidation(
436
- dynamicSteps.selectStorage,
437
- 'storage',
438
- {
439
- fieldMessage: 'aaa',
440
- alertMessage: 'aaa',
441
- }
442
- )
443
- } else if (wizard.hasMessage(dynamicSteps.selectStorage, 'storage')) {
444
- value = wizard.removeValidation(
445
- dynamicSteps.selectStorage,
446
- 'storage',
447
- value
448
- )
449
- }
450
-
451
- resolve({
452
- stepHasError,
453
- newValue: value,
454
- })
455
- storageSubmit.value = null
456
- }
457
- })
458
- }
459
- const checkCustomizeHardware = async (
460
- value: UI_I_WizardStep[]
461
- ): Promise<UI_I_ValidationReturn> => {
462
- let stepHasError = false
463
-
464
- return new Promise((resolve) => {
465
- customizeHardwareSubmit.value = (isValid: boolean) => {
466
- if (!isValid) {
467
- stepHasError = wizard.setValidation(
468
- dynamicSteps.customizeHardware,
469
- 'customizeHardware',
470
- {
471
- fieldMessage: 'aaa',
472
- alertMessage: 'aaa',
473
- }
474
- )
475
- } else if (
476
- wizard.hasMessage(dynamicSteps.customizeHardware, 'customizeHardware')
477
- ) {
478
- value = wizard.removeValidation(
479
- dynamicSteps.customizeHardware,
480
- 'customizeHardware',
481
- value
482
- )
483
- }
484
-
485
- resolve({
486
- stepHasError,
487
- newValue: value,
488
- })
489
- storageSubmit.value = null
490
- }
491
- })
492
- }
493
-
494
- const vmForm = ref<UI_I_VmForm>({
495
- name: '',
496
- compatibility: '',
497
- guestMachineType: null,
498
- guestOsFamily: null,
499
- guestOsVersion: null,
500
- computeResource: null,
501
- storage: null,
502
- locationPath: '',
503
- dataCenter: null,
504
- options: [],
505
- })
506
- const onChangeName = (name: string, node: UI_I_TreeNode): void => {
507
- vmForm.value.name = name
508
- if (isSphere.value) {
509
- vmForm.value.locationPath = node.id
510
- vmForm.value.dataCenter = $recursion.findParentByValue(
511
- node,
512
- 'datacenter',
513
- 'type',
514
- 'parent'
515
- )
516
- }
517
- }
518
- const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
519
- if (!storage) return
520
-
521
- vmForm.value.storage = storage
522
- }
523
- const onChangeSelectOptions = (options: string[]): void => {
524
- vmForm.value.options = options
525
- if (
526
- options.includes('customize-os') &&
527
- options.includes('customize-hardware')
528
- ) {
529
- let procuratorSchame = isScheduledTasks.value ? 7 : 3
530
- let sphereSchame = isScheduledTasks.value ? 15 : 11
531
- wizard.changeScheme(isSphere.value ? sphereSchame : procuratorSchame)
532
- } else if (options.includes('customize-os')) {
533
- let procuratorSchame = isScheduledTasks.value ? 5 : 1
534
- let sphereSchame = isScheduledTasks.value ? 13 : 9
535
- wizard.changeScheme(isSphere.value ? sphereSchame : procuratorSchame)
536
- } else if (options.includes('customize-hardware')) {
537
- let procuratorSchame = isScheduledTasks.value ? 6 : 2
538
- let sphereSchame = isScheduledTasks.value ? 14 : 10
539
- wizard.changeScheme(isSphere.value ? sphereSchame : procuratorSchame)
540
- } else {
541
- let procuratorSchame = isScheduledTasks.value ? 4 : 0
542
- let sphereSchame = isScheduledTasks.value ? 12 : 8
543
- wizard.changeScheme(isSphere.value ? sphereSchame : procuratorSchame)
544
- }
545
-
546
- // Change power on by default
547
- isPowerOnByDefault.value = options.includes('power-on')
548
- }
549
- const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
550
- const onChangeCustomizeHardware = (
551
- data: UI_I_SendDataCustomizeHardware
552
- ): void => {
553
- customizeHardware.value = data
554
- }
555
-
556
- const virtualHardwareHardDisksLocal = computed<
557
- UI_I_SendDataNewHardDisk[] | null
558
- >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
559
- const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
560
- () => customizeHardware.value?.virtualHardware?.networks || null
561
- )
562
- const virtualHardwareCdDvdDrivesLocal = computed<
563
- UI_I_SendDataNewCdDvdDrive[] | null
564
- >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
565
-
566
- const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
567
- () => customizeHardware.value?.virtualHardware?.cpu || null
568
- )
569
- const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
570
- () => customizeHardware.value?.virtualHardware?.memory || null
571
- )
572
- const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
573
- const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
574
- null
575
- )
576
- const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
577
- const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
578
- virtualHardwareHardDisks.value = data[0]
579
- virtualHardwareCdDvdDrives.value = data[1]
580
- virtualHardwareNetworks.value = data[2]
581
- }
582
-
583
- const isPowerOnByDefault = ref<boolean>(false)
584
-
585
- watch(
586
- () => props.vmNameInWizard,
587
- (newValue) => {
588
- vmForm.value.name = newValue
589
- }
590
- )
591
-
592
- const validateSendData = async (
593
- value: UI_I_WizardStep[]
594
- ): Promise<UI_I_ValidationReturn> => {
595
- wizard.setLoader(true)
596
- let stepHasError = false
597
-
598
- const data = await props.validateSendDataFunc(
599
- vmForm.value,
600
- virtualHardwareCpu.value,
601
- virtualHardwareMemory.value,
602
- customizeHardware.value,
603
- virtualHardwareNetworks.value,
604
- virtualHardwareHardDisks.value,
605
- virtualHardwareCdDvdDrives.value,
606
- isPowerOnByDefault.value,
607
- localization.value,
608
- vmForm.value.locationPath, // для сферы
609
- // computeResourcePath.value // для сферы
610
- vmSettings.value.host_id // для сферы // TODO rollback
611
- )
612
-
613
- wizard.setLoader(false)
614
- if (data) {
615
- stepHasError = true
616
- selectedNavItem.value = data[0]
617
- }
618
-
619
- return {
620
- stepHasError,
621
- newValue: value,
622
- }
623
- }
624
- const onFinish = (): void => {
625
- wizard.setLoader(false)
626
- props
627
- .finishFunc(
628
- vmForm.value,
629
- virtualHardwareCpu.value,
630
- virtualHardwareMemory.value,
631
- customizeHardware.value,
632
- virtualHardwareNetworks.value,
633
- virtualHardwareHardDisks.value,
634
- virtualHardwareCdDvdDrives.value,
635
- isPowerOnByDefault.value,
636
- localization.value,
637
- vmForm.value.locationPath, // для сферы
638
- // computeResourcePath.value, // для сферы
639
- vmSettings.value.host_id, // для сферы // TODO rollback
640
- false,
641
- newTaskForm.value,
642
- props.schedulerTask
643
- )
644
- .then(() => {
645
- onHideModal()
646
- wizard.setLoader(false)
647
- })
648
- }
649
-
650
- const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
651
-
652
- const nameFormSubmit = ref<null | Function>(null)
653
- const computeResourceSubmit = ref<null | Function>(null)
654
- const storageSubmit = ref<null | Function>(null)
655
- const customizeHardwareSubmit = ref<null | Function>(null)
656
-
657
- const vmSettings = computed<UI_I_VmSettings | null>(() => props.vmSettings)
658
- const vmName = ref<string>(vmSettings.value?.name || '')
659
-
660
- const guestOsFamilies = ref<UI_I_OptionItem[]>(
661
- capabilities.value.guestOsFamilies
662
- )
663
- const guestOsVersions = ref<UI_I_ArbitraryObject<UI_I_OptionItem[]>>(
664
- capabilities.value.guestOsVersions
665
- )
666
- const machineTypes = ref<UI_I_OptionItem[]>(capabilities.value.machineTypes)
667
-
668
- const computeResource = ref<UI_I_TreeNode | null>(null)
669
- const onChangeComputeResource = (node: UI_I_TreeNode): void => {
670
- computeResource.value = node
671
- }
672
- // // Для сферы
673
- const computeResourcePath = ref<string>('')
674
- const onSelectComputeResourceTree = (node: UI_I_TreeNode): void => {
675
- emits('select-compute-resource-tree', node)
676
- computeResourcePath.value = node.id
677
- }
678
-
679
- watch(vmSettings, (newValue) => {
680
- vmName.value = newValue?.name || ''
681
-
682
- if (newValue?.guestOsFamily)
683
- vmForm.value.guestOsFamily = newValue.guestOsFamily
684
- if (newValue?.guestMachineType)
685
- vmForm.value.guestMachineType = newValue.guestMachineType
686
- if (newValue?.guestOsVersion)
687
- vmForm.value.guestOsVersion = newValue.guestOsVersion
688
-
689
- if (newValue?.compatibility)
690
- vmForm.value.compatibility = newValue.compatibility
691
-
692
- if (newValue?.storage) {
693
- const datastore = props.datastore.find(
694
- (item) => item.id === newValue.storage.id
695
- )
696
- if (datastore) vmForm.value.storage = datastore
697
- }
698
- })
699
-
700
- const onHideModal = (): void => {
701
- emits('hide')
702
- }
703
- </script>
704
-
705
- <style scoped lang="scss">
706
- :deep(.has-solid.close-icon.clr-icon) {
707
- width: 20px;
708
- top: 0;
709
- }
710
- .vm-context {
711
- padding: 16px 15px 10px 10px;
712
- height: 100%;
713
- display: flex;
714
- flex-direction: column;
715
-
716
- .context-title-wrap {
717
- padding-bottom: 3px;
718
- border-bottom: 1px solid #a6a6a6;
719
-
720
- h4 {
721
- font-weight: 700;
722
- font-size: 13px;
723
- color: var(--vm-context-title);
724
- }
725
- p {
726
- font-weight: 400;
727
- font-size: 13px;
728
- color: var(--vm-context-sub-title);
729
- }
730
- }
731
-
732
- .finish-block {
733
- padding: 18px 24px 24px 24px;
734
-
735
- .add-hosts-ready-to-complete-mt-12 {
736
- margin-top: 12px;
737
-
738
- .add-hosts-ready-to-complete-bold {
739
- line-height: 18px;
740
- font-weight: 700;
741
- }
742
- }
743
- }
744
-
745
- .vm-hardware-version {
746
- align-self: flex-end;
747
- margin-top: auto;
748
- }
749
- }
750
-
751
- :deep(.modal .modal-dialog .modal-content .modal-footer) {
752
- flex: unset;
753
- height: unset;
754
- min-height: unset;
755
- }
756
- :deep(.wizard-modal-titlebar h3) {
757
- color: #000;
758
- font-size: 24px;
759
- font-weight: 200;
760
- line-height: 27px;
761
- margin: 0;
762
- padding: 0;
763
- }
764
- :deep(.clr-wizard-stepnav-item) {
765
- padding-left: 0;
766
- }
767
- :deep(.clr-wizard-stepnav
768
- .clr-wizard-stepnav-item
769
- button
770
- .clr-wizard-stepnav-link-title) {
771
- width: 189px;
772
- font-weight: 700;
773
- font-size: 13px;
774
- }
775
-
776
- #vm-wizard-notification {
777
- h3 {
778
- color: var(--global-font-color7);
779
- margin-top: 6px;
780
- }
781
- p {
782
- color: var(--global-font-color6);
783
- line-height: 16px;
784
- }
785
- }
786
-
787
- .power-on-by-default-wrap {
788
- display: flex;
789
- align-items: center;
790
-
791
- input {
792
- margin-right: 6px;
793
- }
794
- }
795
-
796
- .new-task-form {
797
- padding: 0 25px 0 5px;
798
- }
799
- </style>
800
-
801
- <style>
802
- :root {
803
- --vm-context-title: #333;
804
- --vm-context-sub-title: #000;
805
- }
806
- :root.dark-theme {
807
- --vm-context-title: #adbbc4;
808
- --vm-context-sub-title: #adbbc4;
809
- }
810
- </style>
1
+ <template>
2
+ <div class="clone-vm">
3
+ <atoms-wizard
4
+ show
5
+ :wizard="wizard"
6
+ :selected-scheme="selectedScheme"
7
+ :title="title"
8
+ :localization="localization"
9
+ @change-steps="onChangeSteps"
10
+ @hide="onHideModal"
11
+ @submit="onFinish"
12
+ >
13
+ <template #modalBody="{ selectedStep }">
14
+ <atoms-loader v-show="!vmSettings" id="loader" />
15
+ <div v-if="vmSettings" class="vm-context">
16
+ <common-pages-scheduled-tasks-modals-common-new-task-form
17
+ v-show="selectedStep.id === dynamicSteps.scheduledTasks"
18
+ v-model="newTaskForm"
19
+ :target="selectedVirtualMachine"
20
+ class="new-task-form"
21
+ />
22
+ <common-vm-actions-common-select-name
23
+ v-show="
24
+ selectedStep.id === dynamicSteps.selectName ||
25
+ selectedStep.id === dynamicSteps.selectNameFolder
26
+ "
27
+ :show="
28
+ selectedStep.id === dynamicSteps.selectName ||
29
+ selectedStep.id === dynamicSteps.selectNameFolder
30
+ "
31
+ :name-form-submit="nameFormSubmit"
32
+ :project="props.project"
33
+ :data-center="props.dataCenter"
34
+ @submit="onChangeName(...$event)"
35
+ @check-name="emits('check-name', $event)"
36
+ />
37
+ <common-vm-actions-common-select-compute-resource
38
+ v-if="isSphere"
39
+ v-show="selectedStep.id === dynamicSteps.selectComputeResource"
40
+ v-model="computeResource"
41
+ :compute-resource-submit="computeResourceSubmit"
42
+ :data-center="vmForm.dataCenter"
43
+ :compute-resource="props.computeResource"
44
+ :compute-resource-tree="props.computeResourceTree"
45
+ @submit="onChangeComputeResource"
46
+ @select-compute-resource-tree="onSelectComputeResourceTree"
47
+ @get-compute-resource-tree="
48
+ emits('get-compute-resource-tree', $event)
49
+ "
50
+ @show-compute-resource-tree="
51
+ emits('show-compute-resource-tree', $event)
52
+ "
53
+ @clear-compute-resource-tree="emits('clear-compute-resource-tree')"
54
+ />
55
+ <common-vm-actions-common-select-storage
56
+ v-show="selectedStep.id === dynamicSteps.selectStorage"
57
+ :storage-submit="storageSubmit"
58
+ :datastore="props.datastore"
59
+ :storage="vmForm.storage"
60
+ :get-datastore-table-func="props.getDatastoreTableFunc"
61
+ @submit="onChangeStorage"
62
+ />
63
+ <common-vm-actions-common-select-options
64
+ v-show="selectedStep.id === dynamicSteps.selectOptions"
65
+ @change="onChangeSelectOptions"
66
+ />
67
+ <common-vm-actions-common-select-os
68
+ v-show="selectedStep.id === dynamicSteps.selectGuestOSMachineType"
69
+ v-model:machine-type="vmForm.guestMachineType"
70
+ v-model:guest-os-family="vmForm.guestOsFamily"
71
+ v-model:guest-os-version="vmForm.guestOsVersion"
72
+ :families-options="guestOsFamilies"
73
+ :versions-options="guestOsVersions"
74
+ :machine-types-options="machineTypes"
75
+ :error-validation-fields="props.errorValidationFields"
76
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
77
+ />
78
+ <common-vm-actions-common-customize-hardware
79
+ v-show="selectedStep.id === dynamicSteps.customizeHardware"
80
+ v-model:vm-name="vmName"
81
+ v-model:guest-machine-type="vmSettings.guestMachineType"
82
+ v-model:guest-os-family="vmSettings.guestOsFamily"
83
+ v-model:guest-os-version="vmSettings.guestOsVersion"
84
+ :storage="vmForm.storage"
85
+ :hard-disks-for-boot-options="virtualHardwareHardDisksLocal"
86
+ :cd-dvd-drives-for-boot-options="virtualHardwareCdDvdDrivesLocal"
87
+ :networks-for-boot-options="virtualHardwareNetworksLocal"
88
+ :cd-dvd-drives="vmSettings.cdDvdDrives"
89
+ :hard-disks="vmSettings.hardDisks"
90
+ :networks="vmSettings.networks"
91
+ :customize-hardware-submit="customizeHardwareSubmit"
92
+ :max-cpus="vmSettings.maxCpus"
93
+ :max-memory="vmSettings.maxMemory"
94
+ :cpu-models="vmSettings.cpuModels"
95
+ :cpu="vmSettings.cpu"
96
+ :memory="vmSettings.memory"
97
+ :video-card="vmSettings.videoCard"
98
+ :usb-controller="vmSettings.usbController"
99
+ :pci-devices="vmSettings.pciDevices"
100
+ :selected-nav-item="selectedNavItem"
101
+ :hard-disks-for-edit="vmSettings.hardDisks"
102
+ :options="vmSettings.options"
103
+ :nodes="props.nodes"
104
+ :files="props.files"
105
+ :networks-table="props.networksTable"
106
+ :error-validation-fields="props.errorValidationFields"
107
+ :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
108
+ :passthrough-devices="props.passthroughDevices"
109
+ :mediated-devices="props.mediatedDevices"
110
+ :get-datastore-table-func="props.getDatastoreTableFunc"
111
+ :datastore="props.datastore"
112
+ :project="props.project"
113
+ is-clone
114
+ @change-boot-order="onChangeBootOrder"
115
+ @send-data="onChangeCustomizeHardware"
116
+ @get-storage="emits('get-storage', $event)"
117
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
118
+ @get-active-device-child="emits('get-active-device-child', $event)"
119
+ @show-datastore-child="emits('show-datastore-child', $event)"
120
+ @get-networks-table="emits('get-networks-table', $event)"
121
+ @get-pci-devices="emits('get-pci-devices')"
122
+ />
123
+ <common-ready-to-complete
124
+ v-show="selectedStep.id === dynamicSteps.readyComplete"
125
+ :data="props.readyCompleteTableInfo"
126
+ />
127
+ </div>
128
+ </template>
129
+ </atoms-wizard>
130
+ </div>
131
+ </template>
132
+
133
+ <script setup lang="ts">
134
+ import type {
135
+ UI_I_DatastoreTableItem,
136
+ UI_I_FolderOrFileTreePayload,
137
+ } from '~/lib/models/store/storage/interfaces'
138
+ import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
139
+ import type { API_UI_I_Error } from '~/lib/models/store/interfaces'
140
+ import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
141
+ import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
142
+ import type {
143
+ UI_I_ArbitraryObject,
144
+ UI_I_Localization,
145
+ } from '~/lib/models/interfaces'
146
+ import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
147
+ import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
148
+ import type {
149
+ UI_I_SendDataCpu,
150
+ UI_I_SendDataMemory,
151
+ UI_I_SendDataNewCdDvdDrive,
152
+ UI_I_SendDataNewHardDisk,
153
+ UI_I_SendDataNewNetwork,
154
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
155
+ import type { UI_T_SelectedNavItem } from '~/components/common/vm/actions/common/lib/models/types'
156
+ import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
157
+ import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
158
+ import type { UI_T_Project } from '~/lib/models/types'
159
+ import type {
160
+ UI_I_MediatedDevice,
161
+ UI_I_PciDevice,
162
+ UI_I_VmSettings,
163
+ } from '~/lib/models/store/vm/interfaces'
164
+ import type { UI_I_VmForm } from '~/components/common/vm/actions/common/lib/models/interfaces'
165
+ import type {
166
+ UI_I_ValidationReturn,
167
+ UI_I_WizardStep,
168
+ } from '~/components/atoms/wizard/lib/models/interfaces'
169
+ import type { UI_I_Capabilities } from '~/components/common/vm/actions/common/lib/models/interfaces'
170
+ import type { UI_I_ScheduleNewTasksForm } from '~/components/common/pages/scheduledTasks/modals/lib/models/interfaces'
171
+ import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
172
+ import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
173
+ import {
174
+ stepsSchemeInitial,
175
+ stepsFunc,
176
+ dynamicSteps,
177
+ } from '~/components/common/vm/actions/clone/lib/config/steps'
178
+ import Wizard from '~/components/atoms/wizard/lib/utils/utils'
179
+ import { mapCapabilities } from '~/components/common/vm/actions/common/lib/utils/capabilities'
180
+ import { scheduledTaskDefaultFormFunc } from '~/components/common/pages/scheduledTasks/modals/lib/config/createScheduledTask'
181
+ import { capabilities } from '~/components/common/vm/actions/common/lib/config/capabilities'
182
+
183
+ const props = defineProps<{
184
+ project: UI_T_Project
185
+ vmSettings: UI_I_VmSettings | null
186
+ nodes: UI_I_FileTreeNode[]
187
+ files: UI_I_FileTreeNode[]
188
+ networksTable: UI_I_NetworkTableItem[]
189
+ datastore: UI_I_DatastoreTableItem[]
190
+ errorValidationFields: UI_I_ErrorValidationField[]
191
+ readyCompleteTableInfo: UI_I_TableInfoItem[]
192
+ vmCpuHelpTextSecond: string
193
+ finishFunc: any
194
+ getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
195
+ validateSendDataFunc: any
196
+ passthroughDevices: UI_I_PciDevice[]
197
+ mediatedDevices: UI_I_MediatedDevice[]
198
+ vmNameInWizard: string
199
+ capabilities?: UI_I_Capabilities
200
+ schedulerTask?: any // TODO надо interface переместить глобално
201
+ selectedVirtualMachine?: UI_I_Capabilities
202
+ dataCenter?: UI_I_TreeNode // для сферы
203
+ computeResource?: UI_I_TreeNode // для сферы
204
+ computeResourceTree?: UI_I_TreeNode[] // для сферы
205
+ }>()
206
+
207
+ const emits = defineEmits<{
208
+ (event: 'check-name', value: [string, (error: API_UI_I_Error) => void]): void
209
+ (event: 'get-storage', value: UI_I_TablePayload): void
210
+ (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
211
+ (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
212
+ (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
213
+ (event: 'remove-error-by-title', value: string): void
214
+ (event: 'get-networks-table', value: UI_I_TablePayload): void
215
+ (event: 'get-pci-devices'): void
216
+ (event: 'hide'): void
217
+ (
218
+ event: 'get-compute-resource-tree',
219
+ value: { id: string | number; cb: () => void }
220
+ ): void // для сферы
221
+ (event: 'show-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
222
+ (event: 'select-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
223
+ (event: 'clear-compute-resource-tree'): void // для сферы
224
+ }>()
225
+
226
+ const { $recursion } = useNuxtApp()
227
+
228
+ const localization = computed<UI_I_Localization>(() => useLocal())
229
+
230
+ const isSphere = computed<boolean>(() => props.project === 'sphere')
231
+
232
+ const isScheduledTasks = computed<boolean>(
233
+ () => props.schedulerTask.isSchedulerTask
234
+ )
235
+
236
+ const title = computed<string>(() => {
237
+ const { scheduleNewTasks, scheduleTaskEdit, cloneExistingVirtualMachine } =
238
+ localization.value.common
239
+
240
+ let result = cloneExistingVirtualMachine
241
+ if (isScheduledTasks.value) {
242
+ const schedulerMode = props.schedulerTask.editTask
243
+ ? scheduleTaskEdit
244
+ : scheduleNewTasks
245
+
246
+ result = `${schedulerMode} (${cloneExistingVirtualMachine})`
247
+ }
248
+
249
+ return result
250
+ })
251
+
252
+ watch(
253
+ () => props.capabilities,
254
+ () => {
255
+ if (props.capabilities) {
256
+ mapCapabilities(props.capabilities)
257
+ }
258
+ },
259
+ { deep: true, immediate: true }
260
+ )
261
+
262
+ const wizard: Wizard = new Wizard(
263
+ stepsFunc(localization.value),
264
+ stepsSchemeInitial
265
+ )
266
+ watch(
267
+ isScheduledTasks,
268
+ (newValue) => {
269
+ if (newValue) {
270
+ wizard.changeScheme(isSphere.value ? 12 : 4)
271
+ } else {
272
+ wizard.changeScheme(isSphere.value ? 8 : 0)
273
+ wizard.selectStepHard(isSphere.value ? 2 : 1)
274
+ }
275
+ },
276
+ { immediate: true }
277
+ )
278
+
279
+ // TODO move to common
280
+ const newTaskForm = ref<UI_I_ScheduleNewTasksForm>(
281
+ useDeepCopy(scheduledTaskDefaultFormFunc())
282
+ )
283
+ watch(
284
+ newTaskForm,
285
+ (newValue: UI_I_ScheduleNewTasksForm) => {
286
+ if (isScheduledTasks.value) wizard.setDisabledNextButton(newValue.isValid)
287
+ },
288
+ { immediate: true, deep: true }
289
+ )
290
+
291
+ const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
292
+
293
+ const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
294
+ wizard.changeSteps(value, validationFunc, validateSendData)
295
+ }
296
+
297
+ const validationFunc = async (
298
+ value: UI_I_WizardStep[],
299
+ currentStep: UI_I_WizardStep,
300
+ nextStep: UI_I_WizardStep
301
+ ): Promise<UI_I_ValidationReturn> => {
302
+ let stepHasError = false
303
+ let stepShouldStop = {
304
+ ifOnCurrentStep: false,
305
+ ifFromAnyStep: false,
306
+ stoppageStepId: -1,
307
+ }
308
+
309
+ wizard.setLoader(true)
310
+ if (
311
+ wizard.isValidateForStep(
312
+ isSphere.value ? dynamicSteps.selectNameFolder : dynamicSteps.selectName,
313
+ currentStep.id,
314
+ nextStep.id
315
+ )
316
+ ) {
317
+ const nameValidation = await checkName(value)
318
+
319
+ value = nameValidation.newValue
320
+ stepHasError = stepHasError || nameValidation.stepHasError
321
+ } else if (
322
+ isSphere.value &&
323
+ wizard.isValidateForStep(
324
+ dynamicSteps.selectComputeResource,
325
+ currentStep.id,
326
+ nextStep.id
327
+ )
328
+ ) {
329
+ const computeResourceValidation = await checkComputeResource(value)
330
+
331
+ value = computeResourceValidation.newValue
332
+ stepHasError = stepHasError || computeResourceValidation.stepHasError
333
+ } else if (
334
+ wizard.isValidateForStep(
335
+ dynamicSteps.selectStorage,
336
+ currentStep.id,
337
+ nextStep.id
338
+ )
339
+ ) {
340
+ const storageValidation = await checkStorage(value)
341
+
342
+ value = storageValidation.newValue
343
+
344
+ stepHasError = stepHasError || storageValidation.stepHasError
345
+ } else if (
346
+ wizard.isValidateForStep(
347
+ dynamicSteps.customizeHardware,
348
+ currentStep.id,
349
+ nextStep.id
350
+ )
351
+ ) {
352
+ const customizeHardwareValidation = await checkCustomizeHardware(value)
353
+
354
+ value = customizeHardwareValidation.newValue
355
+
356
+ stepHasError = stepHasError || customizeHardwareValidation.stepHasError
357
+ }
358
+ wizard.setLoader(false)
359
+
360
+ return {
361
+ newValue: value,
362
+ stepHasError,
363
+ stepShouldStop,
364
+ }
365
+ }
366
+ const checkName = async (
367
+ value: UI_I_WizardStep[]
368
+ ): Promise<UI_I_ValidationReturn> => {
369
+ let stepHasError = false
370
+
371
+ return new Promise((resolve) => {
372
+ const step = isSphere.value
373
+ ? dynamicSteps.selectNameFolder
374
+ : dynamicSteps.selectName
375
+ nameFormSubmit.value = (isValid: boolean) => {
376
+ if (!isValid) {
377
+ stepHasError = wizard.setValidation(step, 'name', {
378
+ fieldMessage: 'aaa',
379
+ alertMessage: 'aaa',
380
+ })
381
+ } else if (wizard.hasMessage(step, 'name')) {
382
+ value = wizard.removeValidation(step, 'name', value)
383
+ }
384
+
385
+ resolve({
386
+ stepHasError,
387
+ newValue: value,
388
+ })
389
+ nameFormSubmit.value = null
390
+ }
391
+ })
392
+ }
393
+ const checkComputeResource = async (
394
+ value: UI_I_WizardStep[]
395
+ ): Promise<UI_I_ValidationReturn> => {
396
+ let stepHasError = false
397
+
398
+ return new Promise((resolve) => {
399
+ computeResourceSubmit.value = (isValid: boolean) => {
400
+ if (!isValid) {
401
+ stepHasError = wizard.setValidation(
402
+ dynamicSteps.selectComputeResource,
403
+ 'computeResource',
404
+ {
405
+ fieldMessage: 'aaa',
406
+ alertMessage: 'aaa',
407
+ }
408
+ )
409
+ } else if (
410
+ wizard.hasMessage(dynamicSteps.selectComputeResource, 'computeResource')
411
+ ) {
412
+ value = wizard.removeValidation(
413
+ dynamicSteps.selectComputeResource,
414
+ 'computeResource',
415
+ value
416
+ )
417
+ }
418
+
419
+ resolve({
420
+ stepHasError,
421
+ newValue: value,
422
+ })
423
+ computeResourceSubmit.value = null
424
+ }
425
+ })
426
+ }
427
+ const checkStorage = async (
428
+ value: UI_I_WizardStep[]
429
+ ): Promise<UI_I_ValidationReturn> => {
430
+ let stepHasError = false
431
+
432
+ return new Promise((resolve) => {
433
+ storageSubmit.value = (isValid: boolean) => {
434
+ if (!isValid) {
435
+ stepHasError = wizard.setValidation(
436
+ dynamicSteps.selectStorage,
437
+ 'storage',
438
+ {
439
+ fieldMessage: 'aaa',
440
+ alertMessage: 'aaa',
441
+ }
442
+ )
443
+ } else if (wizard.hasMessage(dynamicSteps.selectStorage, 'storage')) {
444
+ value = wizard.removeValidation(
445
+ dynamicSteps.selectStorage,
446
+ 'storage',
447
+ value
448
+ )
449
+ }
450
+
451
+ resolve({
452
+ stepHasError,
453
+ newValue: value,
454
+ })
455
+ storageSubmit.value = null
456
+ }
457
+ })
458
+ }
459
+ const checkCustomizeHardware = async (
460
+ value: UI_I_WizardStep[]
461
+ ): Promise<UI_I_ValidationReturn> => {
462
+ let stepHasError = false
463
+
464
+ return new Promise((resolve) => {
465
+ customizeHardwareSubmit.value = (isValid: boolean) => {
466
+ if (!isValid) {
467
+ stepHasError = wizard.setValidation(
468
+ dynamicSteps.customizeHardware,
469
+ 'customizeHardware',
470
+ {
471
+ fieldMessage: 'aaa',
472
+ alertMessage: 'aaa',
473
+ }
474
+ )
475
+ } else if (
476
+ wizard.hasMessage(dynamicSteps.customizeHardware, 'customizeHardware')
477
+ ) {
478
+ value = wizard.removeValidation(
479
+ dynamicSteps.customizeHardware,
480
+ 'customizeHardware',
481
+ value
482
+ )
483
+ }
484
+
485
+ resolve({
486
+ stepHasError,
487
+ newValue: value,
488
+ })
489
+ storageSubmit.value = null
490
+ }
491
+ })
492
+ }
493
+
494
+ const vmForm = ref<UI_I_VmForm>({
495
+ name: '',
496
+ compatibility: '',
497
+ guestMachineType: null,
498
+ guestOsFamily: null,
499
+ guestOsVersion: null,
500
+ computeResource: null,
501
+ storage: null,
502
+ locationPath: '',
503
+ dataCenter: null,
504
+ options: [],
505
+ })
506
+ const onChangeName = (name: string, node: UI_I_TreeNode): void => {
507
+ vmForm.value.name = name
508
+ if (isSphere.value) {
509
+ vmForm.value.locationPath = node.id
510
+ vmForm.value.dataCenter = $recursion.findParentByValue(
511
+ node,
512
+ 'datacenter',
513
+ 'type',
514
+ 'parent'
515
+ )
516
+ }
517
+ }
518
+ const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
519
+ if (!storage) return
520
+
521
+ vmForm.value.storage = storage
522
+ }
523
+ const onChangeSelectOptions = (options: string[]): void => {
524
+ vmForm.value.options = options
525
+ if (
526
+ options.includes('customize-os') &&
527
+ options.includes('customize-hardware')
528
+ ) {
529
+ let procuratorSchame = isScheduledTasks.value ? 7 : 3
530
+ let sphereSchame = isScheduledTasks.value ? 15 : 11
531
+ wizard.changeScheme(isSphere.value ? sphereSchame : procuratorSchame)
532
+ } else if (options.includes('customize-os')) {
533
+ let procuratorSchame = isScheduledTasks.value ? 5 : 1
534
+ let sphereSchame = isScheduledTasks.value ? 13 : 9
535
+ wizard.changeScheme(isSphere.value ? sphereSchame : procuratorSchame)
536
+ } else if (options.includes('customize-hardware')) {
537
+ let procuratorSchame = isScheduledTasks.value ? 6 : 2
538
+ let sphereSchame = isScheduledTasks.value ? 14 : 10
539
+ wizard.changeScheme(isSphere.value ? sphereSchame : procuratorSchame)
540
+ } else {
541
+ let procuratorSchame = isScheduledTasks.value ? 4 : 0
542
+ let sphereSchame = isScheduledTasks.value ? 12 : 8
543
+ wizard.changeScheme(isSphere.value ? sphereSchame : procuratorSchame)
544
+ }
545
+
546
+ // Change power on by default
547
+ isPowerOnByDefault.value = options.includes('power-on')
548
+ }
549
+ const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
550
+ const onChangeCustomizeHardware = (
551
+ data: UI_I_SendDataCustomizeHardware
552
+ ): void => {
553
+ customizeHardware.value = data
554
+ }
555
+
556
+ const virtualHardwareHardDisksLocal = computed<
557
+ UI_I_SendDataNewHardDisk[] | null
558
+ >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
559
+ const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
560
+ () => customizeHardware.value?.virtualHardware?.networks || null
561
+ )
562
+ const virtualHardwareCdDvdDrivesLocal = computed<
563
+ UI_I_SendDataNewCdDvdDrive[] | null
564
+ >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
565
+
566
+ const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
567
+ () => customizeHardware.value?.virtualHardware?.cpu || null
568
+ )
569
+ const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
570
+ () => customizeHardware.value?.virtualHardware?.memory || null
571
+ )
572
+ const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
573
+ const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
574
+ null
575
+ )
576
+ const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
577
+ const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
578
+ virtualHardwareHardDisks.value = data[0]
579
+ virtualHardwareCdDvdDrives.value = data[1]
580
+ virtualHardwareNetworks.value = data[2]
581
+ }
582
+
583
+ const isPowerOnByDefault = ref<boolean>(false)
584
+
585
+ watch(
586
+ () => props.vmNameInWizard,
587
+ (newValue) => {
588
+ vmForm.value.name = newValue
589
+ }
590
+ )
591
+
592
+ const validateSendData = async (
593
+ value: UI_I_WizardStep[]
594
+ ): Promise<UI_I_ValidationReturn> => {
595
+ wizard.setLoader(true)
596
+ let stepHasError = false
597
+
598
+ const data = await props.validateSendDataFunc(
599
+ vmForm.value,
600
+ virtualHardwareCpu.value,
601
+ virtualHardwareMemory.value,
602
+ customizeHardware.value,
603
+ virtualHardwareNetworks.value,
604
+ virtualHardwareHardDisks.value,
605
+ virtualHardwareCdDvdDrives.value,
606
+ isPowerOnByDefault.value,
607
+ localization.value,
608
+ vmForm.value.locationPath, // для сферы
609
+ // computeResourcePath.value // для сферы
610
+ vmSettings.value.host_id // для сферы // TODO rollback
611
+ )
612
+
613
+ wizard.setLoader(false)
614
+ if (data) {
615
+ stepHasError = true
616
+ selectedNavItem.value = data[0]
617
+ }
618
+
619
+ return {
620
+ stepHasError,
621
+ newValue: value,
622
+ }
623
+ }
624
+ const onFinish = (): void => {
625
+ wizard.setLoader(false)
626
+ props
627
+ .finishFunc(
628
+ vmForm.value,
629
+ virtualHardwareCpu.value,
630
+ virtualHardwareMemory.value,
631
+ customizeHardware.value,
632
+ virtualHardwareNetworks.value,
633
+ virtualHardwareHardDisks.value,
634
+ virtualHardwareCdDvdDrives.value,
635
+ isPowerOnByDefault.value,
636
+ localization.value,
637
+ vmForm.value.locationPath, // для сферы
638
+ // computeResourcePath.value, // для сферы
639
+ vmSettings.value.host_id, // для сферы // TODO rollback
640
+ false,
641
+ newTaskForm.value,
642
+ props.schedulerTask
643
+ )
644
+ .then(() => {
645
+ onHideModal()
646
+ wizard.setLoader(false)
647
+ })
648
+ }
649
+
650
+ const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
651
+
652
+ const nameFormSubmit = ref<null | Function>(null)
653
+ const computeResourceSubmit = ref<null | Function>(null)
654
+ const storageSubmit = ref<null | Function>(null)
655
+ const customizeHardwareSubmit = ref<null | Function>(null)
656
+
657
+ const vmSettings = computed<UI_I_VmSettings | null>(() => props.vmSettings)
658
+ const vmName = ref<string>(vmSettings.value?.name || '')
659
+
660
+ const guestOsFamilies = ref<UI_I_OptionItem[]>(
661
+ capabilities.value.guestOsFamilies
662
+ )
663
+ const guestOsVersions = ref<UI_I_ArbitraryObject<UI_I_OptionItem[]>>(
664
+ capabilities.value.guestOsVersions
665
+ )
666
+ const machineTypes = ref<UI_I_OptionItem[]>(capabilities.value.machineTypes)
667
+
668
+ const computeResource = ref<UI_I_TreeNode | null>(null)
669
+ const onChangeComputeResource = (node: UI_I_TreeNode): void => {
670
+ computeResource.value = node
671
+ }
672
+ // // Для сферы
673
+ const computeResourcePath = ref<string>('')
674
+ const onSelectComputeResourceTree = (node: UI_I_TreeNode): void => {
675
+ emits('select-compute-resource-tree', node)
676
+ computeResourcePath.value = node.id
677
+ }
678
+
679
+ watch(vmSettings, (newValue) => {
680
+ vmName.value = newValue?.name || ''
681
+
682
+ if (newValue?.guestOsFamily)
683
+ vmForm.value.guestOsFamily = newValue.guestOsFamily
684
+ if (newValue?.guestMachineType)
685
+ vmForm.value.guestMachineType = newValue.guestMachineType
686
+ if (newValue?.guestOsVersion)
687
+ vmForm.value.guestOsVersion = newValue.guestOsVersion
688
+
689
+ if (newValue?.compatibility)
690
+ vmForm.value.compatibility = newValue.compatibility
691
+
692
+ if (newValue?.storage) {
693
+ const datastore = props.datastore.find(
694
+ (item) => item.id === newValue.storage.id
695
+ )
696
+ if (datastore) vmForm.value.storage = datastore
697
+ }
698
+ })
699
+
700
+ const onHideModal = (): void => {
701
+ emits('hide')
702
+ }
703
+ </script>
704
+
705
+ <style scoped lang="scss">
706
+ :deep(.has-solid.close-icon.clr-icon) {
707
+ width: 20px;
708
+ top: 0;
709
+ }
710
+ .vm-context {
711
+ padding: 16px 15px 10px 10px;
712
+ height: 100%;
713
+ display: flex;
714
+ flex-direction: column;
715
+
716
+ .context-title-wrap {
717
+ padding-bottom: 3px;
718
+ border-bottom: 1px solid #a6a6a6;
719
+
720
+ h4 {
721
+ font-weight: 700;
722
+ font-size: 13px;
723
+ color: var(--vm-context-title);
724
+ }
725
+ p {
726
+ font-weight: 400;
727
+ font-size: 13px;
728
+ color: var(--vm-context-sub-title);
729
+ }
730
+ }
731
+
732
+ .finish-block {
733
+ padding: 18px 24px 24px 24px;
734
+
735
+ .add-hosts-ready-to-complete-mt-12 {
736
+ margin-top: 12px;
737
+
738
+ .add-hosts-ready-to-complete-bold {
739
+ line-height: 18px;
740
+ font-weight: 700;
741
+ }
742
+ }
743
+ }
744
+
745
+ .vm-hardware-version {
746
+ align-self: flex-end;
747
+ margin-top: auto;
748
+ }
749
+ }
750
+
751
+ :deep(.modal .modal-dialog .modal-content .modal-footer) {
752
+ flex: unset;
753
+ height: unset;
754
+ min-height: unset;
755
+ }
756
+ :deep(.wizard-modal-titlebar h3) {
757
+ color: #000;
758
+ font-size: 24px;
759
+ font-weight: 200;
760
+ line-height: 27px;
761
+ margin: 0;
762
+ padding: 0;
763
+ }
764
+ :deep(.clr-wizard-stepnav-item) {
765
+ padding-left: 0;
766
+ }
767
+ :deep(.clr-wizard-stepnav
768
+ .clr-wizard-stepnav-item
769
+ button
770
+ .clr-wizard-stepnav-link-title) {
771
+ width: 189px;
772
+ font-weight: 700;
773
+ font-size: 13px;
774
+ }
775
+
776
+ #vm-wizard-notification {
777
+ h3 {
778
+ color: var(--global-font-color7);
779
+ margin-top: 6px;
780
+ }
781
+ p {
782
+ color: var(--global-font-color6);
783
+ line-height: 16px;
784
+ }
785
+ }
786
+
787
+ .power-on-by-default-wrap {
788
+ display: flex;
789
+ align-items: center;
790
+
791
+ input {
792
+ margin-right: 6px;
793
+ }
794
+ }
795
+
796
+ .new-task-form {
797
+ padding: 0 25px 0 5px;
798
+ }
799
+ </style>
800
+
801
+ <style>
802
+ :root {
803
+ --vm-context-title: #333;
804
+ --vm-context-sub-title: #000;
805
+ }
806
+ :root.dark-theme {
807
+ --vm-context-title: #adbbc4;
808
+ --vm-context-sub-title: #adbbc4;
809
+ }
810
+ </style>