bfg-common 1.5.152 → 1.5.154

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 (150) 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/perPage/PerPage.vue +58 -58
  8. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  9. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  10. package/components/atoms/tabs/VerticalTabs.vue +105 -105
  11. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  12. package/components/common/browse/blocks/lib/models/types.ts +1 -1
  13. package/components/common/browse/lib/models/interfaces.ts +5 -5
  14. package/components/common/context/lib/models/interfaces.ts +31 -31
  15. package/components/common/context/recursion/RecursionNew.vue +238 -238
  16. package/components/common/diagramMain/DiagramMain.vue +897 -897
  17. package/components/common/diagramMain/Header.vue +214 -214
  18. package/components/common/diagramMain/adapter/AdapterItems.vue +61 -61
  19. package/components/common/diagramMain/lib/config/initial.ts +50 -50
  20. package/components/common/diagramMain/lib/models/types.ts +21 -21
  21. package/components/common/diagramMain/lib/utils/utils.ts +331 -331
  22. package/components/common/diagramMain/modals/editSettings/ConfirmTeamingSettingsModal.vue +40 -40
  23. package/components/common/diagramMain/modals/editSettings/tabs/NetworkProperties.vue +214 -214
  24. package/components/common/diagramMain/modals/editSettings/tabs/Security.vue +189 -189
  25. package/components/common/diagramMain/modals/editSettings/tabs/SwitchProperties.vue +163 -163
  26. package/components/common/diagramMain/modals/editSettings/tabs/TeamingFailover.vue +175 -175
  27. package/components/common/diagramMain/modals/editSettings/tabs/port/IpvFourSettings.vue +346 -346
  28. package/components/common/diagramMain/modals/editSettings/tabs/port/PortProperties.vue +205 -205
  29. package/components/common/diagramMain/modals/lib/config/initial.ts +180 -180
  30. package/components/common/diagramMain/modals/lib/config/vmKernelAdapter.ts +90 -90
  31. package/components/common/diagramMain/modals/lib/mappers/mappers.ts +87 -87
  32. package/components/common/diagramMain/modals/lib/utils/index.ts +24 -24
  33. package/components/common/diagramMain/modals/migrateVmkernelAdapter/lib/config/steps.ts +114 -114
  34. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/ConnectionSettings.vue +169 -169
  35. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/SelectVmkernelAdapter.vue +159 -159
  36. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/common.ts +14 -14
  37. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/connectionSettings.ts +137 -137
  38. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/selectVmkernelAdapter.ts +52 -52
  39. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/validations.ts +19 -19
  40. package/components/common/diagramMain/port/Ports.vue +47 -47
  41. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  42. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  43. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  44. package/components/common/pages/home/headline/Headline.vue +45 -45
  45. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  46. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  47. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  48. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  49. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  50. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  51. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  52. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  53. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  54. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  55. package/components/common/pages/packages/Packages.vue +208 -208
  56. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  57. package/components/common/readyToComplete/New.vue +66 -66
  58. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  59. package/components/common/recursionTree/RecursionTree.vue +223 -223
  60. package/components/common/select/button/ButtonDropdown.vue +108 -108
  61. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  62. package/components/common/vm/actions/add/Add.vue +785 -785
  63. package/components/common/vm/actions/add/New.vue +556 -556
  64. package/components/common/vm/actions/add/Old.vue +371 -371
  65. package/components/common/vm/actions/add/folderTreeView/FolderTreeView.vue +72 -72
  66. package/components/common/vm/actions/add/folderTreeView/New.vue +40 -40
  67. package/components/common/vm/actions/add/folderTreeView/Old.vue +50 -50
  68. package/components/common/vm/actions/add/lib/config/steps.ts +263 -263
  69. package/components/common/vm/actions/clone/Clone.vue +801 -801
  70. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -291
  71. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +626 -626
  72. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  73. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  74. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  75. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +99 -99
  76. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  77. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  78. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  79. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  80. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  81. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  82. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  83. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  84. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  85. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +373 -373
  86. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/Location.vue +149 -149
  87. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationNew.vue +74 -74
  88. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationOld.vue +83 -83
  89. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +288 -288
  90. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +94 -94
  91. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  92. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  93. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  94. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  95. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  96. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  97. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  98. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  99. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  100. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  101. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  102. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  103. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  104. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  105. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  106. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  107. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  108. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  109. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  110. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  111. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  112. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  113. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  114. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  115. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +39 -39
  116. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  117. package/components/common/vm/actions/common/lib/utils/capabilities.ts +52 -52
  118. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  119. package/components/common/vm/actions/common/select/computeResource/ComputeResource.vue +134 -134
  120. package/components/common/vm/actions/common/select/computeResource/treeView/New.vue +44 -44
  121. package/components/common/vm/actions/common/select/computeResource/treeView/TreeView.vue +118 -118
  122. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -38
  123. package/components/common/vm/actions/common/select/createType/New.vue +84 -84
  124. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  125. package/components/common/vm/actions/common/select/name/Name.vue +167 -167
  126. package/components/common/vm/actions/common/select/os/New.vue +122 -122
  127. package/components/common/vm/actions/common/select/os/Old.vue +152 -152
  128. package/components/common/vm/actions/common/select/os/Os.vue +139 -139
  129. package/components/common/vm/actions/common/select/storage/Storage.vue +131 -131
  130. package/components/common/vm/actions/common/select/storage/new/lib/config/table.ts +326 -326
  131. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  132. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  133. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  134. package/components/common/wizards/network/add/steps/SelectConnectionType.vue +104 -105
  135. package/components/common/wizards/vm/migrate/Migrate.vue +343 -343
  136. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  137. package/components/common/wizards/vm/migrate/lib/config/steps.ts +157 -157
  138. package/components/common/wizards/vm/migrate/lib/validations.ts +68 -68
  139. package/components/common/wizards/vm/migrate/select/computeResource/tableView/TableView.vue +137 -137
  140. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  141. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  142. package/composables/productNameLocal.ts +30 -30
  143. package/composables/useAppVersion.ts +21 -21
  144. package/package.json +1 -1
  145. package/plugins/date.ts +233 -233
  146. package/public/spice-console/lib/images/bitmap.js +203 -203
  147. package/public/spice-console/network/spicechannel.js +383 -383
  148. package/store/main/mutations.ts +7 -7
  149. package/store/main/state.ts +7 -7
  150. package/store/tasks/mappers/recentTasks.ts +64 -64
