bfg-common 1.5.153 → 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,626 +1,626 @@
1
- <template>
2
- <div class="clone-to-template">
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="!vmSettingsLocal" id="loader" />
15
- <div v-if="vmSettingsLocal" 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="selectedStep.id === dynamicSteps.selectName"
24
- :show="selectedStep.id === dynamicSteps.selectName"
25
- :name-form-submit="nameFormSubmit"
26
- :project="props.project"
27
- @submit="onChangeName(...$event)"
28
- @check-name="emits('check-name', $event)"
29
- />
30
- <common-vm-actions-common-select-storage
31
- v-show="selectedStep.id === dynamicSteps.selectStorage"
32
- :storage-submit="storageSubmit"
33
- :datastore="props.datastore"
34
- :storage="vmSettingsLocal.storage"
35
- :get-datastore-table-func="props.getDatastoreTableFunc"
36
- @submit="onChangeStorage"
37
- />
38
- <common-vm-actions-common-customize-hardware
39
- v-show="selectedStep.id === dynamicSteps.customizeHardware"
40
- v-model:vm-name="vmName"
41
- v-model:guest-machine-type="vmSettingsLocal.guestMachineType"
42
- v-model:guest-os-family="vmSettingsLocal.guestOsFamily"
43
- v-model:guest-os-version="vmSettingsLocal.guestOsVersion"
44
- :storage="vmSettingsLocal.storage"
45
- :hard-disks-for-boot-options="virtualHardwareHardDisksLocal"
46
- :cd-dvd-drives-for-boot-options="virtualHardwareCdDvdDrivesLocal"
47
- :networks-for-boot-options="virtualHardwareNetworksLocal"
48
- :cd-dvd-drives="vmSettingsLocal.cdDvdDrives"
49
- :hard-disks="vmSettingsLocal.hardDisks"
50
- :networks="vmSettingsLocal.networks"
51
- :customize-hardware-submit="customizeHardwareSubmit"
52
- :max-cpus="vmSettingsLocal.maxCpus"
53
- :max-memory="vmSettingsLocal.maxMemory"
54
- :cpu-models="vmSettingsLocal.cpuModels"
55
- :cpu="vmSettingsLocal.cpu"
56
- :memory="vmSettingsLocal.memory"
57
- :video-card="vmSettingsLocal.videoCard"
58
- :usb-controller="vmSettingsLocal.usbController"
59
- :pci-devices="vmSettingsLocal.pciDevices"
60
- :selected-nav-item="selectedNavItem"
61
- :hard-disks-for-edit="vmSettingsLocal.hardDisks"
62
- :options="vmSettingsLocal.options"
63
- :nodes="props.nodes"
64
- :files="props.files"
65
- :networks-table="props.networksTable"
66
- :error-validation-fields="props.errorValidationFields"
67
- :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
68
- :passthrough-devices="props.passthroughDevices"
69
- :mediated-devices="props.mediatedDevices"
70
- :get-datastore-table-func="props.getDatastoreTableFunc"
71
- :datastore="props.datastore"
72
- :project="props.project"
73
- is-clone
74
- @change-boot-order="onChangeBootOrder"
75
- @send-data="onChangeCustomizeHardware"
76
- @get-storage="emits('get-storage', $event)"
77
- @get-folders-or-files="emits('get-folders-or-files', $event)"
78
- @get-active-device-child="emits('get-active-device-child', $event)"
79
- @show-datastore-child="emits('show-datastore-child', $event)"
80
- @get-networks-table="emits('get-networks-table', $event)"
81
- @get-pci-devices="emits('get-pci-devices')"
82
- />
83
- <common-ready-to-complete
84
- v-show="selectedStep.id === dynamicSteps.readyComplete"
85
- :data="props.readyCompleteTableInfo"
86
- />
87
- </div>
88
- </template>
89
- </atoms-wizard>
90
- </div>
91
- </template>
92
-
93
- <script setup lang="ts">
94
- import type {
95
- UI_I_DatastoreTableItem,
96
- UI_I_FolderOrFileTreePayload,
97
- } from '~/lib/models/store/storage/interfaces'
98
- import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
99
- import type { API_UI_I_Error } from '~/lib/models/store/interfaces'
100
- import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
101
- import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
102
- import type { UI_I_Localization } from '~/lib/models/interfaces'
103
- import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
104
- import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
105
- import type {
106
- UI_I_SendDataCpu,
107
- UI_I_SendDataMemory,
108
- UI_I_SendDataNewCdDvdDrive,
109
- UI_I_SendDataNewHardDisk,
110
- UI_I_SendDataNewNetwork,
111
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
112
- import type { UI_T_SelectedNavItem } from '~/components/common/vm/actions/common/lib/models/types'
113
- import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
114
- import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
115
- import type { UI_T_Project } from '~/lib/models/types'
116
- import type {
117
- UI_I_MediatedDevice,
118
- UI_I_PciDevice,
119
- UI_I_VmSettings,
120
- } from '~/lib/models/store/vm/interfaces'
121
- import type {
122
- I_DynamicSteps,
123
- // UI_I_VmForm,
124
- } from '~/components/common/vm/actions/clone/toTemplate/lib/models/interfaces'
125
- import type {
126
- UI_I_ValidationReturn,
127
- UI_I_WizardStep,
128
- } from '~/components/atoms/wizard/lib/models/interfaces'
129
- import type { UI_I_Capabilities } from '~/components/common/vm/actions/common/lib/models/interfaces'
130
- import type { UI_I_ScheduleNewTasksForm } from '~/components/common/pages/scheduledTasks/modals/lib/models/interfaces'
131
- import {
132
- stepsSchemeInitial,
133
- stepsFunc,
134
- getDynamicSteps,
135
- } from '~/components/common/vm/actions/clone/toTemplate/lib/config/steps'
136
- import Wizard from '~/components/atoms/wizard/lib/utils/utils'
137
- import { mapCapabilities } from '~/components/common/vm/actions/common/lib/utils/capabilities'
138
- import { scheduledTaskDefaultFormFunc } from '~/components/common/pages/scheduledTasks/modals/lib/config/createScheduledTask'
139
-
140
- const props = defineProps<{
141
- project: UI_T_Project
142
- vmSettings: UI_I_VmSettings | null
143
- nodes: UI_I_FileTreeNode[]
144
- files: UI_I_FileTreeNode[]
145
- networksTable: UI_I_NetworkTableItem[]
146
- datastore: UI_I_DatastoreTableItem[]
147
- errorValidationFields: UI_I_ErrorValidationField[]
148
- readyCompleteTableInfo: UI_I_TableInfoItem[]
149
- vmCpuHelpTextSecond: string
150
- finishFunc: any
151
- getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
152
- validateSendDataFunc: any
153
- passthroughDevices: UI_I_PciDevice[]
154
- mediatedDevices: UI_I_MediatedDevice[]
155
- vmNameInWizard: string
156
- capabilities?: UI_I_Capabilities
157
- schedulerTask?: any // TODO надо interface переместить глобално
158
- selectedVirtualMachine?: UI_I_Capabilities
159
- }>()
160
-
161
- const emits = defineEmits<{
162
- (event: 'check-name', value: [string, (error: API_UI_I_Error) => void]): void
163
- (event: 'get-storage', value: UI_I_TablePayload): void
164
- (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
165
- (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
166
- (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
167
- (event: 'remove-error-by-title', value: string): void
168
- (event: 'get-networks-table', value: UI_I_TablePayload): void
169
- (event: 'get-pci-devices'): void
170
- (event: 'hide'): void
171
- }>()
172
-
173
- const localization = computed<UI_I_Localization>(() => useLocal())
174
-
175
- const isScheduledTasks = computed<boolean>(
176
- () => props.schedulerTask.isSchedulerTask
177
- )
178
-
179
- const title = computed<string>(() => {
180
- const { scheduleNewTasks, scheduleTaskEdit, cloneTemplate } =
181
- localization.value.common
182
-
183
- let result = cloneTemplate
184
- if (isScheduledTasks.value) {
185
- const schedulerMode = props.schedulerTask.editTask
186
- ? scheduleTaskEdit
187
- : scheduleNewTasks
188
-
189
- result = `${schedulerMode} (${cloneTemplate})`
190
- }
191
-
192
- return result
193
- })
194
-
195
- const dynamicSteps = ref<I_DynamicSteps>(
196
- getDynamicSteps(isScheduledTasks.value)
197
- )
198
-
199
- watch(
200
- () => props.capabilities,
201
- () => {
202
- if (props.capabilities) mapCapabilities(props.capabilities)
203
- },
204
- { deep: true, immediate: true }
205
- )
206
-
207
- const wizard: Wizard = new Wizard(
208
- stepsFunc(localization.value, isScheduledTasks.value),
209
- stepsSchemeInitial(isScheduledTasks.value)
210
- )
211
- // TODO move to common
212
- const newTaskForm = ref<UI_I_ScheduleNewTasksForm>(
213
- useDeepCopy(scheduledTaskDefaultFormFunc())
214
- )
215
- watch(
216
- newTaskForm,
217
- (newValue: UI_I_ScheduleNewTasksForm) => {
218
- if (isScheduledTasks.value) wizard.setDisabledNextButton(newValue.isValid)
219
- },
220
- { immediate: true, deep: true }
221
- )
222
-
223
- const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
224
-
225
- const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
226
- wizard.changeSteps(value, validationFunc, validateSendData)
227
- }
228
-
229
- const validationFunc = async (
230
- value: UI_I_WizardStep[],
231
- currentStep: UI_I_WizardStep,
232
- nextStep: UI_I_WizardStep
233
- ): Promise<UI_I_ValidationReturn> => {
234
- let stepHasError = false
235
- let stepShouldStop = {
236
- ifOnCurrentStep: false,
237
- ifFromAnyStep: false,
238
- stoppageStepId: -1,
239
- }
240
-
241
- wizard.setLoader(true)
242
- if (
243
- wizard.isValidateForStep(
244
- dynamicSteps.value.selectName,
245
- currentStep.id,
246
- nextStep.id
247
- )
248
- ) {
249
- const nameValidation = await checkName(value)
250
-
251
- value = nameValidation.newValue
252
- stepHasError = stepHasError || nameValidation.stepHasError
253
- } else if (
254
- wizard.isValidateForStep(
255
- dynamicSteps.value.selectStorage,
256
- currentStep.id,
257
- nextStep.id
258
- )
259
- ) {
260
- const storageValidation = await checkStorage(value)
261
-
262
- value = storageValidation.newValue
263
-
264
- stepHasError = stepHasError || storageValidation.stepHasError
265
- } else if (
266
- wizard.isValidateForStep(
267
- dynamicSteps.value.selectOptions,
268
- currentStep.id,
269
- nextStep.id
270
- )
271
- ) {
272
- selectOptionsSubmit.value++
273
- } else if (
274
- wizard.isValidateForStep(
275
- dynamicSteps.value.customizeHardware,
276
- currentStep.id,
277
- nextStep.id
278
- )
279
- ) {
280
- const customizeHardwareValidation = await checkCustomizeHardware(value)
281
-
282
- value = customizeHardwareValidation.newValue
283
-
284
- stepHasError = stepHasError || customizeHardwareValidation.stepHasError
285
- }
286
- wizard.setLoader(false)
287
-
288
- return {
289
- newValue: value,
290
- stepHasError,
291
- stepShouldStop,
292
- }
293
- }
294
- const checkName = async (
295
- value: UI_I_WizardStep[]
296
- ): Promise<UI_I_ValidationReturn> => {
297
- let stepHasError = false
298
-
299
- return new Promise((resolve) => {
300
- nameFormSubmit.value = (isValid: boolean) => {
301
- if (!isValid) {
302
- stepHasError = wizard.setValidation(
303
- dynamicSteps.value.selectName,
304
- 'name',
305
- {
306
- fieldMessage: 'aaa',
307
- alertMessage: 'aaa',
308
- }
309
- )
310
- } else if (wizard.hasMessage(dynamicSteps.value.selectName, 'name')) {
311
- value = wizard.removeValidation(
312
- dynamicSteps.value.selectName,
313
- 'name',
314
- value
315
- )
316
- }
317
-
318
- resolve({
319
- stepHasError,
320
- newValue: value,
321
- })
322
- nameFormSubmit.value = null
323
- }
324
- })
325
- }
326
- const checkStorage = async (
327
- value: UI_I_WizardStep[]
328
- ): Promise<UI_I_ValidationReturn> => {
329
- let stepHasError = false
330
-
331
- return new Promise((resolve) => {
332
- storageSubmit.value = (isValid: boolean) => {
333
- if (!isValid) {
334
- stepHasError = wizard.setValidation(
335
- dynamicSteps.value.selectStorage,
336
- 'storage',
337
- {
338
- fieldMessage: 'aaa',
339
- alertMessage: 'aaa',
340
- }
341
- )
342
- } else if (
343
- wizard.hasMessage(dynamicSteps.value.selectStorage, 'storage')
344
- ) {
345
- value = wizard.removeValidation(
346
- dynamicSteps.value.selectStorage,
347
- 'storage',
348
- value
349
- )
350
- }
351
-
352
- resolve({
353
- stepHasError,
354
- newValue: value,
355
- })
356
- storageSubmit.value = null
357
- }
358
- })
359
- }
360
- const checkCustomizeHardware = async (
361
- value: UI_I_WizardStep[]
362
- ): Promise<UI_I_ValidationReturn> => {
363
- let stepHasError = false
364
-
365
- return new Promise((resolve) => {
366
- customizeHardwareSubmit.value = (isValid: boolean) => {
367
- if (!isValid) {
368
- stepHasError = wizard.setValidation(
369
- dynamicSteps.value.customizeHardware,
370
- 'customizeHardware',
371
- {
372
- fieldMessage: 'aaa',
373
- alertMessage: 'aaa',
374
- }
375
- )
376
- } else if (
377
- wizard.hasMessage(
378
- dynamicSteps.value.customizeHardware,
379
- 'customizeHardware'
380
- )
381
- ) {
382
- value = wizard.removeValidation(
383
- dynamicSteps.value.customizeHardware,
384
- 'customizeHardware',
385
- value
386
- )
387
- }
388
-
389
- resolve({
390
- stepHasError,
391
- newValue: value,
392
- })
393
- storageSubmit.value = null
394
- }
395
- })
396
- }
397
-
398
- const storageIdCash = ref<string | null>(null)
399
- const onChangeName = (name: string): void => {
400
- vmSettingsLocal.value && (vmSettingsLocal.value.name = name)
401
- }
402
- const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
403
- if (!storage) return
404
-
405
- vmSettingsLocal.value && (vmSettingsLocal.value.storage = storage)
406
- storageIdCash.value = storage.id
407
- }
408
- const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
409
- const onChangeCustomizeHardware = (
410
- data: UI_I_SendDataCustomizeHardware
411
- ): void => {
412
- customizeHardware.value = data
413
- }
414
-
415
- const virtualHardwareHardDisksLocal = computed<
416
- UI_I_SendDataNewHardDisk[] | null
417
- >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
418
- const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
419
- () => customizeHardware.value?.virtualHardware?.networks || null
420
- )
421
- const virtualHardwareCdDvdDrivesLocal = computed<
422
- UI_I_SendDataNewCdDvdDrive[] | null
423
- >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
424
-
425
- const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
426
- () => customizeHardware.value?.virtualHardware?.cpu || null
427
- )
428
- const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
429
- () => customizeHardware.value?.virtualHardware?.memory || null
430
- )
431
- const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
432
- const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
433
- null
434
- )
435
- const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
436
- const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
437
- virtualHardwareHardDisks.value = data[0]
438
- virtualHardwareCdDvdDrives.value = data[1]
439
- virtualHardwareNetworks.value = data[2]
440
- }
441
-
442
- const isPowerOnByDefault = ref<boolean>(true)
443
-
444
- watch(
445
- () => props.vmNameInWizard,
446
- (newValue) => {
447
- vmSettingsLocal.value && (vmSettingsLocal.value.name = newValue)
448
- }
449
- )
450
-
451
- const validateSendData = async (
452
- value: UI_I_WizardStep[]
453
- ): Promise<UI_I_ValidationReturn> => {
454
- wizard.setLoader(true)
455
- let stepHasError = false
456
-
457
- const data = await props.validateSendDataFunc(
458
- vmSettingsLocal.value,
459
- virtualHardwareCpu.value,
460
- virtualHardwareMemory.value,
461
- customizeHardware.value,
462
- virtualHardwareNetworks.value,
463
- virtualHardwareHardDisks.value,
464
- virtualHardwareCdDvdDrives.value,
465
- isPowerOnByDefault.value,
466
- localization.value
467
- )
468
-
469
- wizard.setLoader(false)
470
- if (data) {
471
- stepHasError = true
472
- selectedNavItem.value = data[0]
473
- }
474
-
475
- return {
476
- stepHasError,
477
- newValue: value,
478
- }
479
- }
480
- const onFinish = (): void => {
481
- wizard.setLoader(false)
482
- props
483
- .finishFunc(
484
- vmSettingsLocal.value,
485
- virtualHardwareCpu.value,
486
- virtualHardwareMemory.value,
487
- customizeHardware.value,
488
- virtualHardwareNetworks.value,
489
- virtualHardwareHardDisks.value,
490
- virtualHardwareCdDvdDrives.value,
491
- isPowerOnByDefault.value,
492
- localization.value,
493
- false,
494
- newTaskForm.value,
495
- props.schedulerTask
496
- )
497
- .then(() => {
498
- onHideModal()
499
- wizard.setLoader(false)
500
- })
501
- }
502
-
503
- const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
504
-
505
- const nameFormSubmit = ref<null | Function>(null)
506
- const storageSubmit = ref<null | Function>(null)
507
- const selectOptionsSubmit = ref<number>(0)
508
- const customizeHardwareSubmit = ref<null | Function>(null)
509
-
510
- const vmSettingsLocal = computed<UI_I_VmSettings | null>(() => props.vmSettings)
511
- const vmName = ref<string>(vmSettingsLocal.value?.name || '')
512
- watch(vmSettingsLocal, (newValue) => {
513
- vmName.value = newValue?.name || ''
514
- })
515
-
516
- const onHideModal = (): void => {
517
- emits('hide')
518
- }
519
- </script>
520
-
521
- <style scoped lang="scss">
522
- :deep(.has-solid.close-icon.clr-icon) {
523
- width: 20px;
524
- top: 0;
525
- }
526
- .vm-context {
527
- padding: 16px 15px 10px 10px;
528
- height: 100%;
529
- display: flex;
530
- flex-direction: column;
531
-
532
- .context-title-wrap {
533
- padding-bottom: 3px;
534
- border-bottom: 1px solid #a6a6a6;
535
-
536
- h4 {
537
- font-weight: 700;
538
- font-size: 13px;
539
- color: var(--vm-context-title);
540
- }
541
- p {
542
- font-weight: 400;
543
- font-size: 13px;
544
- color: var(--vm-context-sub-title);
545
- }
546
- }
547
-
548
- .finish-block {
549
- padding: 18px 24px 24px 24px;
550
-
551
- .add-hosts-ready-to-complete-mt-12 {
552
- margin-top: 12px;
553
-
554
- .add-hosts-ready-to-complete-bold {
555
- line-height: 18px;
556
- font-weight: 700;
557
- }
558
- }
559
- }
560
-
561
- .vm-hardware-version {
562
- align-self: flex-end;
563
- margin-top: auto;
564
- }
565
- }
566
-
567
- :deep(.modal .modal-dialog .modal-content .modal-footer) {
568
- flex: unset;
569
- height: unset;
570
- min-height: unset;
571
- }
572
- :deep(.wizard-modal-titlebar h3) {
573
- color: #000;
574
- font-size: 24px;
575
- font-weight: 200;
576
- line-height: 27px;
577
- margin: 0;
578
- padding: 0;
579
- }
580
- :deep(.clr-wizard-stepnav-item) {
581
- padding-left: 0;
582
- }
583
- :deep(.clr-wizard-stepnav
584
- .clr-wizard-stepnav-item
585
- button
586
- .clr-wizard-stepnav-link-title) {
587
- width: 189px;
588
- font-weight: 700;
589
- font-size: 13px;
590
- }
591
-
592
- #vm-wizard-notification {
593
- h3 {
594
- color: var(--global-font-color7);
595
- margin-top: 6px;
596
- }
597
- p {
598
- color: var(--global-font-color6);
599
- line-height: 16px;
600
- }
601
- }
602
-
603
- .power-on-by-default-wrap {
604
- display: flex;
605
- align-items: center;
606
-
607
- input {
608
- margin-right: 6px;
609
- }
610
- }
611
-
612
- .new-task-form {
613
- padding: 0 25px 0 5px;
614
- }
615
- </style>
616
-
617
- <style>
618
- :root {
619
- --vm-context-title: #333;
620
- --vm-context-sub-title: #000;
621
- }
622
- :root.dark-theme {
623
- --vm-context-title: #adbbc4;
624
- --vm-context-sub-title: #adbbc4;
625
- }
626
- </style>
1
+ <template>
2
+ <div class="clone-to-template">
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="!vmSettingsLocal" id="loader" />
15
+ <div v-if="vmSettingsLocal" 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="selectedStep.id === dynamicSteps.selectName"
24
+ :show="selectedStep.id === dynamicSteps.selectName"
25
+ :name-form-submit="nameFormSubmit"
26
+ :project="props.project"
27
+ @submit="onChangeName(...$event)"
28
+ @check-name="emits('check-name', $event)"
29
+ />
30
+ <common-vm-actions-common-select-storage
31
+ v-show="selectedStep.id === dynamicSteps.selectStorage"
32
+ :storage-submit="storageSubmit"
33
+ :datastore="props.datastore"
34
+ :storage="vmSettingsLocal.storage"
35
+ :get-datastore-table-func="props.getDatastoreTableFunc"
36
+ @submit="onChangeStorage"
37
+ />
38
+ <common-vm-actions-common-customize-hardware
39
+ v-show="selectedStep.id === dynamicSteps.customizeHardware"
40
+ v-model:vm-name="vmName"
41
+ v-model:guest-machine-type="vmSettingsLocal.guestMachineType"
42
+ v-model:guest-os-family="vmSettingsLocal.guestOsFamily"
43
+ v-model:guest-os-version="vmSettingsLocal.guestOsVersion"
44
+ :storage="vmSettingsLocal.storage"
45
+ :hard-disks-for-boot-options="virtualHardwareHardDisksLocal"
46
+ :cd-dvd-drives-for-boot-options="virtualHardwareCdDvdDrivesLocal"
47
+ :networks-for-boot-options="virtualHardwareNetworksLocal"
48
+ :cd-dvd-drives="vmSettingsLocal.cdDvdDrives"
49
+ :hard-disks="vmSettingsLocal.hardDisks"
50
+ :networks="vmSettingsLocal.networks"
51
+ :customize-hardware-submit="customizeHardwareSubmit"
52
+ :max-cpus="vmSettingsLocal.maxCpus"
53
+ :max-memory="vmSettingsLocal.maxMemory"
54
+ :cpu-models="vmSettingsLocal.cpuModels"
55
+ :cpu="vmSettingsLocal.cpu"
56
+ :memory="vmSettingsLocal.memory"
57
+ :video-card="vmSettingsLocal.videoCard"
58
+ :usb-controller="vmSettingsLocal.usbController"
59
+ :pci-devices="vmSettingsLocal.pciDevices"
60
+ :selected-nav-item="selectedNavItem"
61
+ :hard-disks-for-edit="vmSettingsLocal.hardDisks"
62
+ :options="vmSettingsLocal.options"
63
+ :nodes="props.nodes"
64
+ :files="props.files"
65
+ :networks-table="props.networksTable"
66
+ :error-validation-fields="props.errorValidationFields"
67
+ :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
68
+ :passthrough-devices="props.passthroughDevices"
69
+ :mediated-devices="props.mediatedDevices"
70
+ :get-datastore-table-func="props.getDatastoreTableFunc"
71
+ :datastore="props.datastore"
72
+ :project="props.project"
73
+ is-clone
74
+ @change-boot-order="onChangeBootOrder"
75
+ @send-data="onChangeCustomizeHardware"
76
+ @get-storage="emits('get-storage', $event)"
77
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
78
+ @get-active-device-child="emits('get-active-device-child', $event)"
79
+ @show-datastore-child="emits('show-datastore-child', $event)"
80
+ @get-networks-table="emits('get-networks-table', $event)"
81
+ @get-pci-devices="emits('get-pci-devices')"
82
+ />
83
+ <common-ready-to-complete
84
+ v-show="selectedStep.id === dynamicSteps.readyComplete"
85
+ :data="props.readyCompleteTableInfo"
86
+ />
87
+ </div>
88
+ </template>
89
+ </atoms-wizard>
90
+ </div>
91
+ </template>
92
+
93
+ <script setup lang="ts">
94
+ import type {
95
+ UI_I_DatastoreTableItem,
96
+ UI_I_FolderOrFileTreePayload,
97
+ } from '~/lib/models/store/storage/interfaces'
98
+ import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
99
+ import type { API_UI_I_Error } from '~/lib/models/store/interfaces'
100
+ import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
101
+ import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
102
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
103
+ import type { UI_I_SendDataCustomizeHardware } from '~/components/common/vm/actions/common/customizeHardware/lib/models/interfaces'
104
+ import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
105
+ import type {
106
+ UI_I_SendDataCpu,
107
+ UI_I_SendDataMemory,
108
+ UI_I_SendDataNewCdDvdDrive,
109
+ UI_I_SendDataNewHardDisk,
110
+ UI_I_SendDataNewNetwork,
111
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
112
+ import type { UI_T_SelectedNavItem } from '~/components/common/vm/actions/common/lib/models/types'
113
+ import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
114
+ import type { UI_T_ChangeBootOrder } from '~/components/common/vm/actions/lib/models/types'
115
+ import type { UI_T_Project } from '~/lib/models/types'
116
+ import type {
117
+ UI_I_MediatedDevice,
118
+ UI_I_PciDevice,
119
+ UI_I_VmSettings,
120
+ } from '~/lib/models/store/vm/interfaces'
121
+ import type {
122
+ I_DynamicSteps,
123
+ // UI_I_VmForm,
124
+ } from '~/components/common/vm/actions/clone/toTemplate/lib/models/interfaces'
125
+ import type {
126
+ UI_I_ValidationReturn,
127
+ UI_I_WizardStep,
128
+ } from '~/components/atoms/wizard/lib/models/interfaces'
129
+ import type { UI_I_Capabilities } from '~/components/common/vm/actions/common/lib/models/interfaces'
130
+ import type { UI_I_ScheduleNewTasksForm } from '~/components/common/pages/scheduledTasks/modals/lib/models/interfaces'
131
+ import {
132
+ stepsSchemeInitial,
133
+ stepsFunc,
134
+ getDynamicSteps,
135
+ } from '~/components/common/vm/actions/clone/toTemplate/lib/config/steps'
136
+ import Wizard from '~/components/atoms/wizard/lib/utils/utils'
137
+ import { mapCapabilities } from '~/components/common/vm/actions/common/lib/utils/capabilities'
138
+ import { scheduledTaskDefaultFormFunc } from '~/components/common/pages/scheduledTasks/modals/lib/config/createScheduledTask'
139
+
140
+ const props = defineProps<{
141
+ project: UI_T_Project
142
+ vmSettings: UI_I_VmSettings | null
143
+ nodes: UI_I_FileTreeNode[]
144
+ files: UI_I_FileTreeNode[]
145
+ networksTable: UI_I_NetworkTableItem[]
146
+ datastore: UI_I_DatastoreTableItem[]
147
+ errorValidationFields: UI_I_ErrorValidationField[]
148
+ readyCompleteTableInfo: UI_I_TableInfoItem[]
149
+ vmCpuHelpTextSecond: string
150
+ finishFunc: any
151
+ getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
152
+ validateSendDataFunc: any
153
+ passthroughDevices: UI_I_PciDevice[]
154
+ mediatedDevices: UI_I_MediatedDevice[]
155
+ vmNameInWizard: string
156
+ capabilities?: UI_I_Capabilities
157
+ schedulerTask?: any // TODO надо interface переместить глобално
158
+ selectedVirtualMachine?: UI_I_Capabilities
159
+ }>()
160
+
161
+ const emits = defineEmits<{
162
+ (event: 'check-name', value: [string, (error: API_UI_I_Error) => void]): void
163
+ (event: 'get-storage', value: UI_I_TablePayload): void
164
+ (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
165
+ (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
166
+ (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
167
+ (event: 'remove-error-by-title', value: string): void
168
+ (event: 'get-networks-table', value: UI_I_TablePayload): void
169
+ (event: 'get-pci-devices'): void
170
+ (event: 'hide'): void
171
+ }>()
172
+
173
+ const localization = computed<UI_I_Localization>(() => useLocal())
174
+
175
+ const isScheduledTasks = computed<boolean>(
176
+ () => props.schedulerTask.isSchedulerTask
177
+ )
178
+
179
+ const title = computed<string>(() => {
180
+ const { scheduleNewTasks, scheduleTaskEdit, cloneTemplate } =
181
+ localization.value.common
182
+
183
+ let result = cloneTemplate
184
+ if (isScheduledTasks.value) {
185
+ const schedulerMode = props.schedulerTask.editTask
186
+ ? scheduleTaskEdit
187
+ : scheduleNewTasks
188
+
189
+ result = `${schedulerMode} (${cloneTemplate})`
190
+ }
191
+
192
+ return result
193
+ })
194
+
195
+ const dynamicSteps = ref<I_DynamicSteps>(
196
+ getDynamicSteps(isScheduledTasks.value)
197
+ )
198
+
199
+ watch(
200
+ () => props.capabilities,
201
+ () => {
202
+ if (props.capabilities) mapCapabilities(props.capabilities)
203
+ },
204
+ { deep: true, immediate: true }
205
+ )
206
+
207
+ const wizard: Wizard = new Wizard(
208
+ stepsFunc(localization.value, isScheduledTasks.value),
209
+ stepsSchemeInitial(isScheduledTasks.value)
210
+ )
211
+ // TODO move to common
212
+ const newTaskForm = ref<UI_I_ScheduleNewTasksForm>(
213
+ useDeepCopy(scheduledTaskDefaultFormFunc())
214
+ )
215
+ watch(
216
+ newTaskForm,
217
+ (newValue: UI_I_ScheduleNewTasksForm) => {
218
+ if (isScheduledTasks.value) wizard.setDisabledNextButton(newValue.isValid)
219
+ },
220
+ { immediate: true, deep: true }
221
+ )
222
+
223
+ const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
224
+
225
+ const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
226
+ wizard.changeSteps(value, validationFunc, validateSendData)
227
+ }
228
+
229
+ const validationFunc = async (
230
+ value: UI_I_WizardStep[],
231
+ currentStep: UI_I_WizardStep,
232
+ nextStep: UI_I_WizardStep
233
+ ): Promise<UI_I_ValidationReturn> => {
234
+ let stepHasError = false
235
+ let stepShouldStop = {
236
+ ifOnCurrentStep: false,
237
+ ifFromAnyStep: false,
238
+ stoppageStepId: -1,
239
+ }
240
+
241
+ wizard.setLoader(true)
242
+ if (
243
+ wizard.isValidateForStep(
244
+ dynamicSteps.value.selectName,
245
+ currentStep.id,
246
+ nextStep.id
247
+ )
248
+ ) {
249
+ const nameValidation = await checkName(value)
250
+
251
+ value = nameValidation.newValue
252
+ stepHasError = stepHasError || nameValidation.stepHasError
253
+ } else if (
254
+ wizard.isValidateForStep(
255
+ dynamicSteps.value.selectStorage,
256
+ currentStep.id,
257
+ nextStep.id
258
+ )
259
+ ) {
260
+ const storageValidation = await checkStorage(value)
261
+
262
+ value = storageValidation.newValue
263
+
264
+ stepHasError = stepHasError || storageValidation.stepHasError
265
+ } else if (
266
+ wizard.isValidateForStep(
267
+ dynamicSteps.value.selectOptions,
268
+ currentStep.id,
269
+ nextStep.id
270
+ )
271
+ ) {
272
+ selectOptionsSubmit.value++
273
+ } else if (
274
+ wizard.isValidateForStep(
275
+ dynamicSteps.value.customizeHardware,
276
+ currentStep.id,
277
+ nextStep.id
278
+ )
279
+ ) {
280
+ const customizeHardwareValidation = await checkCustomizeHardware(value)
281
+
282
+ value = customizeHardwareValidation.newValue
283
+
284
+ stepHasError = stepHasError || customizeHardwareValidation.stepHasError
285
+ }
286
+ wizard.setLoader(false)
287
+
288
+ return {
289
+ newValue: value,
290
+ stepHasError,
291
+ stepShouldStop,
292
+ }
293
+ }
294
+ const checkName = async (
295
+ value: UI_I_WizardStep[]
296
+ ): Promise<UI_I_ValidationReturn> => {
297
+ let stepHasError = false
298
+
299
+ return new Promise((resolve) => {
300
+ nameFormSubmit.value = (isValid: boolean) => {
301
+ if (!isValid) {
302
+ stepHasError = wizard.setValidation(
303
+ dynamicSteps.value.selectName,
304
+ 'name',
305
+ {
306
+ fieldMessage: 'aaa',
307
+ alertMessage: 'aaa',
308
+ }
309
+ )
310
+ } else if (wizard.hasMessage(dynamicSteps.value.selectName, 'name')) {
311
+ value = wizard.removeValidation(
312
+ dynamicSteps.value.selectName,
313
+ 'name',
314
+ value
315
+ )
316
+ }
317
+
318
+ resolve({
319
+ stepHasError,
320
+ newValue: value,
321
+ })
322
+ nameFormSubmit.value = null
323
+ }
324
+ })
325
+ }
326
+ const checkStorage = async (
327
+ value: UI_I_WizardStep[]
328
+ ): Promise<UI_I_ValidationReturn> => {
329
+ let stepHasError = false
330
+
331
+ return new Promise((resolve) => {
332
+ storageSubmit.value = (isValid: boolean) => {
333
+ if (!isValid) {
334
+ stepHasError = wizard.setValidation(
335
+ dynamicSteps.value.selectStorage,
336
+ 'storage',
337
+ {
338
+ fieldMessage: 'aaa',
339
+ alertMessage: 'aaa',
340
+ }
341
+ )
342
+ } else if (
343
+ wizard.hasMessage(dynamicSteps.value.selectStorage, 'storage')
344
+ ) {
345
+ value = wizard.removeValidation(
346
+ dynamicSteps.value.selectStorage,
347
+ 'storage',
348
+ value
349
+ )
350
+ }
351
+
352
+ resolve({
353
+ stepHasError,
354
+ newValue: value,
355
+ })
356
+ storageSubmit.value = null
357
+ }
358
+ })
359
+ }
360
+ const checkCustomizeHardware = async (
361
+ value: UI_I_WizardStep[]
362
+ ): Promise<UI_I_ValidationReturn> => {
363
+ let stepHasError = false
364
+
365
+ return new Promise((resolve) => {
366
+ customizeHardwareSubmit.value = (isValid: boolean) => {
367
+ if (!isValid) {
368
+ stepHasError = wizard.setValidation(
369
+ dynamicSteps.value.customizeHardware,
370
+ 'customizeHardware',
371
+ {
372
+ fieldMessage: 'aaa',
373
+ alertMessage: 'aaa',
374
+ }
375
+ )
376
+ } else if (
377
+ wizard.hasMessage(
378
+ dynamicSteps.value.customizeHardware,
379
+ 'customizeHardware'
380
+ )
381
+ ) {
382
+ value = wizard.removeValidation(
383
+ dynamicSteps.value.customizeHardware,
384
+ 'customizeHardware',
385
+ value
386
+ )
387
+ }
388
+
389
+ resolve({
390
+ stepHasError,
391
+ newValue: value,
392
+ })
393
+ storageSubmit.value = null
394
+ }
395
+ })
396
+ }
397
+
398
+ const storageIdCash = ref<string | null>(null)
399
+ const onChangeName = (name: string): void => {
400
+ vmSettingsLocal.value && (vmSettingsLocal.value.name = name)
401
+ }
402
+ const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
403
+ if (!storage) return
404
+
405
+ vmSettingsLocal.value && (vmSettingsLocal.value.storage = storage)
406
+ storageIdCash.value = storage.id
407
+ }
408
+ const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
409
+ const onChangeCustomizeHardware = (
410
+ data: UI_I_SendDataCustomizeHardware
411
+ ): void => {
412
+ customizeHardware.value = data
413
+ }
414
+
415
+ const virtualHardwareHardDisksLocal = computed<
416
+ UI_I_SendDataNewHardDisk[] | null
417
+ >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
418
+ const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
419
+ () => customizeHardware.value?.virtualHardware?.networks || null
420
+ )
421
+ const virtualHardwareCdDvdDrivesLocal = computed<
422
+ UI_I_SendDataNewCdDvdDrive[] | null
423
+ >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
424
+
425
+ const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
426
+ () => customizeHardware.value?.virtualHardware?.cpu || null
427
+ )
428
+ const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
429
+ () => customizeHardware.value?.virtualHardware?.memory || null
430
+ )
431
+ const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
432
+ const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
433
+ null
434
+ )
435
+ const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
436
+ const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
437
+ virtualHardwareHardDisks.value = data[0]
438
+ virtualHardwareCdDvdDrives.value = data[1]
439
+ virtualHardwareNetworks.value = data[2]
440
+ }
441
+
442
+ const isPowerOnByDefault = ref<boolean>(true)
443
+
444
+ watch(
445
+ () => props.vmNameInWizard,
446
+ (newValue) => {
447
+ vmSettingsLocal.value && (vmSettingsLocal.value.name = newValue)
448
+ }
449
+ )
450
+
451
+ const validateSendData = async (
452
+ value: UI_I_WizardStep[]
453
+ ): Promise<UI_I_ValidationReturn> => {
454
+ wizard.setLoader(true)
455
+ let stepHasError = false
456
+
457
+ const data = await props.validateSendDataFunc(
458
+ vmSettingsLocal.value,
459
+ virtualHardwareCpu.value,
460
+ virtualHardwareMemory.value,
461
+ customizeHardware.value,
462
+ virtualHardwareNetworks.value,
463
+ virtualHardwareHardDisks.value,
464
+ virtualHardwareCdDvdDrives.value,
465
+ isPowerOnByDefault.value,
466
+ localization.value
467
+ )
468
+
469
+ wizard.setLoader(false)
470
+ if (data) {
471
+ stepHasError = true
472
+ selectedNavItem.value = data[0]
473
+ }
474
+
475
+ return {
476
+ stepHasError,
477
+ newValue: value,
478
+ }
479
+ }
480
+ const onFinish = (): void => {
481
+ wizard.setLoader(false)
482
+ props
483
+ .finishFunc(
484
+ vmSettingsLocal.value,
485
+ virtualHardwareCpu.value,
486
+ virtualHardwareMemory.value,
487
+ customizeHardware.value,
488
+ virtualHardwareNetworks.value,
489
+ virtualHardwareHardDisks.value,
490
+ virtualHardwareCdDvdDrives.value,
491
+ isPowerOnByDefault.value,
492
+ localization.value,
493
+ false,
494
+ newTaskForm.value,
495
+ props.schedulerTask
496
+ )
497
+ .then(() => {
498
+ onHideModal()
499
+ wizard.setLoader(false)
500
+ })
501
+ }
502
+
503
+ const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
504
+
505
+ const nameFormSubmit = ref<null | Function>(null)
506
+ const storageSubmit = ref<null | Function>(null)
507
+ const selectOptionsSubmit = ref<number>(0)
508
+ const customizeHardwareSubmit = ref<null | Function>(null)
509
+
510
+ const vmSettingsLocal = computed<UI_I_VmSettings | null>(() => props.vmSettings)
511
+ const vmName = ref<string>(vmSettingsLocal.value?.name || '')
512
+ watch(vmSettingsLocal, (newValue) => {
513
+ vmName.value = newValue?.name || ''
514
+ })
515
+
516
+ const onHideModal = (): void => {
517
+ emits('hide')
518
+ }
519
+ </script>
520
+
521
+ <style scoped lang="scss">
522
+ :deep(.has-solid.close-icon.clr-icon) {
523
+ width: 20px;
524
+ top: 0;
525
+ }
526
+ .vm-context {
527
+ padding: 16px 15px 10px 10px;
528
+ height: 100%;
529
+ display: flex;
530
+ flex-direction: column;
531
+
532
+ .context-title-wrap {
533
+ padding-bottom: 3px;
534
+ border-bottom: 1px solid #a6a6a6;
535
+
536
+ h4 {
537
+ font-weight: 700;
538
+ font-size: 13px;
539
+ color: var(--vm-context-title);
540
+ }
541
+ p {
542
+ font-weight: 400;
543
+ font-size: 13px;
544
+ color: var(--vm-context-sub-title);
545
+ }
546
+ }
547
+
548
+ .finish-block {
549
+ padding: 18px 24px 24px 24px;
550
+
551
+ .add-hosts-ready-to-complete-mt-12 {
552
+ margin-top: 12px;
553
+
554
+ .add-hosts-ready-to-complete-bold {
555
+ line-height: 18px;
556
+ font-weight: 700;
557
+ }
558
+ }
559
+ }
560
+
561
+ .vm-hardware-version {
562
+ align-self: flex-end;
563
+ margin-top: auto;
564
+ }
565
+ }
566
+
567
+ :deep(.modal .modal-dialog .modal-content .modal-footer) {
568
+ flex: unset;
569
+ height: unset;
570
+ min-height: unset;
571
+ }
572
+ :deep(.wizard-modal-titlebar h3) {
573
+ color: #000;
574
+ font-size: 24px;
575
+ font-weight: 200;
576
+ line-height: 27px;
577
+ margin: 0;
578
+ padding: 0;
579
+ }
580
+ :deep(.clr-wizard-stepnav-item) {
581
+ padding-left: 0;
582
+ }
583
+ :deep(.clr-wizard-stepnav
584
+ .clr-wizard-stepnav-item
585
+ button
586
+ .clr-wizard-stepnav-link-title) {
587
+ width: 189px;
588
+ font-weight: 700;
589
+ font-size: 13px;
590
+ }
591
+
592
+ #vm-wizard-notification {
593
+ h3 {
594
+ color: var(--global-font-color7);
595
+ margin-top: 6px;
596
+ }
597
+ p {
598
+ color: var(--global-font-color6);
599
+ line-height: 16px;
600
+ }
601
+ }
602
+
603
+ .power-on-by-default-wrap {
604
+ display: flex;
605
+ align-items: center;
606
+
607
+ input {
608
+ margin-right: 6px;
609
+ }
610
+ }
611
+
612
+ .new-task-form {
613
+ padding: 0 25px 0 5px;
614
+ }
615
+ </style>
616
+
617
+ <style>
618
+ :root {
619
+ --vm-context-title: #333;
620
+ --vm-context-sub-title: #000;
621
+ }
622
+ :root.dark-theme {
623
+ --vm-context-title: #adbbc4;
624
+ --vm-context-sub-title: #adbbc4;
625
+ }
626
+ </style>