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,417 +1,417 @@
1
- <template>
2
- <div class="restore">
3
- <atoms-wizard
4
- show
5
- :wizard="wizard"
6
- :selected-scheme="selectedScheme"
7
- :title="localization.common.restore"
8
- :localization="localization"
9
- test-id="restore"
10
- @change-steps="onChangeSteps"
11
- @hide="onHideModal"
12
- @submit="onRestore"
13
- >
14
- <template #modalBody="{ selectedStep }">
15
- <div
16
- v-show="isLoading"
17
- class="loader-wrap absolute left-0 right-0 top-0 bottom-0"
18
- >
19
- <atoms-loader-pre-loader
20
- id="loader"
21
- :show="isLoading"
22
- class="absolute-center"
23
- test-id="backup-restore-spinner"
24
- />
25
- </div>
26
- <atoms-alert
27
- v-show="errors.length"
28
- :items="errors"
29
- status="alert-danger"
30
- test-id="restore-alert"
31
- @remove="onRemoveValidationErrors"
32
- />
33
-
34
- <common-pages-backups-modals-restore-types
35
- v-show="selectedStep.id === dynamicSteps.selectType"
36
- v-model="model"
37
- />
38
-
39
- <common-pages-backups-modals-restore-name
40
- v-show="selectedStep.id === dynamicSteps.selectName"
41
- v-model="model"
42
- :show="selectedStep.id === dynamicSteps.selectName"
43
- :name-form-submit="nameFormSubmit"
44
- @check-name="onCheckName"
45
- />
46
-
47
- <!-- TODO refactoring-->
48
- <common-vm-actions-common-select-storage
49
- v-show="selectedStep.id === dynamicSteps.selectStorage"
50
- :storage-submit="storageSubmit"
51
- :datastore="props.datastore"
52
- :is-datastore-loading="props.datastoreLoading"
53
- :storage="model.pvm.storage"
54
- :get-datastore-table-func="getDatastoreTableFunc"
55
- @submit="onChangeStorage"
56
- />
57
-
58
- <common-pages-backups-modals-restore-disks
59
- v-show="selectedStep.id === dynamicSteps.selectDisks"
60
- v-model="model"
61
- />
62
- <common-pages-backups-modals-restore-networks
63
- v-if="selectedStep.id === dynamicSteps.selectNetwork"
64
- v-model="model"
65
- :alert-messages="[]"
66
- :networks="props.networks"
67
- @get-networks="onGetNetworks"
68
- />
69
-
70
- <common-ready-to-complete
71
- v-show="selectedStep.id === dynamicSteps.readyComplete"
72
- :data="readyToCompleteInfo"
73
- />
74
- </template>
75
- </atoms-wizard>
76
- </div>
77
-
78
- <common-modals-confirmation
79
- v-if="isShowConfirm"
80
- :headline="localization.common.attention"
81
- :description="localization.common.restoreBackupConfirmDescription"
82
- @hide-modal="isShowConfirm = false"
83
- @confirm="onFinish"
84
- />
85
- </template>
86
-
87
- <script setup lang="ts">
88
- import type { UI_I_Localization } from '~/lib/models/interfaces'
89
- import type {
90
- UI_I_WizardStep,
91
- UI_I_ValidationReturn,
92
- } from '~/components/atoms/wizard/lib/models/interfaces'
93
- import Wizard from '~/components/atoms/wizard/lib/utils/utils'
94
- import type { UI_I_DatastoreTableItem } from '~/lib/models/store/storage/interfaces'
95
- import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
96
- import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
97
- import type { UI_I_NameCheck } from '~/components/common/pages/backups/modals/restore/name/lib/models/interfaces'
98
- import type { UI_I_RestoreForm } from '~/components/common/pages/backups/modals/lib/models/interfaces'
99
- import {
100
- stepsSchemeInitial,
101
- stepsFunc,
102
- dynamicSteps,
103
- } from '~/components/common/pages/backups/modals/restore/lib/config/steps'
104
- import { restoreCodes } from '~/components/common/pages/backups/modals/restore/lib/config/restoreCodes'
105
-
106
- const model = defineModel<UI_I_RestoreForm>({ required: true })
107
-
108
- const props = defineProps<{
109
- datastore: UI_I_DatastoreTableItem[]
110
- datastoreLoading: boolean
111
- networks: UI_I_NetworkTableItem[]
112
- }>()
113
- const emits = defineEmits<{
114
- (event: 'get-datastore', value: string): void
115
- (event: 'get-networks', value: string): void
116
- (event: 'check-name', value: UI_I_NameCheck): void
117
- (event: 'finish'): void
118
- (event: 'hide'): void
119
- }>()
120
-
121
- const { $store }: any = useNuxtApp()
122
-
123
- const localization = computed<UI_I_Localization>(() => useLocal())
124
-
125
- const wizard: Wizard = new Wizard(
126
- stepsFunc(localization.value),
127
- stepsSchemeInitial
128
- )
129
-
130
- watch(
131
- () => model.value.restore_code,
132
- (newValue) => {
133
- wizard.changeScheme(newValue - 1)
134
- },
135
- { immediate: true }
136
- )
137
- const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
138
- const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
139
- wizard.changeSteps(value, validationFunc)
140
- }
141
-
142
- const nameFormSubmit = ref<null | Function>(null)
143
- const storageSubmit = ref<null | Function>(null)
144
-
145
- const validationFunc = async (
146
- value: UI_I_WizardStep[],
147
- currentStep: UI_I_WizardStep,
148
- nextStep: UI_I_WizardStep
149
- ): Promise<UI_I_ValidationReturn> => {
150
- let stepHasError = false
151
- const stepShouldStop = {
152
- ifOnCurrentStep: false,
153
- ifFromAnyStep: false,
154
- stoppageStepId: -1,
155
- }
156
-
157
- wizard.setLoader(true)
158
-
159
- if (
160
- wizard.isValidateForStep(
161
- dynamicSteps.selectName,
162
- currentStep.id,
163
- nextStep.id
164
- )
165
- ) {
166
- const nameValidation = await checkName(value)
167
-
168
- value = nameValidation.newValue
169
- stepHasError = stepHasError || nameValidation.stepHasError
170
- }
171
-
172
- if (
173
- wizard.isValidateForStep(
174
- dynamicSteps.selectStorage,
175
- currentStep.id,
176
- nextStep.id
177
- )
178
- ) {
179
- const validation = await checkStorage(value)
180
-
181
- value = validation.newValue
182
- stepHasError = stepHasError || validation.stepHasError
183
- }
184
-
185
- if (
186
- wizard.isValidateForStep(
187
- dynamicSteps.selectDisks,
188
- currentStep.id,
189
- nextStep.id
190
- )
191
- ) {
192
- const validation = checkDisks(value)
193
-
194
- value = validation.newValue
195
- stepHasError = stepHasError || validation.stepHasError
196
- }
197
-
198
- wizard.setLoader(false)
199
-
200
- return {
201
- newValue: value,
202
- stepHasError,
203
- stepShouldStop,
204
- }
205
- }
206
-
207
- const checkName = async (
208
- value: UI_I_WizardStep[]
209
- ): Promise<UI_I_ValidationReturn> => {
210
- let stepHasError = false
211
-
212
- return new Promise((resolve) => {
213
- nameFormSubmit.value = (isValid: boolean): void => {
214
- if (!isValid) {
215
- stepHasError = wizard.setValidation(dynamicSteps.selectName, 'name', {
216
- fieldMessage: 'aaa',
217
- alertMessage: 'aaa',
218
- })
219
- } else if (wizard.hasMessage(dynamicSteps.selectName, 'name')) {
220
- value = wizard.removeValidation(dynamicSteps.selectName, 'name', value)
221
- }
222
-
223
- resolve({
224
- stepHasError,
225
- newValue: value,
226
- })
227
- nameFormSubmit.value = null
228
- }
229
- })
230
- }
231
-
232
- const checkStorage = async (
233
- value: UI_I_WizardStep[]
234
- ): Promise<UI_I_ValidationReturn> => {
235
- let stepHasError = false
236
-
237
- return new Promise((resolve) => {
238
- storageSubmit.value = (isValid: boolean): void => {
239
- if (!isValid) {
240
- stepHasError = wizard.setValidation(
241
- dynamicSteps.selectStorage,
242
- 'storage',
243
- {
244
- fieldMessage: 'aaa',
245
- alertMessage: 'aaa',
246
- }
247
- )
248
- } else if (wizard.hasMessage(dynamicSteps.selectStorage, 'storage')) {
249
- value = wizard.removeValidation(
250
- dynamicSteps.selectStorage,
251
- 'storage',
252
- value
253
- )
254
- }
255
-
256
- resolve({
257
- stepHasError,
258
- newValue: value,
259
- })
260
- storageSubmit.value = null
261
- }
262
- })
263
- }
264
-
265
- const checkDisks = (value: UI_I_WizardStep[]): UI_I_ValidationReturn => {
266
- let stepHasError = false
267
-
268
- const isValidStores = !!model.value?.pvm.disk_devices.length
269
- if (!isValidStores) {
270
- stepHasError = wizard.setValidation(
271
- dynamicSteps.selectDisks,
272
- 'disk_devices',
273
- {
274
- fieldMessage: localization.value.common.diskIsRequired,
275
- alertMessage: localization.value.common.diskIsRequired,
276
- }
277
- )
278
- showValidationErrors([localization.value.common.diskIsRequired])
279
- } else if (wizard.hasMessage(dynamicSteps.selectDisks, 'disk_devices')) {
280
- value = wizard.removeValidation(
281
- dynamicSteps.selectDisks,
282
- 'disk_devices',
283
- value
284
- )
285
- onRemoveValidationErrors()
286
- }
287
-
288
- return {
289
- stepHasError,
290
- newValue: value,
291
- }
292
- }
293
-
294
- const getDatastoreTableFunc = async (): Promise<void> => {
295
- emits('get-datastore', model.value.bucket)
296
- }
297
-
298
- const selectedStorageName = ref<string>('')
299
- const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
300
- if (!storage) return
301
- selectedStorageName.value = storage.name
302
- model.value.pvm.storage = {
303
- id: storage.id,
304
- folder: '',
305
- }
306
- }
307
-
308
- const onCheckName = async (data: UI_I_NameCheck): Promise<void> => {
309
- emits('check-name', data)
310
- }
311
-
312
- const isLoading = ref<boolean>(true)
313
- // В Сфере и Прокураторе одно и тоже
314
- const getPvm = async (): Promise<void> => {
315
- await $store.dispatch('backup/A_GET_PVM', {
316
- target: model.value.backup_storage,
317
- bucketId: model.value.bucket, // TODO bucket поменять на vm так как это сейчас vm
318
- backupId: model.value.backup,
319
- })
320
-
321
- model.value.pvm = useDeepCopy($store.getters['backup/getPvm'])
322
- isLoading.value = false
323
- }
324
- getPvm()
325
-
326
- const readyToCompleteInfo = computed<UI_I_TableInfoItem[]>(() => {
327
- const result = []
328
-
329
- switch (model.value.restore_code) {
330
- case restoreCodes.diskOnly:
331
- case restoreCodes.existing:
332
- result.push({
333
- label: localization.value.common.backup,
334
- value: model.value.backup,
335
- })
336
- break
337
- case restoreCodes.asNew:
338
- result.push({
339
- label: localization.value.common.vmName,
340
- value: model.value.pvm.name,
341
- })
342
-
343
- // Datastores
344
- result.push({
345
- label: localization.value.common.datastore,
346
- value: selectedStorageName.value,
347
- })
348
-
349
- // Disks
350
- model.value.pvm.disk_devices.forEach((disk_device, i) => {
351
- if (!disk_device.source) return
352
-
353
- result.push({
354
- label: `${localization.value.common.disk} ${i}`,
355
- value: disk_device.source,
356
- })
357
- })
358
-
359
- // Networks
360
- model.value.pvm.network_devices.forEach((network) => {
361
- result.push({
362
- label: localization.value.common.network,
363
- value: network.network,
364
- })
365
- })
366
- break
367
- // case 1:
368
- // result.push({
369
- // label: localization.value.common.vmName,
370
- // value: model.value.pvm.name,
371
- // })
372
- // break
373
- }
374
-
375
- return result
376
- })
377
-
378
- const errors = ref<string[]>([])
379
- const showValidationErrors = (data: string[]): void => {
380
- errors.value = data
381
- }
382
- const onRemoveValidationErrors = (): void => {
383
- errors.value = []
384
- }
385
-
386
- const onFinish = (): void => {
387
- emits('finish')
388
- }
389
- const onHideModal = (): void => {
390
- emits('hide')
391
- }
392
-
393
- const onRestore = (): void => {
394
- if (model.value.restore_code === restoreCodes.existing) {
395
- isShowConfirm.value = true
396
- } else {
397
- onFinish()
398
- }
399
- }
400
-
401
- const isShowConfirm = ref<boolean>(false)
402
-
403
- const onGetNetworks = (hostId: string): void => {
404
- emits('get-networks', hostId)
405
- }
406
- </script>
407
-
408
- <style scoped lang="scss">
409
- :deep(.modal-body) {
410
- display: flex;
411
- flex-direction: column;
412
- }
413
- .loader-wrap {
414
- background-color: rgba(0, 0, 0, 0.3);
415
- z-index: var(--z-fixed);
416
- }
417
- </style>
1
+ <template>
2
+ <div class="restore">
3
+ <atoms-wizard
4
+ show
5
+ :wizard="wizard"
6
+ :selected-scheme="selectedScheme"
7
+ :title="localization.common.restore"
8
+ :localization="localization"
9
+ test-id="restore"
10
+ @change-steps="onChangeSteps"
11
+ @hide="onHideModal"
12
+ @submit="onRestore"
13
+ >
14
+ <template #modalBody="{ selectedStep }">
15
+ <div
16
+ v-show="isLoading"
17
+ class="loader-wrap absolute left-0 right-0 top-0 bottom-0"
18
+ >
19
+ <atoms-loader-pre-loader
20
+ id="loader"
21
+ :show="isLoading"
22
+ class="absolute-center"
23
+ test-id="backup-restore-spinner"
24
+ />
25
+ </div>
26
+ <atoms-alert
27
+ v-show="errors.length"
28
+ :items="errors"
29
+ status="alert-danger"
30
+ test-id="restore-alert"
31
+ @remove="onRemoveValidationErrors"
32
+ />
33
+
34
+ <common-pages-backups-modals-restore-types
35
+ v-show="selectedStep.id === dynamicSteps.selectType"
36
+ v-model="model"
37
+ />
38
+
39
+ <common-pages-backups-modals-restore-name
40
+ v-show="selectedStep.id === dynamicSteps.selectName"
41
+ v-model="model"
42
+ :show="selectedStep.id === dynamicSteps.selectName"
43
+ :name-form-submit="nameFormSubmit"
44
+ @check-name="onCheckName"
45
+ />
46
+
47
+ <!-- TODO refactoring-->
48
+ <common-vm-actions-common-select-storage
49
+ v-show="selectedStep.id === dynamicSteps.selectStorage"
50
+ :storage-submit="storageSubmit"
51
+ :datastore="props.datastore"
52
+ :is-datastore-loading="props.datastoreLoading"
53
+ :storage="model.pvm.storage"
54
+ :get-datastore-table-func="getDatastoreTableFunc"
55
+ @submit="onChangeStorage"
56
+ />
57
+
58
+ <common-pages-backups-modals-restore-disks
59
+ v-show="selectedStep.id === dynamicSteps.selectDisks"
60
+ v-model="model"
61
+ />
62
+ <common-pages-backups-modals-restore-networks
63
+ v-if="selectedStep.id === dynamicSteps.selectNetwork"
64
+ v-model="model"
65
+ :alert-messages="[]"
66
+ :networks="props.networks"
67
+ @get-networks="onGetNetworks"
68
+ />
69
+
70
+ <common-ready-to-complete
71
+ v-show="selectedStep.id === dynamicSteps.readyComplete"
72
+ :data="readyToCompleteInfo"
73
+ />
74
+ </template>
75
+ </atoms-wizard>
76
+ </div>
77
+
78
+ <common-modals-confirmation
79
+ v-if="isShowConfirm"
80
+ :headline="localization.common.attention"
81
+ :description="localization.common.restoreBackupConfirmDescription"
82
+ @hide-modal="isShowConfirm = false"
83
+ @confirm="onFinish"
84
+ />
85
+ </template>
86
+
87
+ <script setup lang="ts">
88
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
89
+ import type {
90
+ UI_I_WizardStep,
91
+ UI_I_ValidationReturn,
92
+ } from '~/components/atoms/wizard/lib/models/interfaces'
93
+ import Wizard from '~/components/atoms/wizard/lib/utils/utils'
94
+ import type { UI_I_DatastoreTableItem } from '~/lib/models/store/storage/interfaces'
95
+ import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
96
+ import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
97
+ import type { UI_I_NameCheck } from '~/components/common/pages/backups/modals/restore/name/lib/models/interfaces'
98
+ import type { UI_I_RestoreForm } from '~/components/common/pages/backups/modals/lib/models/interfaces'
99
+ import {
100
+ stepsSchemeInitial,
101
+ stepsFunc,
102
+ dynamicSteps,
103
+ } from '~/components/common/pages/backups/modals/restore/lib/config/steps'
104
+ import { restoreCodes } from '~/components/common/pages/backups/modals/restore/lib/config/restoreCodes'
105
+
106
+ const model = defineModel<UI_I_RestoreForm>({ required: true })
107
+
108
+ const props = defineProps<{
109
+ datastore: UI_I_DatastoreTableItem[]
110
+ datastoreLoading: boolean
111
+ networks: UI_I_NetworkTableItem[]
112
+ }>()
113
+ const emits = defineEmits<{
114
+ (event: 'get-datastore', value: string): void
115
+ (event: 'get-networks', value: string): void
116
+ (event: 'check-name', value: UI_I_NameCheck): void
117
+ (event: 'finish'): void
118
+ (event: 'hide'): void
119
+ }>()
120
+
121
+ const { $store }: any = useNuxtApp()
122
+
123
+ const localization = computed<UI_I_Localization>(() => useLocal())
124
+
125
+ const wizard: Wizard = new Wizard(
126
+ stepsFunc(localization.value),
127
+ stepsSchemeInitial
128
+ )
129
+
130
+ watch(
131
+ () => model.value.restore_code,
132
+ (newValue) => {
133
+ wizard.changeScheme(newValue - 1)
134
+ },
135
+ { immediate: true }
136
+ )
137
+ const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
138
+ const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
139
+ wizard.changeSteps(value, validationFunc)
140
+ }
141
+
142
+ const nameFormSubmit = ref<null | Function>(null)
143
+ const storageSubmit = ref<null | Function>(null)
144
+
145
+ const validationFunc = async (
146
+ value: UI_I_WizardStep[],
147
+ currentStep: UI_I_WizardStep,
148
+ nextStep: UI_I_WizardStep
149
+ ): Promise<UI_I_ValidationReturn> => {
150
+ let stepHasError = false
151
+ const stepShouldStop = {
152
+ ifOnCurrentStep: false,
153
+ ifFromAnyStep: false,
154
+ stoppageStepId: -1,
155
+ }
156
+
157
+ wizard.setLoader(true)
158
+
159
+ if (
160
+ wizard.isValidateForStep(
161
+ dynamicSteps.selectName,
162
+ currentStep.id,
163
+ nextStep.id
164
+ )
165
+ ) {
166
+ const nameValidation = await checkName(value)
167
+
168
+ value = nameValidation.newValue
169
+ stepHasError = stepHasError || nameValidation.stepHasError
170
+ }
171
+
172
+ if (
173
+ wizard.isValidateForStep(
174
+ dynamicSteps.selectStorage,
175
+ currentStep.id,
176
+ nextStep.id
177
+ )
178
+ ) {
179
+ const validation = await checkStorage(value)
180
+
181
+ value = validation.newValue
182
+ stepHasError = stepHasError || validation.stepHasError
183
+ }
184
+
185
+ if (
186
+ wizard.isValidateForStep(
187
+ dynamicSteps.selectDisks,
188
+ currentStep.id,
189
+ nextStep.id
190
+ )
191
+ ) {
192
+ const validation = checkDisks(value)
193
+
194
+ value = validation.newValue
195
+ stepHasError = stepHasError || validation.stepHasError
196
+ }
197
+
198
+ wizard.setLoader(false)
199
+
200
+ return {
201
+ newValue: value,
202
+ stepHasError,
203
+ stepShouldStop,
204
+ }
205
+ }
206
+
207
+ const checkName = async (
208
+ value: UI_I_WizardStep[]
209
+ ): Promise<UI_I_ValidationReturn> => {
210
+ let stepHasError = false
211
+
212
+ return new Promise((resolve) => {
213
+ nameFormSubmit.value = (isValid: boolean): void => {
214
+ if (!isValid) {
215
+ stepHasError = wizard.setValidation(dynamicSteps.selectName, 'name', {
216
+ fieldMessage: 'aaa',
217
+ alertMessage: 'aaa',
218
+ })
219
+ } else if (wizard.hasMessage(dynamicSteps.selectName, 'name')) {
220
+ value = wizard.removeValidation(dynamicSteps.selectName, 'name', value)
221
+ }
222
+
223
+ resolve({
224
+ stepHasError,
225
+ newValue: value,
226
+ })
227
+ nameFormSubmit.value = null
228
+ }
229
+ })
230
+ }
231
+
232
+ const checkStorage = async (
233
+ value: UI_I_WizardStep[]
234
+ ): Promise<UI_I_ValidationReturn> => {
235
+ let stepHasError = false
236
+
237
+ return new Promise((resolve) => {
238
+ storageSubmit.value = (isValid: boolean): void => {
239
+ if (!isValid) {
240
+ stepHasError = wizard.setValidation(
241
+ dynamicSteps.selectStorage,
242
+ 'storage',
243
+ {
244
+ fieldMessage: 'aaa',
245
+ alertMessage: 'aaa',
246
+ }
247
+ )
248
+ } else if (wizard.hasMessage(dynamicSteps.selectStorage, 'storage')) {
249
+ value = wizard.removeValidation(
250
+ dynamicSteps.selectStorage,
251
+ 'storage',
252
+ value
253
+ )
254
+ }
255
+
256
+ resolve({
257
+ stepHasError,
258
+ newValue: value,
259
+ })
260
+ storageSubmit.value = null
261
+ }
262
+ })
263
+ }
264
+
265
+ const checkDisks = (value: UI_I_WizardStep[]): UI_I_ValidationReturn => {
266
+ let stepHasError = false
267
+
268
+ const isValidStores = !!model.value?.pvm.disk_devices.length
269
+ if (!isValidStores) {
270
+ stepHasError = wizard.setValidation(
271
+ dynamicSteps.selectDisks,
272
+ 'disk_devices',
273
+ {
274
+ fieldMessage: localization.value.common.diskIsRequired,
275
+ alertMessage: localization.value.common.diskIsRequired,
276
+ }
277
+ )
278
+ showValidationErrors([localization.value.common.diskIsRequired])
279
+ } else if (wizard.hasMessage(dynamicSteps.selectDisks, 'disk_devices')) {
280
+ value = wizard.removeValidation(
281
+ dynamicSteps.selectDisks,
282
+ 'disk_devices',
283
+ value
284
+ )
285
+ onRemoveValidationErrors()
286
+ }
287
+
288
+ return {
289
+ stepHasError,
290
+ newValue: value,
291
+ }
292
+ }
293
+
294
+ const getDatastoreTableFunc = async (): Promise<void> => {
295
+ emits('get-datastore', model.value.bucket)
296
+ }
297
+
298
+ const selectedStorageName = ref<string>('')
299
+ const onChangeStorage = (storage: UI_I_DatastoreTableItem | null): void => {
300
+ if (!storage) return
301
+ selectedStorageName.value = storage.name
302
+ model.value.pvm.storage = {
303
+ id: storage.id,
304
+ folder: '',
305
+ }
306
+ }
307
+
308
+ const onCheckName = async (data: UI_I_NameCheck): Promise<void> => {
309
+ emits('check-name', data)
310
+ }
311
+
312
+ const isLoading = ref<boolean>(true)
313
+ // В Сфере и Прокураторе одно и тоже
314
+ const getPvm = async (): Promise<void> => {
315
+ await $store.dispatch('backup/A_GET_PVM', {
316
+ target: model.value.backup_storage,
317
+ bucketId: model.value.bucket, // TODO bucket поменять на vm так как это сейчас vm
318
+ backupId: model.value.backup,
319
+ })
320
+
321
+ model.value.pvm = useDeepCopy($store.getters['backup/getPvm'])
322
+ isLoading.value = false
323
+ }
324
+ getPvm()
325
+
326
+ const readyToCompleteInfo = computed<UI_I_TableInfoItem[]>(() => {
327
+ const result = []
328
+
329
+ switch (model.value.restore_code) {
330
+ case restoreCodes.diskOnly:
331
+ case restoreCodes.existing:
332
+ result.push({
333
+ label: localization.value.common.backup,
334
+ value: model.value.backup,
335
+ })
336
+ break
337
+ case restoreCodes.asNew:
338
+ result.push({
339
+ label: localization.value.common.vmName,
340
+ value: model.value.pvm.name,
341
+ })
342
+
343
+ // Datastores
344
+ result.push({
345
+ label: localization.value.common.datastore,
346
+ value: selectedStorageName.value,
347
+ })
348
+
349
+ // Disks
350
+ model.value.pvm.disk_devices.forEach((disk_device, i) => {
351
+ if (!disk_device.source) return
352
+
353
+ result.push({
354
+ label: `${localization.value.common.disk} ${i}`,
355
+ value: disk_device.source,
356
+ })
357
+ })
358
+
359
+ // Networks
360
+ model.value.pvm.network_devices.forEach((network) => {
361
+ result.push({
362
+ label: localization.value.common.network,
363
+ value: network.network,
364
+ })
365
+ })
366
+ break
367
+ // case 1:
368
+ // result.push({
369
+ // label: localization.value.common.vmName,
370
+ // value: model.value.pvm.name,
371
+ // })
372
+ // break
373
+ }
374
+
375
+ return result
376
+ })
377
+
378
+ const errors = ref<string[]>([])
379
+ const showValidationErrors = (data: string[]): void => {
380
+ errors.value = data
381
+ }
382
+ const onRemoveValidationErrors = (): void => {
383
+ errors.value = []
384
+ }
385
+
386
+ const onFinish = (): void => {
387
+ emits('finish')
388
+ }
389
+ const onHideModal = (): void => {
390
+ emits('hide')
391
+ }
392
+
393
+ const onRestore = (): void => {
394
+ if (model.value.restore_code === restoreCodes.existing) {
395
+ isShowConfirm.value = true
396
+ } else {
397
+ onFinish()
398
+ }
399
+ }
400
+
401
+ const isShowConfirm = ref<boolean>(false)
402
+
403
+ const onGetNetworks = (hostId: string): void => {
404
+ emits('get-networks', hostId)
405
+ }
406
+ </script>
407
+
408
+ <style scoped lang="scss">
409
+ :deep(.modal-body) {
410
+ display: flex;
411
+ flex-direction: column;
412
+ }
413
+ .loader-wrap {
414
+ background-color: rgba(0, 0, 0, 0.3);
415
+ z-index: var(--z-fixed);
416
+ }
417
+ </style>