bfg-common 1.5.421 → 1.5.423

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 (157) 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 +7 -3
  7. package/assets/localization/local_en.json +12 -8
  8. package/assets/localization/local_hy.json +8 -4
  9. package/assets/localization/local_kk.json +7 -3
  10. package/assets/localization/local_ru.json +12 -8
  11. package/assets/localization/local_zh.json +7 -3
  12. package/assets/scss/common/theme.scss +0 -214
  13. package/components/atoms/TheIcon3.vue +50 -50
  14. package/components/atoms/collapse/CollapseNav.vue +170 -170
  15. package/components/atoms/perPage/PerPage.vue +58 -58
  16. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  17. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  18. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  19. package/components/common/context/lib/models/interfaces.ts +33 -33
  20. package/components/common/diagramMain/modals/lib/config/networkModal.ts +398 -398
  21. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  22. package/components/common/pages/backups/Backups.vue +102 -102
  23. package/components/common/pages/backups/DetailView.vue +52 -52
  24. package/components/common/pages/backups/lib/models/interfaces.ts +36 -36
  25. package/components/common/pages/backups/modals/Modals.vue +231 -226
  26. package/components/common/pages/backups/modals/createBackup/CreateBackup.vue +376 -353
  27. package/components/common/pages/backups/modals/createBackup/configuration/Configuration.vue +29 -29
  28. package/components/common/pages/backups/modals/createBackup/configuration/backupWindow/BackupWindow.vue +26 -26
  29. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/MaxBandwidth.vue +66 -66
  30. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/config/options.ts +6 -6
  31. package/components/common/pages/backups/modals/createBackup/configuration/strategy/Strategy.vue +35 -35
  32. package/components/common/pages/backups/modals/createBackup/datastores/Datastores.vue +59 -59
  33. package/components/common/pages/backups/modals/createBackup/datastores/tableView/TableView.vue +95 -95
  34. package/components/common/pages/backups/modals/createBackup/datastores/tableView/lib/config/table.ts +119 -119
  35. package/components/common/pages/backups/modals/createBackup/disks/Disks.vue +2 -2
  36. package/components/common/pages/backups/modals/createBackup/disks/tableView/TableView.vue +7 -4
  37. package/components/common/pages/backups/modals/createBackup/disks/tableView/lib/config/table.ts +117 -117
  38. package/components/common/pages/backups/modals/createBackup/general/General.vue +135 -48
  39. package/components/common/pages/backups/modals/createBackup/lib/config/steps.ts +117 -117
  40. package/components/common/pages/backups/modals/createBackup/lib/config/strategyOptions.ts +12 -12
  41. package/components/common/pages/backups/modals/lib/config/restore.ts +115 -115
  42. package/components/common/pages/backups/modals/lib/models/interfaces.ts +186 -185
  43. package/components/common/pages/backups/modals/restore/Restore.vue +417 -417
  44. package/components/common/pages/backups/modals/restore/disks/Disks.vue +27 -27
  45. package/components/common/pages/backups/modals/restore/disks/tableView/TableView.vue +102 -102
  46. package/components/common/pages/backups/modals/restore/disks/tableView/lib/config/table.ts +117 -117
  47. package/components/common/pages/backups/modals/restore/lib/config/steps.ts +108 -108
  48. package/components/common/pages/backups/modals/restore/name/Name.vue +160 -160
  49. package/components/common/pages/backups/modals/restore/name/lib/models/interfaces.ts +6 -6
  50. package/components/common/pages/backups/modals/restore/networks/Networks.vue +67 -67
  51. package/components/common/pages/backups/modals/restore/networks/table/Table.vue +214 -214
  52. package/components/common/pages/backups/modals/restore/types/lib/config/typeOptions.ts +25 -25
  53. package/components/common/pages/backups/tools/Tools.vue +75 -75
  54. package/components/common/pages/backups/tools/lib/config/tabs.ts +36 -36
  55. package/components/common/pages/home/headline/HeadlineOld.vue +42 -42
  56. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  57. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  58. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  59. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  60. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  61. package/components/common/pages/scheduledTasks/lib/utils/utils.ts +84 -84
  62. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  63. package/components/common/select/radio/RadioGroup.vue +137 -137
  64. package/components/common/spiceConsole/Drawer.vue +381 -381
  65. package/components/common/spiceConsole/SpiceConsole.vue +127 -127
  66. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  67. package/components/common/split/horizontal/HorizontalNew.vue +22 -5
  68. package/components/common/split/horizontal/HorizontalOld.vue +8 -1
  69. package/components/common/split/vertical/VerticalNew.vue +13 -2
  70. package/components/common/summary/notification/NotificationNew.vue +20 -4
  71. package/components/common/titleBar/titleBarNew/notification/Notification.vue +31 -0
  72. package/components/common/tools/Actions.vue +207 -207
  73. package/components/common/tooltip/Help.vue +14 -1
  74. package/components/common/treeView/TreeView.vue +52 -52
  75. package/components/common/vm/actions/add/New.vue +10 -0
  76. package/components/common/vm/actions/add/folderTreeView/FolderTreeView.vue +72 -72
  77. package/components/common/vm/actions/add/folderTreeView/New.vue +40 -40
  78. package/components/common/vm/actions/clone/Clone.vue +11 -0
  79. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -291
  80. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +11 -0
  81. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareNew.vue +26 -0
  82. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  83. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +78 -70
  84. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  85. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/CpuNew.vue +8 -0
  86. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  87. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  88. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/tooltip/TooltipNew.vue +2 -0
  89. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskNew.vue +15 -0
  90. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/file/FileNew.vue +8 -0
  91. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/Location.vue +154 -154
  92. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationOld.vue +85 -85
  93. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/maximumSize/MaximumSize.vue +23 -23
  94. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/maximumSize/MaximumSizeNew.vue +8 -0
  95. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  96. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  97. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  98. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  99. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  100. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  101. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  102. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  103. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  104. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  105. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/inputDevices/InputDevicesNew.vue +10 -0
  106. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/numberDisplays/NumberDisplays.vue +53 -53
  107. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +32 -32
  108. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +60 -60
  109. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +174 -174
  110. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  111. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapOld.vue +44 -44
  112. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  113. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  114. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  115. package/components/common/vm/actions/common/select/compatibility/New.vue +18 -0
  116. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  117. package/components/common/vm/actions/common/select/computeResource/ComputeResource.vue +143 -143
  118. package/components/common/vm/actions/common/select/computeResource/New.vue +184 -168
  119. package/components/common/vm/actions/common/select/computeResource/treeView/TreeView.vue +131 -131
  120. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -38
  121. package/components/common/vm/actions/common/select/createType/New.vue +16 -0
  122. package/components/common/vm/actions/common/select/createType/Old.vue +9 -0
  123. package/components/common/vm/actions/common/select/createType/lib/config/items.ts +48 -48
  124. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  125. package/components/common/vm/actions/common/select/name/New.vue +20 -0
  126. package/components/common/vm/actions/common/select/os/New.vue +10 -0
  127. package/components/common/vm/actions/common/select/os/Old.vue +152 -152
  128. package/components/common/vm/actions/common/select/os/Os.vue +139 -139
  129. package/components/common/vm/actions/common/select/storage/new/New.vue +32 -0
  130. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  131. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  132. package/components/common/vm/actions/common/select/template/old/Old.vue +50 -50
  133. package/components/common/vm/actions/common/select/template/treeView/New.vue +10 -0
  134. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  135. package/components/common/vmt/actions/add/Old.vue +10 -0
  136. package/components/common/vmt/actions/add/lib/models/interfaces.ts +23 -23
  137. package/components/common/wizards/datastore/add/steps/nameAndConfigure/_serversList/DeletePopover.vue +8 -0
  138. package/components/common/wizards/datastore/add/steps/nameAndDevice/table/new/New.vue +11 -0
  139. package/components/common/wizards/datastore/add/steps/typeMode/lib/config/typeOptions.ts +43 -43
  140. package/components/common/wizards/network/add/modals/SelectStandardSwitch.vue +17 -6
  141. package/components/common/wizards/network/add/modals/SelectSwitch.vue +17 -6
  142. package/components/common/wizards/vm/migrate/lib/config/steps.ts +157 -157
  143. package/components/common/wizards/vm/migrate/lib/validations.ts +68 -68
  144. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  145. package/components/common/wizards/vm/migrate/select/type/lib/config/typeOptions.ts +45 -45
  146. package/composables/productNameLocal.ts +30 -30
  147. package/composables/useAppVersion.ts +21 -21
  148. package/package.json +1 -1
  149. package/plugins/date.ts +233 -233
  150. package/plugins/panelStates.ts +70 -70
  151. package/plugins/text.ts +59 -59
  152. package/public/spice-console/lib/images/bitmap.js +203 -203
  153. package/public/spice-console/network/spicechannel.js +390 -390
  154. package/store/main/mutations.ts +7 -7
  155. package/store/main/state.ts +7 -7
  156. package/components/common/pages/backups/modals/createBackup/disks/tableView/lib/models/interfaces.ts +0 -4
  157. package/components/common/wizards/network/add/modals/lib/models/interfaces.ts +0 -21
