bfg-common 1.5.44 → 1.5.45

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 (184) 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/context/Context.vue +111 -111
  26. package/components/common/context/lib/models/interfaces.ts +31 -31
  27. package/components/common/context/recursion/Recursion.vue +87 -87
  28. package/components/common/context/recursion/RecursionNew.vue +238 -238
  29. package/components/common/context/recursion/RecursionOld.vue +228 -228
  30. package/components/common/details/DetailsItem.vue +109 -109
  31. package/components/common/diagramMain/DiagramMain.vue +897 -897
  32. package/components/common/diagramMain/Header.vue +214 -214
  33. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  34. package/components/common/layout/theHeader/helpMenu/aboutNew/AboutNew.vue +103 -103
  35. package/components/common/layout/theHeader/userMenu/modals/preferences/view/ViewOld.vue +112 -112
  36. package/components/common/mainNavigationPanel/MainNavigationPanelNew.vue +336 -336
  37. package/components/common/mainNavigationPanel/MainNavigationPanelOld.vue +311 -311
  38. package/components/common/modals/unsavedChanges/UnsavedChanges.vue +56 -56
  39. package/components/common/monitor/overview/OverviewOld.vue +139 -139
  40. package/components/common/pages/home/StatusContent.vue +49 -49
  41. package/components/common/pages/home/headline/Headline.vue +45 -45
  42. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  43. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  44. package/components/common/pages/home/widgets/Widgets.vue +49 -49
  45. package/components/common/pages/home/widgets/WidgetsNew.vue +86 -86
  46. package/components/common/pages/home/widgets/WidgetsOld.vue +34 -34
  47. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  48. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  49. package/components/common/pages/home/widgets/vms/Vms.vue +26 -26
  50. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  51. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  52. package/components/common/pages/licensing/Licensing.vue +128 -0
  53. package/components/common/pages/licensing/lib/models/interfaces.ts +22 -0
  54. package/components/common/pages/licensing/lib/utils/validation.ts +29 -0
  55. package/components/common/pages/licensing/listView/ListView.vue +50 -0
  56. package/components/common/pages/licensing/listView/lib/config/list.ts +57 -0
  57. package/components/common/pages/licensing/listView/lib/models/interfaces.ts +5 -0
  58. package/components/common/pages/licensing/modals/assign/Assign.vue +247 -0
  59. package/components/common/pages/licensing/modals/assign/lib/config/tabsPannel.ts +17 -0
  60. package/components/common/pages/licensing/modals/assign/lib/models/interfaces.ts +5 -0
  61. package/components/common/pages/licensing/modals/assign/lib/utils/error.ts +25 -0
  62. package/components/common/pages/licensing/modals/assign/new/New.vue +216 -0
  63. package/components/common/pages/licensing/modals/assign/tableView/TableView.vue +193 -0
  64. package/components/common/pages/licensing/modals/assign/tableView/lib/config/table.ts +100 -0
  65. package/components/common/pages/licensing/modals/assign/tableView/lib/config/tableKeys.ts +10 -0
  66. package/components/common/pages/licensing/modals/assign/tableView/lib/models/interfaces.ts +9 -0
  67. package/components/common/pages/licensing/modals/assign/tableView/lib/models/types.ts +8 -0
  68. package/components/common/pages/packages/Packages.vue +208 -208
  69. package/components/common/pages/shortcuts/block/BlockNew.vue +96 -96
  70. package/components/common/pages/shortcuts/block/BlockOld.vue +68 -68
  71. package/components/common/portlets/customAttributes/Portlet.vue +667 -667
  72. package/components/common/portlets/tag/Portlet.vue +433 -433
  73. package/components/common/recursionTree/RecursionTree.vue +223 -223
  74. package/components/common/select/button/ButtonDropdown.vue +108 -108
  75. package/components/common/spiceConsole/Drawer.vue +370 -370
  76. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  77. package/components/common/split/horizontal/HorizontalNew.vue +376 -376
  78. package/components/common/split/horizontal/HorizontalOld.vue +337 -337
  79. package/components/common/split/vertical/Vertical.vue +160 -160
  80. package/components/common/tools/Actions.vue +188 -188
  81. package/components/common/vm/actions/add/Add.vue +774 -774
  82. package/components/common/vm/actions/add/lib/config/steps.ts +247 -247
  83. package/components/common/vm/actions/clone/Clone.vue +798 -798
  84. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -291
  85. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +634 -634
  86. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +116 -116
  87. package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +275 -275
  88. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareNew.vue +274 -274
  89. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareOld.vue +177 -177
  90. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +698 -698
  91. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareNew.vue +410 -410
  92. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +319 -319
  93. package/components/common/vm/actions/common/customizeHardware/virtualHardware/browseView/BrowseView.vue +219 -219
  94. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/Bus.vue +99 -99
  95. package/components/common/vm/actions/common/customizeHardware/virtualHardware/bus/BusNew.vue +117 -117
  96. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +232 -232
  97. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveNew.vue +164 -164
  98. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDriveOld.vue +168 -168
  99. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  100. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +70 -70
  101. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  102. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +338 -338
  103. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  104. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  105. package/components/common/vm/actions/common/customizeHardware/virtualHardware/limit/Limit.vue +220 -220
  106. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +368 -368
  107. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskNew.vue +232 -232
  108. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskOld.vue +250 -250
  109. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/mode/ModeOld.vue +56 -56
  110. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/sharing/SharingNew.vue +44 -44
  111. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +286 -286
  112. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/NewNetworkNew.vue +124 -124
  113. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/LocationOld.vue +134 -134
  114. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/New.vue +63 -63
  115. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/location/new/table/lib/config/config.ts +95 -95
  116. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  117. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressNew.vue +69 -69
  118. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddressOld.vue +83 -83
  119. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +205 -205
  120. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  121. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  122. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  123. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoNew.vue +84 -84
  124. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  125. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  126. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  127. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  128. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGrid.vue +41 -41
  129. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridNew.vue +81 -81
  130. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  131. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newUsbController/NewUsbControllerNew.vue +56 -56
  132. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  133. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/OtherNew.vue +30 -30
  134. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardNew.vue +104 -104
  135. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/VideoCardOld.vue +112 -112
  136. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/totalVideoMemory/TotalVideoMemoryNew.vue +54 -54
  137. package/components/common/vm/actions/common/customizeHardware/vmoptions/Vmoptions.vue +145 -145
  138. package/components/common/vm/actions/common/customizeHardware/vmoptions/VmoptionsNew.vue +102 -102
  139. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/BootOptionsNew.vue +75 -75
  140. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +26 -26
  141. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +57 -57
  142. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/FirmwareNew.vue +42 -42
  143. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/menu/MenuNew.vue +25 -25
  144. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +171 -171
  145. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +50 -50
  146. package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsNew.vue +141 -141
  147. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/New.vue +140 -140
  148. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/copyPaste/CopyPasteNew.vue +30 -30
  149. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/fileTransfer/FileTransferNew.vue +30 -30
  150. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/folderSharing/FolderSharingNew.vue +30 -30
  151. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  152. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapNew.vue +39 -39
  153. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  154. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordNew.vue +102 -102
  155. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordOld.vue +94 -94
  156. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  157. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionNew.vue +38 -38
  158. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  159. package/components/common/vm/actions/common/lib/utils/capabilities.ts +52 -52
  160. package/components/common/vm/actions/common/select/createType/CreateType.vue +74 -74
  161. package/components/common/vm/actions/common/select/storage/Storage.vue +130 -130
  162. package/components/common/vm/actions/common/select/storage/StorageOld.vue +129 -129
  163. package/components/common/vm/actions/common/select/template/Template.vue +65 -65
  164. package/components/common/vm/actions/common/select/template/TemplateTreeView.vue +88 -88
  165. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  166. package/components/common/wizards/datastore/add/lib/config/steps.ts +138 -138
  167. package/components/common/wizards/datastore/add/nfs/accessibility/Accessibility.vue +60 -60
  168. package/components/common/wizards/datastore/add/readyComplete/ReadyComplete.vue +92 -92
  169. package/components/common/wizards/network/add/steps/SelectConnectionType.vue +105 -105
  170. package/components/common/wizards/vm/migrate/lib/config/constructDataReady.ts +220 -220
  171. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  172. package/components/common/wizards/vm/migrate/select/network/table/network/Network.vue +150 -150
  173. package/components/common/wizards/vm/migrate/select/network/table/network/lib/config/advancedTable.ts +91 -91
  174. package/components/common/wizards/vm/migrate/select/priority/Priority.vue +43 -43
  175. package/composables/productNameLocal.ts +30 -30
  176. package/composables/useAppVersion.ts +21 -21
  177. package/package.json +1 -1
  178. package/plugins/date.ts +233 -233
  179. package/plugins/directives.ts +24 -24
  180. package/public/spice-console/lib/images/bitmap.js +203 -203
  181. package/public/spice-console/network/spicechannel.js +383 -383
  182. package/store/main/mutations.ts +7 -7
  183. package/store/main/state.ts +7 -7
  184. 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>