bfg-common 1.5.57 → 1.5.59

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 (182) 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/localization/local_be.json +5 -2
  7. package/assets/localization/local_en.json +5 -2
  8. package/assets/localization/local_hy.json +5 -2
  9. package/assets/localization/local_kk.json +5 -2
  10. package/assets/localization/local_ru.json +5 -2
  11. package/assets/localization/local_zh.json +5 -2
  12. package/assets/scss/common/normalize.scss +339 -339
  13. package/components/atoms/TheIcon3.vue +50 -50
  14. package/components/atoms/collapse/CollapseNav.vue +165 -165
  15. package/components/atoms/combobox/Combobox.vue +2 -0
  16. package/components/atoms/dropdown/dropdown/Dropdown.vue +168 -168
  17. package/components/atoms/modal/bySteps/BySteps.vue +253 -253
  18. package/components/atoms/perPage/PerPage.vue +58 -58
  19. package/components/atoms/stack/StackBlock.vue +185 -185
  20. package/components/atoms/table/dataGrid/DataGridColumnSwitch.vue +222 -222
  21. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  22. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  23. package/components/atoms/tabs/VerticalTabs.vue +105 -105
  24. package/components/atoms/tooltip/Signpost.vue +227 -227
  25. package/components/common/accordion/Recursion.vue +222 -222
  26. package/components/common/browse/BrowseNew.vue +237 -237
  27. package/components/common/browse/BrowseOld.vue +217 -217
  28. package/components/common/browse/blocks/contents/Files.vue +37 -37
  29. package/components/common/browse/blocks/contents/FilesOld.vue +72 -72
  30. package/components/common/browse/blocks/contents/filesNew/FilesNew.vue +96 -96
  31. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  32. package/components/common/context/Context.vue +111 -111
  33. package/components/common/context/lib/models/interfaces.ts +31 -31
  34. package/components/common/context/recursion/Recursion.vue +87 -87
  35. package/components/common/context/recursion/RecursionNew.vue +238 -238
  36. package/components/common/context/recursion/RecursionOld.vue +228 -228
  37. package/components/common/details/DetailsItem.vue +109 -109
  38. package/components/common/diagramMain/DiagramMain.vue +897 -897
  39. package/components/common/diagramMain/Header.vue +214 -214
  40. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  41. package/components/common/layout/theHeader/helpMenu/aboutNew/AboutNew.vue +103 -103
  42. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  43. package/components/common/mainNavigationPanel/MainNavigationPanelOld.vue +311 -311
  44. package/components/common/modals/unsavedChanges/UnsavedChanges.vue +56 -56
  45. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  46. package/components/common/pages/home/headline/Headline.vue +45 -45
  47. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  48. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  49. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  50. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  51. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  52. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  53. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  54. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  55. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  56. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  57. package/components/common/pages/packages/Packages.vue +208 -208
  58. package/components/common/pages/shortcuts/block/BlockNew.vue +96 -96
  59. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  60. package/components/common/portlets/customAttributes/Portlet.vue +667 -667
  61. package/components/common/portlets/tag/Portlet.vue +433 -433
  62. package/components/common/recursionTree/RecursionTree.vue +223 -223
  63. package/components/common/select/button/ButtonDropdown.vue +108 -108
  64. package/components/common/spiceConsole/Drawer.vue +370 -370
  65. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  66. package/components/common/split/horizontal/HorizontalOld.vue +337 -337
  67. package/components/common/split/vertical/Vertical.vue +160 -160
  68. package/components/common/tools/Actions.vue +202 -202
  69. package/components/common/vm/actions/add/Add.vue +727 -774
  70. package/components/common/vm/actions/add/New.vue +375 -0
  71. package/components/common/vm/actions/add/Old.vue +318 -0
  72. package/components/common/vm/actions/add/lib/config/steps.ts +247 -247
  73. package/components/common/vm/actions/clone/Clone.vue +798 -798
  74. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -291
  75. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +634 -634
  76. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  77. package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +275 -275
  78. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareNew.vue +274 -274
  79. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareOld.vue +177 -177
  80. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +698 -698
  81. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareNew.vue +410 -410
  82. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  83. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  84. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +99 -99
  85. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/BusNew.vue +117 -117
  86. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  87. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveNew.vue +164 -164
  88. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  89. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  90. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  91. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  92. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  93. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  94. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  95. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  96. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +368 -368
  97. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskNew.vue +232 -232
  98. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskOld.vue +250 -250
  99. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/mode/ModeOld.vue +56 -56
  100. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/sharing/SharingNew.vue +44 -44
  101. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +286 -286
  102. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetworkNew.vue +124 -124
  103. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/LocationOld.vue +134 -134
  104. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/New.vue +63 -63
  105. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +95 -95
  106. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  107. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressNew.vue +69 -69
  108. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressOld.vue +83 -83
  109. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  110. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  111. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  112. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  113. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoNew.vue +84 -84
  114. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  115. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  116. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  117. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  118. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGrid.vue +41 -41
  119. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridNew.vue +81 -81
  120. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  121. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbControllerNew.vue +56 -56
  122. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  123. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  124. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardNew.vue +104 -104
  125. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardOld.vue +112 -112
  126. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/totalVideoMemory/TotalVideoMemoryNew.vue +54 -54
  127. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  128. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  129. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  130. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  131. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  132. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/FirmwareNew.vue +42 -42
  133. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/menu/MenuNew.vue +25 -25
  134. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  135. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  136. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsNew.vue +141 -141
  137. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  138. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  139. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  140. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/folderSharing/FolderSharingNew.vue +30 -30
  141. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  142. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapNew.vue +39 -39
  143. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  144. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordNew.vue +102 -102
  145. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordOld.vue +94 -94
  146. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  147. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +38 -38
  148. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  149. package/components/common/vm/actions/common/lib/utils/capabilities.ts +52 -52
  150. package/components/common/vm/actions/common/select/compatibility/Compatibility.vue +162 -162
  151. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -74
  152. package/components/common/vm/actions/common/select/createType/New.vue +84 -0
  153. package/components/common/vm/actions/common/select/createType/Old.vue +70 -0
  154. package/components/common/vm/actions/common/select/createType/lib/config/items.ts +24 -4
  155. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -0
  156. package/components/common/vm/actions/common/select/name/Name.vue +167 -236
  157. package/components/common/vm/actions/common/select/name/New.vue +143 -0
  158. package/components/common/vm/actions/common/select/name/Old.vue +119 -0
  159. package/components/common/vm/actions/common/select/storage/Storage.vue +130 -130
  160. package/components/common/vm/actions/common/select/storage/StorageOld.vue +129 -129
  161. package/components/common/vm/actions/common/select/template/Template.vue +65 -65
  162. package/components/common/vm/actions/common/select/template/TemplateTreeView.vue +88 -88
  163. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  164. package/components/common/wizards/datastore/add/lib/config/steps.ts +138 -138
  165. package/components/common/wizards/datastore/add/nfs/accessibility/Accessibility.vue +60 -60
  166. package/components/common/wizards/datastore/add/readyComplete/ReadyComplete.vue +92 -92
  167. package/components/common/wizards/network/add/steps/SelectConnectionType.vue +105 -105
  168. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  169. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  170. package/components/common/wizards/vm/migrate/select/network/table/network/Network.vue +150 -150
  171. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  172. package/components/common/wizards/vm/migrate/select/priority/Priority.vue +43 -43
  173. package/composables/productNameLocal.ts +30 -30
  174. package/composables/useAppVersion.ts +21 -21
  175. package/package.json +1 -1
  176. package/plugins/date.ts +233 -233
  177. package/plugins/directives.ts +24 -24
  178. package/public/spice-console/lib/images/bitmap.js +203 -203
  179. package/public/spice-console/network/spicechannel.js +383 -383
  180. package/store/main/mutations.ts +7 -7
  181. package/store/main/state.ts +7 -7
  182. package/store/tasks/mappers/recentTasks.ts +64 -64
