bfg-common 1.5.164 → 1.5.166

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 (131) hide show
  1. package/CODE_STYLE.md +109 -109
  2. package/assets/img/icons/icons-sprite-dark-3.svg +227 -227
  3. package/assets/img/icons/icons-sprite-dark-5.svg +488 -488
  4. package/assets/img/icons/icons-sprite-light-3.svg +227 -227
  5. package/assets/img/icons/icons-sprite-light-5.svg +488 -488
  6. package/assets/localization/local_be.json +4 -3
  7. package/assets/localization/local_en.json +5 -4
  8. package/assets/localization/local_hy.json +4 -3
  9. package/assets/localization/local_kk.json +4 -3
  10. package/assets/localization/local_ru.json +5 -4
  11. package/assets/localization/local_zh.json +2 -1
  12. package/components/atoms/TheIcon3.vue +50 -50
  13. package/components/atoms/modal/Modal.vue +0 -1
  14. package/components/atoms/perPage/PerPage.vue +58 -58
  15. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  16. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  17. package/components/atoms/tabs/VerticalTabs.vue +105 -105
  18. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  19. package/components/common/context/lib/models/interfaces.ts +31 -31
  20. package/components/common/context/recursion/RecursionNew.vue +238 -238
  21. package/components/common/diagramMain/DiagramMain.vue +897 -897
  22. package/components/common/diagramMain/Header.vue +214 -214
  23. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  24. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  25. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  26. package/components/common/pages/home/headline/Headline.vue +45 -45
  27. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  28. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  29. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  30. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  31. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  32. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  33. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  34. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  35. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  36. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  37. package/components/common/pages/packages/Packages.vue +208 -208
  38. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  39. package/components/common/readyToComplete/New.vue +66 -66
  40. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  41. package/components/common/recursionTree/RecursionTree.vue +223 -223
  42. package/components/common/select/button/ButtonDropdown.vue +108 -108
  43. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  44. package/components/common/vm/actions/add/Add.vue +785 -785
  45. package/components/common/vm/actions/add/New.vue +556 -556
  46. package/components/common/vm/actions/add/Old.vue +371 -371
  47. package/components/common/vm/actions/add/folderTreeView/FolderTreeView.vue +72 -72
  48. package/components/common/vm/actions/add/folderTreeView/New.vue +40 -40
  49. package/components/common/vm/actions/add/folderTreeView/Old.vue +50 -50
  50. package/components/common/vm/actions/add/lib/config/steps.ts +263 -263
  51. package/components/common/vm/actions/clone/Clone.vue +810 -810
  52. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -291
  53. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +626 -626
  54. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  55. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  56. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  57. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +100 -100
  58. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  59. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  60. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  61. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  62. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  63. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  64. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  65. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  66. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  67. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +375 -375
  68. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/Location.vue +149 -149
  69. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationNew.vue +74 -74
  70. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationOld.vue +83 -83
  71. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +288 -288
  72. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +94 -94
  73. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  74. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  75. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  76. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  77. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  78. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  79. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  80. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  81. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  82. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  83. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  84. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  85. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  86. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  87. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  88. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  89. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  90. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  91. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  92. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  93. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  94. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  95. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  96. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  97. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +39 -39
  98. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  99. package/components/common/vm/actions/common/lib/utils/capabilities.ts +52 -52
  100. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  101. package/components/common/vm/actions/common/select/computeResource/ComputeResource.vue +134 -134
  102. package/components/common/vm/actions/common/select/computeResource/treeView/New.vue +44 -44
  103. package/components/common/vm/actions/common/select/computeResource/treeView/TreeView.vue +118 -118
  104. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -38
  105. package/components/common/vm/actions/common/select/createType/New.vue +84 -84
  106. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  107. package/components/common/vm/actions/common/select/name/Name.vue +167 -167
  108. package/components/common/vm/actions/common/select/os/New.vue +122 -122
  109. package/components/common/vm/actions/common/select/os/Old.vue +152 -152
  110. package/components/common/vm/actions/common/select/os/Os.vue +139 -139
  111. package/components/common/vm/actions/common/select/storage/Storage.vue +129 -129
  112. package/components/common/vm/actions/common/select/storage/new/lib/config/table.ts +326 -326
  113. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  114. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  115. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  116. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  117. package/components/common/wizards/vm/migrate/lib/config/steps.ts +157 -157
  118. package/components/common/wizards/vm/migrate/lib/validations.ts +68 -68
  119. package/components/common/wizards/vm/migrate/select/computeResource/tableView/TableView.vue +137 -137
  120. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  121. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  122. package/composables/productNameLocal.ts +30 -30
  123. package/composables/useAppVersion.ts +21 -21
  124. package/lib/models/store/vm/interfaces.ts +142 -0
  125. package/package.json +1 -1
  126. package/plugins/date.ts +233 -233
  127. package/public/spice-console/lib/images/bitmap.js +203 -203
  128. package/public/spice-console/network/spicechannel.js +383 -383
  129. package/store/main/mutations.ts +7 -7
  130. package/store/main/state.ts +7 -7
  131. 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>