@@ -1,353 +1,376 @@
1
- <template>
2
- <div class="create-backup">
3
- <atoms-wizard
4
- show
5
- :wizard="wizard"
6
- :selected-scheme="selectedScheme"
7
- :title="title"
8
- :localization="localization"
9
- :test-id="testId"
10
- @change-steps="onChangeSteps"
11
- @hide="onHideModal"
12
- @submit="onFinish"
13
- >
14
- <template #modalBody="{ selectedStep }">
15
- <atoms-alert
16
- v-show="errors.length"
17
- status="alert-danger"
18
- :items="errors"
19
- test-id="create-backup-alert"
20
- @remove="onRemoveValidationErrors"
21
- />
22
-
23
- <common-pages-scheduled-tasks-modals-common-new-task-form
24
- v-show="selectedStep.id === dynamicSteps.schedulingOptions"
25
- v-model="modelSchedulerTask"
26
- :target="props.selectedVmName"
27
- class="new-task-form"
28
- />
29
-
30
- <common-pages-backups-modals-create-backup-general
31
- v-show="selectedStep.id === dynamicSteps.general"
32
- v-model="model"
33
- />
34
-
35
- <common-pages-backups-modals-create-backup-disks
36
- v-show="selectedStep.id === dynamicSteps.disks"
37
- v-model="model"
38
- :disks="props.disks"
39
- :disks-loading="props.disksLoading"
40
- />
41
-
42
- <common-pages-backups-modals-create-backup-datastores
43
- v-show="selectedStep.id === dynamicSteps.datastores"
44
- v-model="model"
45
- :datastore-table="props.datastoreTable"
46
- :datastore-table-loading="props.datastoreTableLoading"
47
- @change="onChangeDatastore"
48
- />
49
-
50
- <common-pages-backups-modals-create-backup-configuration
51
- v-show="selectedStep.id === dynamicSteps.configuration"
52
- v-model="model"
53
- />
54
-
55
- <common-ready-to-complete
56
- v-show="selectedStep.id === dynamicSteps.readyComplete"
57
- :data="readyToCompleteInfo"
58
- />
59
- </template>
60
- </atoms-wizard>
61
- </div>
62
- </template>
63
-
64
- <script setup lang="ts">
65
- import type { UI_I_Localization } from '~/lib/models/interfaces'
66
- import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
67
- import type {
68
- UI_I_WizardStep,
69
- UI_I_ValidationReturn,
70
- } from '~/components/atoms/wizard/lib/models/interfaces'
71
- import type { UI_I_ScheduleNewTasksForm } from '~/components/common/pages/scheduledTasks/modals/lib/models/interfaces'
72
- import type {
73
- UI_I_BackupDatastoreTable,
74
- UI_I_CreateBackupForm,
75
- UI_I_CreateBackupFormDiskDevice,
76
- } from '~/components/common/pages/backups/modals/lib/models/interfaces'
77
- import type { UI_I_SelectInputItem } from '~/components/common/select/input/lib/models/interfaces'
78
- import Wizard from '~/components/atoms/wizard/lib/utils/utils'
79
- import {
80
- stepsSchemeInitial,
81
- stepsFunc,
82
- dynamicSteps,
83
- } from '~/components/common/pages/backups/modals/createBackup/lib/config/steps'
84
- import { strategyOptionsFunc } from '~/components/common/pages/backups/modals/createBackup/lib/config/strategyOptions'
85
-
86
- const model = defineModel<UI_I_CreateBackupForm>({ required: true })
87
- const modelSchedulerTask = defineModel<UI_I_ScheduleNewTasksForm>(
88
- 'schedulerForm',
89
- { required: true }
90
- )
91
-
92
- const props = defineProps<{
93
- isEdit: boolean
94
- target: string
95
- isScheduledTasks: boolean
96
- isEditScheduledTasks: boolean
97
- selectedVmName: string
98
- disks: UI_I_CreateBackupFormDiskDevice[]
99
- disksLoading: boolean
100
- datastoreTable: UI_I_BackupDatastoreTable
101
- datastoreTableLoading: boolean
102
- }>()
103
-
104
- const emits = defineEmits<{
105
- (event: 'change-step-create-backup', value: UI_I_WizardStep[]): void
106
- (event: 'finish'): void
107
- (event: 'hide'): void
108
- }>()
109
-
110
- const localization = computed<UI_I_Localization>(() => useLocal())
111
- const { $binary }: any = useNuxtApp()
112
-
113
- const title = computed<string>(() => {
114
- const { createBackup, updateBackup, scheduleNewTasks, scheduleTaskEdit } =
115
- localization.value.common
116
- let result = props.isEdit ? updateBackup : createBackup
117
- if (props.isScheduledTasks) {
118
- const schedulerMode = props.isEditScheduledTasks
119
- ? scheduleTaskEdit
120
- : scheduleNewTasks
121
-
122
- result = `${schedulerMode} (${createBackup})`
123
- }
124
-
125
- return result
126
- })
127
-
128
- const testId = ref<string>(props.isEdit ? 'update-backup' : 'create-backup')
129
-
130
- const wizard: Wizard = new Wizard(
131
- stepsFunc(localization.value),
132
- stepsSchemeInitial(props.isScheduledTasks)
133
- )
134
-
135
- watch(
136
- modelSchedulerTask,
137
- (newValue: UI_I_ScheduleNewTasksForm) => {
138
- if (props.isScheduledTasks) wizard.setDisabledNextButton(newValue.isValid)
139
- },
140
- { immediate: true, deep: true }
141
- )
142
-
143
- const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
144
- const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
145
- emits('change-step-create-backup', value)
146
- wizard.changeSteps(value, validationFunc)
147
- }
148
- const validationFunc = async (
149
- value: UI_I_WizardStep[],
150
- currentStep: UI_I_WizardStep,
151
- nextStep: UI_I_WizardStep
152
- ): Promise<UI_I_ValidationReturn> => {
153
- let stepHasError = false
154
- const stepShouldStop = {
155
- ifOnCurrentStep: false,
156
- ifFromAnyStep: false,
157
- stoppageStepId: -1,
158
- }
159
-
160
- if (
161
- wizard.isValidateForStep(dynamicSteps.general, currentStep.id, nextStep.id)
162
- ) {
163
- const nameValidation = checkName(value)
164
-
165
- value = nameValidation.newValue
166
- stepHasError = stepHasError || nameValidation.stepHasError
167
- }
168
-
169
- if (
170
- wizard.isValidateForStep(dynamicSteps.disks, currentStep.id, nextStep.id)
171
- ) {
172
- const validation = checkDisks(value)
173
-
174
- value = validation.newValue
175
- stepHasError = stepHasError || validation.stepHasError
176
- }
177
-
178
- if (
179
- wizard.isValidateForStep(
180
- dynamicSteps.datastores,
181
- currentStep.id,
182
- nextStep.id
183
- )
184
- ) {
185
- const validation = checkDatastore(value)
186
-
187
- value = validation.newValue
188
- stepHasError = stepHasError || validation.stepHasError
189
- }
190
-
191
- return {
192
- newValue: value,
193
- stepHasError,
194
- stepShouldStop,
195
- }
196
- }
197
-
198
- const checkName = (value: UI_I_WizardStep[]): UI_I_ValidationReturn => {
199
- let stepHasError = false
200
-
201
- const isValid = !!model.value?.name
202
- if (!isValid) {
203
- stepHasError = wizard.setValidation(dynamicSteps.general, 'name', {
204
- fieldMessage: localization.value.common.nameIsRequired,
205
- alertMessage: localization.value.common.nameIsRequired,
206
- })
207
- showValidationErrors([localization.value.common.nameIsRequired])
208
- } else if (wizard.hasMessage(dynamicSteps.general, 'name')) {
209
- value = wizard.removeValidation(dynamicSteps.general, 'name', value)
210
- onRemoveValidationErrors()
211
- }
212
-
213
- return {
214
- stepHasError,
215
- newValue: value,
216
- }
217
- }
218
-
219
- const checkDisks = (value: UI_I_WizardStep[]): UI_I_ValidationReturn => {
220
- let stepHasError = false
221
-
222
- const isValidStores = !!model.value?.disk_devices.length
223
- if (!isValidStores) {
224
- stepHasError = wizard.setValidation(dynamicSteps.disks, 'disk_devices', {
225
- fieldMessage: localization.value.common.diskIsRequired,
226
- alertMessage: localization.value.common.diskIsRequired,
227
- })
228
- showValidationErrors([localization.value.common.diskIsRequired])
229
- } else if (wizard.hasMessage(dynamicSteps.disks, 'disk_devices')) {
230
- value = wizard.removeValidation(dynamicSteps.disks, 'disk_devices', value)
231
- onRemoveValidationErrors()
232
- }
233
-
234
- return {
235
- stepHasError,
236
- newValue: value,
237
- }
238
- }
239
-
240
- const checkDatastore = (value: UI_I_WizardStep[]): UI_I_ValidationReturn => {
241
- let stepHasError = false
242
-
243
- const isValidStorage = !!model.value?.backup_storage.length
244
- if (!isValidStorage) {
245
- stepHasError = wizard.setValidation(
246
- dynamicSteps.datastores,
247
- 'backup_storage',
248
- {
249
- fieldMessage: localization.value.common.datastoreIsRequired,
250
- alertMessage: localization.value.common.datastoreIsRequired,
251
- }
252
- )
253
- showValidationErrors([localization.value.common.datastoreIsRequired])
254
- } else if (wizard.hasMessage(dynamicSteps.datastores, 'backup_storage')) {
255
- value = wizard.removeValidation(
256
- dynamicSteps.datastores,
257
- 'backup_storage',
258
- value
259
- )
260
- onRemoveValidationErrors()
261
- }
262
-
263
- return {
264
- stepHasError,
265
- newValue: value,
266
- }
267
- }
268
-
269
- const selectedDatastoresNames = ref<string[]>([])
270
- const onChangeDatastore = (names: string[]): void => {
271
- selectedDatastoresNames.value = names
272
- }
273
-
274
- const strategyOptions = ref<UI_I_SelectInputItem[]>(
275
- strategyOptionsFunc(localization.value)
276
- )
277
-
278
- const readyToCompleteInfo = computed<UI_I_TableInfoItem[]>(() => {
279
- // General
280
- const result = [
281
- {
282
- label: localization.value.common.name,
283
- value: model.value.name,
284
- },
285
- {
286
- label: localization.value.common.description,
287
- value: model.value.description,
288
- },
289
- ]
290
-
291
- // Disks
292
- model.value.disk_devices.forEach((disk_device, i) => {
293
- result.push({
294
- label: `${localization.value.common.disk} ${i + 1}`,
295
- value: disk_device.location,
296
- })
297
- })
298
-
299
- // Datastores
300
- result.push({
301
- label: localization.value.common.datastore,
302
- value: selectedDatastoresNames.value.join(', '),
303
- })
304
-
305
- // Configuration
306
- result.push({
307
- label: localization.value.common.strategy,
308
- value:
309
- strategyOptions.value.find(
310
- (option) => option.value === model.value.strategy
311
- )?.label || '',
312
- })
313
- // result.push({
314
- // label: localization.value.common.backupWindow,
315
- // value: model.value.start_window_min + '',
316
- // })
317
-
318
- const gbSizeByB = 1_073_741_824
319
- const maxBandwidth =
320
- model.value.bandwidth_limit >= gbSizeByB
321
- ? $binary.bToGb(model.value.bandwidth_limit) + ' Gbps'
322
- : $binary.bToMb(model.value.bandwidth_limit) + ' Mbps'
323
-
324
- result.push({
325
- label: localization.value.common.maxBandwidth,
326
- value: maxBandwidth,
327
- })
328
-
329
- return result
330
- })
331
-
332
- const errors = ref<string[]>([])
333
- const showValidationErrors = (data: string[]): void => {
334
- errors.value = data
335
- }
336
- const onRemoveValidationErrors = (): void => {
337
- errors.value = []
338
- }
339
-
340
- const onFinish = (): void => {
341
- emits('finish')
342
- }
343
- const onHideModal = (): void => {
344
- emits('hide')
345
- }
346
- </script>
347
-
348
- <style scoped lang="scss">
349
- :deep(.modal-body) {
350
- display: flex;
351
- flex-direction: column;
352
- }
353
- </style>
1
+ <template>
2
+ <div class="create-backup">
3
+ <atoms-wizard
4
+ show
5
+ :wizard="wizard"
6
+ :selected-scheme="selectedScheme"
7
+ :title="title"
8
+ :localization="localization"
9
+ :test-id="testId"
10
+ @change-steps="onChangeSteps"
11
+ @hide="onHideModal"
12
+ @submit="onFinish"
13
+ >
14
+ <template #modalBody="{ selectedStep }">
15
+ <atoms-alert
16
+ v-show="errors.length"
17
+ status="alert-danger"
18
+ :items="errors"
19
+ test-id="create-backup-alert"
20
+ @remove="onRemoveValidationErrors"
21
+ />
22
+
23
+ <common-pages-scheduled-tasks-modals-common-new-task-form
24
+ v-show="selectedStep.id === dynamicSteps.schedulingOptions"
25
+ v-model="modelSchedulerTask"
26
+ :target="props.selectedVmName"
27
+ class="new-task-form"
28
+ />
29
+
30
+ <common-pages-backups-modals-create-backup-general
31
+ v-show="selectedStep.id === dynamicSteps.general"
32
+ v-model="model"
33
+ :show="selectedStep.id === dynamicSteps.general"
34
+ :general-submit="generalSubmit"
35
+ @check-name="onCheckName"
36
+ />
37
+
38
+ <common-pages-backups-modals-create-backup-disks
39
+ v-show="selectedStep.id === dynamicSteps.disks"
40
+ v-model="model"
41
+ :disks="props.disks"
42
+ :disks-loading="props.disksLoading"
43
+ />
44
+
45
+ <common-pages-backups-modals-create-backup-datastores
46
+ v-show="selectedStep.id === dynamicSteps.datastores"
47
+ v-model="model"
48
+ :datastore-table="props.datastoreTable"
49
+ :datastore-table-loading="props.datastoreTableLoading"
50
+ @change="onChangeDatastore"
51
+ />
52
+
53
+ <common-pages-backups-modals-create-backup-configuration
54
+ v-show="selectedStep.id === dynamicSteps.configuration"
55
+ v-model="model"
56
+ />
57
+
58
+ <common-ready-to-complete
59
+ v-show="selectedStep.id === dynamicSteps.readyComplete"
60
+ :data="readyToCompleteInfo"
61
+ />
62
+ </template>
63
+ </atoms-wizard>
64
+ </div>
65
+ </template>
66
+
67
+ <script setup lang="ts">
68
+ import type { UI_I_WizardStep, UI_I_ValidationReturn } from '~/node_modules/bfg-uikit/components/ui/wizard/lib/models/interfaces'
69
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
70
+ import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
71
+ import type { UI_I_ScheduleNewTasksForm } from '~/components/common/pages/scheduledTasks/modals/lib/models/interfaces'
72
+ import type {
73
+ UI_I_BackupDatastoreTable,
74
+ UI_I_CreateBackupForm,
75
+ UI_I_Pvm,
76
+ } from '~/components/common/pages/backups/modals/lib/models/interfaces'
77
+ import type { UI_I_SelectInputItem } from '~/components/common/select/input/lib/models/interfaces'
78
+ import type { UI_I_NameCheck } from '~/components/common/pages/backups/modals/restore/name/lib/models/interfaces'
79
+ import Wizard from '~/components/atoms/wizard/lib/utils/utils'
80
+ import {
81
+ stepsSchemeInitial,
82
+ stepsFunc,
83
+ dynamicSteps,
84
+ } from '~/components/common/pages/backups/modals/createBackup/lib/config/steps'
85
+ import { strategyOptionsFunc } from '~/components/common/pages/backups/modals/createBackup/lib/config/strategyOptions'
86
+
87
+ const model = defineModel<UI_I_CreateBackupForm>({ required: true })
88
+ const modelSchedulerTask = defineModel<UI_I_ScheduleNewTasksForm>(
89
+ 'schedulerForm',
90
+ { required: true }
91
+ )
92
+
93
+ const props = defineProps<{
94
+ isEdit: boolean
95
+ target: string
96
+ isScheduledTasks: boolean
97
+ isEditScheduledTasks: boolean
98
+ selectedVmName: string
99
+ disks: UI_I_Pvm['disk_devices']
100
+ disksLoading: boolean
101
+ datastoreTable: UI_I_BackupDatastoreTable
102
+ datastoreTableLoading: boolean
103
+ }>()
104
+
105
+ const emits = defineEmits<{
106
+ (event: 'change-step-create-backup', value: UI_I_WizardStep[]): void
107
+ (event: 'check-name', value: UI_I_NameCheck): void
108
+ (event: 'finish'): void
109
+ (event: 'hide'): void
110
+ }>()
111
+
112
+ const localization = computed<UI_I_Localization>(() => useLocal())
113
+ const { $binary }: any = useNuxtApp()
114
+
115
+ const title = computed<string>(() => {
116
+ const { createBackup, updateBackup, scheduleNewTasks, scheduleTaskEdit } =
117
+ localization.value.common
118
+ let result = props.isEdit ? updateBackup : createBackup
119
+ if (props.isScheduledTasks) {
120
+ const schedulerMode = props.isEditScheduledTasks
121
+ ? scheduleTaskEdit
122
+ : scheduleNewTasks
123
+
124
+ result = `${schedulerMode} (${createBackup})`
125
+ }
126
+
127
+ return result
128
+ })
129
+
130
+ const testId = ref<string>(props.isEdit ? 'update-backup' : 'create-backup')
131
+
132
+ const wizard: Wizard = new Wizard(
133
+ stepsFunc(localization.value),
134
+ stepsSchemeInitial(props.isScheduledTasks)
135
+ )
136
+
137
+ watch(
138
+ modelSchedulerTask,
139
+ (newValue: UI_I_ScheduleNewTasksForm) => {
140
+ if (props.isScheduledTasks) wizard.setDisabledNextButton(newValue.isValid)
141
+ },
142
+ { immediate: true, deep: true }
143
+ )
144
+
145
+ const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
146
+ const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
147
+ emits('change-step-create-backup', value)
148
+ wizard.changeSteps(value, validationFunc)
149
+ }
150
+
151
+ const generalSubmit = ref<null | Function>(null)
152
+
153
+ const validationFunc = async (
154
+ value: UI_I_WizardStep[],
155
+ currentStep: UI_I_WizardStep,
156
+ nextStep: UI_I_WizardStep
157
+ ): Promise<UI_I_ValidationReturn> => {
158
+ let stepHasError = false
159
+ const stepShouldStop = {
160
+ ifOnCurrentStep: false,
161
+ ifFromAnyStep: false,
162
+ stoppageStepId: -1,
163
+ }
164
+
165
+ if (
166
+ wizard.isValidateForStep(dynamicSteps.general, currentStep.id, nextStep.id)
167
+ ) {
168
+ const nameValidation = await checkName(value)
169
+
170
+ value = nameValidation.newValue
171
+ stepHasError = stepHasError || nameValidation.stepHasError
172
+ }
173
+
174
+ if (
175
+ wizard.isValidateForStep(dynamicSteps.disks, currentStep.id, nextStep.id)
176
+ ) {
177
+ const validation = checkDisks(value)
178
+
179
+ value = validation.newValue
180
+ stepHasError = stepHasError || validation.stepHasError
181
+ }
182
+
183
+ if (
184
+ wizard.isValidateForStep(
185
+ dynamicSteps.datastores,
186
+ currentStep.id,
187
+ nextStep.id
188
+ )
189
+ ) {
190
+ const validation = checkDatastore(value)
191
+
192
+ value = validation.newValue
193
+ stepHasError = stepHasError || validation.stepHasError
194
+ }
195
+
196
+ return {
197
+ newValue: value,
198
+ stepHasError,
199
+ stepShouldStop,
200
+ }
201
+ }
202
+
203
+ const checkName = async (
204
+ value: UI_I_WizardStep[]
205
+ ): Promise<UI_I_ValidationReturn> => {
206
+ let stepHasError = false
207
+
208
+ const { name } = model.value
209
+ if (!name) {
210
+ stepHasError = wizard.setValidation(dynamicSteps.general, 'name', {
211
+ fieldMessage: localization.value.common.nameIsRequired,
212
+ alertMessage: localization.value.common.nameIsRequired,
213
+ })
214
+ return {
215
+ stepHasError,
216
+ newValue: value,
217
+ }
218
+ }
219
+ return new Promise((resolve) => {
220
+ generalSubmit.value = (isValid: boolean): void => {
221
+ if (!isValid) {
222
+ stepHasError = wizard.setValidation(dynamicSteps.general, 'name', {
223
+ fieldMessage: 'aaa',
224
+ alertMessage: 'aaa',
225
+ })
226
+ } else if (wizard.hasMessage(dynamicSteps.general, 'name')) {
227
+ value = wizard.removeValidation(dynamicSteps.general, 'name', value)
228
+ }
229
+
230
+ resolve({
231
+ stepHasError,
232
+ newValue: value,
233
+ })
234
+ generalSubmit.value = null
235
+ }
236
+ })
237
+ }
238
+ const onCheckName = async (data: UI_I_NameCheck): Promise<void> => {
239
+ emits('check-name', data)
240
+ }
241
+
242
+ const checkDisks = (value: UI_I_WizardStep[]): UI_I_ValidationReturn => {
243
+ let stepHasError = false
244
+
245
+ const isValidStores = !!model.value?.disk_devices.length
246
+ if (!isValidStores) {
247
+ stepHasError = wizard.setValidation(dynamicSteps.disks, 'disk_devices', {
248
+ fieldMessage: localization.value.common.diskIsRequired,
249
+ alertMessage: localization.value.common.diskIsRequired,
250
+ })
251
+ showValidationErrors([localization.value.common.diskIsRequired])
252
+ } else if (wizard.hasMessage(dynamicSteps.disks, 'disk_devices')) {
253
+ value = wizard.removeValidation(dynamicSteps.disks, 'disk_devices', value)
254
+ onRemoveValidationErrors()
255
+ }
256
+
257
+ return {
258
+ stepHasError,
259
+ newValue: value,
260
+ }
261
+ }
262
+
263
+ const checkDatastore = (value: UI_I_WizardStep[]): UI_I_ValidationReturn => {
264
+ let stepHasError = false
265
+
266
+ const isValidStorage = !!model.value?.backup_storage.length
267
+ if (!isValidStorage) {
268
+ stepHasError = wizard.setValidation(
269
+ dynamicSteps.datastores,
270
+ 'backup_storage',
271
+ {
272
+ fieldMessage: localization.value.common.datastoreIsRequired,
273
+ alertMessage: localization.value.common.datastoreIsRequired,
274
+ }
275
+ )
276
+ showValidationErrors([localization.value.common.datastoreIsRequired])
277
+ } else if (wizard.hasMessage(dynamicSteps.datastores, 'backup_storage')) {
278
+ value = wizard.removeValidation(
279
+ dynamicSteps.datastores,
280
+ 'backup_storage',
281
+ value
282
+ )
283
+ onRemoveValidationErrors()
284
+ }
285
+
286
+ return {
287
+ stepHasError,
288
+ newValue: value,
289
+ }
290
+ }
291
+
292
+ const selectedDatastoresNames = ref<string[]>([])
293
+ const onChangeDatastore = (names: string[]): void => {
294
+ selectedDatastoresNames.value = names
295
+ }
296
+
297
+ const strategyOptions = ref<UI_I_SelectInputItem[]>(
298
+ strategyOptionsFunc(localization.value)
299
+ )
300
+
301
+ const readyToCompleteInfo = computed<UI_I_TableInfoItem[]>(() => {
302
+ // General
303
+ const result = [
304
+ {
305
+ label: localization.value.common.name,
306
+ value: model.value.name,
307
+ },
308
+ {
309
+ label: localization.value.common.description,
310
+ value: model.value.description,
311
+ },
312
+ ]
313
+
314
+ // Disks
315
+ model.value.disk_devices.forEach((disk_device, i) => {
316
+ result.push({
317
+ label: `${localization.value.common.disk} ${i + 1}`,
318
+ value: disk_device.location,
319
+ })
320
+ })
321
+
322
+ // Datastores
323
+ result.push({
324
+ label: localization.value.common.datastore,
325
+ value: selectedDatastoresNames.value.join(', '),
326
+ })
327
+
328
+ // Configuration
329
+ result.push({
330
+ label: localization.value.common.strategy,
331
+ value:
332
+ strategyOptions.value.find(
333
+ (option) => option.value === model.value.strategy
334
+ )?.label || '',
335
+ })
336
+ // result.push({
337
+ // label: localization.value.common.backupWindow,
338
+ // value: model.value.start_window_min + '',
339
+ // })
340
+
341
+ const gbSizeByB = 1_073_741_824
342
+ const maxBandwidth =
343
+ model.value.bandwidth_limit >= gbSizeByB
344
+ ? $binary.bToGb(model.value.bandwidth_limit) + ' Gbps'
345
+ : $binary.bToMb(model.value.bandwidth_limit) + ' Mbps'
346
+
347
+ result.push({
348
+ label: localization.value.common.maxBandwidth,
349
+ value: maxBandwidth,
350
+ })
351
+
352
+ return result
353
+ })
354
+
355
+ const errors = ref<string[]>([])
356
+ const showValidationErrors = (data: string[]): void => {
357
+ errors.value = data
358
+ }
359
+ const onRemoveValidationErrors = (): void => {
360
+ errors.value = []
361
+ }
362
+
363
+ const onFinish = (): void => {
364
+ emits('finish')
365
+ }
366
+ const onHideModal = (): void => {
367
+ emits('hide')
368
+ }
369
+ </script>
370
+
371
+ <style scoped lang="scss">
372
+ :deep(.modal-body) {
373
+ display: flex;
374
+ flex-direction: column;
375
+ }
376
+ </style>