@@ -1,634 +1,634 @@
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="!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-customize-hardware
39
- v-show="selectedStep.id === dynamicSteps.customizeHardware"
40
- v-model:vm-name="vmName"
41
- v-model:guest-machine-type="vmSettings.guestMachineType"
42
- v-model:guest-os-family="vmSettings.guestOsFamily"
43
- v-model:guest-os-version="vmSettings.guestOsVersion"
44
- :storage="vmSettings.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="vmSettings.cdDvdDrives"
49
- :hard-disks="vmSettings.hardDisks"
50
- :networks="vmSettings.networks"
51
- :customize-hardware-submit="customizeHardwareSubmit"
52
- :max-cpus="vmSettings.maxCpus"
53
- :max-memory="vmSettings.maxMemory"
54
- :cpu-models="vmSettings.cpuModels"
55
- :cpu="vmSettings.cpu"
56
- :memory="vmSettings.memory"
57
- :video-card="vmSettings.videoCard"
58
- :usb-controller="vmSettings.usbController"
59
- :pci-devices="vmSettings.pciDevices"
60
- :selected-nav-item="selectedNavItem"
61
- :hard-disks-for-edit="vmSettings.hardDisks"
62
- :options="vmSettings.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 vmForm = ref<UI_I_VmForm>({
400
- name: '',
401
- storage: null,
402
- options: [],
403
- })
404
- const onChangeName = (name: string): void => {
405
- vmForm.value.name = name
406
- }
407
- const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
408
- if (!storage) return
409
-
410
- vmForm.value.storage = storage
411
- storageIdCash.value = storage.id
412
- }
413
- const onChangeSelectOptions = (options: string[]): void => {
414
- vmForm.value.options = options
415
- }
416
- const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
417
- const onChangeCustomizeHardware = (
418
- data: UI_I_SendDataCustomizeHardware
419
- ): void => {
420
- customizeHardware.value = data
421
- }
422
-
423
- const virtualHardwareHardDisksLocal = computed<
424
- UI_I_SendDataNewHardDisk[] | null
425
- >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
426
- const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
427
- () => customizeHardware.value?.virtualHardware?.networks || null
428
- )
429
- const virtualHardwareCdDvdDrivesLocal = computed<
430
- UI_I_SendDataNewCdDvdDrive[] | null
431
- >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
432
-
433
- const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
434
- () => customizeHardware.value?.virtualHardware?.cpu || null
435
- )
436
- const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
437
- () => customizeHardware.value?.virtualHardware?.memory || null
438
- )
439
- const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
440
- const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
441
- null
442
- )
443
- const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
444
- const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
445
- virtualHardwareHardDisks.value = data[0]
446
- virtualHardwareCdDvdDrives.value = data[1]
447
- virtualHardwareNetworks.value = data[2]
448
- }
449
-
450
- const isPowerOnByDefault = ref<boolean>(true)
451
-
452
- watch(
453
- () => props.vmNameInWizard,
454
- (newValue) => {
455
- vmForm.value.name = newValue
456
- }
457
- )
458
-
459
- const validateSendData = async (
460
- value: UI_I_WizardStep[]
461
- ): Promise<UI_I_ValidationReturn> => {
462
- wizard.setLoader(true)
463
- let stepHasError = false
464
-
465
- const data = await props.validateSendDataFunc(
466
- vmForm.value,
467
- virtualHardwareCpu.value,
468
- virtualHardwareMemory.value,
469
- customizeHardware.value,
470
- virtualHardwareNetworks.value,
471
- virtualHardwareHardDisks.value,
472
- virtualHardwareCdDvdDrives.value,
473
- isPowerOnByDefault.value,
474
- localization.value
475
- )
476
-
477
- wizard.setLoader(false)
478
- if (data) {
479
- stepHasError = true
480
- selectedNavItem.value = data[0]
481
- }
482
-
483
- return {
484
- stepHasError,
485
- newValue: value,
486
- }
487
- }
488
- const onFinish = (): void => {
489
- wizard.setLoader(false)
490
- props
491
- .finishFunc(
492
- vmForm.value,
493
- virtualHardwareCpu.value,
494
- virtualHardwareMemory.value,
495
- customizeHardware.value,
496
- virtualHardwareNetworks.value,
497
- virtualHardwareHardDisks.value,
498
- virtualHardwareCdDvdDrives.value,
499
- isPowerOnByDefault.value,
500
- localization.value,
501
- false,
502
- newTaskForm.value,
503
- props.schedulerTask
504
- )
505
- .then(() => {
506
- onHideModal()
507
- wizard.setLoader(false)
508
- })
509
- }
510
-
511
- const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
512
-
513
- const nameFormSubmit = ref<null | Function>(null)
514
- const storageSubmit = ref<null | Function>(null)
515
- const selectOptionsSubmit = ref<number>(0)
516
- const customizeHardwareSubmit = ref<null | Function>(null)
517
-
518
- const vmSettings = computed<UI_I_VmSettings | null>(() => props.vmSettings)
519
- const vmName = ref<string>(vmSettings.value?.name || '')
520
- watch(vmSettings, (newValue) => {
521
- vmName.value = newValue?.name || ''
522
- })
523
-
524
- const onHideModal = (): void => {
525
- emits('hide')
526
- }
527
- </script>
528
-
529
- <style scoped lang="scss">
530
- :deep(.has-solid.close-icon.clr-icon) {
531
- width: 20px;
532
- top: 0;
533
- }
534
- .vm-context {
535
- padding: 16px 15px 10px 10px;
536
- height: 100%;
537
- display: flex;
538
- flex-direction: column;
539
-
540
- .context-title-wrap {
541
- padding-bottom: 3px;
542
- border-bottom: 1px solid #a6a6a6;
543
-
544
- h4 {
545
- font-weight: 700;
546
- font-size: 13px;
547
- color: var(--vm-context-title);
548
- }
549
- p {
550
- font-weight: 400;
551
- font-size: 13px;
552
- color: var(--vm-context-sub-title);
553
- }
554
- }
555
-
556
- .finish-block {
557
- padding: 18px 24px 24px 24px;
558
-
559
- .add-hosts-ready-to-complete-mt-12 {
560
- margin-top: 12px;
561
-
562
- .add-hosts-ready-to-complete-bold {
563
- line-height: 18px;
564
- font-weight: 700;
565
- }
566
- }
567
- }
568
-
569
- .vm-hardware-version {
570
- align-self: flex-end;
571
- margin-top: auto;
572
- }
573
- }
574
-
575
- :deep(.modal .modal-dialog .modal-content .modal-footer) {
576
- flex: unset;
577
- height: unset;
578
- min-height: unset;
579
- }
580
- :deep(.wizard-modal-titlebar h3) {
581
- color: #000;
582
- font-size: 24px;
583
- font-weight: 200;
584
- line-height: 27px;
585
- margin: 0;
586
- padding: 0;
587
- }
588
- :deep(.clr-wizard-stepnav-item) {
589
- padding-left: 0;
590
- }
591
- :deep(.clr-wizard-stepnav
592
- .clr-wizard-stepnav-item
593
- button
594
- .clr-wizard-stepnav-link-title) {
595
- width: 189px;
596
- font-weight: 700;
597
- font-size: 13px;
598
- }
599
-
600
- #vm-wizard-notification {
601
- h3 {
602
- color: var(--global-font-color7);
603
- margin-top: 6px;
604
- }
605
- p {
606
- color: var(--global-font-color6);
607
- line-height: 16px;
608
- }
609
- }
610
-
611
- .power-on-by-default-wrap {
612
- display: flex;
613
- align-items: center;
614
-
615
- input {
616
- margin-right: 6px;
617
- }
618
- }
619
-
620
- .new-task-form {
621
- padding: 0 25px 0 5px;
622
- }
623
- </style>
624
-
625
- <style>
626
- :root {
627
- --vm-context-title: #333;
628
- --vm-context-sub-title: #000;
629
- }
630
- :root.dark-theme {
631
- --vm-context-title: #adbbc4;
632
- --vm-context-sub-title: #adbbc4;
633
- }
634
- </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="!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-customize-hardware
39
+ v-show="selectedStep.id === dynamicSteps.customizeHardware"
40
+ v-model:vm-name="vmName"
41
+ v-model:guest-machine-type="vmSettings.guestMachineType"
42
+ v-model:guest-os-family="vmSettings.guestOsFamily"
43
+ v-model:guest-os-version="vmSettings.guestOsVersion"
44
+ :storage="vmSettings.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="vmSettings.cdDvdDrives"
49
+ :hard-disks="vmSettings.hardDisks"
50
+ :networks="vmSettings.networks"
51
+ :customize-hardware-submit="customizeHardwareSubmit"
52
+ :max-cpus="vmSettings.maxCpus"
53
+ :max-memory="vmSettings.maxMemory"
54
+ :cpu-models="vmSettings.cpuModels"
55
+ :cpu="vmSettings.cpu"
56
+ :memory="vmSettings.memory"
57
+ :video-card="vmSettings.videoCard"
58
+ :usb-controller="vmSettings.usbController"
59
+ :pci-devices="vmSettings.pciDevices"
60
+ :selected-nav-item="selectedNavItem"
61
+ :hard-disks-for-edit="vmSettings.hardDisks"
62
+ :options="vmSettings.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 vmForm = ref<UI_I_VmForm>({
400
+ name: '',
401
+ storage: null,
402
+ options: [],
403
+ })
404
+ const onChangeName = (name: string): void => {
405
+ vmForm.value.name = name
406
+ }
407
+ const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
408
+ if (!storage) return
409
+
410
+ vmForm.value.storage = storage
411
+ storageIdCash.value = storage.id
412
+ }
413
+ const onChangeSelectOptions = (options: string[]): void => {
414
+ vmForm.value.options = options
415
+ }
416
+ const customizeHardware = ref<UI_I_SendDataCustomizeHardware | null>(null)
417
+ const onChangeCustomizeHardware = (
418
+ data: UI_I_SendDataCustomizeHardware
419
+ ): void => {
420
+ customizeHardware.value = data
421
+ }
422
+
423
+ const virtualHardwareHardDisksLocal = computed<
424
+ UI_I_SendDataNewHardDisk[] | null
425
+ >(() => customizeHardware.value?.virtualHardware?.hardDisks || null)
426
+ const virtualHardwareNetworksLocal = computed<UI_I_SendDataNewNetwork[] | null>(
427
+ () => customizeHardware.value?.virtualHardware?.networks || null
428
+ )
429
+ const virtualHardwareCdDvdDrivesLocal = computed<
430
+ UI_I_SendDataNewCdDvdDrive[] | null
431
+ >(() => customizeHardware.value?.virtualHardware?.cdDvdDrives || null)
432
+
433
+ const virtualHardwareCpu = computed<UI_I_SendDataCpu | null>(
434
+ () => customizeHardware.value?.virtualHardware?.cpu || null
435
+ )
436
+ const virtualHardwareMemory = computed<UI_I_SendDataMemory | null>(
437
+ () => customizeHardware.value?.virtualHardware?.memory || null
438
+ )
439
+ const virtualHardwareHardDisks = ref<UI_I_SendDataNewHardDisk[] | null>(null)
440
+ const virtualHardwareCdDvdDrives = ref<UI_I_SendDataNewCdDvdDrive[] | null>(
441
+ null
442
+ )
443
+ const virtualHardwareNetworks = ref<UI_I_SendDataNewNetwork[] | null>(null)
444
+ const onChangeBootOrder = (data: UI_T_ChangeBootOrder): void => {
445
+ virtualHardwareHardDisks.value = data[0]
446
+ virtualHardwareCdDvdDrives.value = data[1]
447
+ virtualHardwareNetworks.value = data[2]
448
+ }
449
+
450
+ const isPowerOnByDefault = ref<boolean>(true)
451
+
452
+ watch(
453
+ () => props.vmNameInWizard,
454
+ (newValue) => {
455
+ vmForm.value.name = newValue
456
+ }
457
+ )
458
+
459
+ const validateSendData = async (
460
+ value: UI_I_WizardStep[]
461
+ ): Promise<UI_I_ValidationReturn> => {
462
+ wizard.setLoader(true)
463
+ let stepHasError = false
464
+
465
+ const data = await props.validateSendDataFunc(
466
+ vmForm.value,
467
+ virtualHardwareCpu.value,
468
+ virtualHardwareMemory.value,
469
+ customizeHardware.value,
470
+ virtualHardwareNetworks.value,
471
+ virtualHardwareHardDisks.value,
472
+ virtualHardwareCdDvdDrives.value,
473
+ isPowerOnByDefault.value,
474
+ localization.value
475
+ )
476
+
477
+ wizard.setLoader(false)
478
+ if (data) {
479
+ stepHasError = true
480
+ selectedNavItem.value = data[0]
481
+ }
482
+
483
+ return {
484
+ stepHasError,
485
+ newValue: value,
486
+ }
487
+ }
488
+ const onFinish = (): void => {
489
+ wizard.setLoader(false)
490
+ props
491
+ .finishFunc(
492
+ vmForm.value,
493
+ virtualHardwareCpu.value,
494
+ virtualHardwareMemory.value,
495
+ customizeHardware.value,
496
+ virtualHardwareNetworks.value,
497
+ virtualHardwareHardDisks.value,
498
+ virtualHardwareCdDvdDrives.value,
499
+ isPowerOnByDefault.value,
500
+ localization.value,
501
+ false,
502
+ newTaskForm.value,
503
+ props.schedulerTask
504
+ )
505
+ .then(() => {
506
+ onHideModal()
507
+ wizard.setLoader(false)
508
+ })
509
+ }
510
+
511
+ const selectedNavItem = ref<UI_T_SelectedNavItem>(0)
512
+
513
+ const nameFormSubmit = ref<null | Function>(null)
514
+ const storageSubmit = ref<null | Function>(null)
515
+ const selectOptionsSubmit = ref<number>(0)
516
+ const customizeHardwareSubmit = ref<null | Function>(null)
517
+
518
+ const vmSettings = computed<UI_I_VmSettings | null>(() => props.vmSettings)
519
+ const vmName = ref<string>(vmSettings.value?.name || '')
520
+ watch(vmSettings, (newValue) => {
521
+ vmName.value = newValue?.name || ''
522
+ })
523
+
524
+ const onHideModal = (): void => {
525
+ emits('hide')
526
+ }
527
+ </script>
528
+
529
+ <style scoped lang="scss">
530
+ :deep(.has-solid.close-icon.clr-icon) {
531
+ width: 20px;
532
+ top: 0;
533
+ }
534
+ .vm-context {
535
+ padding: 16px 15px 10px 10px;
536
+ height: 100%;
537
+ display: flex;
538
+ flex-direction: column;
539
+
540
+ .context-title-wrap {
541
+ padding-bottom: 3px;
542
+ border-bottom: 1px solid #a6a6a6;
543
+
544
+ h4 {
545
+ font-weight: 700;
546
+ font-size: 13px;
547
+ color: var(--vm-context-title);
548
+ }
549
+ p {
550
+ font-weight: 400;
551
+ font-size: 13px;
552
+ color: var(--vm-context-sub-title);
553
+ }
554
+ }
555
+
556
+ .finish-block {
557
+ padding: 18px 24px 24px 24px;
558
+
559
+ .add-hosts-ready-to-complete-mt-12 {
560
+ margin-top: 12px;
561
+
562
+ .add-hosts-ready-to-complete-bold {
563
+ line-height: 18px;
564
+ font-weight: 700;
565
+ }
566
+ }
567
+ }
568
+
569
+ .vm-hardware-version {
570
+ align-self: flex-end;
571
+ margin-top: auto;
572
+ }
573
+ }
574
+
575
+ :deep(.modal .modal-dialog .modal-content .modal-footer) {
576
+ flex: unset;
577
+ height: unset;
578
+ min-height: unset;
579
+ }
580
+ :deep(.wizard-modal-titlebar h3) {
581
+ color: #000;
582
+ font-size: 24px;
583
+ font-weight: 200;
584
+ line-height: 27px;
585
+ margin: 0;
586
+ padding: 0;
587
+ }
588
+ :deep(.clr-wizard-stepnav-item) {
589
+ padding-left: 0;
590
+ }
591
+ :deep(.clr-wizard-stepnav
592
+ .clr-wizard-stepnav-item
593
+ button
594
+ .clr-wizard-stepnav-link-title) {
595
+ width: 189px;
596
+ font-weight: 700;
597
+ font-size: 13px;
598
+ }
599
+
600
+ #vm-wizard-notification {
601
+ h3 {
602
+ color: var(--global-font-color7);
603
+ margin-top: 6px;
604
+ }
605
+ p {
606
+ color: var(--global-font-color6);
607
+ line-height: 16px;
608
+ }
609
+ }
610
+
611
+ .power-on-by-default-wrap {
612
+ display: flex;
613
+ align-items: center;
614
+
615
+ input {
616
+ margin-right: 6px;
617
+ }
618
+ }
619
+
620
+ .new-task-form {
621
+ padding: 0 25px 0 5px;
622
+ }
623
+ </style>
624
+
625
+ <style>
626
+ :root {
627
+ --vm-context-title: #333;
628
+ --vm-context-sub-title: #000;
629
+ }
630
+ :root.dark-theme {
631
+ --vm-context-title: #adbbc4;
632
+ --vm-context-sub-title: #adbbc4;
633
+ }
634
+ </style>