bfg-common 1.5.119 → 1.5.121

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