bfg-common 1.5.424 → 1.5.425

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 (137) 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 +2 -1
  7. package/assets/localization/local_en.json +2 -1
  8. package/assets/localization/local_hy.json +2 -1
  9. package/assets/localization/local_kk.json +2 -1
  10. package/assets/localization/local_ru.json +2 -1
  11. package/assets/localization/local_zh.json +2 -1
  12. package/components/atoms/TheIcon3.vue +50 -50
  13. package/components/atoms/collapse/CollapseNav.vue +170 -170
  14. package/components/atoms/perPage/PerPage.vue +58 -58
  15. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  16. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  17. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  18. package/components/common/context/lib/models/interfaces.ts +33 -33
  19. package/components/common/diagramMain/modals/lib/config/networkModal.ts +398 -398
  20. package/components/common/diagramMain/modals/lib/config/portModal.ts +251 -251
  21. package/components/common/diagramMain/modals/lib/config/vCenterModal.ts +48 -48
  22. package/components/common/diagramMain/port/Port.vue +580 -580
  23. package/components/common/layout/theHeader/helpMenu/About.vue +82 -82
  24. package/components/common/pages/backups/Backups.vue +102 -102
  25. package/components/common/pages/backups/DetailView.vue +52 -52
  26. package/components/common/pages/backups/lib/models/interfaces.ts +36 -36
  27. package/components/common/pages/backups/modals/Modals.vue +231 -231
  28. package/components/common/pages/backups/modals/createBackup/CreateBackup.vue +376 -376
  29. package/components/common/pages/backups/modals/createBackup/configuration/Configuration.vue +29 -29
  30. package/components/common/pages/backups/modals/createBackup/configuration/backupWindow/BackupWindow.vue +26 -26
  31. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/MaxBandwidth.vue +66 -66
  32. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/config/options.ts +6 -6
  33. package/components/common/pages/backups/modals/createBackup/configuration/strategy/Strategy.vue +35 -35
  34. package/components/common/pages/backups/modals/createBackup/datastores/Datastores.vue +59 -59
  35. package/components/common/pages/backups/modals/createBackup/datastores/tableView/TableView.vue +95 -95
  36. package/components/common/pages/backups/modals/createBackup/datastores/tableView/lib/config/table.ts +119 -119
  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 -135
  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 -186
  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/tools/Actions.vue +207 -207
  68. package/components/common/treeView/TreeView.vue +52 -52
  69. package/components/common/vm/actions/add/folderTreeView/FolderTreeView.vue +72 -72
  70. package/components/common/vm/actions/add/folderTreeView/New.vue +40 -40
  71. package/components/common/vm/actions/clone/lib/config/steps.ts +291 -291
  72. package/components/common/vm/actions/clone/toTemplate/ToTemplate.vue +2 -2
  73. package/components/common/vm/actions/clone/toTemplate/lib/config/steps.ts +4 -2
  74. package/components/common/vm/actions/clone/toTemplate/lib/models/interfaces.ts +1 -1
  75. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/Media.vue +25 -25
  76. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaNew.vue +78 -78
  77. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cdDvdDrive/media/MediaOld.vue +50 -50
  78. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  79. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  80. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/Location.vue +154 -154
  81. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/LocationOld.vue +85 -85
  82. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/maximumSize/MaximumSize.vue +23 -23
  83. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  84. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoNew.vue +66 -66
  85. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/directPathIo/DirectPathIoOld.vue +62 -62
  86. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  87. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIoOld.vue +76 -76
  88. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/Note.vue +15 -15
  89. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteNew.vue +42 -42
  90. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/note/NoteOld.vue +30 -30
  91. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/nvidiaGrid/NvidiaGridOld.vue +84 -84
  92. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  93. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/numberDisplays/NumberDisplays.vue +53 -53
  94. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +32 -32
  95. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +60 -60
  96. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +174 -174
  97. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  98. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/KeymapOld.vue +44 -44
  99. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  100. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  101. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirectionOld.vue +44 -44
  102. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  103. package/components/common/vm/actions/common/select/computeResource/ComputeResource.vue +143 -143
  104. package/components/common/vm/actions/common/select/computeResource/New.vue +184 -184
  105. package/components/common/vm/actions/common/select/computeResource/treeView/TreeView.vue +131 -131
  106. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -38
  107. package/components/common/vm/actions/common/select/createType/lib/config/items.ts +48 -48
  108. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  109. package/components/common/vm/actions/common/select/os/Old.vue +152 -152
  110. package/components/common/vm/actions/common/select/os/Os.vue +139 -139
  111. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  112. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  113. package/components/common/vm/actions/common/select/template/old/Old.vue +50 -50
  114. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  115. package/components/common/vmt/actions/add/New.vue +5 -3
  116. package/components/common/vmt/actions/add/Old.vue +5 -3
  117. package/components/common/vmt/actions/add/lib/config/steps.ts +2 -2
  118. package/components/common/vmt/actions/add/lib/models/interfaces.ts +23 -23
  119. package/components/common/wizards/datastore/add/steps/nameAndConfigure/_serversList/lib/config/tableKeys.ts +2 -2
  120. package/components/common/wizards/datastore/add/steps/nameAndConfigure/_serversList/lib/models/types.ts +1 -1
  121. package/components/common/wizards/datastore/add/steps/typeMode/lib/config/typeOptions.ts +43 -43
  122. package/components/common/wizards/vm/migrate/lib/config/steps.ts +157 -157
  123. package/components/common/wizards/vm/migrate/lib/validations.ts +68 -68
  124. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  125. package/components/common/wizards/vm/migrate/select/type/lib/config/typeOptions.ts +45 -45
  126. package/composables/productNameLocal.ts +30 -30
  127. package/composables/useAppVersion.ts +21 -21
  128. package/package.json +1 -1
  129. package/plugins/date.ts +233 -233
  130. package/plugins/panelStates.ts +70 -70
  131. package/plugins/text.ts +59 -59
  132. package/public/spice-console/lib/images/bitmap.js +203 -203
  133. package/public/spice-console/network/spicechannel.js +390 -390
  134. package/store/main/mutations.ts +7 -7
  135. package/store/main/state.ts +7 -7
  136. package/store/tasks/lib/models/enums.ts +5 -0
  137. package/store/tasks/mappers/recentTasks.ts +14 -3
@@ -1,376 +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
- :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>
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>