bfg-common 1.5.496 → 1.5.497

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 (117) 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 +7 -1
  7. package/assets/localization/local_en.json +10 -4
  8. package/assets/localization/local_hy.json +7 -1
  9. package/assets/localization/local_kk.json +7 -1
  10. package/assets/localization/local_ru.json +10 -4
  11. package/assets/localization/local_zh.json +7 -1
  12. package/components/atoms/TheIcon3.vue +50 -50
  13. package/components/atoms/collapse/CollapseNav.vue +170 -170
  14. package/components/atoms/perPage/PerPage.vue +58 -58
  15. package/components/atoms/table/dataGrid/DataGridPagination.vue +97 -97
  16. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  17. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  18. package/components/common/backup/storage/actions/add/Add.vue +251 -251
  19. package/components/common/backup/storage/actions/add/lib/utils.ts +62 -62
  20. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  21. package/components/common/diagramMain/modals/lib/config/portModal.ts +251 -251
  22. package/components/common/diagramMain/modals/lib/config/vCenterModal.ts +48 -48
  23. package/components/common/diagramMain/port/Port.vue +580 -580
  24. package/components/common/layout/theHeader/helpMenu/About.vue +79 -79
  25. package/components/common/layout/theHeader/helpMenu/aboutOld/AboutOld.vue +79 -79
  26. package/components/common/modals/confirmation/Confirmation.vue +3 -0
  27. package/components/common/modals/confirmation/ConfirmationNew.vue +3 -1
  28. package/components/common/pages/backups/DetailView.vue +52 -52
  29. package/components/common/pages/backups/lib/models/interfaces.ts +36 -36
  30. package/components/common/pages/backups/modals/Modals.vue +243 -243
  31. package/components/common/pages/backups/modals/createBackup/configuration/Configuration.vue +29 -29
  32. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/config/options.ts +6 -6
  33. package/components/common/pages/backups/modals/createBackup/datastores/tableView/TableView.vue +95 -95
  34. package/components/common/pages/backups/modals/createBackup/general/General.vue +141 -141
  35. package/components/common/pages/backups/modals/createBackup/lib/config/strategyOptions.ts +12 -12
  36. package/components/common/pages/backups/modals/lib/config/restore.ts +115 -115
  37. package/components/common/pages/backups/modals/lib/models/interfaces.ts +186 -186
  38. package/components/common/pages/backups/modals/restore/disks/Disks.vue +27 -27
  39. package/components/common/pages/backups/modals/restore/disks/tableView/lib/config/table.ts +117 -117
  40. package/components/common/pages/backups/modals/restore/name/Name.vue +166 -166
  41. package/components/common/pages/backups/modals/restore/name/lib/models/interfaces.ts +6 -6
  42. package/components/common/pages/backups/modals/restore/networks/Networks.vue +67 -67
  43. package/components/common/pages/backups/modals/restore/networks/table/Table.vue +214 -214
  44. package/components/common/pages/backups/modals/restore/types/lib/config/typeOptions.ts +25 -25
  45. package/components/common/pages/backups/tools/Tools.vue +75 -75
  46. package/components/common/pages/backups/tools/lib/config/tabs.ts +36 -36
  47. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  48. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  49. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  50. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  51. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  52. package/components/common/pages/scheduledTasks/lib/utils/utils.ts +84 -84
  53. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  54. package/components/common/select/radio/RadioGroup.vue +137 -137
  55. package/components/common/spiceConsole/Drawer.vue +392 -392
  56. package/components/common/spiceConsole/SpiceConsole.vue +184 -184
  57. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  58. package/components/common/tools/Actions.vue +207 -207
  59. package/components/common/treeView/TreeView.vue +52 -52
  60. package/components/common/vm/actions/add/Add.vue +874 -877
  61. package/components/common/vm/actions/add/New.vue +2 -6
  62. package/components/common/vm/actions/add/Old.vue +2 -6
  63. package/components/common/vm/actions/add/folderTreeView/FolderTreeView.vue +72 -72
  64. package/components/common/vm/actions/add/folderTreeView/New.vue +40 -40
  65. package/components/common/vm/actions/add/lib/config/steps.ts +347 -347
  66. package/components/common/vm/actions/clone/Clone.vue +2 -2
  67. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +368 -368
  68. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  69. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  70. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/Location.vue +154 -154
  71. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/Table.vue +99 -99
  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/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  74. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  75. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/numberDisplays/NumberDisplays.vue +53 -53
  76. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +32 -32
  77. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +60 -60
  78. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +174 -174
  79. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  80. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  81. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  82. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  83. package/components/common/vm/actions/common/select/computeResource/ComputeResource.vue +143 -143
  84. package/components/common/vm/actions/common/select/computeResource/New.vue +184 -184
  85. package/components/common/vm/actions/common/select/computeResource/treeView/TreeView.vue +131 -131
  86. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -38
  87. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  88. package/components/common/vm/actions/common/select/name/Name.vue +188 -200
  89. package/components/common/vm/actions/common/select/name/Old.vue +130 -130
  90. package/components/common/vm/actions/common/select/os/Old.vue +152 -152
  91. package/components/common/vm/actions/common/select/os/Os.vue +139 -139
  92. package/components/common/vm/actions/common/select/storage/new/New.vue +320 -320
  93. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  94. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  95. package/components/common/vm/actions/common/select/template/old/Old.vue +50 -50
  96. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  97. package/components/common/vm/actions/register/Register.vue +263 -267
  98. package/components/common/vm/actions/register/lib/config/steps.ts +86 -86
  99. package/components/common/wizards/datastore/add/Add.vue +228 -228
  100. package/components/common/wizards/datastore/add/lib/utils.ts +93 -93
  101. package/components/common/wizards/datastore/add/steps/typeMode/lib/config/typeOptions.ts +43 -43
  102. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  103. package/composables/useAppVersion.ts +21 -21
  104. package/composables/useLocal.ts +6 -6
  105. package/composables/useLocalCommon.ts +39 -39
  106. package/package.json +2 -2
  107. package/plugins/date.ts +233 -233
  108. package/plugins/panelStates.ts +70 -70
  109. package/plugins/text.ts +59 -59
  110. package/public/spice-console/lib/images/bitmap.js +203 -203
  111. package/public/spice-console/network/spicechannel.js +440 -440
  112. package/public/spice-console/run.js +210 -210
  113. package/store/main/mutations.ts +7 -7
  114. package/store/main/state.ts +7 -7
  115. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +0 -644
  116. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +0 -118
  117. package/components/common/vm/actions/clone/toTemplate/lib/models/interfaces.ts +0 -14
