bfg-common 1.5.540 → 1.5.541

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