bfg-common 1.5.37 → 1.5.39

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