@@ -1,877 +1,874 @@
1
- <template>
2
- <common-vm-actions-add-new
3
- v-if="isNewView"
4
- v-model:vm-form="vmForm"
5
- v-model:selected-create-type="selectedCreateType"
6
- v-model:is-power-on-by-default="isPowerOnByDefault"
7
- :project="props.project"
8
- :is-vmt="props.isVmt"
9
- :nodes="props.nodes"
10
- :files="props.files"
11
- :networks-table="props.networksTable"
12
- :datastore="props.datastore"
13
- :is-datastore-loading="props.isDatastoreLoading"
14
- :error-validation-fields="props.errorValidationFields"
15
- :ready-complete-table-info="props.readyCompleteTableInfo"
16
- :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
17
- :import-from-v-m-warev-sphere="props.importFromVMWarevSphere"
18
- :get-datastore-table-func="props.getDatastoreTableFunc"
19
- :passthrough-devices="props.passthroughDevices"
20
- :mediated-devices="props.mediatedDevices"
21
- :templates-tree="props.templatesTree"
22
- :wizard="wizard"
23
- :selected-scheme="selectedScheme"
24
- :template-submit="templateSubmit"
25
- :name-form-submit="nameFormSubmit"
26
- :storage-submit="storageSubmit"
27
- :customize-hardware-submit="customizeHardwareSubmit"
28
- :customize-hardware-for-template-submit="customizeHardwareForTemplateSubmit"
29
- :is-sphere="isSphere"
30
- :compatibility="compatibility"
31
- :guestOsFamilies="guestOsFamilies"
32
- :guestOsVersions="guestOsVersions"
33
- :machineTypes="machineTypes"
34
- :virtual-hardware-hard-disks-local="virtualHardwareHardDisksLocal"
35
- :virtual-hardware-cd-dvd-drives-local="virtualHardwareCdDvdDrivesLocal"
36
- :virtual-hardware-networks-local="virtualHardwareNetworksLocal"
37
- :max-cpus="maxCpus"
38
- :max-memory="maxMemory"
39
- :cpu-models="cpuModels"
40
- :selected-nav-item="selectedNavItem"
41
- :compatibility-info="compatibilityInfo"
42
- :is-show-power-on="isShowPowerOn"
43
- :is-show-select-template="isShowSelectTemplate"
44
- :compute-resource-submit="computeResourceSubmit"
45
- :data-center="props.dataCenter"
46
- :compute-resource="props.computeResource"
47
- :compute-resource-tree="props.computeResourceTree"
48
- :vmt-settings="props.vmtSettings"
49
- :is-loading="isLoading"
50
- :selected-template-id="props.selectedTemplateId"
51
- :validate-empty-name="props.validateEmptyName"
52
- :title="title"
53
- @check-name="emits('check-name', $event)"
54
- @get-storage="emits('get-storage', $event)"
55
- @get-folders-or-files="emits('get-folders-or-files', $event)"
56
- @get-active-device-child="emits('get-active-device-child', $event)"
57
- @show-datastore-child="emits('show-datastore-child', $event)"
58
- @remove-error-by-title="emits('remove-error-by-title', $event)"
59
- @get-networks-table="emits('get-networks-table', $event)"
60
- @get-pci-devices="emits('get-pci-devices')"
61
- @change-steps="onChangeSteps"
62
- @change-template="onChangeTemplate"
63
- @change-name="onChangeName(...$event)"
64
- @change-storage="onChangeStorage"
65
- @change-select-options="onChangeSelectOptions"
66
- @change-compatibility="onChangeCompatibility"
67
- @change-boot-order="onChangeBootOrder"
68
- @change-customize-hardware="onChangeCustomizeHardware"
69
- @clear-compute-resource-tree="emits('clear-compute-resource-tree')"
70
- @change-compute-resource="onChangeComputeResource"
71
- @select-compute-resource-tree="onSelectComputeResourceTree"
72
- @get-compute-resource-tree="emits('get-compute-resource-tree', $event)"
73
- @show-compute-resource-tree="emits('show-compute-resource-tree', $event)"
74
- @finish="onFinish"
75
- @hide="onHideModal"
76
- />
77
- <common-vm-actions-add-old
78
- v-else
79
- v-model:vm-form="vmForm"
80
- v-model:selected-create-type="selectedCreateType"
81
- v-model:is-power-on-by-default="isPowerOnByDefault"
82
- :project="props.project"
83
- :is-vmt="props.isVmt"
84
- :nodes="props.nodes"
85
- :files="props.files"
86
- :networks-table="props.networksTable"
87
- :datastore="props.datastore"
88
- :is-datastore-loading="props.isDatastoreLoading"
89
- :error-validation-fields="props.errorValidationFields"
90
- :ready-complete-table-info="props.readyCompleteTableInfo"
91
- :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
92
- :import-from-v-m-warev-sphere="props.importFromVMWarevSphere"
93
- :get-datastore-table-func="props.getDatastoreTableFunc"
94
- :passthrough-devices="props.passthroughDevices"
95
- :mediated-devices="props.mediatedDevices"
96
- :templates-tree="props.templatesTree"
97
- :wizard="wizard"
98
- :selected-scheme="selectedScheme"
99
- :template-submit="templateSubmit"
100
- :name-form-submit="nameFormSubmit"
101
- :storage-submit="storageSubmit"
102
- :customize-hardware-submit="customizeHardwareSubmit"
103
- :customize-hardware-for-template-submit="customizeHardwareForTemplateSubmit"
104
- :is-sphere="isSphere"
105
- :compatibility="compatibility"
106
- :guestOsFamilies="guestOsFamilies"
107
- :guestOsVersions="guestOsVersions"
108
- :machineTypes="machineTypes"
109
- :virtual-hardware-hard-disks-local="virtualHardwareHardDisksLocal"
110
- :virtual-hardware-cd-dvd-drives-local="virtualHardwareCdDvdDrivesLocal"
111
- :virtual-hardware-networks-local="virtualHardwareNetworksLocal"
112
- :max-cpus="maxCpus"
113
- :max-memory="maxMemory"
114
- :cpu-models="cpuModels"
115
- :selected-nav-item="selectedNavItem"
116
- :compatibility-info="compatibilityInfo"
117
- :is-show-power-on="isShowPowerOn"
118
- :compute-resource-submit="computeResourceSubmit"
119
- :data-center="props.dataCenter"
120
- :compute-resource="props.computeResource"
121
- :compute-resource-tree="props.computeResourceTree"
122
- :vmt-settings="props.vmtSettings"
123
- :is-loading="isLoading"
124
- :validate-empty-name="props.validateEmptyName"
125
- :title="title"
126
- @check-name="emits('check-name', $event)"
127
- @get-storage="emits('get-storage', $event)"
128
- @get-folders-or-files="emits('get-folders-or-files', $event)"
129
- @get-active-device-child="emits('get-active-device-child', $event)"
130
- @show-datastore-child="emits('show-datastore-child', $event)"
131
- @remove-error-by-title="emits('remove-error-by-title', $event)"
132
- @get-networks-table="emits('get-networks-table', $event)"
133
- @get-pci-devices="emits('get-pci-devices')"
134
- @change-steps="onChangeSteps"
135
- @change-template="onChangeTemplate"
136
- @change-name="onChangeName(...$event)"
137
- @change-storage="onChangeStorage"
138
- @change-select-options="onChangeSelectOptions"
139
- @change-compatibility="onChangeCompatibility"
140
- @change-boot-order="onChangeBootOrder"
141
- @change-customize-hardware="onChangeCustomizeHardware"
142
- @clear-compute-resource-tree="emits('clear-compute-resource-tree')"
143
- @change-compute-resource="onChangeComputeResource"
144
- @select-compute-resource-tree="onSelectComputeResourceTree"
145
- @get-compute-resource-tree="emits('get-compute-resource-tree', $event)"
146
- @show-compute-resource-tree="emits('show-compute-resource-tree', $event)"
147
- @finish="onFinish"
148
- @hide="onHideModal"
149
- />
150
- </template>
151
-
152
- <script setup lang="ts">
153
- import type {
154
- UI_I_ValidationReturn,
155
- UI_I_WizardStep,
156
- } from '~/node_modules/bfg-uikit/components/ui/wizard/lib/models/interfaces'
157
- import Wizard from '~/node_modules/bfg-uikit/components/ui/wizard/lib/utils/utils'
158
- import type {
159
- UI_I_Localization,
160
- UI_I_ArbitraryObject,
161
- } from '~/lib/models/interfaces'
162
- import type { UI_T_Project } from '~/lib/models/types'
163
- import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
164
- import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
165
- import type {
166
- UI_I_DatastoreTableItem,
167
- UI_I_FolderOrFileTreePayload,
168
- } from '~/lib/models/store/storage/interfaces'
169
- import type {
170
- // API_UI_I_Error,
171
- UI_I_ErrorValidationField,
172
- } from '~/lib/models/store/interfaces'
173
- import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
174
- import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
175
- import type {
176
- UI_T_AddVmFinishFunc,
177
- UI_T_SelectedNavItem,
178
- } from '~/components/common/vm/actions/common/lib/models/types'
179
- import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
180
- import type {
181
- UI_I_Capabilities,
182
- UI_I_VmForm,
183
- UI_I_VmFormCash,
184
- } from '~/components/common/vm/actions/common/lib/models/interfaces'
185
- import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
186
- import type {
187
- UI_I_SendDataCpu,
188
- UI_I_SendDataMemory,
189
- UI_I_SendDataNewCdDvdDrive,
190
- UI_I_SendDataNewHardDisk,
191
- UI_I_SendDataNewNetwork,
192
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
193
- import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
194
- import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
195
- import type {
196
- UI_I_MediatedDevice,
197
- UI_I_PciDevice,
198
- UI_I_VmSettings,
199
- } from '~/lib/models/store/vm/interfaces'
200
- import { capabilities } from '~/components/common/vm/actions/common/lib/config/capabilities'
201
- import {
202
- stepsSchemeInitial,
203
- stepsFunc,
204
- dynamicSteps,
205
- } from '~/components/common/vm/actions/add/lib/config/steps'
206
- import { mapCapabilities } from '~/components/common/vm/actions/common/lib/utils/capabilities'
207
-
208
- const props = withDefaults(
209
- defineProps<{
210
- project: UI_T_Project
211
- nodes: UI_I_FileTreeNode[]
212
- files: UI_I_FileTreeNode[]
213
- networksTable: UI_I_NetworkTableItem[]
214
- datastore: UI_I_DatastoreTableItem[]
215
- isDatastoreLoading: boolean
216
- errorValidationFields: UI_I_ErrorValidationField[]
217
- readyCompleteTableInfo: UI_I_TableInfoItem[]
218
- vmCpuHelpTextSecond: string
219
- importFromVMWarevSphere: string
220
- finishFunc: UI_T_AddVmFinishFunc
221
- getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
222
- validateSendDataFunc: UI_T_AddVmFinishFunc<
223
- [UI_T_SelectedNavItem, null | number] | null
224
- >
225
- passthroughDevices: UI_I_PciDevice[]
226
- mediatedDevices: UI_I_MediatedDevice[]
227
- vmNameInWizard: string
228
- templatesTree?: UI_I_TreeNode[]
229
- capabilities?: UI_I_Capabilities
230
- vmtSettings?: UI_I_VmSettings | null
231
- validateEmptyName?: boolean
232
- dataCenter?: UI_I_TreeNode // для сферы
233
- computeResource?: UI_I_TreeNode // для сферы
234
- computeResourceTree?: UI_I_TreeNode[] // для сферы
235
- selectedTemplateId?: string // для сферы
236
- isVmt?: boolean // для сферы
237
- }>(),
238
- {
239
- templatesTree: [],
240
- capabilities: undefined,
241
- vmtSettings: undefined,
242
- validateEmptyName: false,
243
- dataCenter: undefined,
244
- computeResource: undefined,
245
- computeResourceTree: undefined,
246
- selectedTemplateId: '',
247
- isVmt: false,
248
- }
249
- )
250
-
251
- const emits = defineEmits<{
252
- (
253
- event: 'check-name',
254
- value: [[string, UI_I_TreeNode | null], (error: any) => void]
255
- ): void
256
- (event: 'get-storage', value: UI_I_TablePayload): void
257
- (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
258
- (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
259
- (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
260
- (event: 'remove-error-by-title', value: string): void
261
- (event: 'get-networks-table', value: UI_I_TablePayload): void
262
- (event: 'get-pci-devices'): void
263
- (event: 'get-pci-devices'): void
264
- (event: 'hide'): void
265
- (event: 'select-template', value: string): void
266
- (
267
- event: 'get-compute-resource-tree',
268
- value: { id: string | number; cb: () => void }
269
- ): void // для сферы
270
- (event: 'show-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
271
- (event: 'select-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
272
- (event: 'clear-compute-resource-tree'): void // для сферы
273
- }>()
274
-
275
- const { $store, $recursion }: any = useNuxtApp()
276
- const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
277
-
278
- const localization = computed<UI_I_Localization>(() => useLocal())
279
-
280
- const isSphere = computed<boolean>(() => props.project === 'sphere')
281
-
282
- const title = computed<string>(() =>
283
- props.isVmt
284
- ? localization.value.vmt.newTemplate
285
- : localization.value.common.newVirtualMachine2
286
- )
287
-
288
- watch(
289
- () => props.capabilities,
290
- () => {
291
- if (props.capabilities) mapCapabilities(props.capabilities)
292
- },
293
- { deep: true, immediate: true }
294
- )
295
-
296
- const selectedCreateType = ref<string>('0')
297
- if (props.isVmt) selectedCreateType.value = '-1'
298
-
299
- const wizard: Wizard = new Wizard(
300
- stepsFunc(localization.value, props.isVmt, isSphere.value),
301
- stepsSchemeInitial
302
- )
303
- watch(
304
- selectedCreateType,
305
- (newValue) => {
306
- switch (newValue) {
307
- case '0':
308
- wizard.changeScheme(isSphere.value ? 1 : 0)
309
- break
310
- case '1':
311
- wizard.changeScheme(isSphere.value ? 6 : 2)
312
- break
313
- case '-1':
314
- wizard.changeScheme(isSphere.value ? 11 : 10)
315
- break
316
- }
317
- },
318
- { immediate: true }
319
- )
320
-
321
- // if (isSphere.value) wizard.changeScheme(1)
322
- const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
323
- // const alertMessages = computed<string[][]>(() => wizard.alertMessages.value)
324
-
325
- const isShowSelectTemplate = computed<boolean>(
326
- () =>
327
- wizard.selectedStepId === dynamicSteps.selectTemplate &&
328
- selectedCreateType.value === '1'
329
- )
330
-
331
- const isShowPowerOn = computed<boolean>(
332
- () =>
333
- wizard.selectedStepId > dynamicSteps.customizeHardware &&
334
- selectedCreateType.value !== '1' &&
335
- !props.isVmt
336
- )
337
-
338
- const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
339
- wizard.changeSteps(value, validationFunc, validateSendData)
340
- }
341
- const validationFunc = async (
342
- value: UI_I_WizardStep[],
343
- currentStep: UI_I_WizardStep,
344
- nextStep: UI_I_WizardStep
345
- ): Promise<UI_I_ValidationReturn> => {
346
- let stepHasError = false
347
- let stepShouldStop = {
348
- ifOnCurrentStep: false,
349
- ifFromAnyStep: false,
350
- stoppageStepId: -1,
351
- }
352
-
353
- wizard.setLoader(true)
354
- if (
355
- wizard.isValidateForStep(
356
- dynamicSteps.selectTemplate,
357
- currentStep.id,
358
- nextStep.id
359
- )
360
- ) {
361
- const templateValidation = await checkTemplate(value)
362
-
363
- value = templateValidation.newValue
364
- stepHasError = stepHasError || templateValidation.stepHasError
365
- } else if (
366
- wizard.isValidateForStep(
367
- isSphere.value ? dynamicSteps.selectNameFolder : dynamicSteps.selectName,
368
- currentStep.id,
369
- nextStep.id
370
- )
371
- ) {
372
- const nameValidation = await onCheckName(value)
373
-
374
- value = nameValidation.newValue
375
- stepHasError = stepHasError || nameValidation.stepHasError
376
- } else if (
377
- isSphere.value &&
378
- wizard.isValidateForStep(
379
- dynamicSteps.selectComputeResource,
380
- currentStep.id,
381
- nextStep.id
382
- )
383
- ) {
384
- const computeResourceValidation = await checkComputeResource(value)
385
-
386
- value = computeResourceValidation.newValue
387
- stepHasError = stepHasError || computeResourceValidation.stepHasError
388
- } else if (
389
- wizard.isValidateForStep(
390
- dynamicSteps.selectStorage,
391
- currentStep.id,
392
- nextStep.id
393
- )
394
- ) {
395
- const storageValidation = await checkStorage(value)
396
-
397
- value = storageValidation.newValue
398
-
399
- stepHasError = stepHasError || storageValidation.stepHasError
400
- } else if (
401
- wizard.isValidateForStep(
402
- dynamicSteps.customizeHardware,
403
- currentStep.id,
404
- nextStep.id
405
- )
406
- ) {
407
- const validation = await checkCustomizeHardware(value)
408
-
409
- value = validation.newValue
410
-
411
- stepHasError = stepHasError || validation.stepHasError
412
- } else if (
413
- wizard.isValidateForStep(
414
- dynamicSteps.customizeHardwareTemplate,
415
- currentStep.id,
416
- nextStep.id
417
- )
418
- ) {
419
- const validation = await checkCustomizeHardwareForTemplate(value)
420
-
421
- value = validation.newValue
422
-
423
- stepHasError = stepHasError || validation.stepHasError
424
- }
425
- wizard.setLoader(false)
426
-
427
- return {
428
- newValue: value,
429
- stepHasError,
430
- stepShouldStop,
431
- }
432
- }
433
-
434
- const checkTemplate = async (
435
- value: UI_I_WizardStep[]
436
- ): Promise<UI_I_ValidationReturn> => {
437
- let stepHasError = false
438
-
439
- return new Promise((resolve) => {
440
- templateSubmit.value = (isValid: boolean) => {
441
- if (!isValid) {
442
- stepHasError = wizard.setValidation(
443
- dynamicSteps.selectTemplate,
444
- 'template',
445
- {
446
- fieldMessage: 'aaa',
447
- alertMessage: 'aaa',
448
- }
449
- )
450
- } else if (wizard.hasMessage(dynamicSteps.selectTemplate, 'template')) {
451
- value = wizard.removeValidation(
452
- dynamicSteps.selectTemplate,
453
- 'template',
454
- value
455
- )
456
- }
457
-
458
- resolve({
459
- stepHasError,
460
- newValue: value,
461
- })
462
- templateSubmit.value = null
463
- }
464
- })
465
- }
466
- const onCheckName = async (
467
- value: UI_I_WizardStep[]
468
- ): Promise<UI_I_ValidationReturn> => {
469
- let stepHasError = false
470
-
471
- return new Promise((resolve) => {
472
- const step = isSphere.value
473
- ? dynamicSteps.selectNameFolder
474
- : dynamicSteps.selectName
475
- nameFormSubmit.value = (isValid: boolean) => {
476
- if (!isValid) {
477
- stepHasError = wizard.setValidation(step, 'name', {
478
- fieldMessage: 'aaa',
479
- alertMessage: 'aaa',
480
- })
481
- } else if (wizard.hasMessage(step, 'name')) {
482
- value = wizard.removeValidation(step, 'name', value)
483
- }
484
-
485
- resolve({
486
- stepHasError,
487
- newValue: value,
488
- })
489
- nameFormSubmit.value = null
490
- }
491
- })
492
- }
493
- const checkComputeResource = async (
494
- value: UI_I_WizardStep[]
495
- ): Promise<UI_I_ValidationReturn> => {
496
- let stepHasError = false
497
-
498
- return new Promise((resolve) => {
499
- computeResourceSubmit.value = (isValid: boolean) => {
500
- if (!isValid) {
501
- stepHasError = wizard.setValidation(
502
- dynamicSteps.selectComputeResource,
503
- 'computeResource',
504
- {
505
- fieldMessage: 'aaa',
506
- alertMessage: 'aaa',
507
- }
508
- )
509
- } else if (
510
- wizard.hasMessage(dynamicSteps.selectComputeResource, 'computeResource')
511
- ) {
512
- value = wizard.removeValidation(
513
- dynamicSteps.selectComputeResource,
514
- 'computeResource',
515
- value
516
- )
517
- }
518
-
519
- resolve({
520
- stepHasError,
521
- newValue: value,
522
- })
523
- computeResourceSubmit.value = null
524
- }
525
- })
526
- }
527
- const checkStorage = async (
528
- value: UI_I_WizardStep[]
529
- ): Promise<UI_I_ValidationReturn> => {
530
- let stepHasError = false
531
-
532
- return new Promise((resolve) => {
533
- storageSubmit.value = (isValid: boolean) => {
534
- if (!isValid) {
535
- stepHasError = wizard.setValidation(
536
- dynamicSteps.selectStorage,
537
- 'storage',
538
- {
539
- fieldMessage: 'aaa',
540
- alertMessage: 'aaa',
541
- }
542
- )
543
- } else if (wizard.hasMessage(dynamicSteps.selectStorage, 'storage')) {
544
- value = wizard.removeValidation(
545
- dynamicSteps.selectStorage,
546
- 'storage',
547
- value
548
- )
549
- }
550
-
551
- resolve({
552
- stepHasError,
553
- newValue: value,
554
- })
555
- storageSubmit.value = null
556
- }
557
- })
558
- }
559
- const checkCustomizeHardware = async (
560
- value: UI_I_WizardStep[]
561
- ): Promise<UI_I_ValidationReturn> => {
562
- let stepHasError = false
563
- isLoading.value = true
564
-
565
- return new Promise((resolve) => {
566
- customizeHardwareSubmit.value = (isValid: boolean) => {
567
- if (!isValid) {
568
- stepHasError = wizard.setValidation(
569
- dynamicSteps.customizeHardware,
570
- 'customizeHardware',
571
- {
572
- fieldMessage: 'aaa',
573
- alertMessage: 'aaa',
574
- }
575
- )
576
- } else if (
577
- wizard.hasMessage(dynamicSteps.customizeHardware, 'customizeHardware')
578
- ) {
579
- wizard.removeValidationLocal(
580
- dynamicSteps.customizeHardware,
581
- 'customizeHardware'
582
- )
583
- value = wizard.removeValidation(
584
- dynamicSteps.customizeHardware,
585
- 'customizeHardware',
586
- value
587
- )
588
- }
589
-
590
- resolve({
591
- stepHasError,
592
- newValue: value,
593
- })
594
- storageSubmit.value = null
595
- isLoading.value = false
596
- }
597
- })
598
- }
599
- const checkCustomizeHardwareForTemplate = async (
600
- value: UI_I_WizardStep[]
601
- ): Promise<UI_I_ValidationReturn> => {
602
- let stepHasError = false
603
-
604
- return new Promise((resolve) => {
605
- customizeHardwareForTemplateSubmit.value = (isValid: boolean) => {
606
- if (!isValid) {
607
- stepHasError = wizard.setValidation(
608
- dynamicSteps.customizeHardwareTemplate,
609
- 'customizeHardwareForTemplate',
610
- {
611
- fieldMessage: 'aaa',
612
- alertMessage: 'aaa',
613
- }
614
- )
615
- } else if (
616
- wizard.hasMessage(
617
- dynamicSteps.customizeHardwareTemplate,
618
- 'customizeHardwareForTemplate'
619
- )
620
- ) {
621
- value = wizard.removeValidation(
622
- dynamicSteps.customizeHardwareTemplate,
623
- 'customizeHardwareForTemplate',
624
- value
625
- )
626
- }
627
-
628
- resolve({
629
- stepHasError,
630
- newValue: value,
631
- })
632
- storageSubmit.value = null
633
- }
634
- })
635
- }
636
-
637
- const storageIdCash = ref<string | null>(null)
638
- const vmForm = ref<UI_I_VmForm>({
639
- name: '',
640
- compatibility: '',
641
- guestMachineType: null,
642
- guestOsFamily: null,
643
- guestOsVersion: null,
644
- computeResource: null,
645
- storage: null,
646
- locationPath: '',
647
- dataCenter: null,
648
- })
649
-
650
- // TODO remove (not used)
651
- const vmFormCash = ref<UI_I_VmFormCash>({
652
- dataCenterId: null,
653
- computeResourceTypeAndId: null,
654
- })
655
-
656
- const onChangeName = (name: string, node: UI_I_TreeNode | null): void => {
657
- vmForm.value.name = name
658
- if (isSphere.value) {
659
- vmForm.value.locationPath = node.id
660
- vmForm.value.dataCenter = $recursion.findParentByValue(
661
- node,
662
- 'datacenter',
663
- 'type',
664
- 'parent'
665
- )
666
- vmFormCash.value.dataCenterId = vmForm.value.dataCenter?.id || null
667
- }
668
- }
669
- // // Для сферы
670
- const computeResourcePath = ref<string>('')
671
- const onSelectComputeResourceTree = (node: UI_I_TreeNode): void => {
672
- emits('select-compute-resource-tree', node)
673
- computeResourcePath.value = node.id
674
- }
675
- const onChangeComputeResource = (node: UI_I_TreeNode): void => {
676
- vmForm.value.computeResource = node
677
- // const type = node.type.toUpperCase()
678
- // schedRequirementsTemplate.value = `sched_requirements="(${type}_ID=${node.id})"\\`
679
- vmFormCash.value.computeResourceTypeAndId = `${node.type}${node.id}` || null
680
- }
681
- const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
682
- if (!storage) return
683
-
684
- vmForm.value.storage = storage
685
- storageIdCash.value = storage.id
686
- }
687
- const compatibilityInfo = ref<string>('')
688
- const onChangeCompatibility = (compatibility: UI_I_OptionItem): void => {
689
- vmForm.value.compatibility = compatibility.value
690
-
691
- const version = compatibility.value.split('-')[1]
692
- compatibilityInfo.value = `${localization.value.common.compatibility}: ${compatibility.text} (${localization.value.common.vmVersion} ${version})`
693
- }
694
- const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
695
- const onChangeCustomizeHardware = (
696
- data: UI_I_SendDataCustomizeHardware
697
- ): void => {
698
- customizeHardware.value = data
699
- }
700
-
701
- const virtualHardwareHardDisksLocal = computed<
702
- UI_I_SendDataNewHardDisk[] | null
703
- >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
704
- const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
705
- () => customizeHardware.value?.virtualHardware?.networks || null
706
- )
707
- const virtualHardwareCdDvdDrivesLocal = computed<
708
- UI_I_SendDataNewCdDvdDrive[] | null
709
- >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
710
-
711
- const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
712
- () => customizeHardware.value?.virtualHardware?.cpu || null
713
- )
714
- const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
715
- () => customizeHardware.value?.virtualHardware?.memory || null
716
- )
717
- const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
718
- const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
719
- null
720
- )
721
- const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
722
- const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
723
- virtualHardwareHardDisks.value = data[0]
724
- virtualHardwareCdDvdDrives.value = data[1]
725
- virtualHardwareNetworks.value = data[2]
726
- }
727
-
728
- const isPowerOnByDefault = ref<boolean>(true)
729
-
730
- watch(
731
- () => props.vmNameInWizard,
732
- (newValue) => {
733
- vmForm.value.name = newValue
734
- }
735
- )
736
-
737
- const validateSendData = async (
738
- value: UI_I_WizardStep[]
739
- ): Promise<UI_I_ValidationReturn> => {
740
- wizard.setLoader(true)
741
- let stepHasError = false
742
- isLoading.value = true
743
-
744
- const data = await props.validateSendDataFunc(
745
- vmForm.value,
746
- virtualHardwareCpu.value,
747
- virtualHardwareMemory.value,
748
- customizeHardware.value,
749
- virtualHardwareNetworks.value,
750
- virtualHardwareHardDisks.value,
751
- virtualHardwareCdDvdDrives.value,
752
- isPowerOnByDefault.value,
753
- localization.value,
754
- vmForm.value.locationPath, // для сферы
755
- computeResourcePath.value // для сферы
756
- )
757
-
758
- isLoading.value = false
759
- wizard.setLoader(false)
760
- if (data) {
761
- stepHasError = true
762
- selectedNavItem.value = data[0]
763
- data[1] !== null && wizard.selectStepHard(data[1])
764
- }
765
-
766
- return {
767
- stepHasError,
768
- newValue: value,
769
- }
770
- }
771
-
772
- const isLoading = ref<boolean>(false)
773
- const onFinish = (): void => {
774
- isLoading.value = true
775
- wizard.setLoader(false)
776
- props
777
- .finishFunc(
778
- vmForm.value,
779
- virtualHardwareCpu.value,
780
- virtualHardwareMemory.value,
781
- customizeHardware.value,
782
- virtualHardwareNetworks.value,
783
- virtualHardwareHardDisks.value,
784
- virtualHardwareCdDvdDrives.value,
785
- isPowerOnByDefault.value,
786
- localization.value,
787
- vmForm.value.locationPath, // для сферы
788
- computeResourcePath.value, // для сферы
789
- false,
790
- selectedTemplate.value,
791
- selectedCreateType.value
792
- )
793
- .then(() => {
794
- onHideModal()
795
- wizard.setLoader(false)
796
- isLoading.value = false
797
- })
798
- }
799
-
800
- const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
801
-
802
- const nameFormSubmit = ref<null | Function>(null)
803
- const templateSubmit = ref<null | Function>(null)
804
- const computeResourceSubmit = ref<null | Function>(null)
805
- const storageSubmit = ref<null | Function>(null)
806
- const customizeHardwareSubmit = ref<null | Function>(null)
807
- const customizeHardwareForTemplateSubmit = ref<null | Function>(null)
808
- const compatibility = ref<UI_I_OptionItem[]>(capabilities.value.compatibility)
809
- const guestOsFamilies = ref<UI_I_OptionItem[]>(
810
- capabilities.value.guestOsFamilies
811
- )
812
- const guestOsVersions = ref<UI_I_ArbitraryObject<UI_I_OptionItem[]>>(
813
- capabilities.value.guestOsVersions
814
- )
815
- const machineTypes = ref<UI_I_OptionItem[]>(capabilities.value.machineTypes)
816
- const cpuModels = ref<UI_I_OptionItem[]>(capabilities.value.cpuModels)
817
- const maxCpus = ref<number>(capabilities.value.maxCpus)
818
- const maxMemory = ref<number>(capabilities.value.maxMemory)
819
-
820
- const selectedTemplate = ref<string>('')
821
- const onChangeTemplate = (node: UI_I_TreeNode): void => {
822
- selectedTemplate.value = node.id.toString()
823
- emits('select-template', node.id.toString())
824
- }
825
- const selectedOptions = ref<string[]>([])
826
- const onChangeSelectOptions = (options: string[]) => {
827
- selectedOptions.value = options
828
- if (
829
- options.includes('customize-os') &&
830
- options.includes('customize-hardware')
831
- ) {
832
- wizard.changeScheme(isSphere.value ? 9 : 5)
833
- } else if (options.includes('customize-os')) {
834
- wizard.changeScheme(isSphere.value ? 7 : 3)
835
- } else if (options.includes('customize-hardware')) {
836
- wizard.changeScheme(isSphere.value ? 8 : 4)
837
- } else {
838
- wizard.changeScheme(isSphere.value ? 6 : 2)
839
- }
840
-
841
- isPowerOnByDefault.value = options.includes('power-on')
842
- }
843
-
844
- const onHideModal = (): void => {
845
- emits('hide')
846
- }
847
-
848
- watch(
849
- () => props.vmtSettings,
850
- (newValue) => {
851
- if (newValue) {
852
- vmForm.value.name = newValue.name
853
- vmForm.value.compatibility =
854
- newValue.compatibility || vmForm.value.compatibility
855
- vmForm.value.storage = newValue.storage
856
- if (customizeHardware.value?.virtualHardware) {
857
- customizeHardware.value.virtualHardware.cdDvdDrives =
858
- newValue.cdDvdDrives
859
- customizeHardware.value.virtualHardware.hardDisks = newValue.hardDisks
860
- customizeHardware.value.virtualHardware.networks = newValue.networks
861
- customizeHardware.value.virtualHardware.cpu = newValue.cpu
862
- customizeHardware.value.virtualHardware.memory = newValue.memory
863
- customizeHardware.value.virtualHardware.videoCard = newValue.videoCard
864
- customizeHardware.value.virtualHardware.usbController =
865
- newValue.usbController
866
- customizeHardware.value.virtualHardware.pciDevices = newValue.pciDevices
867
- customizeHardware.value.vmOptions = newValue.options
868
- }
869
- maxCpus.value = newValue.cpu.max_vcpus
870
- cpuModels.value = newValue.cpu.model
871
- isPowerOnByDefault.value = false
872
- }
873
- }
874
- )
875
- </script>
876
-
877
- <style scoped lang="scss"></style>
1
+ <template>
2
+ <common-vm-actions-add-new
3
+ v-if="isNewView"
4
+ v-model:vm-form="vmForm"
5
+ v-model:selected-create-type="selectedCreateType"
6
+ v-model:is-power-on-by-default="isPowerOnByDefault"
7
+ :project="props.project"
8
+ :is-vmt="props.isVmt"
9
+ :nodes="props.nodes"
10
+ :files="props.files"
11
+ :networks-table="props.networksTable"
12
+ :datastore="props.datastore"
13
+ :is-datastore-loading="props.isDatastoreLoading"
14
+ :error-validation-fields="props.errorValidationFields"
15
+ :ready-complete-table-info="props.readyCompleteTableInfo"
16
+ :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
17
+ :import-from-v-m-warev-sphere="props.importFromVMWarevSphere"
18
+ :get-datastore-table-func="props.getDatastoreTableFunc"
19
+ :passthrough-devices="props.passthroughDevices"
20
+ :mediated-devices="props.mediatedDevices"
21
+ :templates-tree="props.templatesTree"
22
+ :wizard="wizard"
23
+ :selected-scheme="selectedScheme"
24
+ :template-submit="templateSubmit"
25
+ :name-form-submit="nameFormSubmit"
26
+ :storage-submit="storageSubmit"
27
+ :customize-hardware-submit="customizeHardwareSubmit"
28
+ :customize-hardware-for-template-submit="customizeHardwareForTemplateSubmit"
29
+ :is-sphere="isSphere"
30
+ :compatibility="compatibility"
31
+ :guestOsFamilies="guestOsFamilies"
32
+ :guestOsVersions="guestOsVersions"
33
+ :machineTypes="machineTypes"
34
+ :virtual-hardware-hard-disks-local="virtualHardwareHardDisksLocal"
35
+ :virtual-hardware-cd-dvd-drives-local="virtualHardwareCdDvdDrivesLocal"
36
+ :virtual-hardware-networks-local="virtualHardwareNetworksLocal"
37
+ :max-cpus="maxCpus"
38
+ :max-memory="maxMemory"
39
+ :cpu-models="cpuModels"
40
+ :selected-nav-item="selectedNavItem"
41
+ :compatibility-info="compatibilityInfo"
42
+ :is-show-power-on="isShowPowerOn"
43
+ :is-show-select-template="isShowSelectTemplate"
44
+ :compute-resource-submit="computeResourceSubmit"
45
+ :data-center="props.dataCenter"
46
+ :compute-resource="props.computeResource"
47
+ :compute-resource-tree="props.computeResourceTree"
48
+ :vmt-settings="props.vmtSettings"
49
+ :is-loading="isLoading"
50
+ :selected-template-id="props.selectedTemplateId"
51
+ :validate-empty-name="props.validateEmptyName"
52
+ :title="title"
53
+ :name-request-url="props.nameRequestUrl"
54
+ @get-storage="emits('get-storage', $event)"
55
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
56
+ @get-active-device-child="emits('get-active-device-child', $event)"
57
+ @show-datastore-child="emits('show-datastore-child', $event)"
58
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
59
+ @get-networks-table="emits('get-networks-table', $event)"
60
+ @get-pci-devices="emits('get-pci-devices')"
61
+ @change-steps="onChangeSteps"
62
+ @change-template="onChangeTemplate"
63
+ @change-name="onChangeName(...$event)"
64
+ @change-storage="onChangeStorage"
65
+ @change-select-options="onChangeSelectOptions"
66
+ @change-compatibility="onChangeCompatibility"
67
+ @change-boot-order="onChangeBootOrder"
68
+ @change-customize-hardware="onChangeCustomizeHardware"
69
+ @clear-compute-resource-tree="emits('clear-compute-resource-tree')"
70
+ @change-compute-resource="onChangeComputeResource"
71
+ @select-compute-resource-tree="onSelectComputeResourceTree"
72
+ @get-compute-resource-tree="emits('get-compute-resource-tree', $event)"
73
+ @show-compute-resource-tree="emits('show-compute-resource-tree', $event)"
74
+ @finish="onFinish"
75
+ @hide="onHideModal"
76
+ />
77
+ <common-vm-actions-add-old
78
+ v-else
79
+ v-model:vm-form="vmForm"
80
+ v-model:selected-create-type="selectedCreateType"
81
+ v-model:is-power-on-by-default="isPowerOnByDefault"
82
+ :project="props.project"
83
+ :is-vmt="props.isVmt"
84
+ :nodes="props.nodes"
85
+ :files="props.files"
86
+ :networks-table="props.networksTable"
87
+ :datastore="props.datastore"
88
+ :is-datastore-loading="props.isDatastoreLoading"
89
+ :error-validation-fields="props.errorValidationFields"
90
+ :ready-complete-table-info="props.readyCompleteTableInfo"
91
+ :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
92
+ :import-from-v-m-warev-sphere="props.importFromVMWarevSphere"
93
+ :get-datastore-table-func="props.getDatastoreTableFunc"
94
+ :passthrough-devices="props.passthroughDevices"
95
+ :mediated-devices="props.mediatedDevices"
96
+ :templates-tree="props.templatesTree"
97
+ :wizard="wizard"
98
+ :selected-scheme="selectedScheme"
99
+ :template-submit="templateSubmit"
100
+ :name-form-submit="nameFormSubmit"
101
+ :storage-submit="storageSubmit"
102
+ :customize-hardware-submit="customizeHardwareSubmit"
103
+ :customize-hardware-for-template-submit="customizeHardwareForTemplateSubmit"
104
+ :is-sphere="isSphere"
105
+ :compatibility="compatibility"
106
+ :guestOsFamilies="guestOsFamilies"
107
+ :guestOsVersions="guestOsVersions"
108
+ :machineTypes="machineTypes"
109
+ :virtual-hardware-hard-disks-local="virtualHardwareHardDisksLocal"
110
+ :virtual-hardware-cd-dvd-drives-local="virtualHardwareCdDvdDrivesLocal"
111
+ :virtual-hardware-networks-local="virtualHardwareNetworksLocal"
112
+ :max-cpus="maxCpus"
113
+ :max-memory="maxMemory"
114
+ :cpu-models="cpuModels"
115
+ :selected-nav-item="selectedNavItem"
116
+ :compatibility-info="compatibilityInfo"
117
+ :is-show-power-on="isShowPowerOn"
118
+ :compute-resource-submit="computeResourceSubmit"
119
+ :data-center="props.dataCenter"
120
+ :compute-resource="props.computeResource"
121
+ :compute-resource-tree="props.computeResourceTree"
122
+ :vmt-settings="props.vmtSettings"
123
+ :is-loading="isLoading"
124
+ :validate-empty-name="props.validateEmptyName"
125
+ :title="title"
126
+ :name-request-url="props.nameRequestUrl"
127
+ @get-storage="emits('get-storage', $event)"
128
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
129
+ @get-active-device-child="emits('get-active-device-child', $event)"
130
+ @show-datastore-child="emits('show-datastore-child', $event)"
131
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
132
+ @get-networks-table="emits('get-networks-table', $event)"
133
+ @get-pci-devices="emits('get-pci-devices')"
134
+ @change-steps="onChangeSteps"
135
+ @change-template="onChangeTemplate"
136
+ @change-name="onChangeName(...$event)"
137
+ @change-storage="onChangeStorage"
138
+ @change-select-options="onChangeSelectOptions"
139
+ @change-compatibility="onChangeCompatibility"
140
+ @change-boot-order="onChangeBootOrder"
141
+ @change-customize-hardware="onChangeCustomizeHardware"
142
+ @clear-compute-resource-tree="emits('clear-compute-resource-tree')"
143
+ @change-compute-resource="onChangeComputeResource"
144
+ @select-compute-resource-tree="onSelectComputeResourceTree"
145
+ @get-compute-resource-tree="emits('get-compute-resource-tree', $event)"
146
+ @show-compute-resource-tree="emits('show-compute-resource-tree', $event)"
147
+ @finish="onFinish"
148
+ @hide="onHideModal"
149
+ />
150
+ </template>
151
+
152
+ <script setup lang="ts">
153
+ import type {
154
+ UI_I_ValidationReturn,
155
+ UI_I_WizardStep,
156
+ } from '~/node_modules/bfg-uikit/components/ui/wizard/lib/models/interfaces'
157
+ import Wizard from '~/node_modules/bfg-uikit/components/ui/wizard/lib/utils/utils'
158
+ import type {
159
+ UI_I_Localization,
160
+ UI_I_ArbitraryObject,
161
+ } from '~/lib/models/interfaces'
162
+ import type { UI_T_Project } from '~/lib/models/types'
163
+ import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
164
+ import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
165
+ import type {
166
+ UI_I_DatastoreTableItem,
167
+ UI_I_FolderOrFileTreePayload,
168
+ } from '~/lib/models/store/storage/interfaces'
169
+ import type {
170
+ // API_UI_I_Error,
171
+ UI_I_ErrorValidationField,
172
+ } from '~/lib/models/store/interfaces'
173
+ import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
174
+ import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
175
+ import type {
176
+ UI_T_AddVmFinishFunc,
177
+ UI_T_SelectedNavItem,
178
+ } from '~/components/common/vm/actions/common/lib/models/types'
179
+ import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
180
+ import type {
181
+ UI_I_Capabilities,
182
+ UI_I_VmForm,
183
+ UI_I_VmFormCash,
184
+ } from '~/components/common/vm/actions/common/lib/models/interfaces'
185
+ import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
186
+ import type {
187
+ UI_I_SendDataCpu,
188
+ UI_I_SendDataMemory,
189
+ UI_I_SendDataNewCdDvdDrive,
190
+ UI_I_SendDataNewHardDisk,
191
+ UI_I_SendDataNewNetwork,
192
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
193
+ import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
194
+ import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
195
+ import type {
196
+ UI_I_MediatedDevice,
197
+ UI_I_PciDevice,
198
+ UI_I_VmSettings,
199
+ } from '~/lib/models/store/vm/interfaces'
200
+ import { capabilities } from '~/components/common/vm/actions/common/lib/config/capabilities'
201
+ import {
202
+ stepsSchemeInitial,
203
+ stepsFunc,
204
+ dynamicSteps,
205
+ } from '~/components/common/vm/actions/add/lib/config/steps'
206
+ import { mapCapabilities } from '~/components/common/vm/actions/common/lib/utils/capabilities'
207
+
208
+ const props = withDefaults(
209
+ defineProps<{
210
+ project: UI_T_Project
211
+ nodes: UI_I_FileTreeNode[]
212
+ files: UI_I_FileTreeNode[]
213
+ networksTable: UI_I_NetworkTableItem[]
214
+ datastore: UI_I_DatastoreTableItem[]
215
+ isDatastoreLoading: boolean
216
+ errorValidationFields: UI_I_ErrorValidationField[]
217
+ readyCompleteTableInfo: UI_I_TableInfoItem[]
218
+ vmCpuHelpTextSecond: string
219
+ importFromVMWarevSphere: string
220
+ finishFunc: UI_T_AddVmFinishFunc
221
+ getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
222
+ validateSendDataFunc: UI_T_AddVmFinishFunc<
223
+ [UI_T_SelectedNavItem, null | number] | null
224
+ >
225
+ passthroughDevices: UI_I_PciDevice[]
226
+ mediatedDevices: UI_I_MediatedDevice[]
227
+ vmNameInWizard: string
228
+ nameRequestUrl: string
229
+ templatesTree?: UI_I_TreeNode[]
230
+ capabilities?: UI_I_Capabilities
231
+ vmtSettings?: UI_I_VmSettings | null
232
+ validateEmptyName?: boolean
233
+ dataCenter?: UI_I_TreeNode // для сферы
234
+ computeResource?: UI_I_TreeNode // для сферы
235
+ computeResourceTree?: UI_I_TreeNode[] // для сферы
236
+ selectedTemplateId?: string // для сферы
237
+ isVmt?: boolean // для сферы
238
+ }>(),
239
+ {
240
+ templatesTree: [],
241
+ capabilities: undefined,
242
+ vmtSettings: undefined,
243
+ validateEmptyName: false,
244
+ dataCenter: undefined,
245
+ computeResource: undefined,
246
+ computeResourceTree: undefined,
247
+ selectedTemplateId: '',
248
+ isVmt: false,
249
+ }
250
+ )
251
+
252
+ const emits = defineEmits<{
253
+ (event: 'get-storage', value: UI_I_TablePayload): void
254
+ (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
255
+ (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
256
+ (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
257
+ (event: 'remove-error-by-title', value: string): void
258
+ (event: 'get-networks-table', value: UI_I_TablePayload): void
259
+ (event: 'get-pci-devices'): void
260
+ (event: 'get-pci-devices'): void
261
+ (event: 'hide'): void
262
+ (event: 'select-template', value: string): void
263
+ (
264
+ event: 'get-compute-resource-tree',
265
+ value: { id: string | number; cb: () => void }
266
+ ): void // для сферы
267
+ (event: 'show-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
268
+ (event: 'select-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
269
+ (event: 'clear-compute-resource-tree'): void // для сферы
270
+ }>()
271
+
272
+ const { $store, $recursion }: any = useNuxtApp()
273
+ const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
274
+
275
+ const localization = computed<UI_I_Localization>(() => useLocal())
276
+
277
+ const isSphere = computed<boolean>(() => props.project === 'sphere')
278
+
279
+ const title = computed<string>(() =>
280
+ props.isVmt
281
+ ? localization.value.vmt.newTemplate
282
+ : localization.value.common.newVirtualMachine2
283
+ )
284
+
285
+ watch(
286
+ () => props.capabilities,
287
+ () => {
288
+ if (props.capabilities) mapCapabilities(props.capabilities)
289
+ },
290
+ { deep: true, immediate: true }
291
+ )
292
+
293
+ const selectedCreateType = ref<string>('0')
294
+ if (props.isVmt) selectedCreateType.value = '-1'
295
+
296
+ const wizard: Wizard = new Wizard(
297
+ stepsFunc(localization.value, props.isVmt, isSphere.value),
298
+ stepsSchemeInitial
299
+ )
300
+ watch(
301
+ selectedCreateType,
302
+ (newValue) => {
303
+ switch (newValue) {
304
+ case '0':
305
+ wizard.changeScheme(isSphere.value ? 1 : 0)
306
+ break
307
+ case '1':
308
+ wizard.changeScheme(isSphere.value ? 6 : 2)
309
+ break
310
+ case '-1':
311
+ wizard.changeScheme(isSphere.value ? 11 : 10)
312
+ break
313
+ }
314
+ },
315
+ { immediate: true }
316
+ )
317
+
318
+ // if (isSphere.value) wizard.changeScheme(1)
319
+ const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
320
+ // const alertMessages = computed<string[][]>(() => wizard.alertMessages.value)
321
+
322
+ const isShowSelectTemplate = computed<boolean>(
323
+ () =>
324
+ wizard.selectedStepId === dynamicSteps.selectTemplate &&
325
+ selectedCreateType.value === '1'
326
+ )
327
+
328
+ const isShowPowerOn = computed<boolean>(
329
+ () =>
330
+ wizard.selectedStepId > dynamicSteps.customizeHardware &&
331
+ selectedCreateType.value !== '1' &&
332
+ !props.isVmt
333
+ )
334
+
335
+ const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
336
+ wizard.changeSteps(value, validationFunc, validateSendData)
337
+ }
338
+ const validationFunc = async (
339
+ value: UI_I_WizardStep[],
340
+ currentStep: UI_I_WizardStep,
341
+ nextStep: UI_I_WizardStep
342
+ ): Promise<UI_I_ValidationReturn> => {
343
+ let stepHasError = false
344
+ let stepShouldStop = {
345
+ ifOnCurrentStep: false,
346
+ ifFromAnyStep: false,
347
+ stoppageStepId: -1,
348
+ }
349
+
350
+ wizard.setLoader(true)
351
+ if (
352
+ wizard.isValidateForStep(
353
+ dynamicSteps.selectTemplate,
354
+ currentStep.id,
355
+ nextStep.id
356
+ )
357
+ ) {
358
+ const templateValidation = await checkTemplate(value)
359
+
360
+ value = templateValidation.newValue
361
+ stepHasError = stepHasError || templateValidation.stepHasError
362
+ } else if (
363
+ wizard.isValidateForStep(
364
+ isSphere.value ? dynamicSteps.selectNameFolder : dynamicSteps.selectName,
365
+ currentStep.id,
366
+ nextStep.id
367
+ )
368
+ ) {
369
+ const nameValidation = await onCheckName(value)
370
+
371
+ value = nameValidation.newValue
372
+ stepHasError = stepHasError || nameValidation.stepHasError
373
+ } else if (
374
+ isSphere.value &&
375
+ wizard.isValidateForStep(
376
+ dynamicSteps.selectComputeResource,
377
+ currentStep.id,
378
+ nextStep.id
379
+ )
380
+ ) {
381
+ const computeResourceValidation = await checkComputeResource(value)
382
+
383
+ value = computeResourceValidation.newValue
384
+ stepHasError = stepHasError || computeResourceValidation.stepHasError
385
+ } else if (
386
+ wizard.isValidateForStep(
387
+ dynamicSteps.selectStorage,
388
+ currentStep.id,
389
+ nextStep.id
390
+ )
391
+ ) {
392
+ const storageValidation = await checkStorage(value)
393
+
394
+ value = storageValidation.newValue
395
+
396
+ stepHasError = stepHasError || storageValidation.stepHasError
397
+ } else if (
398
+ wizard.isValidateForStep(
399
+ dynamicSteps.customizeHardware,
400
+ currentStep.id,
401
+ nextStep.id
402
+ )
403
+ ) {
404
+ const validation = await checkCustomizeHardware(value)
405
+
406
+ value = validation.newValue
407
+
408
+ stepHasError = stepHasError || validation.stepHasError
409
+ } else if (
410
+ wizard.isValidateForStep(
411
+ dynamicSteps.customizeHardwareTemplate,
412
+ currentStep.id,
413
+ nextStep.id
414
+ )
415
+ ) {
416
+ const validation = await checkCustomizeHardwareForTemplate(value)
417
+
418
+ value = validation.newValue
419
+
420
+ stepHasError = stepHasError || validation.stepHasError
421
+ }
422
+ wizard.setLoader(false)
423
+
424
+ return {
425
+ newValue: value,
426
+ stepHasError,
427
+ stepShouldStop,
428
+ }
429
+ }
430
+
431
+ const checkTemplate = async (
432
+ value: UI_I_WizardStep[]
433
+ ): Promise<UI_I_ValidationReturn> => {
434
+ let stepHasError = false
435
+
436
+ return new Promise((resolve) => {
437
+ templateSubmit.value = (isValid: boolean) => {
438
+ if (!isValid) {
439
+ stepHasError = wizard.setValidation(
440
+ dynamicSteps.selectTemplate,
441
+ 'template',
442
+ {
443
+ fieldMessage: 'aaa',
444
+ alertMessage: 'aaa',
445
+ }
446
+ )
447
+ } else if (wizard.hasMessage(dynamicSteps.selectTemplate, 'template')) {
448
+ value = wizard.removeValidation(
449
+ dynamicSteps.selectTemplate,
450
+ 'template',
451
+ value
452
+ )
453
+ }
454
+
455
+ resolve({
456
+ stepHasError,
457
+ newValue: value,
458
+ })
459
+ templateSubmit.value = null
460
+ }
461
+ })
462
+ }
463
+ const onCheckName = async (
464
+ value: UI_I_WizardStep[]
465
+ ): Promise<UI_I_ValidationReturn> => {
466
+ let stepHasError = false
467
+
468
+ return new Promise((resolve) => {
469
+ const step = isSphere.value
470
+ ? dynamicSteps.selectNameFolder
471
+ : dynamicSteps.selectName
472
+ nameFormSubmit.value = (isValid: boolean) => {
473
+ if (!isValid) {
474
+ stepHasError = wizard.setValidation(step, 'name', {
475
+ fieldMessage: 'aaa',
476
+ alertMessage: 'aaa',
477
+ })
478
+ } else if (wizard.hasMessage(step, 'name')) {
479
+ value = wizard.removeValidation(step, 'name', value)
480
+ }
481
+
482
+ resolve({
483
+ stepHasError,
484
+ newValue: value,
485
+ })
486
+ nameFormSubmit.value = null
487
+ }
488
+ })
489
+ }
490
+ const checkComputeResource = async (
491
+ value: UI_I_WizardStep[]
492
+ ): Promise<UI_I_ValidationReturn> => {
493
+ let stepHasError = false
494
+
495
+ return new Promise((resolve) => {
496
+ computeResourceSubmit.value = (isValid: boolean) => {
497
+ if (!isValid) {
498
+ stepHasError = wizard.setValidation(
499
+ dynamicSteps.selectComputeResource,
500
+ 'computeResource',
501
+ {
502
+ fieldMessage: 'aaa',
503
+ alertMessage: 'aaa',
504
+ }
505
+ )
506
+ } else if (
507
+ wizard.hasMessage(dynamicSteps.selectComputeResource, 'computeResource')
508
+ ) {
509
+ value = wizard.removeValidation(
510
+ dynamicSteps.selectComputeResource,
511
+ 'computeResource',
512
+ value
513
+ )
514
+ }
515
+
516
+ resolve({
517
+ stepHasError,
518
+ newValue: value,
519
+ })
520
+ computeResourceSubmit.value = null
521
+ }
522
+ })
523
+ }
524
+ const checkStorage = async (
525
+ value: UI_I_WizardStep[]
526
+ ): Promise<UI_I_ValidationReturn> => {
527
+ let stepHasError = false
528
+
529
+ return new Promise((resolve) => {
530
+ storageSubmit.value = (isValid: boolean) => {
531
+ if (!isValid) {
532
+ stepHasError = wizard.setValidation(
533
+ dynamicSteps.selectStorage,
534
+ 'storage',
535
+ {
536
+ fieldMessage: 'aaa',
537
+ alertMessage: 'aaa',
538
+ }
539
+ )
540
+ } else if (wizard.hasMessage(dynamicSteps.selectStorage, 'storage')) {
541
+ value = wizard.removeValidation(
542
+ dynamicSteps.selectStorage,
543
+ 'storage',
544
+ value
545
+ )
546
+ }
547
+
548
+ resolve({
549
+ stepHasError,
550
+ newValue: value,
551
+ })
552
+ storageSubmit.value = null
553
+ }
554
+ })
555
+ }
556
+ const checkCustomizeHardware = async (
557
+ value: UI_I_WizardStep[]
558
+ ): Promise<UI_I_ValidationReturn> => {
559
+ let stepHasError = false
560
+ isLoading.value = true
561
+
562
+ return new Promise((resolve) => {
563
+ customizeHardwareSubmit.value = (isValid: boolean) => {
564
+ if (!isValid) {
565
+ stepHasError = wizard.setValidation(
566
+ dynamicSteps.customizeHardware,
567
+ 'customizeHardware',
568
+ {
569
+ fieldMessage: 'aaa',
570
+ alertMessage: 'aaa',
571
+ }
572
+ )
573
+ } else if (
574
+ wizard.hasMessage(dynamicSteps.customizeHardware, 'customizeHardware')
575
+ ) {
576
+ wizard.removeValidationLocal(
577
+ dynamicSteps.customizeHardware,
578
+ 'customizeHardware'
579
+ )
580
+ value = wizard.removeValidation(
581
+ dynamicSteps.customizeHardware,
582
+ 'customizeHardware',
583
+ value
584
+ )
585
+ }
586
+
587
+ resolve({
588
+ stepHasError,
589
+ newValue: value,
590
+ })
591
+ storageSubmit.value = null
592
+ isLoading.value = false
593
+ }
594
+ })
595
+ }
596
+ const checkCustomizeHardwareForTemplate = async (
597
+ value: UI_I_WizardStep[]
598
+ ): Promise<UI_I_ValidationReturn> => {
599
+ let stepHasError = false
600
+
601
+ return new Promise((resolve) => {
602
+ customizeHardwareForTemplateSubmit.value = (isValid: boolean) => {
603
+ if (!isValid) {
604
+ stepHasError = wizard.setValidation(
605
+ dynamicSteps.customizeHardwareTemplate,
606
+ 'customizeHardwareForTemplate',
607
+ {
608
+ fieldMessage: 'aaa',
609
+ alertMessage: 'aaa',
610
+ }
611
+ )
612
+ } else if (
613
+ wizard.hasMessage(
614
+ dynamicSteps.customizeHardwareTemplate,
615
+ 'customizeHardwareForTemplate'
616
+ )
617
+ ) {
618
+ value = wizard.removeValidation(
619
+ dynamicSteps.customizeHardwareTemplate,
620
+ 'customizeHardwareForTemplate',
621
+ value
622
+ )
623
+ }
624
+
625
+ resolve({
626
+ stepHasError,
627
+ newValue: value,
628
+ })
629
+ storageSubmit.value = null
630
+ }
631
+ })
632
+ }
633
+
634
+ const storageIdCash = ref<string | null>(null)
635
+ const vmForm = ref<UI_I_VmForm>({
636
+ name: '',
637
+ compatibility: '',
638
+ guestMachineType: null,
639
+ guestOsFamily: null,
640
+ guestOsVersion: null,
641
+ computeResource: null,
642
+ storage: null,
643
+ locationPath: '',
644
+ dataCenter: null,
645
+ })
646
+
647
+ // TODO remove (not used)
648
+ const vmFormCash = ref<UI_I_VmFormCash>({
649
+ dataCenterId: null,
650
+ computeResourceTypeAndId: null,
651
+ })
652
+
653
+ const onChangeName = (name: string, node: UI_I_TreeNode | null): void => {
654
+ vmForm.value.name = name
655
+ if (isSphere.value) {
656
+ vmForm.value.locationPath = node.id
657
+ vmForm.value.dataCenter = $recursion.findParentByValue(
658
+ node,
659
+ 'datacenter',
660
+ 'type',
661
+ 'parent'
662
+ )
663
+ vmFormCash.value.dataCenterId = vmForm.value.dataCenter?.id || null
664
+ }
665
+ }
666
+ // // Для сферы
667
+ const computeResourcePath = ref<string>('')
668
+ const onSelectComputeResourceTree = (node: UI_I_TreeNode): void => {
669
+ emits('select-compute-resource-tree', node)
670
+ computeResourcePath.value = node.id
671
+ }
672
+ const onChangeComputeResource = (node: UI_I_TreeNode): void => {
673
+ vmForm.value.computeResource = node
674
+ // const type = node.type.toUpperCase()
675
+ // schedRequirementsTemplate.value = `sched_requirements="(${type}_ID=${node.id})"\\`
676
+ vmFormCash.value.computeResourceTypeAndId = `${node.type}${node.id}` || null
677
+ }
678
+ const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
679
+ if (!storage) return
680
+
681
+ vmForm.value.storage = storage
682
+ storageIdCash.value = storage.id
683
+ }
684
+ const compatibilityInfo = ref<string>('')
685
+ const onChangeCompatibility = (compatibility: UI_I_OptionItem): void => {
686
+ vmForm.value.compatibility = compatibility.value
687
+
688
+ const version = compatibility.value.split('-')[1]
689
+ compatibilityInfo.value = `${localization.value.common.compatibility}: ${compatibility.text} (${localization.value.common.vmVersion} ${version})`
690
+ }
691
+ const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
692
+ const onChangeCustomizeHardware = (
693
+ data: UI_I_SendDataCustomizeHardware
694
+ ): void => {
695
+ customizeHardware.value = data
696
+ }
697
+
698
+ const virtualHardwareHardDisksLocal = computed<
699
+ UI_I_SendDataNewHardDisk[] | null
700
+ >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
701
+ const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
702
+ () => customizeHardware.value?.virtualHardware?.networks || null
703
+ )
704
+ const virtualHardwareCdDvdDrivesLocal = computed<
705
+ UI_I_SendDataNewCdDvdDrive[] | null
706
+ >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
707
+
708
+ const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
709
+ () => customizeHardware.value?.virtualHardware?.cpu || null
710
+ )
711
+ const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
712
+ () => customizeHardware.value?.virtualHardware?.memory || null
713
+ )
714
+ const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
715
+ const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
716
+ null
717
+ )
718
+ const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
719
+ const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
720
+ virtualHardwareHardDisks.value = data[0]
721
+ virtualHardwareCdDvdDrives.value = data[1]
722
+ virtualHardwareNetworks.value = data[2]
723
+ }
724
+
725
+ const isPowerOnByDefault = ref<boolean>(true)
726
+
727
+ watch(
728
+ () => props.vmNameInWizard,
729
+ (newValue) => {
730
+ vmForm.value.name = newValue
731
+ }
732
+ )
733
+
734
+ const validateSendData = async (
735
+ value: UI_I_WizardStep[]
736
+ ): Promise<UI_I_ValidationReturn> => {
737
+ wizard.setLoader(true)
738
+ let stepHasError = false
739
+ isLoading.value = true
740
+
741
+ const data = await props.validateSendDataFunc(
742
+ vmForm.value,
743
+ virtualHardwareCpu.value,
744
+ virtualHardwareMemory.value,
745
+ customizeHardware.value,
746
+ virtualHardwareNetworks.value,
747
+ virtualHardwareHardDisks.value,
748
+ virtualHardwareCdDvdDrives.value,
749
+ isPowerOnByDefault.value,
750
+ localization.value,
751
+ vmForm.value.locationPath, // для сферы
752
+ computeResourcePath.value // для сферы
753
+ )
754
+
755
+ isLoading.value = false
756
+ wizard.setLoader(false)
757
+ if (data) {
758
+ stepHasError = true
759
+ selectedNavItem.value = data[0]
760
+ data[1] !== null && wizard.selectStepHard(data[1])
761
+ }
762
+
763
+ return {
764
+ stepHasError,
765
+ newValue: value,
766
+ }
767
+ }
768
+
769
+ const isLoading = ref<boolean>(false)
770
+ const onFinish = (): void => {
771
+ isLoading.value = true
772
+ wizard.setLoader(false)
773
+ props
774
+ .finishFunc(
775
+ vmForm.value,
776
+ virtualHardwareCpu.value,
777
+ virtualHardwareMemory.value,
778
+ customizeHardware.value,
779
+ virtualHardwareNetworks.value,
780
+ virtualHardwareHardDisks.value,
781
+ virtualHardwareCdDvdDrives.value,
782
+ isPowerOnByDefault.value,
783
+ localization.value,
784
+ vmForm.value.locationPath, // для сферы
785
+ computeResourcePath.value, // для сферы
786
+ false,
787
+ selectedTemplate.value,
788
+ selectedCreateType.value
789
+ )
790
+ .then(() => {
791
+ onHideModal()
792
+ wizard.setLoader(false)
793
+ isLoading.value = false
794
+ })
795
+ }
796
+
797
+ const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
798
+
799
+ const nameFormSubmit = ref<null | Function>(null)
800
+ const templateSubmit = ref<null | Function>(null)
801
+ const computeResourceSubmit = ref<null | Function>(null)
802
+ const storageSubmit = ref<null | Function>(null)
803
+ const customizeHardwareSubmit = ref<null | Function>(null)
804
+ const customizeHardwareForTemplateSubmit = ref<null | Function>(null)
805
+ const compatibility = ref<UI_I_OptionItem[]>(capabilities.value.compatibility)
806
+ const guestOsFamilies = ref<UI_I_OptionItem[]>(
807
+ capabilities.value.guestOsFamilies
808
+ )
809
+ const guestOsVersions = ref<UI_I_ArbitraryObject<UI_I_OptionItem[]>>(
810
+ capabilities.value.guestOsVersions
811
+ )
812
+ const machineTypes = ref<UI_I_OptionItem[]>(capabilities.value.machineTypes)
813
+ const cpuModels = ref<UI_I_OptionItem[]>(capabilities.value.cpuModels)
814
+ const maxCpus = ref<number>(capabilities.value.maxCpus)
815
+ const maxMemory = ref<number>(capabilities.value.maxMemory)
816
+
817
+ const selectedTemplate = ref<string>('')
818
+ const onChangeTemplate = (node: UI_I_TreeNode): void => {
819
+ selectedTemplate.value = node.id.toString()
820
+ emits('select-template', node.id.toString())
821
+ }
822
+ const selectedOptions = ref<string[]>([])
823
+ const onChangeSelectOptions = (options: string[]) => {
824
+ selectedOptions.value = options
825
+ if (
826
+ options.includes('customize-os') &&
827
+ options.includes('customize-hardware')
828
+ ) {
829
+ wizard.changeScheme(isSphere.value ? 9 : 5)
830
+ } else if (options.includes('customize-os')) {
831
+ wizard.changeScheme(isSphere.value ? 7 : 3)
832
+ } else if (options.includes('customize-hardware')) {
833
+ wizard.changeScheme(isSphere.value ? 8 : 4)
834
+ } else {
835
+ wizard.changeScheme(isSphere.value ? 6 : 2)
836
+ }
837
+
838
+ isPowerOnByDefault.value = options.includes('power-on')
839
+ }
840
+
841
+ const onHideModal = (): void => {
842
+ emits('hide')
843
+ }
844
+
845
+ watch(
846
+ () => props.vmtSettings,
847
+ (newValue) => {
848
+ if (newValue) {
849
+ vmForm.value.name = newValue.name
850
+ vmForm.value.compatibility =
851
+ newValue.compatibility || vmForm.value.compatibility
852
+ vmForm.value.storage = newValue.storage
853
+ if (customizeHardware.value?.virtualHardware) {
854
+ customizeHardware.value.virtualHardware.cdDvdDrives =
855
+ newValue.cdDvdDrives
856
+ customizeHardware.value.virtualHardware.hardDisks = newValue.hardDisks
857
+ customizeHardware.value.virtualHardware.networks = newValue.networks
858
+ customizeHardware.value.virtualHardware.cpu = newValue.cpu
859
+ customizeHardware.value.virtualHardware.memory = newValue.memory
860
+ customizeHardware.value.virtualHardware.videoCard = newValue.videoCard
861
+ customizeHardware.value.virtualHardware.usbController =
862
+ newValue.usbController
863
+ customizeHardware.value.virtualHardware.pciDevices = newValue.pciDevices
864
+ customizeHardware.value.vmOptions = newValue.options
865
+ }
866
+ maxCpus.value = newValue.cpu.max_vcpus
867
+ cpuModels.value = newValue.cpu.model
868
+ isPowerOnByDefault.value = false
869
+ }
870
+ }
871
+ )
872
+ </script>
873
+
874
+ <style scoped lang="scss"></style>