bfg-common 1.3.287 → 1.3.288

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.
@@ -1,577 +1,609 @@
1
- <template>
2
- <div class="add-vm">
3
- <atoms-wizard
4
- show
5
- :steps="wizard.steps"
6
- :selected-scheme="selectedScheme"
7
- :is-loading="wizard.wizardLoader.status"
8
- :loader-messages="wizard.wizardLoader.messages"
9
- :title="localization.newVirtualMachine2"
10
- :was-completed="wasCompleted"
11
- :localization="localization"
12
- test-id="new-virtual-machine-wizard"
13
- @change-steps="onChangeSteps"
14
- @hide="onHideModal"
15
- @submit="onFinish"
16
- >
17
- <template #modalBody="{ selectedStep }">
18
- <div class="add-vm-content">
19
- <common-vm-actions-common-select-create-type
20
- v-show="selectedStep.id === 0"
21
- :import-from-v-m-warev-sphere="props.importFromVMWarevSphere"
22
- />
23
- <common-vm-actions-common-select-name
24
- v-show="selectedStep.id === 1 || selectedStep.id === 2"
25
- :show="selectedStep.id === 1 || selectedStep.id === 2"
26
- :name-form-submit="nameFormSubmit"
27
- :project="props.project"
28
- :data-center="props.dataCenter"
29
- @submit="onChangeName(...$event)"
30
- @check-name="emits('check-name', $event)"
31
- />
32
- <common-vm-actions-common-select-compute-resource
33
- v-if="isSphere"
34
- v-show="selectedStep.id === 3"
35
- v-model="vmForm.computeResource"
36
- :compute-resource-submit="computeResourceSubmit"
37
- :data-center="vmForm.dataCenter"
38
- :compute-resource="props.computeResource"
39
- :compute-resource-tree="props.computeResourceTree"
40
- @submit="onChangeComputeResource"
41
- @select-compute-resource-tree="onSelectComputeResourceTree"
42
- @get-compute-resource-tree="
43
- emits('get-compute-resource-tree', $event)
44
- "
45
- @show-compute-resource-tree="
46
- emits('show-compute-resource-tree', $event)
47
- "
48
- @clear-compute-resource-tree="
49
- emits('clear-compute-resource-tree', $event)
50
- "
51
- />
52
- <common-vm-actions-common-select-storage
53
- v-show="selectedStep.id === 4"
54
- :storage-submit="storageSubmit"
55
- :datastore="props.datastore"
56
- :get-datastore-table-func="props.getDatastoreTableFunc"
57
- @submit="onChangeStorage"
58
- />
59
- <common-vm-actions-common-select-compatibility
60
- v-show="selectedStep.id === 5"
61
- :options="compatibility"
62
- :error-validation-fields="props.errorValidationFields"
63
- @change="onChangeCompatibility"
64
- @remove-error-by-title="emits('remove-error-by-title', $event)"
65
- />
66
- <common-vm-actions-common-select-os
67
- v-show="selectedStep.id === 6 || selectedStep.id === 7"
68
- :families-options="guestOsFamilies"
69
- :versions-options="guestOsVersions"
70
- :machine-types-options="machineTypes"
71
- :error-validation-fields="props.errorValidationFields"
72
- @change="onChangeOs"
73
- @remove-error-by-title="emits('remove-error-by-title', $event)"
74
- />
75
- <common-vm-actions-common-customize-hardware
76
- v-show="selectedStep.id === 8"
77
- :vm-name="vmForm.name"
78
- :guest-machine-type="vmForm.guestMachineType"
79
- :guest-os-family="vmForm.guestOsFamily"
80
- :guest-os-version="vmForm.guestOsVersion"
81
- :storage="vmForm.storage"
82
- :hard-disks-for-boot-options="virtualHardwareHardDisksLocal"
83
- :cd-dvd-drives-for-boot-options="virtualHardwareCdDvdDrivesLocal"
84
- :networks-for-boot-options="virtualHardwareNetworksLocal"
85
- :cd-dvd-drives="virtualHardwareCdDvdDrivesLocal"
86
- :customize-hardware-submit="customizeHardwareSubmit"
87
- :max-cpus="maxCpus"
88
- :max-memory="maxMemory"
89
- :cpu-models="cpuModels"
90
- :selected-nav-item="selectedNavItem"
91
- :nodes="props.nodes"
92
- :files="props.files"
93
- :networks-table="props.networksTable"
94
- :error-validation-fields="props.errorValidationFields"
95
- :get-datastore-table-func="props.getDatastoreTableFunc"
96
- :datastore="props.datastore"
97
- :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
98
- :passthrough-devices="props.passthroughDevices"
99
- @change-boot-order="onChangeBootOrder"
100
- @send-data="onChangeCustomizeHardware"
101
- @get-storage="emits('get-storage', $event)"
102
- @get-folders-or-files="emits('get-folders-or-files', $event)"
103
- @get-active-device-child="emits('get-active-device-child', $event)"
104
- @show-datastore-child="emits('show-datastore-child', $event)"
105
- @remove-error-by-title="emits('remove-error-by-title', $event)"
106
- @get-networks-table="emits('get-networks-table', $event)"
107
- @get-pci-devices="emits('get-pci-devices')"
108
- />
109
- <common-vm-actions-common-ready-to-complete
110
- v-if="selectedStep.id === 9"
111
- :ready-complete-table-info="props.readyCompleteTableInfo"
112
- />
113
- <span v-if="selectedStep.id > 5" class="vm-hardware-version">{{
114
- compatibilityInfo
115
- }}</span>
116
- </div>
117
- </template>
118
-
119
- <template #modalFooterContent>
120
- <div v-if="isShowPowerOn" class="power-on-by-default-wrap">
121
- <input
122
- id="power-on-by-default"
123
- v-model="isPowerOnByDefault"
124
- data-id="power-on-by-default"
125
- type="checkbox"
126
- />
127
- <label for="power-on-by-default" class="label-text-normal">{{
128
- localization.powerOnByDefault
129
- }}</label>
130
- </div>
131
- </template>
132
- </atoms-wizard>
133
- </div>
134
- </template>
135
-
136
- <script setup lang="ts">
137
- import type {
138
- UI_I_Localization,
139
- UI_I_ArbitraryObject,
140
- } from '~/lib/models/interfaces'
141
- import type { UI_T_Project } from '~/lib/models/types'
142
- import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
143
- import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
144
- import type {
145
- UI_I_DatastoreTableItem,
146
- UI_I_FolderOrFileTreePayload,
147
- } from '~/lib/models/store/storage/interfaces'
148
- import type {
149
- API_UI_I_Error,
150
- UI_I_ErrorValidationField,
151
- } from '~/lib/models/store/interfaces'
152
- import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
153
- import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
154
- import type {
155
- UI_T_AddVmFinishFunc,
156
- UI_T_SelectedNavItem,
157
- } from '~/components/common/vm/actions/common/lib/models/types'
158
- import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
159
- import type {
160
- UI_I_ValidationReturn,
161
- UI_I_WizardStep,
162
- } from '~/components/atoms/wizard/lib/models/interfaces'
163
- import type {
164
- UI_I_VmForm,
165
- UI_I_VmFormCash,
166
- } from '~/components/common/vm/actions/common/lib/models/interfaces'
167
- import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
168
- import type { UI_I_OsChange } from '~/components/common/vm/actions/common/select/lib/models/interfaces'
169
- import type {
170
- UI_I_SendDataCpu,
171
- UI_I_SendDataMemory,
172
- UI_I_SendDataNewCdDvdDrive,
173
- UI_I_SendDataNewHardDisk,
174
- UI_I_SendDataNewNetwork,
175
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
176
- import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
177
- import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
178
- import type { UI_I_PciDevice } from '~/lib/models/store/vm/interfaces'
179
- import { capabilities } from '~/components/common/vm/actions/common/lib/config/capabilities'
180
- import {
181
- stepsSchemeInitial,
182
- stepsFunc,
183
- } from '~/components/common/vm/actions/add/lib/config/steps'
184
- import Wizard from '~/components/atoms/wizard/lib/utils/utils'
185
-
186
- const props = defineProps<{
187
- project: UI_T_Project
188
- nodes: UI_I_FileTreeNode[]
189
- files: UI_I_FileTreeNode[]
190
- networksTable: UI_I_NetworkTableItem[]
191
- datastore: UI_I_DatastoreTableItem[]
192
- errorValidationFields: UI_I_ErrorValidationField[]
193
- readyCompleteTableInfo: UI_I_TableInfoItem[]
194
- vmCpuHelpTextSecond: string
195
- importFromVMWarevSphere: string
196
- finishFunc: UI_T_AddVmFinishFunc
197
- getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
198
- validateSendDataFunc: UI_T_AddVmFinishFunc<
199
- [UI_T_SelectedNavItem, null | number] | null
200
- >
201
- passthroughDevices: UI_I_PciDevice[]
202
- vmNameInWizard: string
203
- dataCenter?: UI_I_TreeNode // для сферы
204
- computeResource?: UI_I_TreeNode // для сферы
205
- computeResourceTree?: UI_I_TreeNode[] // для сферы
206
- }>()
207
-
208
- const emits = defineEmits<{
209
- (event: 'check-name', value: [string, (error: API_UI_I_Error) => void]): void
210
- (event: 'get-storage', value: UI_I_TablePayload): void
211
- (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
212
- (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
213
- (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
214
- (event: 'remove-error-by-title', value: string): void
215
- (event: 'get-networks-table', value: UI_I_TablePayload): void
216
- (event: 'get-pci-devices'): void
217
- (event: 'get-pci-devices'): void
218
- (event: 'hide'): void
219
- (
220
- event: 'get-compute-resource-tree',
221
- value: { id: string | number; cb: () => void }
222
- ): void // для сферы
223
- (event: 'show-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
224
- (event: 'select-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
225
- (event: 'clear-compute-resource-tree'): void // для сферы
226
- }>()
227
-
228
- const isSphere = computed<boolean>(() => props.project === 'sphere')
229
-
230
- const { $recursion } = useNuxtApp()
231
-
232
- const localization = computed<UI_I_Localization>(() => useLocal())
233
-
234
- const wizard: Wizard = new Wizard(
235
- stepsFunc(localization.value),
236
- stepsSchemeInitial
237
- )
238
- if (isSphere.value) wizard.changeScheme(1)
239
- const wasCompleted = computed<boolean>(() => wizard.wasCompleted())
240
- const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
241
- const alertMessages = computed<string[][]>(() => wizard.alertMessages.value)
242
-
243
- const isShowPowerOn = computed<boolean>(() => wizard.selectedStepId > 8)
244
-
245
- const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
246
- wizard.changeSteps(value, validationFunc, validateSendData)
247
- }
248
- const validationFunc = async (
249
- value: UI_I_WizardStep[],
250
- currentStep: UI_I_WizardStep,
251
- nextStep: UI_I_WizardStep
252
- ): Promise<UI_I_ValidationReturn> => {
253
- let stepHasError = false
254
- let stepShouldStop = {
255
- ifOnCurrentStep: false,
256
- ifFromAnyStep: false,
257
- stoppageStepId: -1,
258
- }
259
-
260
- wizard.setLoader(true)
261
- if (
262
- wizard.isValidateForStep(
263
- isSphere.value ? 2 : 1,
264
- currentStep.id,
265
- nextStep.id
266
- )
267
- ) {
268
- const nameValidation = await checkName(value)
269
-
270
- value = nameValidation.newValue
271
- stepHasError = stepHasError || nameValidation.stepHasError
272
- } else if (wizard.isValidateForStep(4, currentStep.id, nextStep.id)) {
273
- const storageValidation = await checkStorage(value)
274
-
275
- value = storageValidation.newValue
276
-
277
- stepHasError = stepHasError || storageValidation.stepHasError
278
- } else if (wizard.isValidateForStep(8, currentStep.id, nextStep.id)) {
279
- const storageValidation = await checkCustomizeHardware(value)
280
-
281
- value = storageValidation.newValue
282
-
283
- stepHasError = stepHasError || storageValidation.stepHasError
284
- }
285
- wizard.setLoader(false)
286
-
287
- return {
288
- newValue: value,
289
- stepHasError,
290
- stepShouldStop,
291
- }
292
- }
293
- const checkName = async (
294
- value: UI_I_WizardStep[]
295
- ): Promise<UI_I_ValidationReturn> => {
296
- let stepHasError = false
297
-
298
- return new Promise((resolve) => {
299
- const step = isSphere.value ? 2 : 1
300
- nameFormSubmit.value = (isValid: boolean) => {
301
- if (!isValid) {
302
- stepHasError = wizard.setValidation(step, 'name', {
303
- fieldMessage: 'aaa',
304
- alertMessage: 'aaa',
305
- })
306
- } else if (wizard.hasMessage(step, 'name')) {
307
- value = wizard.removeValidation(step, 'name', value)
308
- }
309
-
310
- resolve({
311
- stepHasError,
312
- newValue: value,
313
- })
314
- nameFormSubmit.value = null
315
- }
316
- })
317
- }
318
- const checkStorage = async (
319
- value: UI_I_WizardStep[]
320
- ): Promise<UI_I_ValidationReturn> => {
321
- let stepHasError = false
322
-
323
- return new Promise((resolve) => {
324
- storageSubmit.value = (isValid: boolean) => {
325
- if (!isValid) {
326
- stepHasError = wizard.setValidation(4, 'storage', {
327
- fieldMessage: 'aaa',
328
- alertMessage: 'aaa',
329
- })
330
- } else if (wizard.hasMessage(4, 'storage')) {
331
- value = wizard.removeValidation(4, 'storage', value)
332
- }
333
-
334
- resolve({
335
- stepHasError,
336
- newValue: value,
337
- })
338
- storageSubmit.value = null
339
- }
340
- })
341
- }
342
- const checkCustomizeHardware = async (
343
- value: UI_I_WizardStep[]
344
- ): Promise<UI_I_ValidationReturn> => {
345
- let stepHasError = false
346
-
347
- return new Promise((resolve) => {
348
- customizeHardwareSubmit.value = (isValid: boolean) => {
349
- if (!isValid) {
350
- stepHasError = wizard.setValidation(8, 'customizeHardware', {
351
- fieldMessage: 'aaa',
352
- alertMessage: 'aaa',
353
- })
354
- } else if (wizard.hasMessage(8, 'customizeHardware')) {
355
- value = wizard.removeValidation(8, 'customizeHardware', value)
356
- }
357
-
358
- resolve({
359
- stepHasError,
360
- newValue: value,
361
- })
362
- storageSubmit.value = null
363
- }
364
- })
365
- }
366
-
367
- const storageIdCash = ref<string | null>(null)
368
- const vmForm = ref<UI_I_VmForm>({
369
- name: '',
370
- compatibility: '',
371
- guestMachineType: null,
372
- guestOsFamily: null,
373
- guestOsVersion: null,
374
- computeResource: null,
375
- storage: null,
376
- locationPath: '',
377
- dataCenter: null,
378
- })
379
- const vmFormCash = ref<UI_I_VmFormCash>({
380
- dataCenterId: null,
381
- computeResourceTypeAndId: null,
382
- })
383
-
384
- const onChangeName = (name: string, node: UI_I_TreeNode): void => {
385
- vmForm.value.name = name
386
- if (isSphere.value) {
387
- vmForm.value.locationPath = $recursion.createAbsolutePathRecursion(
388
- node,
389
- 'id',
390
- 'parent'
391
- )
392
- vmForm.value.dataCenter = $recursion.findParentByValue(
393
- node,
394
- 'datacenter',
395
- 'type',
396
- 'parent'
397
- )
398
- vmFormCash.value.dataCenterId = vmForm.value.dataCenter?.id || null
399
- }
400
- }
401
- // // Для сферы
402
- const computeResourcePath = ref<string>('')
403
- const onSelectComputeResourceTree = (node: UI_I_TreeNode): void => {
404
- emits('select-compute-resource-tree', node)
405
- computeResourcePath.value = $recursion.createAbsolutePathRecursion(
406
- node,
407
- 'id',
408
- 'parent'
409
- )
410
- }
411
- const onChangeComputeResource = (node: UI_I_TreeNode): void => {
412
- vmForm.value.computeResource = node
413
- // const type = node.type.toUpperCase()
414
- // schedRequirementsTemplate.value = `sched_requirements="(${type}_ID=${node.id})"\\`
415
- vmFormCash.value.computeResourceTypeAndId = `${node.type}${node.id}` || null
416
- }
417
- const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
418
- if (!storage) return
419
-
420
- vmForm.value.storage = storage
421
- storageIdCash.value = storage.id
422
- }
423
- const compatibilityInfo = ref<string>('')
424
- const onChangeCompatibility = (compatibility: UI_I_OptionItem): void => {
425
- vmForm.value.compatibility = compatibility.value
426
-
427
- const version = compatibility.value.split('-')[1]
428
- compatibilityInfo.value = `${localization.value.compatibility}: ${compatibility.text} (${localization.value.vmVersion} ${version})`
429
- }
430
- const onChangeOs = (data: UI_I_OsChange): void => {
431
- vmForm.value.guestMachineType = data.selectedMachineType
432
- vmForm.value.guestOsFamily = data.selectedOS
433
- vmForm.value.guestOsVersion = data.selectedVersion
434
- }
435
- const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
436
- const onChangeCustomizeHardware = (
437
- data: UI_I_SendDataCustomizeHardware
438
- ): void => {
439
- customizeHardware.value = data
440
- }
441
-
442
- const virtualHardwareHardDisksLocal = computed<
443
- UI_I_SendDataNewHardDisk[] | null
444
- >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
445
- const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
446
- () => customizeHardware.value?.virtualHardware?.networks || null
447
- )
448
- const virtualHardwareCdDvdDrivesLocal = computed<
449
- UI_I_SendDataNewCdDvdDrive[] | null
450
- >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
451
-
452
- const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
453
- () => customizeHardware.value?.virtualHardware?.cpu || null
454
- )
455
- const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
456
- () => customizeHardware.value?.virtualHardware?.memory || null
457
- )
458
- const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
459
- const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
460
- null
461
- )
462
- const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
463
- const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
464
- virtualHardwareHardDisks.value = data[0]
465
- virtualHardwareCdDvdDrives.value = data[1]
466
- virtualHardwareNetworks.value = data[2]
467
- }
468
-
469
- const isPowerOnByDefault = ref<boolean>(true)
470
-
471
- watch(
472
- () => props.vmNameInWizard,
473
- (newValue) => {
474
- vmForm.value.name = newValue
475
- }
476
- )
477
-
478
- const validateSendData = async (
479
- value: UI_I_WizardStep[]
480
- ): Promise<UI_I_ValidationReturn> => {
481
- wizard.setLoader(true)
482
- let stepHasError = false
483
-
484
- const data = await props.validateSendDataFunc(
485
- vmForm.value,
486
- virtualHardwareCpu.value,
487
- virtualHardwareMemory.value,
488
- customizeHardware.value,
489
- virtualHardwareNetworks.value,
490
- virtualHardwareHardDisks.value,
491
- virtualHardwareCdDvdDrives.value,
492
- isPowerOnByDefault.value,
493
- localization.value,
494
- vmForm.value.locationPath, // для сферы
495
- computeResourcePath.value // для сферы
496
- )
497
-
498
- wizard.setLoader(false)
499
- if (data) {
500
- stepHasError = true
501
- selectedNavItem.value = data[0]
502
- // data[1] !== null && (stepPosition.value = data[1])
503
- }
504
-
505
- return {
506
- stepHasError,
507
- newValue: value,
508
- }
509
- }
510
- const onFinish = (): void => {
511
- wizard.setLoader(false)
512
- props
513
- .finishFunc(
514
- vmForm.value,
515
- virtualHardwareCpu.value,
516
- virtualHardwareMemory.value,
517
- customizeHardware.value,
518
- virtualHardwareNetworks.value,
519
- virtualHardwareHardDisks.value,
520
- virtualHardwareCdDvdDrives.value,
521
- isPowerOnByDefault.value,
522
- localization.value,
523
- vmForm.value.locationPath, // для сферы
524
- computeResourcePath.value, // для сферы
525
- false
526
- )
527
- .then(() => {
528
- onHideModal()
529
- wizard.setLoader(false)
530
- })
531
- }
532
-
533
- const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
534
-
535
- const nameFormSubmit = ref<null | Function>(null)
536
- const computeResourceSubmit = ref<null | Function>(null)
537
- const storageSubmit = ref<null | Function>(null)
538
- const customizeHardwareSubmit = ref<null | Function>(null)
539
- const compatibility = ref<UI_I_OptionItem[]>(capabilities.compatibility)
540
- const guestOsFamilies = ref<UI_I_OptionItem[]>(capabilities.guestOsFamilies)
541
- const guestOsVersions = ref<UI_I_ArbitraryObject<UI_I_OptionItem[]>>(
542
- capabilities.guestOsVersions
543
- )
544
- const machineTypes = ref<UI_I_OptionItem[]>(capabilities.machineTypes)
545
- const cpuModels = ref<UI_I_OptionItem[]>(capabilities.cpuModels)
546
- const maxCpus = ref<number>(capabilities.maxCpus)
547
- const maxMemory = ref<number>(capabilities.maxMemory)
548
-
549
- const onHideModal = (): void => {
550
- emits('hide')
551
- }
552
- </script>
553
-
554
- <style scoped lang="scss">
555
- :deep(.modal-body) {
556
- display: flex;
557
- flex-direction: column;
558
- }
559
- .add-vm-content {
560
- display: flex;
561
- flex-direction: column;
562
- flex: 1;
563
- }
564
- .vm-hardware-version {
565
- align-self: flex-end;
566
- margin-top: auto;
567
- }
568
- .power-on-by-default-wrap {
569
- display: flex;
570
- align-items: center;
571
- margin-right: auto;
572
-
573
- input {
574
- margin-right: 6px;
575
- }
576
- }
577
- </style>
1
+ <template>
2
+ <div class="add-vm">
3
+ <atoms-wizard
4
+ show
5
+ :steps="wizard.steps"
6
+ :selected-scheme="selectedScheme"
7
+ :is-loading="wizard.wizardLoader.status"
8
+ :loader-messages="wizard.wizardLoader.messages"
9
+ :title="localization.newVirtualMachine2"
10
+ :was-completed="wasCompleted"
11
+ :localization="localization"
12
+ test-id="new-virtual-machine-wizard"
13
+ @change-steps="onChangeSteps"
14
+ @hide="onHideModal"
15
+ @submit="onFinish"
16
+ >
17
+ <template #modalBody="{ selectedStep }">
18
+ <div class="add-vm-content">
19
+ <common-vm-actions-common-select-create-type
20
+ v-show="selectedStep.id === 0"
21
+ :import-from-v-m-warev-sphere="props.importFromVMWarevSphere"
22
+ />
23
+ <common-vm-actions-common-select-name
24
+ v-show="selectedStep.id === 1 || selectedStep.id === 2"
25
+ :show="selectedStep.id === 1 || selectedStep.id === 2"
26
+ :name-form-submit="nameFormSubmit"
27
+ :project="props.project"
28
+ :data-center="props.dataCenter"
29
+ @submit="onChangeName(...$event)"
30
+ @check-name="emits('check-name', $event)"
31
+ />
32
+ <common-vm-actions-common-select-compute-resource
33
+ v-if="isSphere"
34
+ v-show="selectedStep.id === 3"
35
+ v-model="vmForm.computeResource"
36
+ :compute-resource-submit="computeResourceSubmit"
37
+ :data-center="vmForm.dataCenter"
38
+ :compute-resource="props.computeResource"
39
+ :compute-resource-tree="props.computeResourceTree"
40
+ @submit="onChangeComputeResource"
41
+ @select-compute-resource-tree="onSelectComputeResourceTree"
42
+ @get-compute-resource-tree="
43
+ emits('get-compute-resource-tree', $event)
44
+ "
45
+ @show-compute-resource-tree="
46
+ emits('show-compute-resource-tree', $event)
47
+ "
48
+ @clear-compute-resource-tree="
49
+ emits('clear-compute-resource-tree', $event)
50
+ "
51
+ />
52
+ <common-vm-actions-common-select-storage
53
+ v-show="selectedStep.id === 4"
54
+ :storage-submit="storageSubmit"
55
+ :datastore="props.datastore"
56
+ :get-datastore-table-func="props.getDatastoreTableFunc"
57
+ @submit="onChangeStorage"
58
+ />
59
+ <common-vm-actions-common-select-compatibility
60
+ v-show="selectedStep.id === 5"
61
+ :options="compatibility"
62
+ :error-validation-fields="props.errorValidationFields"
63
+ @change="onChangeCompatibility"
64
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
65
+ />
66
+ <common-vm-actions-common-select-os
67
+ v-show="selectedStep.id === 6 || selectedStep.id === 7"
68
+ :families-options="guestOsFamilies"
69
+ :versions-options="guestOsVersions"
70
+ :machine-types-options="machineTypes"
71
+ :error-validation-fields="props.errorValidationFields"
72
+ @change="onChangeOs"
73
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
74
+ />
75
+ <common-vm-actions-common-customize-hardware
76
+ v-show="selectedStep.id === 8"
77
+ :vm-name="vmForm.name"
78
+ :guest-machine-type="vmForm.guestMachineType"
79
+ :guest-os-family="vmForm.guestOsFamily"
80
+ :guest-os-version="vmForm.guestOsVersion"
81
+ :storage="vmForm.storage"
82
+ :hard-disks-for-boot-options="virtualHardwareHardDisksLocal"
83
+ :cd-dvd-drives-for-boot-options="virtualHardwareCdDvdDrivesLocal"
84
+ :networks-for-boot-options="virtualHardwareNetworksLocal"
85
+ :cd-dvd-drives="virtualHardwareCdDvdDrivesLocal"
86
+ :customize-hardware-submit="customizeHardwareSubmit"
87
+ :max-cpus="maxCpus"
88
+ :max-memory="maxMemory"
89
+ :cpu-models="cpuModels"
90
+ :selected-nav-item="selectedNavItem"
91
+ :nodes="props.nodes"
92
+ :files="props.files"
93
+ :networks-table="props.networksTable"
94
+ :error-validation-fields="props.errorValidationFields"
95
+ :get-datastore-table-func="props.getDatastoreTableFunc"
96
+ :datastore="props.datastore"
97
+ :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
98
+ :passthrough-devices="props.passthroughDevices"
99
+ @change-boot-order="onChangeBootOrder"
100
+ @send-data="onChangeCustomizeHardware"
101
+ @get-storage="emits('get-storage', $event)"
102
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
103
+ @get-active-device-child="emits('get-active-device-child', $event)"
104
+ @show-datastore-child="emits('show-datastore-child', $event)"
105
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
106
+ @get-networks-table="emits('get-networks-table', $event)"
107
+ @get-pci-devices="emits('get-pci-devices')"
108
+ />
109
+ <common-vm-actions-common-ready-to-complete
110
+ v-if="selectedStep.id === 9"
111
+ :ready-complete-table-info="props.readyCompleteTableInfo"
112
+ />
113
+ <span v-if="selectedStep.id > 5" class="vm-hardware-version">{{
114
+ compatibilityInfo
115
+ }}</span>
116
+ </div>
117
+ </template>
118
+
119
+ <template #modalFooterContent>
120
+ <div v-if="isShowPowerOn" class="power-on-by-default-wrap">
121
+ <input
122
+ id="power-on-by-default"
123
+ v-model="isPowerOnByDefault"
124
+ data-id="power-on-by-default"
125
+ type="checkbox"
126
+ />
127
+ <label for="power-on-by-default" class="label-text-normal">{{
128
+ localization.powerOnByDefault
129
+ }}</label>
130
+ </div>
131
+ </template>
132
+ </atoms-wizard>
133
+ </div>
134
+ </template>
135
+
136
+ <script setup lang="ts">
137
+ import type {
138
+ UI_I_Localization,
139
+ UI_I_ArbitraryObject,
140
+ } from '~/lib/models/interfaces'
141
+ import type { UI_T_Project } from '~/lib/models/types'
142
+ import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
143
+ import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
144
+ import type {
145
+ UI_I_DatastoreTableItem,
146
+ UI_I_FolderOrFileTreePayload,
147
+ } from '~/lib/models/store/storage/interfaces'
148
+ import type {
149
+ API_UI_I_Error,
150
+ UI_I_ErrorValidationField,
151
+ } from '~/lib/models/store/interfaces'
152
+ import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
153
+ import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
154
+ import type {
155
+ UI_T_AddVmFinishFunc,
156
+ UI_T_SelectedNavItem,
157
+ } from '~/components/common/vm/actions/common/lib/models/types'
158
+ import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
159
+ import type {
160
+ UI_I_ValidationReturn,
161
+ UI_I_WizardStep,
162
+ } from '~/components/atoms/wizard/lib/models/interfaces'
163
+ import type {
164
+ UI_I_VmForm,
165
+ UI_I_VmFormCash,
166
+ } from '~/components/common/vm/actions/common/lib/models/interfaces'
167
+ import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
168
+ import type { UI_I_OsChange } from '~/components/common/vm/actions/common/select/lib/models/interfaces'
169
+ import type {
170
+ UI_I_SendDataCpu,
171
+ UI_I_SendDataMemory,
172
+ UI_I_SendDataNewCdDvdDrive,
173
+ UI_I_SendDataNewHardDisk,
174
+ UI_I_SendDataNewNetwork,
175
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
176
+ import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
177
+ import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
178
+ import type { UI_I_PciDevice } from '~/lib/models/store/vm/interfaces'
179
+ import { capabilities } from '~/components/common/vm/actions/common/lib/config/capabilities'
180
+ import {
181
+ stepsSchemeInitial,
182
+ stepsFunc,
183
+ } from '~/components/common/vm/actions/add/lib/config/steps'
184
+ import Wizard from '~/components/atoms/wizard/lib/utils/utils'
185
+
186
+ const props = defineProps<{
187
+ project: UI_T_Project
188
+ nodes: UI_I_FileTreeNode[]
189
+ files: UI_I_FileTreeNode[]
190
+ networksTable: UI_I_NetworkTableItem[]
191
+ datastore: UI_I_DatastoreTableItem[]
192
+ errorValidationFields: UI_I_ErrorValidationField[]
193
+ readyCompleteTableInfo: UI_I_TableInfoItem[]
194
+ vmCpuHelpTextSecond: string
195
+ importFromVMWarevSphere: string
196
+ finishFunc: UI_T_AddVmFinishFunc
197
+ getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
198
+ validateSendDataFunc: UI_T_AddVmFinishFunc<
199
+ [UI_T_SelectedNavItem, null | number] | null
200
+ >
201
+ passthroughDevices: UI_I_PciDevice[]
202
+ vmNameInWizard: string
203
+ dataCenter?: UI_I_TreeNode // для сферы
204
+ computeResource?: UI_I_TreeNode // для сферы
205
+ computeResourceTree?: UI_I_TreeNode[] // для сферы
206
+ }>()
207
+
208
+ const emits = defineEmits<{
209
+ (event: 'check-name', value: [string, (error: API_UI_I_Error) => void]): void
210
+ (event: 'get-storage', value: UI_I_TablePayload): void
211
+ (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
212
+ (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
213
+ (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
214
+ (event: 'remove-error-by-title', value: string): void
215
+ (event: 'get-networks-table', value: UI_I_TablePayload): void
216
+ (event: 'get-pci-devices'): void
217
+ (event: 'get-pci-devices'): void
218
+ (event: 'hide'): void
219
+ (
220
+ event: 'get-compute-resource-tree',
221
+ value: { id: string | number; cb: () => void }
222
+ ): void // для сферы
223
+ (event: 'show-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
224
+ (event: 'select-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
225
+ (event: 'clear-compute-resource-tree'): void // для сферы
226
+ }>()
227
+
228
+ const isSphere = computed<boolean>(() => props.project === 'sphere')
229
+
230
+ const { $recursion } = useNuxtApp()
231
+
232
+ const localization = computed<UI_I_Localization>(() => useLocal())
233
+
234
+ const wizard: Wizard = new Wizard(
235
+ stepsFunc(localization.value),
236
+ stepsSchemeInitial
237
+ )
238
+ if (isSphere.value) wizard.changeScheme(1)
239
+ const wasCompleted = computed<boolean>(() => wizard.wasCompleted())
240
+ const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
241
+ const alertMessages = computed<string[][]>(() => wizard.alertMessages.value)
242
+
243
+ const isShowPowerOn = computed<boolean>(() => wizard.selectedStepId > 8)
244
+
245
+ const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
246
+ wizard.changeSteps(value, validationFunc, validateSendData)
247
+ }
248
+ const validationFunc = async (
249
+ value: UI_I_WizardStep[],
250
+ currentStep: UI_I_WizardStep,
251
+ nextStep: UI_I_WizardStep
252
+ ): Promise<UI_I_ValidationReturn> => {
253
+ let stepHasError = false
254
+ let stepShouldStop = {
255
+ ifOnCurrentStep: false,
256
+ ifFromAnyStep: false,
257
+ stoppageStepId: -1,
258
+ }
259
+
260
+ wizard.setLoader(true)
261
+ if (
262
+ wizard.isValidateForStep(
263
+ isSphere.value ? 2 : 1,
264
+ currentStep.id,
265
+ nextStep.id
266
+ )
267
+ ) {
268
+ const nameValidation = await checkName(value)
269
+
270
+ value = nameValidation.newValue
271
+ stepHasError = stepHasError || nameValidation.stepHasError
272
+ } else if (
273
+ isSphere.value &&
274
+ wizard.isValidateForStep(3, currentStep.id, nextStep.id)
275
+ ) {
276
+ const computeResourceValidation = await checkComputeResource(value)
277
+
278
+ value = computeResourceValidation.newValue
279
+ stepHasError = stepHasError || computeResourceValidation.stepHasError
280
+ } else if (wizard.isValidateForStep(4, currentStep.id, nextStep.id)) {
281
+ const storageValidation = await checkStorage(value)
282
+
283
+ value = storageValidation.newValue
284
+
285
+ stepHasError = stepHasError || storageValidation.stepHasError
286
+ } else if (wizard.isValidateForStep(8, currentStep.id, nextStep.id)) {
287
+ const storageValidation = await checkCustomizeHardware(value)
288
+
289
+ value = storageValidation.newValue
290
+
291
+ stepHasError = stepHasError || storageValidation.stepHasError
292
+ }
293
+ wizard.setLoader(false)
294
+
295
+ return {
296
+ newValue: value,
297
+ stepHasError,
298
+ stepShouldStop,
299
+ }
300
+ }
301
+ const checkName = async (
302
+ value: UI_I_WizardStep[]
303
+ ): Promise<UI_I_ValidationReturn> => {
304
+ let stepHasError = false
305
+
306
+ return new Promise((resolve) => {
307
+ const step = isSphere.value ? 2 : 1
308
+ nameFormSubmit.value = (isValid: boolean) => {
309
+ if (!isValid) {
310
+ stepHasError = wizard.setValidation(step, 'name', {
311
+ fieldMessage: 'aaa',
312
+ alertMessage: 'aaa',
313
+ })
314
+ } else if (wizard.hasMessage(step, 'name')) {
315
+ value = wizard.removeValidation(step, 'name', value)
316
+ }
317
+
318
+ resolve({
319
+ stepHasError,
320
+ newValue: value,
321
+ })
322
+ nameFormSubmit.value = null
323
+ }
324
+ })
325
+ }
326
+ const checkComputeResource = async (
327
+ value: UI_I_WizardStep[]
328
+ ): Promise<UI_I_ValidationReturn> => {
329
+ let stepHasError = false
330
+
331
+ return new Promise((resolve) => {
332
+ computeResourceSubmit.value = (isValid: boolean) => {
333
+ if (!isValid) {
334
+ stepHasError = wizard.setValidation(3, 'computeResource', {
335
+ fieldMessage: 'aaa',
336
+ alertMessage: 'aaa',
337
+ })
338
+ } else if (wizard.hasMessage(3, 'computeResource')) {
339
+ value = wizard.removeValidation(3, 'computeResource', value)
340
+ }
341
+
342
+ resolve({
343
+ stepHasError,
344
+ newValue: value,
345
+ })
346
+ computeResourceSubmit.value = null
347
+ }
348
+ })
349
+ }
350
+ const checkStorage = async (
351
+ value: UI_I_WizardStep[]
352
+ ): Promise<UI_I_ValidationReturn> => {
353
+ let stepHasError = false
354
+
355
+ return new Promise((resolve) => {
356
+ storageSubmit.value = (isValid: boolean) => {
357
+ if (!isValid) {
358
+ stepHasError = wizard.setValidation(4, 'storage', {
359
+ fieldMessage: 'aaa',
360
+ alertMessage: 'aaa',
361
+ })
362
+ } else if (wizard.hasMessage(4, 'storage')) {
363
+ value = wizard.removeValidation(4, 'storage', value)
364
+ }
365
+
366
+ resolve({
367
+ stepHasError,
368
+ newValue: value,
369
+ })
370
+ storageSubmit.value = null
371
+ }
372
+ })
373
+ }
374
+ const checkCustomizeHardware = async (
375
+ value: UI_I_WizardStep[]
376
+ ): Promise<UI_I_ValidationReturn> => {
377
+ let stepHasError = false
378
+
379
+ return new Promise((resolve) => {
380
+ customizeHardwareSubmit.value = (isValid: boolean) => {
381
+ if (!isValid) {
382
+ stepHasError = wizard.setValidation(8, 'customizeHardware', {
383
+ fieldMessage: 'aaa',
384
+ alertMessage: 'aaa',
385
+ })
386
+ } else if (wizard.hasMessage(8, 'customizeHardware')) {
387
+ value = wizard.removeValidation(8, 'customizeHardware', value)
388
+ }
389
+
390
+ resolve({
391
+ stepHasError,
392
+ newValue: value,
393
+ })
394
+ storageSubmit.value = null
395
+ }
396
+ })
397
+ }
398
+
399
+ const storageIdCash = ref<string | null>(null)
400
+ const vmForm = ref<UI_I_VmForm>({
401
+ name: '',
402
+ compatibility: '',
403
+ guestMachineType: null,
404
+ guestOsFamily: null,
405
+ guestOsVersion: null,
406
+ computeResource: null,
407
+ storage: null,
408
+ locationPath: '',
409
+ dataCenter: null,
410
+ })
411
+ const vmFormCash = ref<UI_I_VmFormCash>({
412
+ dataCenterId: null,
413
+ computeResourceTypeAndId: null,
414
+ })
415
+
416
+ const onChangeName = (name: string, node: UI_I_TreeNode): void => {
417
+ vmForm.value.name = name
418
+ if (isSphere.value) {
419
+ vmForm.value.locationPath = $recursion.createAbsolutePathRecursion(
420
+ node,
421
+ 'id',
422
+ 'parent'
423
+ )
424
+ vmForm.value.dataCenter = $recursion.findParentByValue(
425
+ node,
426
+ 'datacenter',
427
+ 'type',
428
+ 'parent'
429
+ )
430
+ vmFormCash.value.dataCenterId = vmForm.value.dataCenter?.id || null
431
+ }
432
+ }
433
+ // // Для сферы
434
+ const computeResourcePath = ref<string>('')
435
+ const onSelectComputeResourceTree = (node: UI_I_TreeNode): void => {
436
+ emits('select-compute-resource-tree', node)
437
+ computeResourcePath.value = $recursion.createAbsolutePathRecursion(
438
+ node,
439
+ 'id',
440
+ 'parent'
441
+ )
442
+ }
443
+ const onChangeComputeResource = (node: UI_I_TreeNode): void => {
444
+ vmForm.value.computeResource = node
445
+ // const type = node.type.toUpperCase()
446
+ // schedRequirementsTemplate.value = `sched_requirements="(${type}_ID=${node.id})"\\`
447
+ vmFormCash.value.computeResourceTypeAndId = `${node.type}${node.id}` || null
448
+ }
449
+ const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
450
+ if (!storage) return
451
+
452
+ vmForm.value.storage = storage
453
+ storageIdCash.value = storage.id
454
+ }
455
+ const compatibilityInfo = ref<string>('')
456
+ const onChangeCompatibility = (compatibility: UI_I_OptionItem): void => {
457
+ vmForm.value.compatibility = compatibility.value
458
+
459
+ const version = compatibility.value.split('-')[1]
460
+ compatibilityInfo.value = `${localization.value.compatibility}: ${compatibility.text} (${localization.value.vmVersion} ${version})`
461
+ }
462
+ const onChangeOs = (data: UI_I_OsChange): void => {
463
+ vmForm.value.guestMachineType = data.selectedMachineType
464
+ vmForm.value.guestOsFamily = data.selectedOS
465
+ vmForm.value.guestOsVersion = data.selectedVersion
466
+ }
467
+ const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
468
+ const onChangeCustomizeHardware = (
469
+ data: UI_I_SendDataCustomizeHardware
470
+ ): void => {
471
+ customizeHardware.value = data
472
+ }
473
+
474
+ const virtualHardwareHardDisksLocal = computed<
475
+ UI_I_SendDataNewHardDisk[] | null
476
+ >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
477
+ const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
478
+ () => customizeHardware.value?.virtualHardware?.networks || null
479
+ )
480
+ const virtualHardwareCdDvdDrivesLocal = computed<
481
+ UI_I_SendDataNewCdDvdDrive[] | null
482
+ >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
483
+
484
+ const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
485
+ () => customizeHardware.value?.virtualHardware?.cpu || null
486
+ )
487
+ const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
488
+ () => customizeHardware.value?.virtualHardware?.memory || null
489
+ )
490
+ const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
491
+ const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
492
+ null
493
+ )
494
+ const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
495
+ const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
496
+ virtualHardwareHardDisks.value = data[0]
497
+ virtualHardwareCdDvdDrives.value = data[1]
498
+ virtualHardwareNetworks.value = data[2]
499
+ }
500
+
501
+ const isPowerOnByDefault = ref<boolean>(true)
502
+
503
+ watch(
504
+ () => props.vmNameInWizard,
505
+ (newValue) => {
506
+ vmForm.value.name = newValue
507
+ }
508
+ )
509
+
510
+ const validateSendData = async (
511
+ value: UI_I_WizardStep[]
512
+ ): Promise<UI_I_ValidationReturn> => {
513
+ wizard.setLoader(true)
514
+ let stepHasError = false
515
+
516
+ const data = await props.validateSendDataFunc(
517
+ vmForm.value,
518
+ virtualHardwareCpu.value,
519
+ virtualHardwareMemory.value,
520
+ customizeHardware.value,
521
+ virtualHardwareNetworks.value,
522
+ virtualHardwareHardDisks.value,
523
+ virtualHardwareCdDvdDrives.value,
524
+ isPowerOnByDefault.value,
525
+ localization.value,
526
+ vmForm.value.locationPath, // для сферы
527
+ computeResourcePath.value // для сферы
528
+ )
529
+
530
+ wizard.setLoader(false)
531
+ if (data) {
532
+ stepHasError = true
533
+ selectedNavItem.value = data[0]
534
+ // data[1] !== null && (stepPosition.value = data[1])
535
+ }
536
+
537
+ return {
538
+ stepHasError,
539
+ newValue: value,
540
+ }
541
+ }
542
+ const onFinish = (): void => {
543
+ wizard.setLoader(false)
544
+ props
545
+ .finishFunc(
546
+ vmForm.value,
547
+ virtualHardwareCpu.value,
548
+ virtualHardwareMemory.value,
549
+ customizeHardware.value,
550
+ virtualHardwareNetworks.value,
551
+ virtualHardwareHardDisks.value,
552
+ virtualHardwareCdDvdDrives.value,
553
+ isPowerOnByDefault.value,
554
+ localization.value,
555
+ vmForm.value.locationPath, // для сферы
556
+ computeResourcePath.value, // для сферы
557
+ false
558
+ )
559
+ .then(() => {
560
+ onHideModal()
561
+ wizard.setLoader(false)
562
+ })
563
+ }
564
+
565
+ const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
566
+
567
+ const nameFormSubmit = ref<null | Function>(null)
568
+ const computeResourceSubmit = ref<null | Function>(null)
569
+ const storageSubmit = ref<null | Function>(null)
570
+ const customizeHardwareSubmit = ref<null | Function>(null)
571
+ const compatibility = ref<UI_I_OptionItem[]>(capabilities.compatibility)
572
+ const guestOsFamilies = ref<UI_I_OptionItem[]>(capabilities.guestOsFamilies)
573
+ const guestOsVersions = ref<UI_I_ArbitraryObject<UI_I_OptionItem[]>>(
574
+ capabilities.guestOsVersions
575
+ )
576
+ const machineTypes = ref<UI_I_OptionItem[]>(capabilities.machineTypes)
577
+ const cpuModels = ref<UI_I_OptionItem[]>(capabilities.cpuModels)
578
+ const maxCpus = ref<number>(capabilities.maxCpus)
579
+ const maxMemory = ref<number>(capabilities.maxMemory)
580
+
581
+ const onHideModal = (): void => {
582
+ emits('hide')
583
+ }
584
+ </script>
585
+
586
+ <style scoped lang="scss">
587
+ :deep(.modal-body) {
588
+ display: flex;
589
+ flex-direction: column;
590
+ }
591
+ .add-vm-content {
592
+ display: flex;
593
+ flex-direction: column;
594
+ flex: 1;
595
+ }
596
+ .vm-hardware-version {
597
+ align-self: flex-end;
598
+ margin-top: auto;
599
+ }
600
+ .power-on-by-default-wrap {
601
+ display: flex;
602
+ align-items: center;
603
+ margin-right: auto;
604
+
605
+ input {
606
+ margin-right: 6px;
607
+ }
608
+ }
609
+ </style>