bfg-common 1.2.197 → 1.2.198

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 (107) hide show
  1. package/assets/localization/local_be.json +9 -2
  2. package/assets/localization/local_en.json +9 -2
  3. package/assets/localization/local_hy.json +9 -2
  4. package/assets/localization/local_kk.json +9 -2
  5. package/assets/localization/local_ru.json +9 -2
  6. package/assets/localization/local_zh.json +9 -2
  7. package/components/atoms/table/dataGrid/DataGrid.vue +1490 -1490
  8. package/components/atoms/table/simpleTable/SimpleTable.vue +5 -2
  9. package/components/atoms/wizard/Wizard.vue +4 -4
  10. package/components/atoms/wizard/models/interfaces.ts +4 -3
  11. package/components/atoms/wizard/utils/utils.ts +106 -27
  12. package/components/common/diagramMain/DiagramMain.vue +11 -47
  13. package/components/common/diagramMain/modals/config/index.ts +0 -6
  14. package/components/common/diagramMain/modals/config/vmKernelAdapter.ts +2 -2
  15. package/components/common/diagramMain/modals/editSettings/tabs/NetworkProperties.vue +1 -1
  16. package/components/common/diagramMain/modals/editSettings/tabs/port/IpvFourSettings.vue +1 -1
  17. package/components/common/diagramMain/modals/migrateVmkernelAdapter/MigrateVmkernelAdapter.vue +531 -0
  18. package/components/common/diagramMain/modals/migrateVmkernelAdapter/config/steps.ts +114 -0
  19. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/ConnectionSettings.vue +161 -0
  20. package/components/common/diagramMain/modals/{steps → migrateVmkernelAdapter/steps}/SelectVmkernelAdapter.vue +24 -86
  21. package/components/common/diagramMain/modals/{steps → migrateVmkernelAdapter/steps}/VmkernelAdapterReadyComplete.vue +7 -11
  22. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/common.ts +47 -0
  23. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/connectionSettings.ts +146 -0
  24. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/selectVmkernelAdapter.ts +54 -0
  25. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/validations.ts +19 -0
  26. package/components/common/diagramMain/models/enums.ts +6 -7
  27. package/components/common/diagramMain/models/interfaces.ts +28 -29
  28. package/components/common/diagramMain/models/types.ts +0 -1
  29. package/components/common/monitor/advanced/Advanced.vue +10 -3
  30. package/components/common/monitor/advanced/tools/Tools.vue +15 -7
  31. package/components/common/monitor/advanced/tools/chartOptionsModal/ChartOptionsModal.vue +21 -9
  32. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/Counters.vue +7 -3
  33. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/Table.vue +3 -3
  34. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/config/utils.ts +5 -5
  35. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/Timespan.vue +7 -3
  36. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/Object.vue +24 -3
  37. package/components/common/monitor/advanced/tools/chartOptionsModal/models/types.ts +2 -2
  38. package/components/common/monitor/advanced/tools/config/advancedToolbar.ts +14 -7
  39. package/components/common/monitor/overview/filters/Filters.vue +5 -4
  40. package/components/common/monitor/overview/filters/config/filterOptions.ts +3 -2
  41. package/components/common/tools/viewSettings/ViewSettings.vue +71 -0
  42. package/components/common/tools/viewSettings/models/interfaces.ts +9 -0
  43. package/components/common/vm/actions/add/Add.vue +785 -525
  44. package/components/common/vm/actions/add/utils.ts +105 -0
  45. package/components/common/vm/actions/addOld/Add.vue +690 -0
  46. package/components/common/vm/actions/addOld/FolderTreeView.vue +83 -0
  47. package/components/common/vm/actions/addOld/utils.ts +118 -0
  48. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +394 -394
  49. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +1 -1
  50. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +1 -1
  51. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbController.vue +1 -1
  52. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +1 -1
  53. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCard.vue +1 -1
  54. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptions.vue +1 -1
  55. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptions.vue +1 -1
  56. package/components/common/vm/actions/common/select/name/Name.vue +10 -5
  57. package/components/common/vm/actions/common/select/name/NameOld.vue +215 -0
  58. package/components/common/vm/actions/common/select/storage/Storage.vue +6 -4
  59. package/components/common/vm/actions/common/select/storage/StorageOld.vue +194 -0
  60. package/components/common/wizards/network/add/Add.vue +874 -0
  61. package/components/common/{addNetworking → wizards/network/add}/config/index.ts +2 -16
  62. package/components/common/{addNetworking → wizards/network/add}/config/initialData.ts +4 -19
  63. package/components/common/{addNetworking → wizards/network/add}/config/portPropertiesStep.ts +1 -1
  64. package/components/common/{addNetworking → wizards/network/add}/config/selectSwitch.ts +1 -1
  65. package/components/common/{addNetworking → wizards/network/add}/config/sendData.ts +1 -1
  66. package/components/common/{addNetworking/config/addNetworkingSteps.ts → wizards/network/add/config/steps.ts} +107 -60
  67. package/components/common/{addNetworking → wizards/network/add}/modals/SelectNetwork.vue +2 -2
  68. package/components/common/{addNetworking → wizards/network/add}/modals/SelectStandardSwitch.vue +2 -2
  69. package/components/common/{addNetworking → wizards/network/add}/modals/SelectSwitch.vue +2 -2
  70. package/components/common/wizards/network/add/models/enums.ts +17 -0
  71. package/components/common/{addNetworking → wizards/network/add}/models/interfaces.ts +30 -37
  72. package/components/common/wizards/network/add/models/types.ts +2 -0
  73. package/components/common/wizards/network/add/steps/ConnectionSettings.vue +148 -0
  74. package/components/common/{addNetworking → wizards/network/add}/steps/CreateStandardSwitch.vue +0 -7
  75. package/components/common/wizards/network/add/steps/IpFourSettings.vue +245 -0
  76. package/components/common/{addNetworking → wizards/network/add}/steps/PhysicalAdapter.vue +1 -12
  77. package/components/common/{addNetworking → wizards/network/add}/steps/PortProperties.vue +57 -180
  78. package/components/common/{addNetworking → wizards/network/add}/steps/ReadyComplete.vue +1 -10
  79. package/components/common/{addNetworking → wizards/network/add}/steps/SelectConnectionType.vue +3 -15
  80. package/components/common/{addNetworking → wizards/network/add}/steps/SelectedTargetDevice.vue +106 -212
  81. package/components/common/wizards/network/add/utils/index.ts +4 -0
  82. package/components/common/wizards/network/add/validations/common.ts +58 -0
  83. package/components/common/wizards/network/add/validations/connectionSettings.ts +75 -0
  84. package/components/common/wizards/network/add/validations/createStandardSwitch.ts +58 -0
  85. package/components/common/wizards/network/add/validations/ipFourSettings.ts +188 -0
  86. package/components/common/wizards/network/add/validations/networkValidation.ts +73 -0
  87. package/components/common/wizards/network/add/validations/portProperties.ts +87 -0
  88. package/components/common/wizards/network/add/validations/targetDevice.ts +113 -0
  89. package/components/common/wizards/network/add/validations/validations.ts +43 -0
  90. package/models/composables/useMyFetch/interfaces.ts +25 -25
  91. package/package.json +1 -1
  92. package/components/common/addNetworking/AddNetworking.vue +0 -1123
  93. package/components/common/addNetworking/Wizard.vue +0 -286
  94. package/components/common/addNetworking/config/temporaryData.ts +0 -8
  95. package/components/common/addNetworking/config/validation.ts +0 -23
  96. package/components/common/addNetworking/models/enums.ts +0 -7
  97. package/components/common/addNetworking/models/types.ts +0 -13
  98. package/components/common/addNetworking/steps/ConnectionSettings.vue +0 -269
  99. package/components/common/addNetworking/steps/Header.vue +0 -53
  100. package/components/common/addNetworking/steps/IpFourSettings.vue +0 -361
  101. package/components/common/addNetworking/utils/index.ts +0 -212
  102. package/components/common/diagramMain/modals/MigrateVmkernelAdapter.vue +0 -603
  103. package/components/common/diagramMain/modals/config/migrateVmkernelAdapterSteps.ts +0 -81
  104. package/components/common/diagramMain/modals/config/validation.ts +0 -3
  105. package/components/common/diagramMain/modals/steps/ConnectionSettings.vue +0 -221
  106. package/components/common/diagramMain/modals/steps/Header.vue +0 -60
  107. /package/components/common/{addNetworking → wizards/network/add}/mappers/mappers.ts +0 -0
