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,626 +1,626 @@
1
- <template>
2
- <div class="clone-to-template">
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="!vmSettingsLocal" id="loader" />
15
- <div v-if="vmSettingsLocal" 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="selectedStep.id === dynamicSteps.selectName"
24
- :show="selectedStep.id === dynamicSteps.selectName"
25
- :name-form-submit="nameFormSubmit"
26
- :project="props.project"
27
- @submit="onChangeName(...$event)"
28
- @check-name="emits('check-name', $event)"
29
- />
30
- <common-vm-actions-common-select-storage
31
- v-show="selectedStep.id === dynamicSteps.selectStorage"
32
- :storage-submit="storageSubmit"
33
- :datastore="props.datastore"
34
- :storage="vmSettingsLocal.storage"
35
- :get-datastore-table-func="props.getDatastoreTableFunc"
36
- @submit="onChangeStorage"
37
- />
38
- <common-vm-actions-common-customize-hardware
39
- v-show="selectedStep.id === dynamicSteps.customizeHardware"
40
- v-model:vm-name="vmName"
41
- v-model:guest-machine-type="vmSettingsLocal.guestMachineType"
42
- v-model:guest-os-family="vmSettingsLocal.guestOsFamily"
43
- v-model:guest-os-version="vmSettingsLocal.guestOsVersion"
44
- :storage="vmSettingsLocal.storage"
45
- :hard-disks-for-boot-options="virtualHardwareHardDisksLocal"
46
- :cd-dvd-drives-for-boot-options="virtualHardwareCdDvdDrivesLocal"
47
- :networks-for-boot-options="virtualHardwareNetworksLocal"
48
- :cd-dvd-drives="vmSettingsLocal.cdDvdDrives"
49
- :hard-disks="vmSettingsLocal.hardDisks"
50
- :networks="vmSettingsLocal.networks"
51
- :customize-hardware-submit="customizeHardwareSubmit"
52
- :max-cpus="vmSettingsLocal.maxCpus"
53
- :max-memory="vmSettingsLocal.maxMemory"
54
- :cpu-models="vmSettingsLocal.cpuModels"
55
- :cpu="vmSettingsLocal.cpu"
56
- :memory="vmSettingsLocal.memory"
57
- :video-card="vmSettingsLocal.videoCard"
58
- :usb-controller="vmSettingsLocal.usbController"
59
- :pci-devices="vmSettingsLocal.pciDevices"
60
- :selected-nav-item="selectedNavItem"
61
- :hard-disks-for-edit="vmSettingsLocal.hardDisks"
62
- :options="vmSettingsLocal.options"
63
- :nodes="props.nodes"
64
- :files="props.files"
65
- :networks-table="props.networksTable"
66
- :error-validation-fields="props.errorValidationFields"
67
- :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
68
- :passthrough-devices="props.passthroughDevices"
69
- :mediated-devices="props.mediatedDevices"
70
- :get-datastore-table-func="props.getDatastoreTableFunc"
71
- :datastore="props.datastore"
72
- :project="props.project"
73
- is-clone
74
- @change-boot-order="onChangeBootOrder"
75
- @send-data="onChangeCustomizeHardware"
76
- @get-storage="emits('get-storage', $event)"
77
- @get-folders-or-files="emits('get-folders-or-files', $event)"
78
- @get-active-device-child="emits('get-active-device-child', $event)"
79
- @show-datastore-child="emits('show-datastore-child', $event)"
80
- @get-networks-table="emits('get-networks-table', $event)"
81
- @get-pci-devices="emits('get-pci-devices')"
82
- />
83
- <common-ready-to-complete
84
- v-show="selectedStep.id === dynamicSteps.readyComplete"
85
- :data="props.readyCompleteTableInfo"
86
- />
87
- </div>
88
- </template>
89
- </atoms-wizard>
90
- </div>
91
- </template>
92
-
93
- <script setup lang="ts">
94
- import type {
95
- UI_I_DatastoreTableItem,
96
- UI_I_FolderOrFileTreePayload,
97
- } from '~/lib/models/store/storage/interfaces'
98
- import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
99
- import type { API_UI_I_Error } from '~/lib/models/store/interfaces'
100
- import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
101
- import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
102
- import type { UI_I_Localization } from '~/lib/models/interfaces'
103
- import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
104
- import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
105
- import type {
106
- UI_I_SendDataCpu,
107
- UI_I_SendDataMemory,
108
- UI_I_SendDataNewCdDvdDrive,
109
- UI_I_SendDataNewHardDisk,
110
- UI_I_SendDataNewNetwork,
111
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
112
- import type { UI_T_SelectedNavItem } from '~/components/common/vm/actions/common/lib/models/types'
113
- import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
114
- import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
115
- import type { UI_T_Project } from '~/lib/models/types'
116
- import type {
117
- UI_I_MediatedDevice,
118
- UI_I_PciDevice,
119
- UI_I_VmSettings,
120
- } from '~/lib/models/store/vm/interfaces'
121
- import type {
122
- I_DynamicSteps,
123
- // UI_I_VmForm,
124
- } from '~/components/common/vm/actions/clone/toTemplate/lib/models/interfaces'
125
- import type {
126
- UI_I_ValidationReturn,
127
- UI_I_WizardStep,
128
- } from '~/components/atoms/wizard/lib/models/interfaces'
129
- import type { UI_I_Capabilities } from '~/components/common/vm/actions/common/lib/models/interfaces'
130
- import type { UI_I_ScheduleNewTasksForm } from '~/components/common/pages/scheduledTasks/modals/lib/models/interfaces'
131
- import {
132
- stepsSchemeInitial,
133
- stepsFunc,
134
- getDynamicSteps,
135
- } from '~/components/common/vm/actions/clone/toTemplate/lib/config/steps'
136
- import Wizard from '~/components/atoms/wizard/lib/utils/utils'
137
- import { mapCapabilities } from '~/components/common/vm/actions/common/lib/utils/capabilities'
138
- import { scheduledTaskDefaultFormFunc } from '~/components/common/pages/scheduledTasks/modals/lib/config/createScheduledTask'
139
-
140
- const props = defineProps<{
141
- project: UI_T_Project
142
- vmSettings: UI_I_VmSettings | null
143
- nodes: UI_I_FileTreeNode[]
144
- files: UI_I_FileTreeNode[]
145
- networksTable: UI_I_NetworkTableItem[]
146
- datastore: UI_I_DatastoreTableItem[]
147
- errorValidationFields: UI_I_ErrorValidationField[]
148
- readyCompleteTableInfo: UI_I_TableInfoItem[]
149
- vmCpuHelpTextSecond: string
150
- finishFunc: any
151
- getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
152
- validateSendDataFunc: any
153
- passthroughDevices: UI_I_PciDevice[]
154
- mediatedDevices: UI_I_MediatedDevice[]
155
- vmNameInWizard: string
156
- capabilities?: UI_I_Capabilities
157
- schedulerTask?: any // TODO надо interface переместить глобално
158
- selectedVirtualMachine?: UI_I_Capabilities
159
- }>()
160
-
161
- const emits = defineEmits<{
162
- (event: 'check-name', value: [string, (error: API_UI_I_Error) => void]): void
163
- (event: 'get-storage', value: UI_I_TablePayload): void
164
- (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
165
- (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
166
- (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
167
- (event: 'remove-error-by-title', value: string): void
168
- (event: 'get-networks-table', value: UI_I_TablePayload): void
169
- (event: 'get-pci-devices'): void
170
- (event: 'hide'): void
171
- }>()
172
-
173
- const localization = computed<UI_I_Localization>(() => useLocal())
174
-
175
- const isScheduledTasks = computed<boolean>(
176
- () => props.schedulerTask.isSchedulerTask
177
- )
178
-
179
- const title = computed<string>(() => {
180
- const { scheduleNewTasks, scheduleTaskEdit, cloneTemplate } =
181
- localization.value.common
182
-
183
- let result = cloneTemplate
184
- if (isScheduledTasks.value) {
185
- const schedulerMode = props.schedulerTask.editTask
186
- ? scheduleTaskEdit
187
- : scheduleNewTasks
188
-
189
- result = `${schedulerMode} (${cloneTemplate})`
190
- }
191
-
192
- return result
193
- })
194
-
195
- const dynamicSteps = ref<I_DynamicSteps>(
196
- getDynamicSteps(isScheduledTasks.value)
197
- )
198
-
199
- watch(
200
- () => props.capabilities,
201
- () => {
202
- if (props.capabilities) mapCapabilities(props.capabilities)
203
- },
204
- { deep: true, immediate: true }
205
- )
206
-
207
- const wizard: Wizard = new Wizard(
208
- stepsFunc(localization.value, isScheduledTasks.value),
209
- stepsSchemeInitial(isScheduledTasks.value)
210
- )
211
- // TODO move to common
212
- const newTaskForm = ref<UI_I_ScheduleNewTasksForm>(
213
- useDeepCopy(scheduledTaskDefaultFormFunc())
214
- )
215
- watch(
216
- newTaskForm,
217
- (newValue: UI_I_ScheduleNewTasksForm) => {
218
- if (isScheduledTasks.value) wizard.setDisabledNextButton(newValue.isValid)
219
- },
220
- { immediate: true, deep: true }
221
- )
222
-
223
- const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
224
-
225
- const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
226
- wizard.changeSteps(value, validationFunc, validateSendData)
227
- }
228
-
229
- const validationFunc = async (
230
- value: UI_I_WizardStep[],
231
- currentStep: UI_I_WizardStep,
232
- nextStep: UI_I_WizardStep
233
- ): Promise<UI_I_ValidationReturn> => {
234
- let stepHasError = false
235
- let stepShouldStop = {
236
- ifOnCurrentStep: false,
237
- ifFromAnyStep: false,
238
- stoppageStepId: -1,
239
- }
240
-
241
- wizard.setLoader(true)
242
- if (
243
- wizard.isValidateForStep(
244
- dynamicSteps.value.selectName,
245
- currentStep.id,
246
- nextStep.id
247
- )
248
- ) {
249
- const nameValidation = await checkName(value)
250
-
251
- value = nameValidation.newValue
252
- stepHasError = stepHasError || nameValidation.stepHasError
253
- } else if (
254
- wizard.isValidateForStep(
255
- dynamicSteps.value.selectStorage,
256
- currentStep.id,
257
- nextStep.id
258
- )
259
- ) {
260
- const storageValidation = await checkStorage(value)
261
-
262
- value = storageValidation.newValue
263
-
264
- stepHasError = stepHasError || storageValidation.stepHasError
265
- } else if (
266
- wizard.isValidateForStep(
267
- dynamicSteps.value.selectOptions,
268
- currentStep.id,
269
- nextStep.id
270
- )
271
- ) {
272
- selectOptionsSubmit.value++
273
- } else if (
274
- wizard.isValidateForStep(
275
- dynamicSteps.value.customizeHardware,
276
- currentStep.id,
277
- nextStep.id
278
- )
279
- ) {
280
- const customizeHardwareValidation = await checkCustomizeHardware(value)
281
-
282
- value = customizeHardwareValidation.newValue
283
-
284
- stepHasError = stepHasError || customizeHardwareValidation.stepHasError
285
- }
286
- wizard.setLoader(false)
287
-
288
- return {
289
- newValue: value,
290
- stepHasError,
291
- stepShouldStop,
292
- }
293
- }
294
- const checkName = async (
295
- value: UI_I_WizardStep[]
296
- ): Promise<UI_I_ValidationReturn> => {
297
- let stepHasError = false
298
-
299
- return new Promise((resolve) => {
300
- nameFormSubmit.value = (isValid: boolean) => {
301
- if (!isValid) {
302
- stepHasError = wizard.setValidation(
303
- dynamicSteps.value.selectName,
304
- 'name',
305
- {
306
- fieldMessage: 'aaa',
307
- alertMessage: 'aaa',
308
- }
309
- )
310
- } else if (wizard.hasMessage(dynamicSteps.value.selectName, 'name')) {
311
- value = wizard.removeValidation(
312
- dynamicSteps.value.selectName,
313
- 'name',
314
- value
315
- )
316
- }
317
-
318
- resolve({
319
- stepHasError,
320
- newValue: value,
321
- })
322
- nameFormSubmit.value = null
323
- }
324
- })
325
- }
326
- const checkStorage = async (
327
- value: UI_I_WizardStep[]
328
- ): Promise<UI_I_ValidationReturn> => {
329
- let stepHasError = false
330
-
331
- return new Promise((resolve) => {
332
- storageSubmit.value = (isValid: boolean) => {
333
- if (!isValid) {
334
- stepHasError = wizard.setValidation(
335
- dynamicSteps.value.selectStorage,
336
- 'storage',
337
- {
338
- fieldMessage: 'aaa',
339
- alertMessage: 'aaa',
340
- }
341
- )
342
- } else if (
343
- wizard.hasMessage(dynamicSteps.value.selectStorage, 'storage')
344
- ) {
345
- value = wizard.removeValidation(
346
- dynamicSteps.value.selectStorage,
347
- 'storage',
348
- value
349
- )
350
- }
351
-
352
- resolve({
353
- stepHasError,
354
- newValue: value,
355
- })
356
- storageSubmit.value = null
357
- }
358
- })
359
- }
360
- const checkCustomizeHardware = async (
361
- value: UI_I_WizardStep[]
362
- ): Promise<UI_I_ValidationReturn> => {
363
- let stepHasError = false
364
-
365
- return new Promise((resolve) => {
366
- customizeHardwareSubmit.value = (isValid: boolean) => {
367
- if (!isValid) {
368
- stepHasError = wizard.setValidation(
369
- dynamicSteps.value.customizeHardware,
370
- 'customizeHardware',
371
- {
372
- fieldMessage: 'aaa',
373
- alertMessage: 'aaa',
374
- }
375
- )
376
- } else if (
377
- wizard.hasMessage(
378
- dynamicSteps.value.customizeHardware,
379
- 'customizeHardware'
380
- )
381
- ) {
382
- value = wizard.removeValidation(
383
- dynamicSteps.value.customizeHardware,
384
- 'customizeHardware',
385
- value
386
- )
387
- }
388
-
389
- resolve({
390
- stepHasError,
391
- newValue: value,
392
- })
393
- storageSubmit.value = null
394
- }
395
- })
396
- }
397
-
398
- const storageIdCash = ref<string | null>(null)
399
- const onChangeName = (name: string): void => {
400
- vmSettingsLocal.value && (vmSettingsLocal.value.name = name)
401
- }
402
- const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
403
- if (!storage) return
404
-
405
- vmSettingsLocal.value && (vmSettingsLocal.value.storage = storage)
406
- storageIdCash.value = storage.id
407
- }
408
- const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
409
- const onChangeCustomizeHardware = (
410
- data: UI_I_SendDataCustomizeHardware
411
- ): void => {
412
- customizeHardware.value = data
413
- }
414
-
415
- const virtualHardwareHardDisksLocal = computed<
416
- UI_I_SendDataNewHardDisk[] | null
417
- >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
418
- const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
419
- () => customizeHardware.value?.virtualHardware?.networks || null
420
- )
421
- const virtualHardwareCdDvdDrivesLocal = computed<
422
- UI_I_SendDataNewCdDvdDrive[] | null
423
- >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
424
-
425
- const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
426
- () => customizeHardware.value?.virtualHardware?.cpu || null
427
- )
428
- const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
429
- () => customizeHardware.value?.virtualHardware?.memory || null
430
- )
431
- const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
432
- const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
433
- null
434
- )
435
- const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
436
- const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
437
- virtualHardwareHardDisks.value = data[0]
438
- virtualHardwareCdDvdDrives.value = data[1]
439
- virtualHardwareNetworks.value = data[2]
440
- }
441
-
442
- const isPowerOnByDefault = ref<boolean>(true)
443
-
444
- watch(
445
- () => props.vmNameInWizard,
446
- (newValue) => {
447
- vmSettingsLocal.value && (vmSettingsLocal.value.name = newValue)
448
- }
449
- )
450
-
451
- const validateSendData = async (
452
- value: UI_I_WizardStep[]
453
- ): Promise<UI_I_ValidationReturn> => {
454
- wizard.setLoader(true)
455
- let stepHasError = false
456
-
457
- const data = await props.validateSendDataFunc(
458
- vmSettingsLocal.value,
459
- virtualHardwareCpu.value,
460
- virtualHardwareMemory.value,
461
- customizeHardware.value,
462
- virtualHardwareNetworks.value,
463
- virtualHardwareHardDisks.value,
464
- virtualHardwareCdDvdDrives.value,
465
- isPowerOnByDefault.value,
466
- localization.value
467
- )
468
-
469
- wizard.setLoader(false)
470
- if (data) {
471
- stepHasError = true
472
- selectedNavItem.value = data[0]
473
- }
474
-
475
- return {
476
- stepHasError,
477
- newValue: value,
478
- }
479
- }
480
- const onFinish = (): void => {
481
- wizard.setLoader(false)
482
- props
483
- .finishFunc(
484
- vmSettingsLocal.value,
485
- virtualHardwareCpu.value,
486
- virtualHardwareMemory.value,
487
- customizeHardware.value,
488
- virtualHardwareNetworks.value,
489
- virtualHardwareHardDisks.value,
490
- virtualHardwareCdDvdDrives.value,
491
- isPowerOnByDefault.value,
492
- localization.value,
493
- false,
494
- newTaskForm.value,
495
- props.schedulerTask
496
- )
497
- .then(() => {
498
- onHideModal()
499
- wizard.setLoader(false)
500
- })
501
- }
502
-
503
- const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
504
-
505
- const nameFormSubmit = ref<null | Function>(null)
506
- const storageSubmit = ref<null | Function>(null)
507
- const selectOptionsSubmit = ref<number>(0)
508
- const customizeHardwareSubmit = ref<null | Function>(null)
509
-
510
- const vmSettingsLocal = computed<UI_I_VmSettings | null>(() => props.vmSettings)
511
- const vmName = ref<string>(vmSettingsLocal.value?.name || '')
512
- watch(vmSettingsLocal, (newValue) => {
513
- vmName.value = newValue?.name || ''
514
- })
515
-
516
- const onHideModal = (): void => {
517
- emits('hide')
518
- }
519
- </script>
520
-
521
- <style scoped lang="scss">
522
- :deep(.has-solid.close-icon.clr-icon) {
523
- width: 20px;
524
- top: 0;
525
- }
526
- .vm-context {
527
- padding: 16px 15px 10px 10px;
528
- height: 100%;
529
- display: flex;
530
- flex-direction: column;
531
-
532
- .context-title-wrap {
533
- padding-bottom: 3px;
534
- border-bottom: 1px solid #a6a6a6;
535
-
536
- h4 {
537
- font-weight: 700;
538
- font-size: 13px;
539
- color: var(--vm-context-title);
540
- }
541
- p {
542
- font-weight: 400;
543
- font-size: 13px;
544
- color: var(--vm-context-sub-title);
545
- }
546
- }
547
-
548
- .finish-block {
549
- padding: 18px 24px 24px 24px;
550
-
551
- .add-hosts-ready-to-complete-mt-12 {
552
- margin-top: 12px;
553
-
554
- .add-hosts-ready-to-complete-bold {
555
- line-height: 18px;
556
- font-weight: 700;
557
- }
558
- }
559
- }
560
-
561
- .vm-hardware-version {
562
- align-self: flex-end;
563
- margin-top: auto;
564
- }
565
- }
566
-
567
- :deep(.modal .modal-dialog .modal-content .modal-footer) {
568
- flex: unset;
569
- height: unset;
570
- min-height: unset;
571
- }
572
- :deep(.wizard-modal-titlebar h3) {
573
- color: #000;
574
- font-size: 24px;
575
- font-weight: 200;
576
- line-height: 27px;
577
- margin: 0;
578
- padding: 0;
579
- }
580
- :deep(.clr-wizard-stepnav-item) {
581
- padding-left: 0;
582
- }
583
- :deep(.clr-wizard-stepnav
584
- .clr-wizard-stepnav-item
585
- button
586
- .clr-wizard-stepnav-link-title) {
587
- width: 189px;
588
- font-weight: 700;
589
- font-size: 13px;
590
- }
591
-
592
- #vm-wizard-notification {
593
- h3 {
594
- color: var(--global-font-color7);
595
- margin-top: 6px;
596
- }
597
- p {
598
- color: var(--global-font-color6);
599
- line-height: 16px;
600
- }
601
- }
602
-
603
- .power-on-by-default-wrap {
604
- display: flex;
605
- align-items: center;
606
-
607
- input {
608
- margin-right: 6px;
609
- }
610
- }
611
-
612
- .new-task-form {
613
- padding: 0 25px 0 5px;
614
- }
615
- </style>
616
-
617
- <style>
618
- :root {
619
- --vm-context-title: #333;
620
- --vm-context-sub-title: #000;
621
- }
622
- :root.dark-theme {
623
- --vm-context-title: #adbbc4;
624
- --vm-context-sub-title: #adbbc4;
625
- }
626
- </style>
1
+ <template>
2
+ <div class="clone-to-template">
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="!vmSettingsLocal" id="loader" />
15
+ <div v-if="vmSettingsLocal" 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="selectedStep.id === dynamicSteps.selectName"
24
+ :show="selectedStep.id === dynamicSteps.selectName"
25
+ :name-form-submit="nameFormSubmit"
26
+ :project="props.project"
27
+ @submit="onChangeName(...$event)"
28
+ @check-name="emits('check-name', $event)"
29
+ />
30
+ <common-vm-actions-common-select-storage
31
+ v-show="selectedStep.id === dynamicSteps.selectStorage"
32
+ :storage-submit="storageSubmit"
33
+ :datastore="props.datastore"
34
+ :storage="vmSettingsLocal.storage"
35
+ :get-datastore-table-func="props.getDatastoreTableFunc"
36
+ @submit="onChangeStorage"
37
+ />
38
+ <common-vm-actions-common-customize-hardware
39
+ v-show="selectedStep.id === dynamicSteps.customizeHardware"
40
+ v-model:vm-name="vmName"
41
+ v-model:guest-machine-type="vmSettingsLocal.guestMachineType"
42
+ v-model:guest-os-family="vmSettingsLocal.guestOsFamily"
43
+ v-model:guest-os-version="vmSettingsLocal.guestOsVersion"
44
+ :storage="vmSettingsLocal.storage"
45
+ :hard-disks-for-boot-options="virtualHardwareHardDisksLocal"
46
+ :cd-dvd-drives-for-boot-options="virtualHardwareCdDvdDrivesLocal"
47
+ :networks-for-boot-options="virtualHardwareNetworksLocal"
48
+ :cd-dvd-drives="vmSettingsLocal.cdDvdDrives"
49
+ :hard-disks="vmSettingsLocal.hardDisks"
50
+ :networks="vmSettingsLocal.networks"
51
+ :customize-hardware-submit="customizeHardwareSubmit"
52
+ :max-cpus="vmSettingsLocal.maxCpus"
53
+ :max-memory="vmSettingsLocal.maxMemory"
54
+ :cpu-models="vmSettingsLocal.cpuModels"
55
+ :cpu="vmSettingsLocal.cpu"
56
+ :memory="vmSettingsLocal.memory"
57
+ :video-card="vmSettingsLocal.videoCard"
58
+ :usb-controller="vmSettingsLocal.usbController"
59
+ :pci-devices="vmSettingsLocal.pciDevices"
60
+ :selected-nav-item="selectedNavItem"
61
+ :hard-disks-for-edit="vmSettingsLocal.hardDisks"
62
+ :options="vmSettingsLocal.options"
63
+ :nodes="props.nodes"
64
+ :files="props.files"
65
+ :networks-table="props.networksTable"
66
+ :error-validation-fields="props.errorValidationFields"
67
+ :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
68
+ :passthrough-devices="props.passthroughDevices"
69
+ :mediated-devices="props.mediatedDevices"
70
+ :get-datastore-table-func="props.getDatastoreTableFunc"
71
+ :datastore="props.datastore"
72
+ :project="props.project"
73
+ is-clone
74
+ @change-boot-order="onChangeBootOrder"
75
+ @send-data="onChangeCustomizeHardware"
76
+ @get-storage="emits('get-storage', $event)"
77
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
78
+ @get-active-device-child="emits('get-active-device-child', $event)"
79
+ @show-datastore-child="emits('show-datastore-child', $event)"
80
+ @get-networks-table="emits('get-networks-table', $event)"
81
+ @get-pci-devices="emits('get-pci-devices')"
82
+ />
83
+ <common-ready-to-complete
84
+ v-show="selectedStep.id === dynamicSteps.readyComplete"
85
+ :data="props.readyCompleteTableInfo"
86
+ />
87
+ </div>
88
+ </template>
89
+ </atoms-wizard>
90
+ </div>
91
+ </template>
92
+
93
+ <script setup lang="ts">
94
+ import type {
95
+ UI_I_DatastoreTableItem,
96
+ UI_I_FolderOrFileTreePayload,
97
+ } from '~/lib/models/store/storage/interfaces'
98
+ import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
99
+ import type { API_UI_I_Error } from '~/lib/models/store/interfaces'
100
+ import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
101
+ import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
102
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
103
+ import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
104
+ import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
105
+ import type {
106
+ UI_I_SendDataCpu,
107
+ UI_I_SendDataMemory,
108
+ UI_I_SendDataNewCdDvdDrive,
109
+ UI_I_SendDataNewHardDisk,
110
+ UI_I_SendDataNewNetwork,
111
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
112
+ import type { UI_T_SelectedNavItem } from '~/components/common/vm/actions/common/lib/models/types'
113
+ import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
114
+ import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
115
+ import type { UI_T_Project } from '~/lib/models/types'
116
+ import type {
117
+ UI_I_MediatedDevice,
118
+ UI_I_PciDevice,
119
+ UI_I_VmSettings,
120
+ } from '~/lib/models/store/vm/interfaces'
121
+ import type {
122
+ I_DynamicSteps,
123
+ // UI_I_VmForm,
124
+ } from '~/components/common/vm/actions/clone/toTemplate/lib/models/interfaces'
125
+ import type {
126
+ UI_I_ValidationReturn,
127
+ UI_I_WizardStep,
128
+ } from '~/components/atoms/wizard/lib/models/interfaces'
129
+ import type { UI_I_Capabilities } from '~/components/common/vm/actions/common/lib/models/interfaces'
130
+ import type { UI_I_ScheduleNewTasksForm } from '~/components/common/pages/scheduledTasks/modals/lib/models/interfaces'
131
+ import {
132
+ stepsSchemeInitial,
133
+ stepsFunc,
134
+ getDynamicSteps,
135
+ } from '~/components/common/vm/actions/clone/toTemplate/lib/config/steps'
136
+ import Wizard from '~/components/atoms/wizard/lib/utils/utils'
137
+ import { mapCapabilities } from '~/components/common/vm/actions/common/lib/utils/capabilities'
138
+ import { scheduledTaskDefaultFormFunc } from '~/components/common/pages/scheduledTasks/modals/lib/config/createScheduledTask'
139
+
140
+ const props = defineProps<{
141
+ project: UI_T_Project
142
+ vmSettings: UI_I_VmSettings | null
143
+ nodes: UI_I_FileTreeNode[]
144
+ files: UI_I_FileTreeNode[]
145
+ networksTable: UI_I_NetworkTableItem[]
146
+ datastore: UI_I_DatastoreTableItem[]
147
+ errorValidationFields: UI_I_ErrorValidationField[]
148
+ readyCompleteTableInfo: UI_I_TableInfoItem[]
149
+ vmCpuHelpTextSecond: string
150
+ finishFunc: any
151
+ getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
152
+ validateSendDataFunc: any
153
+ passthroughDevices: UI_I_PciDevice[]
154
+ mediatedDevices: UI_I_MediatedDevice[]
155
+ vmNameInWizard: string
156
+ capabilities?: UI_I_Capabilities
157
+ schedulerTask?: any // TODO надо interface переместить глобално
158
+ selectedVirtualMachine?: UI_I_Capabilities
159
+ }>()
160
+
161
+ const emits = defineEmits<{
162
+ (event: 'check-name', value: [string, (error: API_UI_I_Error) => void]): void
163
+ (event: 'get-storage', value: UI_I_TablePayload): void
164
+ (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
165
+ (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
166
+ (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
167
+ (event: 'remove-error-by-title', value: string): void
168
+ (event: 'get-networks-table', value: UI_I_TablePayload): void
169
+ (event: 'get-pci-devices'): void
170
+ (event: 'hide'): void
171
+ }>()
172
+
173
+ const localization = computed<UI_I_Localization>(() => useLocal())
174
+
175
+ const isScheduledTasks = computed<boolean>(
176
+ () => props.schedulerTask.isSchedulerTask
177
+ )
178
+
179
+ const title = computed<string>(() => {
180
+ const { scheduleNewTasks, scheduleTaskEdit, cloneTemplate } =
181
+ localization.value.common
182
+
183
+ let result = cloneTemplate
184
+ if (isScheduledTasks.value) {
185
+ const schedulerMode = props.schedulerTask.editTask
186
+ ? scheduleTaskEdit
187
+ : scheduleNewTasks
188
+
189
+ result = `${schedulerMode} (${cloneTemplate})`
190
+ }
191
+
192
+ return result
193
+ })
194
+
195
+ const dynamicSteps = ref<I_DynamicSteps>(
196
+ getDynamicSteps(isScheduledTasks.value)
197
+ )
198
+
199
+ watch(
200
+ () => props.capabilities,
201
+ () => {
202
+ if (props.capabilities) mapCapabilities(props.capabilities)
203
+ },
204
+ { deep: true, immediate: true }
205
+ )
206
+
207
+ const wizard: Wizard = new Wizard(
208
+ stepsFunc(localization.value, isScheduledTasks.value),
209
+ stepsSchemeInitial(isScheduledTasks.value)
210
+ )
211
+ // TODO move to common
212
+ const newTaskForm = ref<UI_I_ScheduleNewTasksForm>(
213
+ useDeepCopy(scheduledTaskDefaultFormFunc())
214
+ )
215
+ watch(
216
+ newTaskForm,
217
+ (newValue: UI_I_ScheduleNewTasksForm) => {
218
+ if (isScheduledTasks.value) wizard.setDisabledNextButton(newValue.isValid)
219
+ },
220
+ { immediate: true, deep: true }
221
+ )
222
+
223
+ const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
224
+
225
+ const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
226
+ wizard.changeSteps(value, validationFunc, validateSendData)
227
+ }
228
+
229
+ const validationFunc = async (
230
+ value: UI_I_WizardStep[],
231
+ currentStep: UI_I_WizardStep,
232
+ nextStep: UI_I_WizardStep
233
+ ): Promise<UI_I_ValidationReturn> => {
234
+ let stepHasError = false
235
+ let stepShouldStop = {
236
+ ifOnCurrentStep: false,
237
+ ifFromAnyStep: false,
238
+ stoppageStepId: -1,
239
+ }
240
+
241
+ wizard.setLoader(true)
242
+ if (
243
+ wizard.isValidateForStep(
244
+ dynamicSteps.value.selectName,
245
+ currentStep.id,
246
+ nextStep.id
247
+ )
248
+ ) {
249
+ const nameValidation = await checkName(value)
250
+
251
+ value = nameValidation.newValue
252
+ stepHasError = stepHasError || nameValidation.stepHasError
253
+ } else if (
254
+ wizard.isValidateForStep(
255
+ dynamicSteps.value.selectStorage,
256
+ currentStep.id,
257
+ nextStep.id
258
+ )
259
+ ) {
260
+ const storageValidation = await checkStorage(value)
261
+
262
+ value = storageValidation.newValue
263
+
264
+ stepHasError = stepHasError || storageValidation.stepHasError
265
+ } else if (
266
+ wizard.isValidateForStep(
267
+ dynamicSteps.value.selectOptions,
268
+ currentStep.id,
269
+ nextStep.id
270
+ )
271
+ ) {
272
+ selectOptionsSubmit.value++
273
+ } else if (
274
+ wizard.isValidateForStep(
275
+ dynamicSteps.value.customizeHardware,
276
+ currentStep.id,
277
+ nextStep.id
278
+ )
279
+ ) {
280
+ const customizeHardwareValidation = await checkCustomizeHardware(value)
281
+
282
+ value = customizeHardwareValidation.newValue
283
+
284
+ stepHasError = stepHasError || customizeHardwareValidation.stepHasError
285
+ }
286
+ wizard.setLoader(false)
287
+
288
+ return {
289
+ newValue: value,
290
+ stepHasError,
291
+ stepShouldStop,
292
+ }
293
+ }
294
+ const checkName = async (
295
+ value: UI_I_WizardStep[]
296
+ ): Promise<UI_I_ValidationReturn> => {
297
+ let stepHasError = false
298
+
299
+ return new Promise((resolve) => {
300
+ nameFormSubmit.value = (isValid: boolean) => {
301
+ if (!isValid) {
302
+ stepHasError = wizard.setValidation(
303
+ dynamicSteps.value.selectName,
304
+ 'name',
305
+ {
306
+ fieldMessage: 'aaa',
307
+ alertMessage: 'aaa',
308
+ }
309
+ )
310
+ } else if (wizard.hasMessage(dynamicSteps.value.selectName, 'name')) {
311
+ value = wizard.removeValidation(
312
+ dynamicSteps.value.selectName,
313
+ 'name',
314
+ value
315
+ )
316
+ }
317
+
318
+ resolve({
319
+ stepHasError,
320
+ newValue: value,
321
+ })
322
+ nameFormSubmit.value = null
323
+ }
324
+ })
325
+ }
326
+ const checkStorage = async (
327
+ value: UI_I_WizardStep[]
328
+ ): Promise<UI_I_ValidationReturn> => {
329
+ let stepHasError = false
330
+
331
+ return new Promise((resolve) => {
332
+ storageSubmit.value = (isValid: boolean) => {
333
+ if (!isValid) {
334
+ stepHasError = wizard.setValidation(
335
+ dynamicSteps.value.selectStorage,
336
+ 'storage',
337
+ {
338
+ fieldMessage: 'aaa',
339
+ alertMessage: 'aaa',
340
+ }
341
+ )
342
+ } else if (
343
+ wizard.hasMessage(dynamicSteps.value.selectStorage, 'storage')
344
+ ) {
345
+ value = wizard.removeValidation(
346
+ dynamicSteps.value.selectStorage,
347
+ 'storage',
348
+ value
349
+ )
350
+ }
351
+
352
+ resolve({
353
+ stepHasError,
354
+ newValue: value,
355
+ })
356
+ storageSubmit.value = null
357
+ }
358
+ })
359
+ }
360
+ const checkCustomizeHardware = async (
361
+ value: UI_I_WizardStep[]
362
+ ): Promise<UI_I_ValidationReturn> => {
363
+ let stepHasError = false
364
+
365
+ return new Promise((resolve) => {
366
+ customizeHardwareSubmit.value = (isValid: boolean) => {
367
+ if (!isValid) {
368
+ stepHasError = wizard.setValidation(
369
+ dynamicSteps.value.customizeHardware,
370
+ 'customizeHardware',
371
+ {
372
+ fieldMessage: 'aaa',
373
+ alertMessage: 'aaa',
374
+ }
375
+ )
376
+ } else if (
377
+ wizard.hasMessage(
378
+ dynamicSteps.value.customizeHardware,
379
+ 'customizeHardware'
380
+ )
381
+ ) {
382
+ value = wizard.removeValidation(
383
+ dynamicSteps.value.customizeHardware,
384
+ 'customizeHardware',
385
+ value
386
+ )
387
+ }
388
+
389
+ resolve({
390
+ stepHasError,
391
+ newValue: value,
392
+ })
393
+ storageSubmit.value = null
394
+ }
395
+ })
396
+ }
397
+
398
+ const storageIdCash = ref<string | null>(null)
399
+ const onChangeName = (name: string): void => {
400
+ vmSettingsLocal.value && (vmSettingsLocal.value.name = name)
401
+ }
402
+ const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
403
+ if (!storage) return
404
+
405
+ vmSettingsLocal.value && (vmSettingsLocal.value.storage = storage)
406
+ storageIdCash.value = storage.id
407
+ }
408
+ const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
409
+ const onChangeCustomizeHardware = (
410
+ data: UI_I_SendDataCustomizeHardware
411
+ ): void => {
412
+ customizeHardware.value = data
413
+ }
414
+
415
+ const virtualHardwareHardDisksLocal = computed<
416
+ UI_I_SendDataNewHardDisk[] | null
417
+ >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
418
+ const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
419
+ () => customizeHardware.value?.virtualHardware?.networks || null
420
+ )
421
+ const virtualHardwareCdDvdDrivesLocal = computed<
422
+ UI_I_SendDataNewCdDvdDrive[] | null
423
+ >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
424
+
425
+ const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
426
+ () => customizeHardware.value?.virtualHardware?.cpu || null
427
+ )
428
+ const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
429
+ () => customizeHardware.value?.virtualHardware?.memory || null
430
+ )
431
+ const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
432
+ const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
433
+ null
434
+ )
435
+ const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
436
+ const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
437
+ virtualHardwareHardDisks.value = data[0]
438
+ virtualHardwareCdDvdDrives.value = data[1]
439
+ virtualHardwareNetworks.value = data[2]
440
+ }
441
+
442
+ const isPowerOnByDefault = ref<boolean>(true)
443
+
444
+ watch(
445
+ () => props.vmNameInWizard,
446
+ (newValue) => {
447
+ vmSettingsLocal.value && (vmSettingsLocal.value.name = newValue)
448
+ }
449
+ )
450
+
451
+ const validateSendData = async (
452
+ value: UI_I_WizardStep[]
453
+ ): Promise<UI_I_ValidationReturn> => {
454
+ wizard.setLoader(true)
455
+ let stepHasError = false
456
+
457
+ const data = await props.validateSendDataFunc(
458
+ vmSettingsLocal.value,
459
+ virtualHardwareCpu.value,
460
+ virtualHardwareMemory.value,
461
+ customizeHardware.value,
462
+ virtualHardwareNetworks.value,
463
+ virtualHardwareHardDisks.value,
464
+ virtualHardwareCdDvdDrives.value,
465
+ isPowerOnByDefault.value,
466
+ localization.value
467
+ )
468
+
469
+ wizard.setLoader(false)
470
+ if (data) {
471
+ stepHasError = true
472
+ selectedNavItem.value = data[0]
473
+ }
474
+
475
+ return {
476
+ stepHasError,
477
+ newValue: value,
478
+ }
479
+ }
480
+ const onFinish = (): void => {
481
+ wizard.setLoader(false)
482
+ props
483
+ .finishFunc(
484
+ vmSettingsLocal.value,
485
+ virtualHardwareCpu.value,
486
+ virtualHardwareMemory.value,
487
+ customizeHardware.value,
488
+ virtualHardwareNetworks.value,
489
+ virtualHardwareHardDisks.value,
490
+ virtualHardwareCdDvdDrives.value,
491
+ isPowerOnByDefault.value,
492
+ localization.value,
493
+ false,
494
+ newTaskForm.value,
495
+ props.schedulerTask
496
+ )
497
+ .then(() => {
498
+ onHideModal()
499
+ wizard.setLoader(false)
500
+ })
501
+ }
502
+
503
+ const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
504
+
505
+ const nameFormSubmit = ref<null | Function>(null)
506
+ const storageSubmit = ref<null | Function>(null)
507
+ const selectOptionsSubmit = ref<number>(0)
508
+ const customizeHardwareSubmit = ref<null | Function>(null)
509
+
510
+ const vmSettingsLocal = computed<UI_I_VmSettings | null>(() => props.vmSettings)
511
+ const vmName = ref<string>(vmSettingsLocal.value?.name || '')
512
+ watch(vmSettingsLocal, (newValue) => {
513
+ vmName.value = newValue?.name || ''
514
+ })
515
+
516
+ const onHideModal = (): void => {
517
+ emits('hide')
518
+ }
519
+ </script>
520
+
521
+ <style scoped lang="scss">
522
+ :deep(.has-solid.close-icon.clr-icon) {
523
+ width: 20px;
524
+ top: 0;
525
+ }
526
+ .vm-context {
527
+ padding: 16px 15px 10px 10px;
528
+ height: 100%;
529
+ display: flex;
530
+ flex-direction: column;
531
+
532
+ .context-title-wrap {
533
+ padding-bottom: 3px;
534
+ border-bottom: 1px solid #a6a6a6;
535
+
536
+ h4 {
537
+ font-weight: 700;
538
+ font-size: 13px;
539
+ color: var(--vm-context-title);
540
+ }
541
+ p {
542
+ font-weight: 400;
543
+ font-size: 13px;
544
+ color: var(--vm-context-sub-title);
545
+ }
546
+ }
547
+
548
+ .finish-block {
549
+ padding: 18px 24px 24px 24px;
550
+
551
+ .add-hosts-ready-to-complete-mt-12 {
552
+ margin-top: 12px;
553
+
554
+ .add-hosts-ready-to-complete-bold {
555
+ line-height: 18px;
556
+ font-weight: 700;
557
+ }
558
+ }
559
+ }
560
+
561
+ .vm-hardware-version {
562
+ align-self: flex-end;
563
+ margin-top: auto;
564
+ }
565
+ }
566
+
567
+ :deep(.modal .modal-dialog .modal-content .modal-footer) {
568
+ flex: unset;
569
+ height: unset;
570
+ min-height: unset;
571
+ }
572
+ :deep(.wizard-modal-titlebar h3) {
573
+ color: #000;
574
+ font-size: 24px;
575
+ font-weight: 200;
576
+ line-height: 27px;
577
+ margin: 0;
578
+ padding: 0;
579
+ }
580
+ :deep(.clr-wizard-stepnav-item) {
581
+ padding-left: 0;
582
+ }
583
+ :deep(.clr-wizard-stepnav
584
+ .clr-wizard-stepnav-item
585
+ button
586
+ .clr-wizard-stepnav-link-title) {
587
+ width: 189px;
588
+ font-weight: 700;
589
+ font-size: 13px;
590
+ }
591
+
592
+ #vm-wizard-notification {
593
+ h3 {
594
+ color: var(--global-font-color7);
595
+ margin-top: 6px;
596
+ }
597
+ p {
598
+ color: var(--global-font-color6);
599
+ line-height: 16px;
600
+ }
601
+ }
602
+
603
+ .power-on-by-default-wrap {
604
+ display: flex;
605
+ align-items: center;
606
+
607
+ input {
608
+ margin-right: 6px;
609
+ }
610
+ }
611
+
612
+ .new-task-form {
613
+ padding: 0 25px 0 5px;
614
+ }
615
+ </style>
616
+
617
+ <style>
618
+ :root {
619
+ --vm-context-title: #333;
620
+ --vm-context-sub-title: #000;
621
+ }
622
+ :root.dark-theme {
623
+ --vm-context-title: #adbbc4;
624
+ --vm-context-sub-title: #adbbc4;
625
+ }
626
+ </style>