@@ -1,801 +1,801 @@
1
- <template>
2
- <div class="clone-vm">
3
- <atoms-wizard
4
- show
5
- :wizard="wizard"
6
- :selected-scheme="selectedScheme"
7
- :title="title"
8
- :localization="localization"
9
- @change-steps="onChangeSteps"
10
- @hide="onHideModal"
11
- @submit="onFinish"
12
- >
13
- <template #modalBody="{ selectedStep }">
14
- <atoms-loader v-show="!vmSettings" id="loader" />
15
- <div v-if="vmSettings" class="vm-context">
16
- <common-pages-scheduled-tasks-modals-common-new-task-form
17
- v-show="selectedStep.id === dynamicSteps.scheduledTasks"
18
- v-model="newTaskForm"
19
- :target="selectedVirtualMachine"
20
- class="new-task-form"
21
- />
22
- <common-vm-actions-common-select-name
23
- v-show="
24
- selectedStep.id === dynamicSteps.selectName ||
25
- selectedStep.id === dynamicSteps.selectNameFolder
26
- "
27
- :show="
28
- selectedStep.id === dynamicSteps.selectName ||
29
- selectedStep.id === dynamicSteps.selectNameFolder
30
- "
31
- :name-form-submit="nameFormSubmit"
32
- :project="props.project"
33
- :data-center="props.dataCenter"
34
- @submit="onChangeName(...$event)"
35
- @check-name="emits('check-name', $event)"
36
- />
37
- <common-vm-actions-common-select-compute-resource
38
- v-if="isSphere"
39
- v-show="selectedStep.id === dynamicSteps.selectComputeResource"
40
- v-model="computeResource"
41
- :compute-resource-submit="computeResourceSubmit"
42
- :data-center="vmForm.dataCenter"
43
- :compute-resource="props.computeResource"
44
- :compute-resource-tree="props.computeResourceTree"
45
- @submit="onChangeComputeResource"
46
- @select-compute-resource-tree="onSelectComputeResourceTree"
47
- @get-compute-resource-tree="
48
- emits('get-compute-resource-tree', $event)
49
- "
50
- @show-compute-resource-tree="
51
- emits('show-compute-resource-tree', $event)
52
- "
53
- @clear-compute-resource-tree="emits('clear-compute-resource-tree')"
54
- />
55
- <common-vm-actions-common-select-storage
56
- v-show="selectedStep.id === dynamicSteps.selectStorage"
57
- :storage-submit="storageSubmit"
58
- :datastore="props.datastore"
59
- :storage="vmSettings.storage"
60
- :get-datastore-table-func="props.getDatastoreTableFunc"
61
- @submit="onChangeStorage"
62
- />
63
- <common-vm-actions-common-select-options
64
- v-show="selectedStep.id === dynamicSteps.selectOptions"
65
- @change="onChangeSelectOptions"
66
- />
67
- <common-vm-actions-common-select-os
68
- v-show="selectedStep.id === dynamicSteps.selectGuestOSMachineType"
69
- v-model:machine-type="vmForm.guestMachineType"
70
- v-model:guest-os-family="vmForm.guestOsFamily"
71
- v-model:guest-os-version="vmForm.guestOsVersion"
72
- :families-options="guestOsFamilies"
73
- :versions-options="guestOsVersions"
74
- :machine-types-options="machineTypes"
75
- :error-validation-fields="props.errorValidationFields"
76
- @remove-error-by-title="emits('remove-error-by-title', $event)"
77
- />
78
- <common-vm-actions-common-customize-hardware
79
- v-show="selectedStep.id === dynamicSteps.customizeHardware"
80
- v-model:vm-name="vmName"
81
- v-model:guest-machine-type="vmSettings.guestMachineType"
82
- v-model:guest-os-family="vmSettings.guestOsFamily"
83
- v-model:guest-os-version="vmSettings.guestOsVersion"
84
- :storage="vmSettings.storage"
85
- :hard-disks-for-boot-options="virtualHardwareHardDisksLocal"
86
- :cd-dvd-drives-for-boot-options="virtualHardwareCdDvdDrivesLocal"
87
- :networks-for-boot-options="virtualHardwareNetworksLocal"
88
- :cd-dvd-drives="vmSettings.cdDvdDrives"
89
- :hard-disks="vmSettings.hardDisks"
90
- :networks="vmSettings.networks"
91
- :customize-hardware-submit="customizeHardwareSubmit"
92
- :max-cpus="vmSettings.maxCpus"
93
- :max-memory="vmSettings.maxMemory"
94
- :cpu-models="vmSettings.cpuModels"
95
- :cpu="vmSettings.cpu"
96
- :memory="vmSettings.memory"
97
- :video-card="vmSettings.videoCard"
98
- :usb-controller="vmSettings.usbController"
99
- :pci-devices="vmSettings.pciDevices"
100
- :selected-nav-item="selectedNavItem"
101
- :hard-disks-for-edit="vmSettings.hardDisks"
102
- :options="vmSettings.options"
103
- :nodes="props.nodes"
104
- :files="props.files"
105
- :networks-table="props.networksTable"
106
- :error-validation-fields="props.errorValidationFields"
107
- :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
108
- :passthrough-devices="props.passthroughDevices"
109
- :mediated-devices="props.mediatedDevices"
110
- :get-datastore-table-func="props.getDatastoreTableFunc"
111
- :datastore="props.datastore"
112
- :project="props.project"
113
- is-clone
114
- @change-boot-order="onChangeBootOrder"
115
- @send-data="onChangeCustomizeHardware"
116
- @get-storage="emits('get-storage', $event)"
117
- @get-folders-or-files="emits('get-folders-or-files', $event)"
118
- @get-active-device-child="emits('get-active-device-child', $event)"
119
- @show-datastore-child="emits('show-datastore-child', $event)"
120
- @get-networks-table="emits('get-networks-table', $event)"
121
- @get-pci-devices="emits('get-pci-devices')"
122
- />
123
- <common-ready-to-complete
124
- v-show="selectedStep.id === dynamicSteps.readyComplete"
125
- :data="props.readyCompleteTableInfo"
126
- />
127
- </div>
128
- </template>
129
- </atoms-wizard>
130
- </div>
131
- </template>
132
-
133
- <script setup lang="ts">
134
- import type {
135
- UI_I_DatastoreTableItem,
136
- UI_I_FolderOrFileTreePayload,
137
- } from '~/lib/models/store/storage/interfaces'
138
- import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
139
- import type { API_UI_I_Error } from '~/lib/models/store/interfaces'
140
- import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
141
- import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
142
- import type {
143
- UI_I_ArbitraryObject,
144
- UI_I_Localization,
145
- } from '~/lib/models/interfaces'
146
- import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
147
- import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
148
- import type {
149
- UI_I_SendDataCpu,
150
- UI_I_SendDataMemory,
151
- UI_I_SendDataNewCdDvdDrive,
152
- UI_I_SendDataNewHardDisk,
153
- UI_I_SendDataNewNetwork,
154
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
155
- import type { UI_T_SelectedNavItem } from '~/components/common/vm/actions/common/lib/models/types'
156
- import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
157
- import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
158
- import type { UI_T_Project } from '~/lib/models/types'
159
- import type {
160
- UI_I_MediatedDevice,
161
- UI_I_PciDevice,
162
- UI_I_VmSettings,
163
- } from '~/lib/models/store/vm/interfaces'
164
- import type {
165
- UI_I_VmForm,
166
- } from '~/components/common/vm/actions/common/lib/models/interfaces'
167
- import type {
168
- UI_I_ValidationReturn,
169
- UI_I_WizardStep,
170
- } from '~/components/atoms/wizard/lib/models/interfaces'
171
- import type { UI_I_Capabilities } from '~/components/common/vm/actions/common/lib/models/interfaces'
172
- import type { UI_I_ScheduleNewTasksForm } from '~/components/common/pages/scheduledTasks/modals/lib/models/interfaces'
173
- import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
174
- import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
175
- import {
176
- stepsSchemeInitial,
177
- stepsFunc,
178
- dynamicSteps,
179
- } from '~/components/common/vm/actions/clone/lib/config/steps'
180
- import Wizard from '~/components/atoms/wizard/lib/utils/utils'
181
- import { mapCapabilities } from '~/components/common/vm/actions/common/lib/utils/capabilities'
182
- import { scheduledTaskDefaultFormFunc } from '~/components/common/pages/scheduledTasks/modals/lib/config/createScheduledTask'
183
- import { capabilities } from '~/components/common/vm/actions/common/lib/config/capabilities'
184
-
185
- const props = defineProps<{
186
- project: UI_T_Project
187
- vmSettings: UI_I_VmSettings | null
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
- finishFunc: any
196
- getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
197
- validateSendDataFunc: any
198
- passthroughDevices: UI_I_PciDevice[]
199
- mediatedDevices: UI_I_MediatedDevice[]
200
- vmNameInWizard: string
201
- capabilities?: UI_I_Capabilities
202
- schedulerTask?: any // TODO надо interface переместить глобално
203
- selectedVirtualMachine?: UI_I_Capabilities
204
- dataCenter?: UI_I_TreeNode // для сферы
205
- computeResource?: UI_I_TreeNode // для сферы
206
- computeResourceTree?: UI_I_TreeNode[] // для сферы
207
- }>()
208
-
209
- const emits = defineEmits<{
210
- (event: 'check-name', value: [string, (error: API_UI_I_Error) => void]): void
211
- (event: 'get-storage', value: UI_I_TablePayload): void
212
- (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
213
- (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
214
- (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
215
- (event: 'remove-error-by-title', value: string): void
216
- (event: 'get-networks-table', value: UI_I_TablePayload): 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 { $recursion } = useNuxtApp()
229
-
230
- const localization = computed<UI_I_Localization>(() => useLocal())
231
-
232
- const isSphere = computed<boolean>(() => props.project === 'sphere')
233
-
234
- const isScheduledTasks = computed<boolean>(
235
- () => props.schedulerTask.isSchedulerTask
236
- )
237
-
238
- const title = computed<string>(() => {
239
- const { scheduleNewTasks, scheduleTaskEdit, cloneExistingVirtualMachine } =
240
- localization.value.common
241
-
242
- let result = cloneExistingVirtualMachine
243
- if (isScheduledTasks.value) {
244
- const schedulerMode = props.schedulerTask.editTask
245
- ? scheduleTaskEdit
246
- : scheduleNewTasks
247
-
248
- result = `${schedulerMode} (${cloneExistingVirtualMachine})`
249
- }
250
-
251
- return result
252
- })
253
-
254
- watch(
255
- () => props.capabilities,
256
- () => {
257
- if (props.capabilities) {
258
- mapCapabilities(props.capabilities)
259
- }
260
- },
261
- { deep: true, immediate: true }
262
- )
263
-
264
- const wizard: Wizard = new Wizard(
265
- stepsFunc(localization.value),
266
- stepsSchemeInitial
267
- )
268
- watch(
269
- isScheduledTasks,
270
- (newValue) => {
271
- if (newValue) {
272
- wizard.changeScheme(isSphere.value ? 12 : 4)
273
- } else {
274
- wizard.changeScheme(isSphere.value ? 8 : 0)
275
- wizard.selectStepHard(isSphere.value ? 2 : 1)
276
- }
277
- },
278
- { immediate: true }
279
- )
280
-
281
- // TODO move to common
282
- const newTaskForm = ref<UI_I_ScheduleNewTasksForm>(
283
- useDeepCopy(scheduledTaskDefaultFormFunc())
284
- )
285
- watch(
286
- newTaskForm,
287
- (newValue: UI_I_ScheduleNewTasksForm) => {
288
- if (isScheduledTasks.value) wizard.setDisabledNextButton(newValue.isValid)
289
- },
290
- { immediate: true, deep: true }
291
- )
292
-
293
- const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
294
-
295
- const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
296
- wizard.changeSteps(value, validationFunc, validateSendData)
297
- }
298
-
299
- const validationFunc = async (
300
- value: UI_I_WizardStep[],
301
- currentStep: UI_I_WizardStep,
302
- nextStep: UI_I_WizardStep
303
- ): Promise<UI_I_ValidationReturn> => {
304
- let stepHasError = false
305
- let stepShouldStop = {
306
- ifOnCurrentStep: false,
307
- ifFromAnyStep: false,
308
- stoppageStepId: -1,
309
- }
310
-
311
- wizard.setLoader(true)
312
- if (
313
- wizard.isValidateForStep(
314
- isSphere.value ? dynamicSteps.selectNameFolder : dynamicSteps.selectName,
315
- currentStep.id,
316
- nextStep.id
317
- )
318
- ) {
319
- const nameValidation = await checkName(value)
320
-
321
- value = nameValidation.newValue
322
- stepHasError = stepHasError || nameValidation.stepHasError
323
- } else if (
324
- isSphere.value &&
325
- wizard.isValidateForStep(
326
- dynamicSteps.selectComputeResource,
327
- currentStep.id,
328
- nextStep.id
329
- )
330
- ) {
331
- const computeResourceValidation = await checkComputeResource(value)
332
-
333
- value = computeResourceValidation.newValue
334
- stepHasError = stepHasError || computeResourceValidation.stepHasError
335
- } else if (
336
- wizard.isValidateForStep(
337
- dynamicSteps.selectStorage,
338
- currentStep.id,
339
- nextStep.id
340
- )
341
- ) {
342
- const storageValidation = await checkStorage(value)
343
-
344
- value = storageValidation.newValue
345
-
346
- stepHasError = stepHasError || storageValidation.stepHasError
347
- } else if (
348
- wizard.isValidateForStep(
349
- dynamicSteps.customizeHardware,
350
- currentStep.id,
351
- nextStep.id
352
- )
353
- ) {
354
- const customizeHardwareValidation = await checkCustomizeHardware(value)
355
-
356
- value = customizeHardwareValidation.newValue
357
-
358
- stepHasError = stepHasError || customizeHardwareValidation.stepHasError
359
- }
360
- wizard.setLoader(false)
361
-
362
- return {
363
- newValue: value,
364
- stepHasError,
365
- stepShouldStop,
366
- }
367
- }
368
- const checkName = async (
369
- value: UI_I_WizardStep[]
370
- ): Promise<UI_I_ValidationReturn> => {
371
- let stepHasError = false
372
-
373
- return new Promise((resolve) => {
374
- const step = isSphere.value
375
- ? dynamicSteps.selectNameFolder
376
- : dynamicSteps.selectName
377
- nameFormSubmit.value = (isValid: boolean) => {
378
- if (!isValid) {
379
- stepHasError = wizard.setValidation(step, 'name', {
380
- fieldMessage: 'aaa',
381
- alertMessage: 'aaa',
382
- })
383
- } else if (wizard.hasMessage(step, 'name')) {
384
- value = wizard.removeValidation(step, 'name', value)
385
- }
386
-
387
- resolve({
388
- stepHasError,
389
- newValue: value,
390
- })
391
- nameFormSubmit.value = null
392
- }
393
- })
394
- }
395
- const checkComputeResource = async (
396
- value: UI_I_WizardStep[]
397
- ): Promise<UI_I_ValidationReturn> => {
398
- let stepHasError = false
399
-
400
- return new Promise((resolve) => {
401
- computeResourceSubmit.value = (isValid: boolean) => {
402
- if (!isValid) {
403
- stepHasError = wizard.setValidation(
404
- dynamicSteps.selectComputeResource,
405
- 'computeResource',
406
- {
407
- fieldMessage: 'aaa',
408
- alertMessage: 'aaa',
409
- }
410
- )
411
- } else if (
412
- wizard.hasMessage(dynamicSteps.selectComputeResource, 'computeResource')
413
- ) {
414
- value = wizard.removeValidation(
415
- dynamicSteps.selectComputeResource,
416
- 'computeResource',
417
- value
418
- )
419
- }
420
-
421
- resolve({
422
- stepHasError,
423
- newValue: value,
424
- })
425
- computeResourceSubmit.value = null
426
- }
427
- })
428
- }
429
- const checkStorage = async (
430
- value: UI_I_WizardStep[]
431
- ): Promise<UI_I_ValidationReturn> => {
432
- let stepHasError = false
433
-
434
- return new Promise((resolve) => {
435
- storageSubmit.value = (isValid: boolean) => {
436
- if (!isValid) {
437
- stepHasError = wizard.setValidation(
438
- dynamicSteps.selectStorage,
439
- 'storage',
440
- {
441
- fieldMessage: 'aaa',
442
- alertMessage: 'aaa',
443
- }
444
- )
445
- } else if (wizard.hasMessage(dynamicSteps.selectStorage, 'storage')) {
446
- value = wizard.removeValidation(
447
- dynamicSteps.selectStorage,
448
- 'storage',
449
- value
450
- )
451
- }
452
-
453
- resolve({
454
- stepHasError,
455
- newValue: value,
456
- })
457
- storageSubmit.value = null
458
- }
459
- })
460
- }
461
- const checkCustomizeHardware = async (
462
- value: UI_I_WizardStep[]
463
- ): Promise<UI_I_ValidationReturn> => {
464
- let stepHasError = false
465
-
466
- return new Promise((resolve) => {
467
- customizeHardwareSubmit.value = (isValid: boolean) => {
468
- if (!isValid) {
469
- stepHasError = wizard.setValidation(
470
- dynamicSteps.customizeHardware,
471
- 'customizeHardware',
472
- {
473
- fieldMessage: 'aaa',
474
- alertMessage: 'aaa',
475
- }
476
- )
477
- } else if (
478
- wizard.hasMessage(dynamicSteps.customizeHardware, 'customizeHardware')
479
- ) {
480
- value = wizard.removeValidation(
481
- dynamicSteps.customizeHardware,
482
- 'customizeHardware',
483
- value
484
- )
485
- }
486
-
487
- resolve({
488
- stepHasError,
489
- newValue: value,
490
- })
491
- storageSubmit.value = null
492
- }
493
- })
494
- }
495
-
496
- const vmForm = ref<UI_I_VmForm>({
497
- name: '',
498
- compatibility: '',
499
- guestMachineType: null,
500
- guestOsFamily: null,
501
- guestOsVersion: null,
502
- computeResource: null,
503
- storage: null,
504
- locationPath: '',
505
- dataCenter: null,
506
- options: [],
507
- })
508
- const onChangeName = (name: string, node: UI_I_TreeNode): void => {
509
- vmForm.value.name = name
510
- if (isSphere.value) {
511
- vmForm.value.locationPath = node.id
512
- vmForm.value.dataCenter = $recursion.findParentByValue(
513
- node,
514
- 'datacenter',
515
- 'type',
516
- 'parent'
517
- )
518
- }
519
- }
520
- const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
521
- if (!storage) return
522
-
523
- vmForm.value.storage = storage
524
- }
525
- const onChangeSelectOptions = (options: string[]): void => {
526
- vmForm.value.options = options
527
- if (
528
- options.includes('customize-os') &&
529
- options.includes('customize-hardware')
530
- ) {
531
- let procuratorSchame = isScheduledTasks.value ? 7 : 3
532
- let sphereSchame = isScheduledTasks.value ? 15 : 11
533
- wizard.changeScheme(isSphere.value ? sphereSchame : procuratorSchame)
534
- } else if (options.includes('customize-os')) {
535
- let procuratorSchame = isScheduledTasks.value ? 5 : 1
536
- let sphereSchame = isScheduledTasks.value ? 13 : 9
537
- wizard.changeScheme(isSphere.value ? sphereSchame : procuratorSchame)
538
- } else if (options.includes('customize-hardware')) {
539
- let procuratorSchame = isScheduledTasks.value ? 6 : 2
540
- let sphereSchame = isScheduledTasks.value ? 14 : 10
541
- wizard.changeScheme(isSphere.value ? sphereSchame : procuratorSchame)
542
- } else {
543
- let procuratorSchame = isScheduledTasks.value ? 4 : 0
544
- let sphereSchame = isScheduledTasks.value ? 12 : 8
545
- wizard.changeScheme(isSphere.value ? sphereSchame : procuratorSchame)
546
- }
547
-
548
- // Change power on by default
549
- isPowerOnByDefault.value = options.includes('power-on')
550
- }
551
- const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
552
- const onChangeCustomizeHardware = (
553
- data: UI_I_SendDataCustomizeHardware
554
- ): void => {
555
- customizeHardware.value = data
556
- }
557
-
558
- const virtualHardwareHardDisksLocal = computed<
559
- UI_I_SendDataNewHardDisk[] | null
560
- >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
561
- const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
562
- () => customizeHardware.value?.virtualHardware?.networks || null
563
- )
564
- const virtualHardwareCdDvdDrivesLocal = computed<
565
- UI_I_SendDataNewCdDvdDrive[] | null
566
- >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
567
-
568
- const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
569
- () => customizeHardware.value?.virtualHardware?.cpu || null
570
- )
571
- const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
572
- () => customizeHardware.value?.virtualHardware?.memory || null
573
- )
574
- const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
575
- const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
576
- null
577
- )
578
- const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
579
- const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
580
- virtualHardwareHardDisks.value = data[0]
581
- virtualHardwareCdDvdDrives.value = data[1]
582
- virtualHardwareNetworks.value = data[2]
583
- }
584
-
585
- const isPowerOnByDefault = ref<boolean>(false)
586
-
587
- watch(
588
- () => props.vmNameInWizard,
589
- (newValue) => {
590
- vmForm.value.name = newValue
591
- }
592
- )
593
-
594
- const validateSendData = async (
595
- value: UI_I_WizardStep[]
596
- ): Promise<UI_I_ValidationReturn> => {
597
- wizard.setLoader(true)
598
- let stepHasError = false
599
-
600
- const data = await props.validateSendDataFunc(
601
- vmForm.value,
602
- virtualHardwareCpu.value,
603
- virtualHardwareMemory.value,
604
- customizeHardware.value,
605
- virtualHardwareNetworks.value,
606
- virtualHardwareHardDisks.value,
607
- virtualHardwareCdDvdDrives.value,
608
- isPowerOnByDefault.value,
609
- localization.value,
610
- vmForm.value.locationPath, // для сферы
611
- computeResourcePath.value // для сферы
612
- )
613
-
614
- wizard.setLoader(false)
615
- if (data) {
616
- stepHasError = true
617
- selectedNavItem.value = data[0]
618
- }
619
-
620
- return {
621
- stepHasError,
622
- newValue: value,
623
- }
624
- }
625
- const onFinish = (): void => {
626
- wizard.setLoader(false)
627
- props
628
- .finishFunc(
629
- vmForm.value,
630
- virtualHardwareCpu.value,
631
- virtualHardwareMemory.value,
632
- customizeHardware.value,
633
- virtualHardwareNetworks.value,
634
- virtualHardwareHardDisks.value,
635
- virtualHardwareCdDvdDrives.value,
636
- isPowerOnByDefault.value,
637
- localization.value,
638
- vmForm.value.locationPath, // для сферы
639
- computeResourcePath.value, // для сферы
640
- false,
641
- newTaskForm.value,
642
- props.schedulerTask
643
- )
644
- .then(() => {
645
- onHideModal()
646
- wizard.setLoader(false)
647
- })
648
- }
649
-
650
- const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
651
-
652
- const nameFormSubmit = ref<null | Function>(null)
653
- const computeResourceSubmit = ref<null | Function>(null)
654
- const storageSubmit = ref<null | Function>(null)
655
- const customizeHardwareSubmit = ref<null | Function>(null)
656
-
657
- const vmSettings = computed<UI_I_VmSettings | null>(() => props.vmSettings)
658
- const vmName = ref<string>(vmSettings.value?.name || '')
659
-
660
- const guestOsFamilies = ref<UI_I_OptionItem[]>(capabilities.guestOsFamilies)
661
- const guestOsVersions = ref<UI_I_ArbitraryObject<UI_I_OptionItem[]>>(
662
- capabilities.guestOsVersions
663
- )
664
- const machineTypes = ref<UI_I_OptionItem[]>(capabilities.machineTypes)
665
-
666
- const computeResource = ref<UI_I_TreeNode | null>(null)
667
- const onChangeComputeResource = (node: UI_I_TreeNode): void => {
668
- computeResource.value = node
669
- }
670
- // // Для сферы
671
- const computeResourcePath = ref<string>('')
672
- const onSelectComputeResourceTree = (node: UI_I_TreeNode): void => {
673
- emits('select-compute-resource-tree', node)
674
- computeResourcePath.value = node.id
675
- }
676
-
677
- watch(vmSettings, (newValue) => {
678
- vmName.value = newValue?.name || ''
679
-
680
- if (newValue?.guestOsFamily)
681
- vmForm.value.guestOsFamily = newValue.guestOsFamily
682
- if (newValue?.guestMachineType)
683
- vmForm.value.guestMachineType = newValue.guestMachineType
684
- if (newValue?.guestOsVersion)
685
- vmForm.value.guestOsVersion = newValue.guestOsVersion
686
-
687
- if (newValue?.compatibility)
688
- vmForm.value.compatibility = newValue.compatibility
689
- })
690
-
691
- const onHideModal = (): void => {
692
- emits('hide')
693
- }
694
- </script>
695
-
696
- <style scoped lang="scss">
697
- :deep(.has-solid.close-icon.clr-icon) {
698
- width: 20px;
699
- top: 0;
700
- }
701
- .vm-context {
702
- padding: 16px 15px 10px 10px;
703
- height: 100%;
704
- display: flex;
705
- flex-direction: column;
706
-
707
- .context-title-wrap {
708
- padding-bottom: 3px;
709
- border-bottom: 1px solid #a6a6a6;
710
-
711
- h4 {
712
- font-weight: 700;
713
- font-size: 13px;
714
- color: var(--vm-context-title);
715
- }
716
- p {
717
- font-weight: 400;
718
- font-size: 13px;
719
- color: var(--vm-context-sub-title);
720
- }
721
- }
722
-
723
- .finish-block {
724
- padding: 18px 24px 24px 24px;
725
-
726
- .add-hosts-ready-to-complete-mt-12 {
727
- margin-top: 12px;
728
-
729
- .add-hosts-ready-to-complete-bold {
730
- line-height: 18px;
731
- font-weight: 700;
732
- }
733
- }
734
- }
735
-
736
- .vm-hardware-version {
737
- align-self: flex-end;
738
- margin-top: auto;
739
- }
740
- }
741
-
742
- :deep(.modal .modal-dialog .modal-content .modal-footer) {
743
- flex: unset;
744
- height: unset;
745
- min-height: unset;
746
- }
747
- :deep(.wizard-modal-titlebar h3) {
748
- color: #000;
749
- font-size: 24px;
750
- font-weight: 200;
751
- line-height: 27px;
752
- margin: 0;
753
- padding: 0;
754
- }
755
- :deep(.clr-wizard-stepnav-item) {
756
- padding-left: 0;
757
- }
758
- :deep(.clr-wizard-stepnav
759
- .clr-wizard-stepnav-item
760
- button
761
- .clr-wizard-stepnav-link-title) {
762
- width: 189px;
763
- font-weight: 700;
764
- font-size: 13px;
765
- }
766
-
767
- #vm-wizard-notification {
768
- h3 {
769
- color: var(--global-font-color7);
770
- margin-top: 6px;
771
- }
772
- p {
773
- color: var(--global-font-color6);
774
- line-height: 16px;
775
- }
776
- }
777
-
778
- .power-on-by-default-wrap {
779
- display: flex;
780
- align-items: center;
781
-
782
- input {
783
- margin-right: 6px;
784
- }
785
- }
786
-
787
- .new-task-form {
788
- padding: 0 25px 0 5px;
789
- }
790
- </style>
791
-
792
- <style>
793
- :root {
794
- --vm-context-title: #333;
795
- --vm-context-sub-title: #000;
796
- }
797
- :root.dark-theme {
798
- --vm-context-title: #adbbc4;
799
- --vm-context-sub-title: #adbbc4;
800
- }
801
- </style>
1
+ <template>
2
+ <div class="clone-vm">
3
+ <atoms-wizard
4
+ show
5
+ :wizard="wizard"
6
+ :selected-scheme="selectedScheme"
7
+ :title="title"
8
+ :localization="localization"
9
+ @change-steps="onChangeSteps"
10
+ @hide="onHideModal"
11
+ @submit="onFinish"
12
+ >
13
+ <template #modalBody="{ selectedStep }">
14
+ <atoms-loader v-show="!vmSettings" id="loader" />
15
+ <div v-if="vmSettings" class="vm-context">
16
+ <common-pages-scheduled-tasks-modals-common-new-task-form
17
+ v-show="selectedStep.id === dynamicSteps.scheduledTasks"
18
+ v-model="newTaskForm"
19
+ :target="selectedVirtualMachine"
20
+ class="new-task-form"
21
+ />
22
+ <common-vm-actions-common-select-name
23
+ v-show="
24
+ selectedStep.id === dynamicSteps.selectName ||
25
+ selectedStep.id === dynamicSteps.selectNameFolder
26
+ "
27
+ :show="
28
+ selectedStep.id === dynamicSteps.selectName ||
29
+ selectedStep.id === dynamicSteps.selectNameFolder
30
+ "
31
+ :name-form-submit="nameFormSubmit"
32
+ :project="props.project"
33
+ :data-center="props.dataCenter"
34
+ @submit="onChangeName(...$event)"
35
+ @check-name="emits('check-name', $event)"
36
+ />
37
+ <common-vm-actions-common-select-compute-resource
38
+ v-if="isSphere"
39
+ v-show="selectedStep.id === dynamicSteps.selectComputeResource"
40
+ v-model="computeResource"
41
+ :compute-resource-submit="computeResourceSubmit"
42
+ :data-center="vmForm.dataCenter"
43
+ :compute-resource="props.computeResource"
44
+ :compute-resource-tree="props.computeResourceTree"
45
+ @submit="onChangeComputeResource"
46
+ @select-compute-resource-tree="onSelectComputeResourceTree"
47
+ @get-compute-resource-tree="
48
+ emits('get-compute-resource-tree', $event)
49
+ "
50
+ @show-compute-resource-tree="
51
+ emits('show-compute-resource-tree', $event)
52
+ "
53
+ @clear-compute-resource-tree="emits('clear-compute-resource-tree')"
54
+ />
55
+ <common-vm-actions-common-select-storage
56
+ v-show="selectedStep.id === dynamicSteps.selectStorage"
57
+ :storage-submit="storageSubmit"
58
+ :datastore="props.datastore"
59
+ :storage="vmSettings.storage"
60
+ :get-datastore-table-func="props.getDatastoreTableFunc"
61
+ @submit="onChangeStorage"
62
+ />
63
+ <common-vm-actions-common-select-options
64
+ v-show="selectedStep.id === dynamicSteps.selectOptions"
65
+ @change="onChangeSelectOptions"
66
+ />
67
+ <common-vm-actions-common-select-os
68
+ v-show="selectedStep.id === dynamicSteps.selectGuestOSMachineType"
69
+ v-model:machine-type="vmForm.guestMachineType"
70
+ v-model:guest-os-family="vmForm.guestOsFamily"
71
+ v-model:guest-os-version="vmForm.guestOsVersion"
72
+ :families-options="guestOsFamilies"
73
+ :versions-options="guestOsVersions"
74
+ :machine-types-options="machineTypes"
75
+ :error-validation-fields="props.errorValidationFields"
76
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
77
+ />
78
+ <common-vm-actions-common-customize-hardware
79
+ v-show="selectedStep.id === dynamicSteps.customizeHardware"
80
+ v-model:vm-name="vmName"
81
+ v-model:guest-machine-type="vmSettings.guestMachineType"
82
+ v-model:guest-os-family="vmSettings.guestOsFamily"
83
+ v-model:guest-os-version="vmSettings.guestOsVersion"
84
+ :storage="vmSettings.storage"
85
+ :hard-disks-for-boot-options="virtualHardwareHardDisksLocal"
86
+ :cd-dvd-drives-for-boot-options="virtualHardwareCdDvdDrivesLocal"
87
+ :networks-for-boot-options="virtualHardwareNetworksLocal"
88
+ :cd-dvd-drives="vmSettings.cdDvdDrives"
89
+ :hard-disks="vmSettings.hardDisks"
90
+ :networks="vmSettings.networks"
91
+ :customize-hardware-submit="customizeHardwareSubmit"
92
+ :max-cpus="vmSettings.maxCpus"
93
+ :max-memory="vmSettings.maxMemory"
94
+ :cpu-models="vmSettings.cpuModels"
95
+ :cpu="vmSettings.cpu"
96
+ :memory="vmSettings.memory"
97
+ :video-card="vmSettings.videoCard"
98
+ :usb-controller="vmSettings.usbController"
99
+ :pci-devices="vmSettings.pciDevices"
100
+ :selected-nav-item="selectedNavItem"
101
+ :hard-disks-for-edit="vmSettings.hardDisks"
102
+ :options="vmSettings.options"
103
+ :nodes="props.nodes"
104
+ :files="props.files"
105
+ :networks-table="props.networksTable"
106
+ :error-validation-fields="props.errorValidationFields"
107
+ :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
108
+ :passthrough-devices="props.passthroughDevices"
109
+ :mediated-devices="props.mediatedDevices"
110
+ :get-datastore-table-func="props.getDatastoreTableFunc"
111
+ :datastore="props.datastore"
112
+ :project="props.project"
113
+ is-clone
114
+ @change-boot-order="onChangeBootOrder"
115
+ @send-data="onChangeCustomizeHardware"
116
+ @get-storage="emits('get-storage', $event)"
117
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
118
+ @get-active-device-child="emits('get-active-device-child', $event)"
119
+ @show-datastore-child="emits('show-datastore-child', $event)"
120
+ @get-networks-table="emits('get-networks-table', $event)"
121
+ @get-pci-devices="emits('get-pci-devices')"
122
+ />
123
+ <common-ready-to-complete
124
+ v-show="selectedStep.id === dynamicSteps.readyComplete"
125
+ :data="props.readyCompleteTableInfo"
126
+ />
127
+ </div>
128
+ </template>
129
+ </atoms-wizard>
130
+ </div>
131
+ </template>
132
+
133
+ <script setup lang="ts">
134
+ import type {
135
+ UI_I_DatastoreTableItem,
136
+ UI_I_FolderOrFileTreePayload,
137
+ } from '~/lib/models/store/storage/interfaces'
138
+ import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
139
+ import type { API_UI_I_Error } from '~/lib/models/store/interfaces'
140
+ import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
141
+ import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
142
+ import type {
143
+ UI_I_ArbitraryObject,
144
+ UI_I_Localization,
145
+ } from '~/lib/models/interfaces'
146
+ import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
147
+ import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
148
+ import type {
149
+ UI_I_SendDataCpu,
150
+ UI_I_SendDataMemory,
151
+ UI_I_SendDataNewCdDvdDrive,
152
+ UI_I_SendDataNewHardDisk,
153
+ UI_I_SendDataNewNetwork,
154
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
155
+ import type { UI_T_SelectedNavItem } from '~/components/common/vm/actions/common/lib/models/types'
156
+ import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
157
+ import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
158
+ import type { UI_T_Project } from '~/lib/models/types'
159
+ import type {
160
+ UI_I_MediatedDevice,
161
+ UI_I_PciDevice,
162
+ UI_I_VmSettings,
163
+ } from '~/lib/models/store/vm/interfaces'
164
+ import type {
165
+ UI_I_VmForm,
166
+ } from '~/components/common/vm/actions/common/lib/models/interfaces'
167
+ import type {
168
+ UI_I_ValidationReturn,
169
+ UI_I_WizardStep,
170
+ } from '~/components/atoms/wizard/lib/models/interfaces'
171
+ import type { UI_I_Capabilities } from '~/components/common/vm/actions/common/lib/models/interfaces'
172
+ import type { UI_I_ScheduleNewTasksForm } from '~/components/common/pages/scheduledTasks/modals/lib/models/interfaces'
173
+ import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
174
+ import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
175
+ import {
176
+ stepsSchemeInitial,
177
+ stepsFunc,
178
+ dynamicSteps,
179
+ } from '~/components/common/vm/actions/clone/lib/config/steps'
180
+ import Wizard from '~/components/atoms/wizard/lib/utils/utils'
181
+ import { mapCapabilities } from '~/components/common/vm/actions/common/lib/utils/capabilities'
182
+ import { scheduledTaskDefaultFormFunc } from '~/components/common/pages/scheduledTasks/modals/lib/config/createScheduledTask'
183
+ import { capabilities } from '~/components/common/vm/actions/common/lib/config/capabilities'
184
+
185
+ const props = defineProps<{
186
+ project: UI_T_Project
187
+ vmSettings: UI_I_VmSettings | null
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
+ finishFunc: any
196
+ getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
197
+ validateSendDataFunc: any
198
+ passthroughDevices: UI_I_PciDevice[]
199
+ mediatedDevices: UI_I_MediatedDevice[]
200
+ vmNameInWizard: string
201
+ capabilities?: UI_I_Capabilities
202
+ schedulerTask?: any // TODO надо interface переместить глобално
203
+ selectedVirtualMachine?: UI_I_Capabilities
204
+ dataCenter?: UI_I_TreeNode // для сферы
205
+ computeResource?: UI_I_TreeNode // для сферы
206
+ computeResourceTree?: UI_I_TreeNode[] // для сферы
207
+ }>()
208
+
209
+ const emits = defineEmits<{
210
+ (event: 'check-name', value: [string, (error: API_UI_I_Error) => void]): void
211
+ (event: 'get-storage', value: UI_I_TablePayload): void
212
+ (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
213
+ (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
214
+ (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
215
+ (event: 'remove-error-by-title', value: string): void
216
+ (event: 'get-networks-table', value: UI_I_TablePayload): 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 { $recursion } = useNuxtApp()
229
+
230
+ const localization = computed<UI_I_Localization>(() => useLocal())
231
+
232
+ const isSphere = computed<boolean>(() => props.project === 'sphere')
233
+
234
+ const isScheduledTasks = computed<boolean>(
235
+ () => props.schedulerTask.isSchedulerTask
236
+ )
237
+
238
+ const title = computed<string>(() => {
239
+ const { scheduleNewTasks, scheduleTaskEdit, cloneExistingVirtualMachine } =
240
+ localization.value.common
241
+
242
+ let result = cloneExistingVirtualMachine
243
+ if (isScheduledTasks.value) {
244
+ const schedulerMode = props.schedulerTask.editTask
245
+ ? scheduleTaskEdit
246
+ : scheduleNewTasks
247
+
248
+ result = `${schedulerMode} (${cloneExistingVirtualMachine})`
249
+ }
250
+
251
+ return result
252
+ })
253
+
254
+ watch(
255
+ () => props.capabilities,
256
+ () => {
257
+ if (props.capabilities) {
258
+ mapCapabilities(props.capabilities)
259
+ }
260
+ },
261
+ { deep: true, immediate: true }
262
+ )
263
+
264
+ const wizard: Wizard = new Wizard(
265
+ stepsFunc(localization.value),
266
+ stepsSchemeInitial
267
+ )
268
+ watch(
269
+ isScheduledTasks,
270
+ (newValue) => {
271
+ if (newValue) {
272
+ wizard.changeScheme(isSphere.value ? 12 : 4)
273
+ } else {
274
+ wizard.changeScheme(isSphere.value ? 8 : 0)
275
+ wizard.selectStepHard(isSphere.value ? 2 : 1)
276
+ }
277
+ },
278
+ { immediate: true }
279
+ )
280
+
281
+ // TODO move to common
282
+ const newTaskForm = ref<UI_I_ScheduleNewTasksForm>(
283
+ useDeepCopy(scheduledTaskDefaultFormFunc())
284
+ )
285
+ watch(
286
+ newTaskForm,
287
+ (newValue: UI_I_ScheduleNewTasksForm) => {
288
+ if (isScheduledTasks.value) wizard.setDisabledNextButton(newValue.isValid)
289
+ },
290
+ { immediate: true, deep: true }
291
+ )
292
+
293
+ const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
294
+
295
+ const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
296
+ wizard.changeSteps(value, validationFunc, validateSendData)
297
+ }
298
+
299
+ const validationFunc = async (
300
+ value: UI_I_WizardStep[],
301
+ currentStep: UI_I_WizardStep,
302
+ nextStep: UI_I_WizardStep
303
+ ): Promise<UI_I_ValidationReturn> => {
304
+ let stepHasError = false
305
+ let stepShouldStop = {
306
+ ifOnCurrentStep: false,
307
+ ifFromAnyStep: false,
308
+ stoppageStepId: -1,
309
+ }
310
+
311
+ wizard.setLoader(true)
312
+ if (
313
+ wizard.isValidateForStep(
314
+ isSphere.value ? dynamicSteps.selectNameFolder : dynamicSteps.selectName,
315
+ currentStep.id,
316
+ nextStep.id
317
+ )
318
+ ) {
319
+ const nameValidation = await checkName(value)
320
+
321
+ value = nameValidation.newValue
322
+ stepHasError = stepHasError || nameValidation.stepHasError
323
+ } else if (
324
+ isSphere.value &&
325
+ wizard.isValidateForStep(
326
+ dynamicSteps.selectComputeResource,
327
+ currentStep.id,
328
+ nextStep.id
329
+ )
330
+ ) {
331
+ const computeResourceValidation = await checkComputeResource(value)
332
+
333
+ value = computeResourceValidation.newValue
334
+ stepHasError = stepHasError || computeResourceValidation.stepHasError
335
+ } else if (
336
+ wizard.isValidateForStep(
337
+ dynamicSteps.selectStorage,
338
+ currentStep.id,
339
+ nextStep.id
340
+ )
341
+ ) {
342
+ const storageValidation = await checkStorage(value)
343
+
344
+ value = storageValidation.newValue
345
+
346
+ stepHasError = stepHasError || storageValidation.stepHasError
347
+ } else if (
348
+ wizard.isValidateForStep(
349
+ dynamicSteps.customizeHardware,
350
+ currentStep.id,
351
+ nextStep.id
352
+ )
353
+ ) {
354
+ const customizeHardwareValidation = await checkCustomizeHardware(value)
355
+
356
+ value = customizeHardwareValidation.newValue
357
+
358
+ stepHasError = stepHasError || customizeHardwareValidation.stepHasError
359
+ }
360
+ wizard.setLoader(false)
361
+
362
+ return {
363
+ newValue: value,
364
+ stepHasError,
365
+ stepShouldStop,
366
+ }
367
+ }
368
+ const checkName = async (
369
+ value: UI_I_WizardStep[]
370
+ ): Promise<UI_I_ValidationReturn> => {
371
+ let stepHasError = false
372
+
373
+ return new Promise((resolve) => {
374
+ const step = isSphere.value
375
+ ? dynamicSteps.selectNameFolder
376
+ : dynamicSteps.selectName
377
+ nameFormSubmit.value = (isValid: boolean) => {
378
+ if (!isValid) {
379
+ stepHasError = wizard.setValidation(step, 'name', {
380
+ fieldMessage: 'aaa',
381
+ alertMessage: 'aaa',
382
+ })
383
+ } else if (wizard.hasMessage(step, 'name')) {
384
+ value = wizard.removeValidation(step, 'name', value)
385
+ }
386
+
387
+ resolve({
388
+ stepHasError,
389
+ newValue: value,
390
+ })
391
+ nameFormSubmit.value = null
392
+ }
393
+ })
394
+ }
395
+ const checkComputeResource = async (
396
+ value: UI_I_WizardStep[]
397
+ ): Promise<UI_I_ValidationReturn> => {
398
+ let stepHasError = false
399
+
400
+ return new Promise((resolve) => {
401
+ computeResourceSubmit.value = (isValid: boolean) => {
402
+ if (!isValid) {
403
+ stepHasError = wizard.setValidation(
404
+ dynamicSteps.selectComputeResource,
405
+ 'computeResource',
406
+ {
407
+ fieldMessage: 'aaa',
408
+ alertMessage: 'aaa',
409
+ }
410
+ )
411
+ } else if (
412
+ wizard.hasMessage(dynamicSteps.selectComputeResource, 'computeResource')
413
+ ) {
414
+ value = wizard.removeValidation(
415
+ dynamicSteps.selectComputeResource,
416
+ 'computeResource',
417
+ value
418
+ )
419
+ }
420
+
421
+ resolve({
422
+ stepHasError,
423
+ newValue: value,
424
+ })
425
+ computeResourceSubmit.value = null
426
+ }
427
+ })
428
+ }
429
+ const checkStorage = async (
430
+ value: UI_I_WizardStep[]
431
+ ): Promise<UI_I_ValidationReturn> => {
432
+ let stepHasError = false
433
+
434
+ return new Promise((resolve) => {
435
+ storageSubmit.value = (isValid: boolean) => {
436
+ if (!isValid) {
437
+ stepHasError = wizard.setValidation(
438
+ dynamicSteps.selectStorage,
439
+ 'storage',
440
+ {
441
+ fieldMessage: 'aaa',
442
+ alertMessage: 'aaa',
443
+ }
444
+ )
445
+ } else if (wizard.hasMessage(dynamicSteps.selectStorage, 'storage')) {
446
+ value = wizard.removeValidation(
447
+ dynamicSteps.selectStorage,
448
+ 'storage',
449
+ value
450
+ )
451
+ }
452
+
453
+ resolve({
454
+ stepHasError,
455
+ newValue: value,
456
+ })
457
+ storageSubmit.value = null
458
+ }
459
+ })
460
+ }
461
+ const checkCustomizeHardware = async (
462
+ value: UI_I_WizardStep[]
463
+ ): Promise<UI_I_ValidationReturn> => {
464
+ let stepHasError = false
465
+
466
+ return new Promise((resolve) => {
467
+ customizeHardwareSubmit.value = (isValid: boolean) => {
468
+ if (!isValid) {
469
+ stepHasError = wizard.setValidation(
470
+ dynamicSteps.customizeHardware,
471
+ 'customizeHardware',
472
+ {
473
+ fieldMessage: 'aaa',
474
+ alertMessage: 'aaa',
475
+ }
476
+ )
477
+ } else if (
478
+ wizard.hasMessage(dynamicSteps.customizeHardware, 'customizeHardware')
479
+ ) {
480
+ value = wizard.removeValidation(
481
+ dynamicSteps.customizeHardware,
482
+ 'customizeHardware',
483
+ value
484
+ )
485
+ }
486
+
487
+ resolve({
488
+ stepHasError,
489
+ newValue: value,
490
+ })
491
+ storageSubmit.value = null
492
+ }
493
+ })
494
+ }
495
+
496
+ const vmForm = ref<UI_I_VmForm>({
497
+ name: '',
498
+ compatibility: '',
499
+ guestMachineType: null,
500
+ guestOsFamily: null,
501
+ guestOsVersion: null,
502
+ computeResource: null,
503
+ storage: null,
504
+ locationPath: '',
505
+ dataCenter: null,
506
+ options: [],
507
+ })
508
+ const onChangeName = (name: string, node: UI_I_TreeNode): void => {
509
+ vmForm.value.name = name
510
+ if (isSphere.value) {
511
+ vmForm.value.locationPath = node.id
512
+ vmForm.value.dataCenter = $recursion.findParentByValue(
513
+ node,
514
+ 'datacenter',
515
+ 'type',
516
+ 'parent'
517
+ )
518
+ }
519
+ }
520
+ const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
521
+ if (!storage) return
522
+
523
+ vmForm.value.storage = storage
524
+ }
525
+ const onChangeSelectOptions = (options: string[]): void => {
526
+ vmForm.value.options = options
527
+ if (
528
+ options.includes('customize-os') &&
529
+ options.includes('customize-hardware')
530
+ ) {
531
+ let procuratorSchame = isScheduledTasks.value ? 7 : 3
532
+ let sphereSchame = isScheduledTasks.value ? 15 : 11
533
+ wizard.changeScheme(isSphere.value ? sphereSchame : procuratorSchame)
534
+ } else if (options.includes('customize-os')) {
535
+ let procuratorSchame = isScheduledTasks.value ? 5 : 1
536
+ let sphereSchame = isScheduledTasks.value ? 13 : 9
537
+ wizard.changeScheme(isSphere.value ? sphereSchame : procuratorSchame)
538
+ } else if (options.includes('customize-hardware')) {
539
+ let procuratorSchame = isScheduledTasks.value ? 6 : 2
540
+ let sphereSchame = isScheduledTasks.value ? 14 : 10
541
+ wizard.changeScheme(isSphere.value ? sphereSchame : procuratorSchame)
542
+ } else {
543
+ let procuratorSchame = isScheduledTasks.value ? 4 : 0
544
+ let sphereSchame = isScheduledTasks.value ? 12 : 8
545
+ wizard.changeScheme(isSphere.value ? sphereSchame : procuratorSchame)
546
+ }
547
+
548
+ // Change power on by default
549
+ isPowerOnByDefault.value = options.includes('power-on')
550
+ }
551
+ const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
552
+ const onChangeCustomizeHardware = (
553
+ data: UI_I_SendDataCustomizeHardware
554
+ ): void => {
555
+ customizeHardware.value = data
556
+ }
557
+
558
+ const virtualHardwareHardDisksLocal = computed<
559
+ UI_I_SendDataNewHardDisk[] | null
560
+ >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
561
+ const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
562
+ () => customizeHardware.value?.virtualHardware?.networks || null
563
+ )
564
+ const virtualHardwareCdDvdDrivesLocal = computed<
565
+ UI_I_SendDataNewCdDvdDrive[] | null
566
+ >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
567
+
568
+ const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
569
+ () => customizeHardware.value?.virtualHardware?.cpu || null
570
+ )
571
+ const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
572
+ () => customizeHardware.value?.virtualHardware?.memory || null
573
+ )
574
+ const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
575
+ const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
576
+ null
577
+ )
578
+ const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
579
+ const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
580
+ virtualHardwareHardDisks.value = data[0]
581
+ virtualHardwareCdDvdDrives.value = data[1]
582
+ virtualHardwareNetworks.value = data[2]
583
+ }
584
+
585
+ const isPowerOnByDefault = ref<boolean>(false)
586
+
587
+ watch(
588
+ () => props.vmNameInWizard,
589
+ (newValue) => {
590
+ vmForm.value.name = newValue
591
+ }
592
+ )
593
+
594
+ const validateSendData = async (
595
+ value: UI_I_WizardStep[]
596
+ ): Promise<UI_I_ValidationReturn> => {
597
+ wizard.setLoader(true)
598
+ let stepHasError = false
599
+
600
+ const data = await props.validateSendDataFunc(
601
+ vmForm.value,
602
+ virtualHardwareCpu.value,
603
+ virtualHardwareMemory.value,
604
+ customizeHardware.value,
605
+ virtualHardwareNetworks.value,
606
+ virtualHardwareHardDisks.value,
607
+ virtualHardwareCdDvdDrives.value,
608
+ isPowerOnByDefault.value,
609
+ localization.value,
610
+ vmForm.value.locationPath, // для сферы
611
+ computeResourcePath.value // для сферы
612
+ )
613
+
614
+ wizard.setLoader(false)
615
+ if (data) {
616
+ stepHasError = true
617
+ selectedNavItem.value = data[0]
618
+ }
619
+
620
+ return {
621
+ stepHasError,
622
+ newValue: value,
623
+ }
624
+ }
625
+ const onFinish = (): void => {
626
+ wizard.setLoader(false)
627
+ props
628
+ .finishFunc(
629
+ vmForm.value,
630
+ virtualHardwareCpu.value,
631
+ virtualHardwareMemory.value,
632
+ customizeHardware.value,
633
+ virtualHardwareNetworks.value,
634
+ virtualHardwareHardDisks.value,
635
+ virtualHardwareCdDvdDrives.value,
636
+ isPowerOnByDefault.value,
637
+ localization.value,
638
+ vmForm.value.locationPath, // для сферы
639
+ computeResourcePath.value, // для сферы
640
+ false,
641
+ newTaskForm.value,
642
+ props.schedulerTask
643
+ )
644
+ .then(() => {
645
+ onHideModal()
646
+ wizard.setLoader(false)
647
+ })
648
+ }
649
+
650
+ const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
651
+
652
+ const nameFormSubmit = ref<null | Function>(null)
653
+ const computeResourceSubmit = ref<null | Function>(null)
654
+ const storageSubmit = ref<null | Function>(null)
655
+ const customizeHardwareSubmit = ref<null | Function>(null)
656
+
657
+ const vmSettings = computed<UI_I_VmSettings | null>(() => props.vmSettings)
658
+ const vmName = ref<string>(vmSettings.value?.name || '')
659
+
660
+ const guestOsFamilies = ref<UI_I_OptionItem[]>(capabilities.guestOsFamilies)
661
+ const guestOsVersions = ref<UI_I_ArbitraryObject<UI_I_OptionItem[]>>(
662
+ capabilities.guestOsVersions
663
+ )
664
+ const machineTypes = ref<UI_I_OptionItem[]>(capabilities.machineTypes)
665
+
666
+ const computeResource = ref<UI_I_TreeNode | null>(null)
667
+ const onChangeComputeResource = (node: UI_I_TreeNode): void => {
668
+ computeResource.value = node
669
+ }
670
+ // // Для сферы
671
+ const computeResourcePath = ref<string>('')
672
+ const onSelectComputeResourceTree = (node: UI_I_TreeNode): void => {
673
+ emits('select-compute-resource-tree', node)
674
+ computeResourcePath.value = node.id
675
+ }
676
+
677
+ watch(vmSettings, (newValue) => {
678
+ vmName.value = newValue?.name || ''
679
+
680
+ if (newValue?.guestOsFamily)
681
+ vmForm.value.guestOsFamily = newValue.guestOsFamily
682
+ if (newValue?.guestMachineType)
683
+ vmForm.value.guestMachineType = newValue.guestMachineType
684
+ if (newValue?.guestOsVersion)
685
+ vmForm.value.guestOsVersion = newValue.guestOsVersion
686
+
687
+ if (newValue?.compatibility)
688
+ vmForm.value.compatibility = newValue.compatibility
689
+ })
690
+
691
+ const onHideModal = (): void => {
692
+ emits('hide')
693
+ }
694
+ </script>
695
+
696
+ <style scoped lang="scss">
697
+ :deep(.has-solid.close-icon.clr-icon) {
698
+ width: 20px;
699
+ top: 0;
700
+ }
701
+ .vm-context {
702
+ padding: 16px 15px 10px 10px;
703
+ height: 100%;
704
+ display: flex;
705
+ flex-direction: column;
706
+
707
+ .context-title-wrap {
708
+ padding-bottom: 3px;
709
+ border-bottom: 1px solid #a6a6a6;
710
+
711
+ h4 {
712
+ font-weight: 700;
713
+ font-size: 13px;
714
+ color: var(--vm-context-title);
715
+ }
716
+ p {
717
+ font-weight: 400;
718
+ font-size: 13px;
719
+ color: var(--vm-context-sub-title);
720
+ }
721
+ }
722
+
723
+ .finish-block {
724
+ padding: 18px 24px 24px 24px;
725
+
726
+ .add-hosts-ready-to-complete-mt-12 {
727
+ margin-top: 12px;
728
+
729
+ .add-hosts-ready-to-complete-bold {
730
+ line-height: 18px;
731
+ font-weight: 700;
732
+ }
733
+ }
734
+ }
735
+
736
+ .vm-hardware-version {
737
+ align-self: flex-end;
738
+ margin-top: auto;
739
+ }
740
+ }
741
+
742
+ :deep(.modal .modal-dialog .modal-content .modal-footer) {
743
+ flex: unset;
744
+ height: unset;
745
+ min-height: unset;
746
+ }
747
+ :deep(.wizard-modal-titlebar h3) {
748
+ color: #000;
749
+ font-size: 24px;
750
+ font-weight: 200;
751
+ line-height: 27px;
752
+ margin: 0;
753
+ padding: 0;
754
+ }
755
+ :deep(.clr-wizard-stepnav-item) {
756
+ padding-left: 0;
757
+ }
758
+ :deep(.clr-wizard-stepnav
759
+ .clr-wizard-stepnav-item
760
+ button
761
+ .clr-wizard-stepnav-link-title) {
762
+ width: 189px;
763
+ font-weight: 700;
764
+ font-size: 13px;
765
+ }
766
+
767
+ #vm-wizard-notification {
768
+ h3 {
769
+ color: var(--global-font-color7);
770
+ margin-top: 6px;
771
+ }
772
+ p {
773
+ color: var(--global-font-color6);
774
+ line-height: 16px;
775
+ }
776
+ }
777
+
778
+ .power-on-by-default-wrap {
779
+ display: flex;
780
+ align-items: center;
781
+
782
+ input {
783
+ margin-right: 6px;
784
+ }
785
+ }
786
+
787
+ .new-task-form {
788
+ padding: 0 25px 0 5px;
789
+ }
790
+ </style>
791
+
792
+ <style>
793
+ :root {
794
+ --vm-context-title: #333;
795
+ --vm-context-sub-title: #000;
796
+ }
797
+ :root.dark-theme {
798
+ --vm-context-title: #adbbc4;
799
+ --vm-context-sub-title: #adbbc4;
800
+ }
801
+ </style>