@@ -0,0 +1,690 @@
1
+ <template>
2
+ <div class="add-vm">
3
+ <atoms-modal-by-steps
4
+ test-id="add-vm-wizard"
5
+ :show="true"
6
+ :title="localization.newVirtualMachine2"
7
+ :step-items="stepItems"
8
+ :step-position="stepPosition"
9
+ :loading="loading"
10
+ @change-step="onChangeStep"
11
+ @hide="onHideModal"
12
+ >
13
+ <template #modalBody>
14
+ <div class="add-vm-context">
15
+ <div class="context-title-wrap">
16
+ <p>{{ stepSubTitle }}</p>
17
+ </div>
18
+
19
+ <common-vm-actions-common-select-create-type
20
+ v-show="stepPosition === 0"
21
+ :import-from-v-m-warev-sphere="props.importFromVMWarevSphere"
22
+ @next="onNext"
23
+ />
24
+ <common-vm-actions-common-select-name
25
+ v-show="stepPosition === 1"
26
+ :show="stepPosition === 1"
27
+ :name-form-submit="nameFormSubmit"
28
+ :project="props.project"
29
+ :data-center="props.dataCenter"
30
+ @submit="onChangeNameAndNext(...$event)"
31
+ @check-name="emits('check-name', $event)"
32
+ @loading="loading = $event"
33
+ />
34
+ <common-vm-actions-common-select-compute-resource
35
+ v-if="props.project === 'sphere'"
36
+ v-show="stepPosition === 2"
37
+ v-model="vmForm.computeResource"
38
+ :compute-resource-submit="computeResourceSubmit"
39
+ :data-center="vmForm.dataCenter"
40
+ :compute-resource="props.computeResource"
41
+ :compute-resource-tree="props.computeResourceTree"
42
+ @submit="changeComputeResourceAndNext"
43
+ @get-compute-resource-tree="
44
+ emits('get-compute-resource-tree', $event)
45
+ "
46
+ @show-compute-resource-tree="
47
+ emits('show-compute-resource-tree', $event)
48
+ "
49
+ @select-compute-resource-tree="onSelectComputeResourceTree"
50
+ @clear-compute-resource-tree="
51
+ emits('clear-compute-resource-tree', $event)
52
+ "
53
+ />
54
+ <common-vm-actions-common-select-storage
55
+ v-show="
56
+ props.project === 'sphere'
57
+ ? stepPosition === 3
58
+ : stepPosition === 2
59
+ "
60
+ :storage-submit="storageSubmit"
61
+ :datastore="props.datastore"
62
+ :get-datastore-table-func="props.getDatastoreTableFunc"
63
+ @submit="onChangeStorageAndNext"
64
+ />
65
+ <common-vm-actions-common-select-compatibility
66
+ v-show="
67
+ props.project === 'sphere'
68
+ ? stepPosition === 4
69
+ : stepPosition === 3
70
+ "
71
+ :options="compatibility"
72
+ :error-validation-fields="props.errorValidationFields"
73
+ @change="onChangeCompatibility"
74
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
75
+ />
76
+ <common-vm-actions-common-select-os
77
+ v-show="
78
+ props.project === 'sphere'
79
+ ? stepPosition === 5
80
+ : stepPosition === 4
81
+ "
82
+ :families-options="guestOsFamilies"
83
+ :versions-options="guestOsVersions"
84
+ :machine-types-options="machineTypes"
85
+ :error-validation-fields="props.errorValidationFields"
86
+ @change="onChangeOs"
87
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
88
+ />
89
+ <common-vm-actions-common-customize-hardware
90
+ v-show="
91
+ props.project === 'sphere'
92
+ ? stepPosition === 6
93
+ : stepPosition === 5
94
+ "
95
+ :vm-name="vmForm.name"
96
+ :guest-machine-type="vmForm.guestMachineType"
97
+ :guest-os-family="vmForm.guestOsFamily"
98
+ :guest-os-version="vmForm.guestOsVersion"
99
+ :storage="vmForm.storage"
100
+ :hard-disks-for-boot-options="virtualHardwareHardDisksLocal"
101
+ :cd-dvd-drives-for-boot-options="virtualHardwareCdDvdDrivesLocal"
102
+ :networks-for-boot-options="virtualHardwareNetworksLocal"
103
+ :cd-dvd-drives="virtualHardwareCdDvdDrivesLocal"
104
+ :customize-hardware-submit="customizeHardwareSubmit"
105
+ :max-cpus="maxCpus"
106
+ :max-memory="maxMemory"
107
+ :cpu-models="cpuModels"
108
+ :selected-nav-item="selectedNavItem"
109
+ :nodes="props.nodes"
110
+ :files="props.files"
111
+ :networks-table="props.networksTable"
112
+ :error-validation-fields="props.errorValidationFields"
113
+ :get-datastore-table-func="props.getDatastoreTableFunc"
114
+ :datastore="props.datastore"
115
+ :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
116
+ :passthrough-devices="props.passthroughDevices"
117
+ @change-boot-order="onChangeBootOrder"
118
+ @send-data="onChangeCustomizeHardware"
119
+ @get-storage="emits('get-storage', $event)"
120
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
121
+ @get-active-device-child="emits('get-active-device-child', $event)"
122
+ @show-datastore-child="emits('show-datastore-child', $event)"
123
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
124
+ @get-networks-table="emits('get-networks-table', $event)"
125
+ @get-pci-devices="emits('get-pci-devices')"
126
+ @next="onNext(true)"
127
+ />
128
+ <common-vm-actions-common-ready-to-complete
129
+ v-if="
130
+ props.project === 'sphere'
131
+ ? stepPosition === 7
132
+ : stepPosition === 6
133
+ "
134
+ :ready-complete-table-info="props.readyCompleteTableInfo"
135
+ />
136
+
137
+ <span
138
+ v-if="
139
+ props.project === 'sphere' ? stepPosition > 4 : stepPosition > 3
140
+ "
141
+ class="vm-hardware-version"
142
+ >{{ compatibilityInfo }}</span
143
+ >
144
+ </div>
145
+ </template>
146
+
147
+ <template #modalFooter>
148
+ <div class="flex-align-center flex-space-between w-100">
149
+ <div class="power-on-by-default-wrap">
150
+ <template
151
+ v-if="
152
+ props.project === 'sphere'
153
+ ? stepPosition === 7
154
+ : stepPosition === 6
155
+ "
156
+ >
157
+ <input
158
+ id="power-on-by-default"
159
+ v-model="isPowerOnByDefault"
160
+ type="checkbox"
161
+ />
162
+ <label for="power-on-by-default" class="label-text-normal">{{
163
+ localization.powerOnByDefault
164
+ }}</label>
165
+ </template>
166
+ </div>
167
+ <div class="flex-align-center">
168
+ <button
169
+ id="vm-wizard-cancel-button"
170
+ class="btn btn-link"
171
+ @click="onHideModal"
172
+ >
173
+ {{ localization.cancel }}
174
+ </button>
175
+ <button
176
+ v-show="stepPosition > 0"
177
+ id="vm-wizard-back-button"
178
+ class="btn btn-outline"
179
+ @click="onBack"
180
+ >
181
+ {{ localization.back }}
182
+ </button>
183
+ <button
184
+ v-if="stepPosition === stepItems.length - 1"
185
+ id="vm-wizard-finish-button"
186
+ class="btn btn-success"
187
+ @click="onFinish"
188
+ >
189
+ {{ localization.finish }}
190
+ </button>
191
+ <button
192
+ v-else
193
+ id="vm-wizard-next-button"
194
+ class="btn btn-primary"
195
+ @click="onNext(false)"
196
+ >
197
+ {{ localization.next }}
198
+ </button>
199
+ </div>
200
+ </div>
201
+ </template>
202
+ </atoms-modal-by-steps>
203
+ </div>
204
+ </template>
205
+
206
+ <script setup lang="ts">
207
+ import { UI_I_DatastoreTableItem } from '~/models/store/storage/interfaces'
208
+ import { UI_I_NetworkTableItem } from '~/models/store/network/interfaces'
209
+ import { API_UI_I_Error, UI_I_TablePayload } from '~/models/store/interfaces'
210
+ import { UI_I_FolderOrFileTreePayload } from '~/models/store/storage/interfaces'
211
+ import { UI_I_FileTreeNode } from '~/components/models/interfaces'
212
+ import { UI_I_Localization, UI_I_ArbitraryObject } from '~/models/interfaces'
213
+ import {
214
+ UI_I_VmForm,
215
+ UI_I_VmFormCash,
216
+ } from '~/components/common/vm/actions/common/models/interfaces'
217
+ import { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/models/interfaces'
218
+ import { UI_I_ErrorValidationField } from '~/models/store/interfaces'
219
+ import { UI_I_OsChange } from '~/components/common/vm/actions/common/select/models/interfaces'
220
+ import {
221
+ UI_I_SendDataCpu,
222
+ UI_I_SendDataMemory,
223
+ UI_I_SendDataNewCdDvdDrive,
224
+ UI_I_SendDataNewHardDisk,
225
+ UI_I_SendDataNewNetwork,
226
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/models/interfaces'
227
+ import {
228
+ UI_T_AddVmFinishFunc,
229
+ UI_T_SelectedNavItem,
230
+ } from '~/components/common/vm/actions/common/models/types'
231
+ import {
232
+ UI_I_OptionItem,
233
+ UI_I_VerticalStepItem,
234
+ } from '~/components/atoms/models/interfaces'
235
+ import { UI_I_TableInfoItem } from '~/components/atoms/table/info/models/interfaces'
236
+ import { UI_I_ConfigurePciDevicesTable } from '~/models/store/host/interfaces'
237
+ import { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/models/types'
238
+ import { UI_T_Project } from '~/models/types'
239
+ import { UI_I_TreeNode } from '~/components/common/recursionTree/models/interfaces'
240
+ import { capabilities } from '~/components/common/vm/actions/common/config/capabilities'
241
+ import {
242
+ stepItemsFunc,
243
+ subTitleFunc,
244
+ } from '~/components/common/vm/actions/add/utils'
245
+
246
+ const props = defineProps<{
247
+ project: UI_T_Project
248
+ nodes: UI_I_FileTreeNode[]
249
+ files: UI_I_FileTreeNode[]
250
+ networksTable: UI_I_NetworkTableItem[]
251
+ datastore: UI_I_DatastoreTableItem[]
252
+ errorValidationFields: UI_I_ErrorValidationField[]
253
+ readyCompleteTableInfo: UI_I_TableInfoItem[]
254
+ vmCpuHelpTextSecond: string
255
+ importFromVMWarevSphere: string
256
+ finishFunc: UI_T_AddVmFinishFunc
257
+ getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
258
+ validateSendDataFunc: UI_T_AddVmFinishFunc<
259
+ [UI_T_SelectedNavItem, null | number] | null
260
+ >
261
+ passthroughDevices: UI_I_ConfigurePciDevicesTable | null
262
+ vmNameInWizard: string
263
+ dataCenter?: UI_I_TreeNode // для сферы
264
+ computeResource?: UI_I_TreeNode // для сферы
265
+ computeResourceTree?: UI_I_TreeNode[] // для сферы
266
+ }>()
267
+
268
+ const emits = defineEmits<{
269
+ (event: 'check-name', value: [string, (error: API_UI_I_Error) => void]): void
270
+ (event: 'get-storage', value: UI_I_TablePayload): void
271
+ (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
272
+ (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
273
+ (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
274
+ (event: 'remove-error-by-title', value: string): void
275
+ (event: 'get-networks-table', value: UI_I_TablePayload): void
276
+ (event: 'get-pci-devices'): void
277
+ (event: 'hide'): void
278
+ (
279
+ event: 'get-compute-resource-tree',
280
+ value: { id: string | number; cb: () => void }
281
+ ): void // для сферы
282
+ (event: 'show-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
283
+ (event: 'select-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
284
+ (event: 'clear-compute-resource-tree'): void // для сферы
285
+ }>()
286
+
287
+ const { $recursion } = useNuxtApp()
288
+
289
+ const localization = computed<UI_I_Localization>(() => useLocal())
290
+
291
+ const stepPosition = ref<number>(0)
292
+ watch(stepPosition, (newValue) => {
293
+ if (props.project === 'sphere' ? newValue === 7 : newValue === 6)
294
+ validateSendData()
295
+ })
296
+ const stepItems = ref<UI_I_VerticalStepItem[]>([])
297
+ stepItems.value = stepItemsFunc(localization.value, props.project)
298
+
299
+ const subTitle: string[] = subTitleFunc(localization.value, props.project)
300
+ const stepSubTitle = computed<string>(() => subTitle[stepPosition.value])
301
+
302
+ const storageIdCash = ref<string | null>(null)
303
+ const vmForm = ref<UI_I_VmForm>({
304
+ name: '',
305
+ compatibility: '',
306
+ guestMachineType: null,
307
+ guestOsFamily: null,
308
+ guestOsVersion: null,
309
+ computeResource: null,
310
+ storage: null,
311
+ locationPath: '',
312
+ dataCenter: null,
313
+ })
314
+ const vmFormCash = ref<UI_I_VmFormCash>({
315
+ dataCenterId: null,
316
+ computeResourceTypeAndId: null,
317
+ })
318
+
319
+ const isPowerOnByDefault = ref<boolean>(true)
320
+
321
+ const onChangeNameAndNext = (name: string, node: UI_I_TreeNode): void => {
322
+ const hasChanges = vmFormCash.value.dataCenterId !== node?.id
323
+ if (hasChanges) checkLocalChangeAndChangeStepStatus()
324
+
325
+ vmForm.value.name = name
326
+ if (props.project === 'sphere') {
327
+ vmForm.value.locationPath = $recursion.createAbsolutePathRecursion(
328
+ node,
329
+ 'id',
330
+ 'parent'
331
+ )
332
+ vmForm.value.dataCenter = $recursion.findParentByValue(
333
+ node,
334
+ 'datacenter',
335
+ 'type',
336
+ 'parent'
337
+ )
338
+ vmFormCash.value.dataCenterId = vmForm.value.dataCenter?.id || null
339
+ }
340
+ onNext(true)
341
+ }
342
+ // Для сферы
343
+ const computeResourcePath = ref<string>('')
344
+ const onSelectComputeResourceTree = (node: UI_I_TreeNode): void => {
345
+ emits('select-compute-resource-tree', node)
346
+ computeResourcePath.value = $recursion.createAbsolutePathRecursion(
347
+ node,
348
+ 'id',
349
+ 'parent'
350
+ )
351
+ }
352
+ const changeComputeResourceAndNext = (node: UI_I_TreeNode): void => {
353
+ const hasChanges =
354
+ `${node.type}${node.id}` !== vmFormCash.value.computeResourceTypeAndId
355
+ if (hasChanges) checkLocalChangeAndChangeStepStatus()
356
+
357
+ vmForm.value.computeResource = node
358
+ // const type = node.type.toUpperCase()
359
+ // schedRequirementsTemplate.value = `sched_requirements="(${type}_ID=${node.id})"\\`
360
+ vmFormCash.value.computeResourceTypeAndId = `${node.type}${node.id}` || null
361
+
362
+ onNext(true)
363
+ }
364
+ const onChangeStorageAndNext = (
365
+ storage: UI_I_DatastoreTableItem | null
366
+ ): void => {
367
+ if (!storage) return
368
+
369
+ const hasChanges = storage.id !== storageIdCash.value
370
+ if (hasChanges) checkLocalChangeAndChangeStepStatus()
371
+
372
+ vmForm.value.storage = storage
373
+ storageIdCash.value = storage.id
374
+
375
+ onNext(true)
376
+ }
377
+ const compatibilityInfo = ref<string>('')
378
+ const onChangeCompatibility = (compatibility: UI_I_OptionItem): void => {
379
+ vmForm.value.compatibility = compatibility.value
380
+
381
+ const version = compatibility.value.split('-')[1]
382
+ compatibilityInfo.value = `${localization.value.compatibility}: ${compatibility.text} (${localization.value.vmVersion} ${version})`
383
+ }
384
+ const onChangeOs = (data: UI_I_OsChange): void => {
385
+ vmForm.value.guestMachineType = data.selectedMachineType
386
+ vmForm.value.guestOsFamily = data.selectedOS
387
+ vmForm.value.guestOsVersion = data.selectedVersion
388
+ }
389
+ const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
390
+ const onChangeCustomizeHardware = (
391
+ data: UI_I_SendDataCustomizeHardware
392
+ ): void => {
393
+ customizeHardware.value = data
394
+ }
395
+
396
+ const virtualHardwareHardDisksLocal = computed<
397
+ UI_I_SendDataNewHardDisk[] | null
398
+ >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
399
+ const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
400
+ () => customizeHardware.value?.virtualHardware?.networks || null
401
+ )
402
+ const virtualHardwareCdDvdDrivesLocal = computed<
403
+ UI_I_SendDataNewCdDvdDrive[] | null
404
+ >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
405
+
406
+ const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
407
+ () => customizeHardware.value?.virtualHardware?.cpu || null
408
+ )
409
+ const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
410
+ () => customizeHardware.value?.virtualHardware?.memory || null
411
+ )
412
+ const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
413
+ const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
414
+ null
415
+ )
416
+ const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
417
+ const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
418
+ virtualHardwareHardDisks.value = data[0]
419
+ virtualHardwareCdDvdDrives.value = data[1]
420
+ virtualHardwareNetworks.value = data[2]
421
+ }
422
+
423
+ watch(
424
+ () => props.vmNameInWizard,
425
+ (newValue) => {
426
+ vmForm.value.name = newValue
427
+ }
428
+ )
429
+
430
+ const loading = ref<boolean>(false)
431
+ const validateSendData = (): void => {
432
+ loading.value = true
433
+ props
434
+ .validateSendDataFunc(
435
+ vmForm.value,
436
+ virtualHardwareCpu.value,
437
+ virtualHardwareMemory.value,
438
+ customizeHardware.value,
439
+ virtualHardwareNetworks.value,
440
+ virtualHardwareHardDisks.value,
441
+ virtualHardwareCdDvdDrives.value,
442
+ isPowerOnByDefault.value,
443
+ localization.value,
444
+ vmForm.value.locationPath, // для сферы
445
+ computeResourcePath.value // для сферы
446
+ )
447
+ .then((data) => {
448
+ loading.value = false
449
+ if (!data) return
450
+
451
+ selectedNavItem.value = data[0]
452
+ data[1] !== null && (stepPosition.value = data[1])
453
+ })
454
+ }
455
+ const onFinish = (): void => {
456
+ loading.value = true
457
+ props
458
+ .finishFunc(
459
+ vmForm.value,
460
+ virtualHardwareCpu.value,
461
+ virtualHardwareMemory.value,
462
+ customizeHardware.value,
463
+ virtualHardwareNetworks.value,
464
+ virtualHardwareHardDisks.value,
465
+ virtualHardwareCdDvdDrives.value,
466
+ isPowerOnByDefault.value,
467
+ localization.value,
468
+ vmForm.value.locationPath, // для сферы
469
+ computeResourcePath.value, // для сферы
470
+ false
471
+ )
472
+ .then(() => {
473
+ onHideModal()
474
+ loading.value = false
475
+ })
476
+ }
477
+
478
+ const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
479
+
480
+ const nameFormSubmit = ref<number>(0)
481
+ const computeResourceSubmit = ref<number>(0)
482
+ const storageSubmit = ref<number>(0)
483
+ const customizeHardwareSubmit = ref<number>(0)
484
+ const onNext = (force = false): void => {
485
+ const isValid = checkSubmit(force)
486
+ if (!isValid) {
487
+ return
488
+ }
489
+
490
+ const isDisabled = stepItems.value[cashStep]?.disabled
491
+ if (cashStep !== -1 && !isDisabled) {
492
+ stepPosition.value = cashStep
493
+ cashStep = -1
494
+ return
495
+ }
496
+
497
+ stepItems.value[stepPosition.value].complete = true
498
+ stepItems.value[stepPosition.value + 1].disabled = false
499
+ stepPosition.value++
500
+ }
501
+ const checkLocalChangeAndChangeStepStatus = (): void => {
502
+ stepItems.value = stepItems.value.map((step, index) => {
503
+ if (index > stepPosition.value) {
504
+ step.complete = false
505
+ step.disabled = index > stepPosition.value + 1
506
+ }
507
+
508
+ return step
509
+ })
510
+ }
511
+
512
+ const checkSubmit = (force = false): boolean => {
513
+ if (stepPosition.value === 1 && !force) {
514
+ nameFormSubmit.value++
515
+ return false
516
+ }
517
+ if (props.project === 'sphere' && stepPosition.value === 2 && !force) {
518
+ computeResourceSubmit.value++
519
+ return false
520
+ }
521
+ if (
522
+ (props.project === 'sphere'
523
+ ? stepPosition.value === 3
524
+ : stepPosition.value === 2) &&
525
+ !force
526
+ ) {
527
+ storageSubmit.value++
528
+ return false
529
+ }
530
+ if (
531
+ (props.project === 'sphere'
532
+ ? stepPosition.value === 6
533
+ : stepPosition.value === 5) &&
534
+ !force
535
+ ) {
536
+ customizeHardwareSubmit.value++
537
+ return false
538
+ }
539
+ return true
540
+ }
541
+ const checkSubmitByManual = (step: number): boolean => {
542
+ if (stepPosition.value === 1) {
543
+ nameFormSubmit.value++
544
+ return false
545
+ }
546
+ if (
547
+ props.project === 'sphere'
548
+ ? stepPosition.value === 3
549
+ : stepPosition.value === 2
550
+ ) {
551
+ storageSubmit.value++
552
+ return false
553
+ }
554
+ if (props.project === 'sphere' ? step === 8 : step === 7) {
555
+ customizeHardwareSubmit.value++
556
+ return false
557
+ }
558
+ return true
559
+ }
560
+ const onBack = (): void => {
561
+ stepPosition.value--
562
+ }
563
+ let cashStep = -1
564
+ const onChangeStep = (key: number): void => {
565
+ const isValid = checkSubmitByManual(key)
566
+ if (!isValid) {
567
+ cashStep = key
568
+ return
569
+ }
570
+
571
+ stepPosition.value = key
572
+ }
573
+
574
+ const compatibility = ref<UI_I_OptionItem[]>(capabilities.compatibility)
575
+ const guestOsFamilies = ref<UI_I_OptionItem[]>(capabilities.guestOsFamilies)
576
+ const guestOsVersions = ref<UI_I_ArbitraryObject<UI_I_OptionItem[]>>(
577
+ capabilities.guestOsVersions
578
+ )
579
+ const machineTypes = ref<UI_I_OptionItem[]>(capabilities.machineTypes)
580
+ const cpuModels = ref<UI_I_OptionItem[]>(capabilities.cpuModels)
581
+ const maxCpus = ref<number>(capabilities.maxCpus)
582
+ const maxMemory = ref<number>(capabilities.maxMemory)
583
+
584
+ const onHideModal = (): void => {
585
+ emits('hide')
586
+ }
587
+ </script>
588
+
589
+ <style scoped lang="scss">
590
+ :deep(.has-solid.close-icon.clr-icon) {
591
+ width: 20px;
592
+ top: 0;
593
+ }
594
+ .add-vm-context {
595
+ padding: 16px 15px 10px 10px;
596
+ height: 100%;
597
+ display: flex;
598
+ flex-direction: column;
599
+
600
+ .context-title-wrap {
601
+ padding-bottom: 3px;
602
+ border-bottom: 1px solid #a6a6a6;
603
+
604
+ h4 {
605
+ font-weight: 700;
606
+ font-size: 13px;
607
+ color: var(--add-vm-context-title);
608
+ }
609
+ p {
610
+ font-weight: 400;
611
+ font-size: 13px;
612
+ color: var(--add-vm-context-sub-title);
613
+ }
614
+ }
615
+
616
+ .finish-block {
617
+ padding: 18px 24px 24px 24px;
618
+
619
+ .add-hosts-ready-to-complete-mt-12 {
620
+ margin-top: 12px;
621
+
622
+ .add-hosts-ready-to-complete-bold {
623
+ line-height: 18px;
624
+ font-weight: 700;
625
+ }
626
+ }
627
+ }
628
+
629
+ .vm-hardware-version {
630
+ align-self: flex-end;
631
+ margin-top: auto;
632
+ }
633
+ }
634
+
635
+ :deep(.modal .modal-dialog .modal-content .modal-footer) {
636
+ flex: unset;
637
+ height: unset;
638
+ min-height: unset;
639
+ }
640
+ :deep(.wizard-modal-titlebar h3) {
641
+ color: #000;
642
+ font-size: 24px;
643
+ font-weight: 200;
644
+ line-height: 27px;
645
+ margin: 0;
646
+ padding: 0;
647
+ }
648
+ :deep(.clr-wizard-stepnav-item) {
649
+ padding-left: 0;
650
+ }
651
+ :deep(.clr-wizard-stepnav
652
+ .clr-wizard-stepnav-item
653
+ button
654
+ .clr-wizard-stepnav-link-title) {
655
+ width: 189px;
656
+ font-weight: 700;
657
+ font-size: 13px;
658
+ }
659
+
660
+ #vm-wizard-notification {
661
+ h3 {
662
+ color: var(--global-font-color7);
663
+ margin-top: 6px;
664
+ }
665
+ p {
666
+ color: var(--global-font-color6);
667
+ line-height: 16px;
668
+ }
669
+ }
670
+
671
+ .power-on-by-default-wrap {
672
+ display: flex;
673
+ align-items: center;
674
+
675
+ input {
676
+ margin-right: 6px;
677
+ }
678
+ }
679
+ </style>
680
+
681
+ <style>
682
+ :root {
683
+ --add-vm-context-title: #333;
684
+ --add-vm-context-sub-title: #000;
685
+ }
686
+ :root.dark-theme {
687
+ --add-vm-context-title: #adbbc4;
688
+ --add-vm-context-sub-title: #adbbc4;
689
+ }
690
+ </style>