bfg-common 1.5.537 → 1.5.538

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 (124) 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 +1 -1
  7. package/assets/localization/local_en.json +1 -1
  8. package/assets/localization/local_hy.json +1 -1
  9. package/assets/localization/local_kk.json +1 -1
  10. package/assets/localization/local_ru.json +1 -1
  11. package/assets/localization/local_zh.json +1 -1
  12. package/assets/scss/clarity/local_ar.json +1 -1
  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/DataGrid.vue +1718 -1718
  17. package/components/atoms/table/dataGrid/DataGridPagination.vue +97 -97
  18. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  19. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  20. package/components/common/backup/storage/actions/add/Add.vue +251 -251
  21. package/components/common/backup/storage/actions/add/lib/utils.ts +51 -51
  22. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  23. package/components/common/browse/blocks/lib/models/types.ts +1 -1
  24. package/components/common/browse/lib/models/interfaces.ts +5 -5
  25. package/components/common/diagramMain/network/Contents.vue +497 -497
  26. package/components/common/layout/theHeader/helpMenu/About.vue +79 -79
  27. package/components/common/layout/theHeader/helpMenu/aboutOld/AboutOld.vue +79 -79
  28. package/components/common/pages/backups/DetailView.vue +52 -52
  29. package/components/common/pages/backups/lib/models/interfaces.ts +36 -36
  30. package/components/common/pages/backups/modals/Modals.vue +243 -243
  31. package/components/common/pages/backups/modals/createBackup/CreateBackup.vue +195 -195
  32. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/config/options.ts +6 -6
  33. package/components/common/pages/backups/modals/createBackup/lib/config/readyToCompleteOptions.ts +69 -69
  34. package/components/common/pages/backups/modals/lib/config/restore.ts +115 -115
  35. package/components/common/pages/backups/modals/lib/models/interfaces.ts +186 -186
  36. package/components/common/pages/backups/modals/restore/disks/Disks.vue +27 -27
  37. package/components/common/pages/backups/modals/restore/disks/tableView/lib/config/table.ts +117 -117
  38. package/components/common/pages/backups/modals/restore/name/Name.vue +166 -166
  39. package/components/common/pages/backups/modals/restore/name/lib/models/interfaces.ts +6 -6
  40. package/components/common/pages/backups/modals/restore/networks/Networks.vue +70 -70
  41. package/components/common/pages/backups/modals/restore/networks/table/Table.vue +214 -214
  42. package/components/common/pages/backups/modals/restore/types/lib/config/typeOptions.ts +25 -25
  43. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  44. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  45. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  46. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  47. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  48. package/components/common/pages/scheduledTasks/lib/utils/utils.ts +84 -84
  49. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  50. package/components/common/select/radio/RadioGroup.vue +137 -137
  51. package/components/common/spiceConsole/Drawer.vue +420 -420
  52. package/components/common/spiceConsole/SpiceConsole.vue +184 -184
  53. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  54. package/components/common/tools/Actions.vue +207 -207
  55. package/components/common/treeView/TreeView.vue +52 -52
  56. package/components/common/vm/actions/add/Add.vue +949 -949
  57. package/components/common/vm/actions/add/New.vue +689 -689
  58. package/components/common/vm/actions/add/Old.vue +400 -400
  59. package/components/common/vm/actions/add/lib/config/steps.ts +347 -347
  60. package/components/common/vm/actions/clone/Clone.vue +808 -808
  61. package/components/common/vm/actions/clone/new/New.vue +454 -454
  62. package/components/common/vm/actions/clone/old/Old.vue +378 -378
  63. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/Cpu.vue +368 -368
  64. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/Shares.vue +140 -140
  65. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  66. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +427 -427
  67. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/location/Location.vue +154 -154
  68. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newNetwork/macAddress/MacAddress.vue +119 -119
  69. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +31 -31
  70. package/components/common/vm/actions/common/customizeHardware/virtualHardware/other/Other.vue +16 -16
  71. package/components/common/vm/actions/common/customizeHardware/virtualHardware/videoCard/numberDisplays/NumberDisplays.vue +53 -53
  72. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/delay/Delay.vue +32 -32
  73. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/firmware/Firmware.vue +60 -60
  74. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +174 -174
  75. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/keymap/Keymap.vue +32 -32
  76. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/Password.vue +103 -103
  77. package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/usbRedirection/UsbRedirection.vue +28 -28
  78. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  79. package/components/common/vm/actions/common/select/createType/CreateType.vue +38 -38
  80. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  81. package/components/common/vm/actions/common/select/os/Old.vue +152 -152
  82. package/components/common/vm/actions/common/select/os/Os.vue +139 -139
  83. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  84. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  85. package/components/common/vm/actions/common/select/template/old/Old.vue +50 -50
  86. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  87. package/components/common/vm/actions/register/Register.vue +352 -352
  88. package/components/common/vm/actions/register/lib/config/steps.ts +86 -86
  89. package/components/common/wizards/common/steps/computeResource/ComputeResource.vue +85 -85
  90. package/components/common/wizards/common/steps/computeResource/New.vue +92 -92
  91. package/components/common/wizards/common/steps/computeResource/Old.vue +102 -102
  92. package/components/common/wizards/common/steps/computeResource/compatibility/Compatibility.vue +31 -31
  93. package/components/common/wizards/common/steps/computeResource/compatibility/New.vue +98 -98
  94. package/components/common/wizards/common/steps/computeResource/compatibility/Old.vue +54 -54
  95. package/components/common/wizards/common/steps/name/Name.vue +178 -178
  96. package/components/common/wizards/common/steps/name/New.vue +221 -221
  97. package/components/common/wizards/common/steps/name/Old.vue +121 -121
  98. package/components/common/wizards/common/steps/name/lib/models/interfaces.ts +4 -4
  99. package/components/common/wizards/common/steps/name/location/Location.vue +85 -85
  100. package/components/common/wizards/common/steps/name/location/New.vue +40 -40
  101. package/components/common/wizards/datastore/add/Add.vue +228 -228
  102. package/components/common/wizards/datastore/add/lib/utils.ts +85 -85
  103. package/components/common/wizards/datastore/add/steps/typeMode/lib/config/typeOptions.ts +43 -43
  104. package/components/common/wizards/vm/migrate/select/network/Network.vue +103 -103
  105. package/composables/useAppVersion.ts +21 -21
  106. package/composables/useLocal.ts +6 -6
  107. package/composables/useLocalCommon.ts +39 -39
  108. package/package.json +1 -1
  109. package/plugins/console.ts +21 -21
  110. package/plugins/date.ts +233 -233
  111. package/plugins/mouse.ts +21 -21
  112. package/plugins/panelStates.ts +70 -70
  113. package/plugins/text.ts +59 -59
  114. package/public/spice-console/application/clientgui.js +854 -854
  115. package/public/spice-console/application/packetfactory.js +211 -211
  116. package/public/spice-console/application/virtualmouse.js +147 -147
  117. package/public/spice-console/lib/images/bitmap.js +203 -203
  118. package/public/spice-console/network/spicechannel.js +440 -440
  119. package/public/spice-console/process/cursorprocess.js +121 -121
  120. package/public/spice-console/process/inputprocess.js +227 -227
  121. package/public/spice-console/process/mainprocess.js +210 -210
  122. package/public/spice-console/run.js +210 -210
  123. package/store/main/mutations.ts +7 -7
  124. package/store/main/state.ts +7 -7
@@ -1,352 +1,352 @@
1
- <template>
2
- <div class="register-vm">
3
- <atoms-wizard
4
- :wizard="wizard"
5
- :selected-scheme="selectedScheme"
6
- :title="localization.common.registerVm"
7
- :localization="localization"
8
- test-id="register-wizard"
9
- show
10
- @change-steps="onChangeSteps"
11
- @hide="emits('hide')"
12
- @submit="emits('finish')"
13
- >
14
- <template #modalBody="{ selectedStep }">
15
- <!-- <atoms-loader-->
16
- <!-- v-show="props.isLoading"-->
17
- <!-- id="loader"-->
18
- <!-- test-id="edit-vm-settings-spinner"-->
19
- <!-- />-->
20
- <div class="register-vm-content">
21
- <common-wizards-common-steps-name
22
- v-show="
23
- selectedStep.id === dynamicSteps.selectName ||
24
- selectedStep.id === dynamicSteps.selectNameFolder
25
- "
26
- v-model:name="vmForm.name"
27
- v-model:location="location"
28
- :show="
29
- selectedStep.id === dynamicSteps.selectName ||
30
- selectedStep.id === dynamicSteps.selectNameFolder
31
- "
32
- :name-form-submit="nameFormSubmit"
33
- :name-request-url="props.nameRequestUrl"
34
- :validation-description="
35
- localization.common.enterValidLocationVirtualMachine
36
- "
37
- :name-exist-validation-description="
38
- localization.common.vmNameExistInSelectedLocation
39
- "
40
- :test-ids="nameTestIds"
41
- :has-location="props.project === 'sphere'"
42
- :location-nodes="props.locationNodes"
43
- :allowed-location-kinds="allowedLocationKinds"
44
- :location-description="locationDescription"
45
- @submit="onChangeName(...$event)"
46
- />
47
- <common-wizards-common-steps-compute-resource
48
- v-if="isSphere"
49
- v-show="selectedStep.id === dynamicSteps.selectComputeResource"
50
- v-model="vmForm.computeResource"
51
- :node="computeResourceTreeLocal"
52
- :alert-messages="computeResourceAlert"
53
- :is-loading="isLoadingComputeTree"
54
- :compatibility-text="compatibilityText"
55
- />
56
- <common-ready-to-complete
57
- v-if="selectedStep.id === dynamicSteps.readyComplete"
58
- :data="props.readyCompleteTableInfo"
59
- />
60
- </div>
61
- </template>
62
- </atoms-wizard>
63
- </div>
64
- </template>
65
-
66
- <script setup lang="ts">
67
- import type { UI_I_WizardStep } from '~/node_modules/bfg-uikit/components/ui/wizard/lib/models/interfaces'
68
- import type { UI_I_ValidationReturn } from '~/node_modules/bfg-uikit/components/ui/wizard/lib/models/interfaces'
69
- import Wizard from '~/node_modules/bfg-uikit/components/ui/wizard/lib/utils/utils'
70
- import type { UI_I_Localization } from '~/lib/models/interfaces'
71
- import type { UI_T_Project } from '~/lib/models/types'
72
- import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
73
- import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
74
- import type { UI_I_NameTestIds } from '~/components/common/wizards/common/steps/name/lib/models/interfaces'
75
- import {
76
- dynamicSteps,
77
- stepsFunc,
78
- stepsSchemeInitial,
79
- } from '~/components/common/vm/actions/register/lib/config/steps'
80
-
81
- const vmForm = defineModel<any>({ required: true })
82
-
83
- const props = withDefaults(
84
- defineProps<{
85
- project: UI_T_Project
86
- readyCompleteTableInfo: UI_I_TableInfoItem[]
87
- nameRequestUrl: string
88
- isLoadingComputeTree?: boolean // для сферы
89
- computeResourceAlert?: string[] // для сферы
90
- compatibilityText?: [string, string] // для сферы
91
- dataCenter?: UI_I_TreeNode | null // для сферы
92
- computeResourceTree?: UI_I_TreeNode[] // для сферы
93
- locationNodes?: UI_I_TreeNode[] // для сферы
94
- }>(),
95
- {
96
- isLoadingComputeTree: false,
97
- computeResourceAlert: () => [],
98
- compatibilityText: () => [],
99
- dataCenter: null,
100
- computeResourceTree: undefined,
101
- locationNodes: () => [],
102
- }
103
- )
104
-
105
- const emits = defineEmits<{
106
- (event: 'finish'): void
107
- (event: 'hide'): void
108
- (event: 'select-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
109
- (
110
- event: 'get-compute-resource-tree',
111
- value: { id: string | number; cb: () => void }
112
- ): void // для сферы
113
- }>()
114
-
115
- const { $recursion }: any = useNuxtApp()
116
-
117
- const localization = computed<UI_I_Localization>(() => useLocal())
118
- const isSphere = computed<boolean>(() => props.project === 'sphere')
119
-
120
- const location = ref<UI_I_TreeNode | null>(props.dataCenter) // для сферы
121
-
122
- const wizard: Wizard = new Wizard(
123
- stepsFunc(localization.value),
124
- stepsSchemeInitial
125
- )
126
- if (isSphere.value) {
127
- wizard.changeScheme(1)
128
- wizard.selectStepHard(1)
129
- }
130
-
131
- const allowedLocationKinds = [3, 7] // TODO use from config
132
- const locationDescription = computed<string>(
133
- () => localization.value.common.selectLocationVirtualMachine
134
- )
135
-
136
- const nameTestIds: UI_I_NameTestIds = {
137
- name: 'virtual-machine-name',
138
- helpIcon: 'show-vm-name-help-icon',
139
- }
140
-
141
- const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
142
- const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
143
- wizard.changeSteps(value, validationFunc)
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
- let stepShouldStop = {
152
- ifOnCurrentStep: false,
153
- ifFromAnyStep: false,
154
- stoppageStepId: -1,
155
- }
156
-
157
- wizard.setLoader(true)
158
- if (
159
- wizard.isValidateForStep(
160
- isSphere.value ? dynamicSteps.selectNameFolder : dynamicSteps.selectName,
161
- currentStep.id,
162
- nextStep.id
163
- )
164
- ) {
165
- const nameValidation = await onCheckName(value)
166
-
167
- value = nameValidation.newValue
168
- stepHasError = stepHasError || nameValidation.stepHasError
169
- } else if (
170
- isSphere.value &&
171
- wizard.isValidateForStep(
172
- dynamicSteps.selectComputeResource,
173
- currentStep.id,
174
- nextStep.id
175
- )
176
- ) {
177
- const computeResourceValidation = await checkComputeResource(value)
178
-
179
- value = computeResourceValidation.newValue
180
- stepHasError = stepHasError || computeResourceValidation.stepHasError
181
- }
182
- wizard.setLoader(false)
183
-
184
- return {
185
- newValue: value,
186
- stepHasError,
187
- stepShouldStop,
188
- }
189
- }
190
-
191
- const nameFormSubmit = ref<null | Function>(null)
192
- const onCheckName = async (
193
- value: UI_I_WizardStep[]
194
- ): Promise<UI_I_ValidationReturn> => {
195
- let stepHasError = false
196
-
197
- return new Promise((resolve) => {
198
- const step = isSphere.value
199
- ? dynamicSteps.selectNameFolder
200
- : dynamicSteps.selectName
201
- nameFormSubmit.value = (isValid: boolean) => {
202
- if (!isValid) {
203
- stepHasError = wizard.setValidation(step, 'name', {
204
- fieldMessage: 'aaa',
205
- alertMessage: 'aaa',
206
- })
207
- } else if (wizard.hasMessage(step, 'name')) {
208
- value = wizard.removeValidation(step, 'name', value)
209
- }
210
-
211
- resolve({
212
- stepHasError,
213
- newValue: value,
214
- })
215
- nameFormSubmit.value = null
216
- }
217
- })
218
- }
219
- const compatibilityText = computed<[string, string]>(() => {
220
- const { computeResource } = vmForm.value
221
-
222
- if (!computeResource)
223
- return [
224
- 'none',
225
- localization.value.vmWizard.noDestinationComputeResourceSelected,
226
- ]
227
-
228
- let res: [string, string] = [
229
- 'success',
230
- localization.value.common.compatibilityChecksSucceeded,
231
- ]
232
-
233
- if (!['cluster', 'host', 'resource_pool'].includes(computeResource?.type)) {
234
- res = [
235
- 'error',
236
- localization.value.common.selectValidClusterOrHostDestination,
237
- ]
238
- }
239
- if (computeResource?.type === 'cluster') {
240
- const hasHost = !!computeResource.nodes.length
241
- if (!hasHost) {
242
- res = ['error', localization.value.common.clusterNotContainAnyHosts]
243
- }
244
- }
245
-
246
- if (computeResource?.type === 'host') {
247
- if (computeResource.state === 'Error') {
248
- // TODO check Maintenance Mode
249
- res = [
250
- 'error',
251
- localization.value.common.selectedHostDisconnectedMaintenanceMode,
252
- ]
253
- }
254
- }
255
-
256
- return res
257
- })
258
- const computeResourceAlert = ref<string[]>([])
259
- const checkComputeResource = (
260
- value: UI_I_WizardStep[]
261
- ): UI_I_ValidationReturn => {
262
- let stepHasError = false
263
-
264
- const { computeResource } = vmForm.value
265
-
266
- if (
267
- !computeResource ||
268
- // compatibilityText.value[0] !== 1 ||
269
- computeResource.type === 'datacenter' ||
270
- computeResource.type === 'folder' ||
271
- (computeResource.type === 'cluster' && !computeResource.nodes.length)
272
- ) {
273
- computeResourceAlert.value = [
274
- localization.value.common.specifyValidClusterOrHostDestination,
275
- ]
276
- stepHasError = wizard.setValidation(
277
- dynamicSteps.selectComputeResource,
278
- 'computeResource',
279
- {
280
- fieldMessage: 'aaa',
281
- alertMessage: 'aaa',
282
- }
283
- )
284
- } else {
285
- computeResourceAlert.value = []
286
- if (
287
- wizard.hasMessage(dynamicSteps.selectComputeResource, 'computeResource')
288
- ) {
289
- value = wizard.removeValidation(
290
- dynamicSteps.selectComputeResource,
291
- 'computeResource',
292
- value
293
- )
294
- }
295
- }
296
-
297
- return {
298
- stepHasError,
299
- newValue: value,
300
- }
301
- }
302
-
303
- const isLoadingComputeTree = ref<boolean>(false)
304
- const onChangeName = (name: string, node: UI_I_TreeNode | null): void => {
305
- vmForm.value.name = name
306
- if (isSphere.value) {
307
- vmForm.value.locationPath = node.id
308
- vmForm.value.dataCenter = $recursion.findParentByValue(
309
- node,
310
- 'datacenter',
311
- 'type',
312
- 'parent'
313
- )
314
- isLoadingComputeTree.value = true
315
- emits('get-compute-resource-tree', {
316
- id: node.id,
317
- cb: () => {
318
- isLoadingComputeTree.value = false
319
- },
320
- })
321
- }
322
- }
323
-
324
- watch(
325
- () => vmForm.value.computeResource,
326
- (newValue, oldValue) => {
327
- if (newValue && newValue.id !== oldValue?.id) {
328
- onSelectComputeResourceTree(newValue)
329
- }
330
- },
331
- { deep: true }
332
- )
333
- const onSelectComputeResourceTree = (node: UI_I_TreeNode): void => {
334
- emits('select-compute-resource-tree', node)
335
- }
336
-
337
- const computeResourceTreeLocal = computed<UI_I_TreeNode | null>(() => { // для сферы
338
- return props.computeResourceTree?.[0] || null
339
- })
340
- </script>
341
-
342
- <style scoped lang="scss">
343
- :deep(.modal-body) {
344
- display: flex;
345
- flex-direction: column;
346
- }
347
- .register-vm-content {
348
- display: flex;
349
- flex-direction: column;
350
- flex: 1;
351
- }
352
- </style>
1
+ <template>
2
+ <div class="register-vm">
3
+ <atoms-wizard
4
+ :wizard="wizard"
5
+ :selected-scheme="selectedScheme"
6
+ :title="localization.common.registerVm"
7
+ :localization="localization"
8
+ test-id="register-wizard"
9
+ show
10
+ @change-steps="onChangeSteps"
11
+ @hide="emits('hide')"
12
+ @submit="emits('finish')"
13
+ >
14
+ <template #modalBody="{ selectedStep }">
15
+ <!-- <atoms-loader-->
16
+ <!-- v-show="props.isLoading"-->
17
+ <!-- id="loader"-->
18
+ <!-- test-id="edit-vm-settings-spinner"-->
19
+ <!-- />-->
20
+ <div class="register-vm-content">
21
+ <common-wizards-common-steps-name
22
+ v-show="
23
+ selectedStep.id === dynamicSteps.selectName ||
24
+ selectedStep.id === dynamicSteps.selectNameFolder
25
+ "
26
+ v-model:name="vmForm.name"
27
+ v-model:location="location"
28
+ :show="
29
+ selectedStep.id === dynamicSteps.selectName ||
30
+ selectedStep.id === dynamicSteps.selectNameFolder
31
+ "
32
+ :name-form-submit="nameFormSubmit"
33
+ :name-request-url="props.nameRequestUrl"
34
+ :validation-description="
35
+ localization.common.enterValidLocationVirtualMachine
36
+ "
37
+ :name-exist-validation-description="
38
+ localization.common.vmNameExistInSelectedLocation
39
+ "
40
+ :test-ids="nameTestIds"
41
+ :has-location="props.project === 'sphere'"
42
+ :location-nodes="props.locationNodes"
43
+ :allowed-location-kinds="allowedLocationKinds"
44
+ :location-description="locationDescription"
45
+ @submit="onChangeName(...$event)"
46
+ />
47
+ <common-wizards-common-steps-compute-resource
48
+ v-if="isSphere"
49
+ v-show="selectedStep.id === dynamicSteps.selectComputeResource"
50
+ v-model="vmForm.computeResource"
51
+ :node="computeResourceTreeLocal"
52
+ :alert-messages="computeResourceAlert"
53
+ :is-loading="isLoadingComputeTree"
54
+ :compatibility-text="compatibilityText"
55
+ />
56
+ <common-ready-to-complete
57
+ v-if="selectedStep.id === dynamicSteps.readyComplete"
58
+ :data="props.readyCompleteTableInfo"
59
+ />
60
+ </div>
61
+ </template>
62
+ </atoms-wizard>
63
+ </div>
64
+ </template>
65
+
66
+ <script setup lang="ts">
67
+ import type { UI_I_WizardStep } from '~/node_modules/bfg-uikit/components/ui/wizard/lib/models/interfaces'
68
+ import type { UI_I_ValidationReturn } from '~/node_modules/bfg-uikit/components/ui/wizard/lib/models/interfaces'
69
+ import Wizard from '~/node_modules/bfg-uikit/components/ui/wizard/lib/utils/utils'
70
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
71
+ import type { UI_T_Project } from '~/lib/models/types'
72
+ import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
73
+ import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
74
+ import type { UI_I_NameTestIds } from '~/components/common/wizards/common/steps/name/lib/models/interfaces'
75
+ import {
76
+ dynamicSteps,
77
+ stepsFunc,
78
+ stepsSchemeInitial,
79
+ } from '~/components/common/vm/actions/register/lib/config/steps'
80
+
81
+ const vmForm = defineModel<any>({ required: true })
82
+
83
+ const props = withDefaults(
84
+ defineProps<{
85
+ project: UI_T_Project
86
+ readyCompleteTableInfo: UI_I_TableInfoItem[]
87
+ nameRequestUrl: string
88
+ isLoadingComputeTree?: boolean // для сферы
89
+ computeResourceAlert?: string[] // для сферы
90
+ compatibilityText?: [string, string] // для сферы
91
+ dataCenter?: UI_I_TreeNode | null // для сферы
92
+ computeResourceTree?: UI_I_TreeNode[] // для сферы
93
+ locationNodes?: UI_I_TreeNode[] // для сферы
94
+ }>(),
95
+ {
96
+ isLoadingComputeTree: false,
97
+ computeResourceAlert: () => [],
98
+ compatibilityText: () => [],
99
+ dataCenter: null,
100
+ computeResourceTree: undefined,
101
+ locationNodes: () => [],
102
+ }
103
+ )
104
+
105
+ const emits = defineEmits<{
106
+ (event: 'finish'): void
107
+ (event: 'hide'): void
108
+ (event: 'select-compute-resource-tree', value: UI_I_TreeNode): void // для сферы
109
+ (
110
+ event: 'get-compute-resource-tree',
111
+ value: { id: string | number; cb: () => void }
112
+ ): void // для сферы
113
+ }>()
114
+
115
+ const { $recursion }: any = useNuxtApp()
116
+
117
+ const localization = computed<UI_I_Localization>(() => useLocal())
118
+ const isSphere = computed<boolean>(() => props.project === 'sphere')
119
+
120
+ const location = ref<UI_I_TreeNode | null>(props.dataCenter) // для сферы
121
+
122
+ const wizard: Wizard = new Wizard(
123
+ stepsFunc(localization.value),
124
+ stepsSchemeInitial
125
+ )
126
+ if (isSphere.value) {
127
+ wizard.changeScheme(1)
128
+ wizard.selectStepHard(1)
129
+ }
130
+
131
+ const allowedLocationKinds = [3, 7] // TODO use from config
132
+ const locationDescription = computed<string>(
133
+ () => localization.value.common.selectLocationVirtualMachine
134
+ )
135
+
136
+ const nameTestIds: UI_I_NameTestIds = {
137
+ name: 'virtual-machine-name',
138
+ helpIcon: 'show-vm-name-help-icon',
139
+ }
140
+
141
+ const selectedScheme = computed<number[]>(() => wizard.selectedScheme.value)
142
+ const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
143
+ wizard.changeSteps(value, validationFunc)
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
+ let stepShouldStop = {
152
+ ifOnCurrentStep: false,
153
+ ifFromAnyStep: false,
154
+ stoppageStepId: -1,
155
+ }
156
+
157
+ wizard.setLoader(true)
158
+ if (
159
+ wizard.isValidateForStep(
160
+ isSphere.value ? dynamicSteps.selectNameFolder : dynamicSteps.selectName,
161
+ currentStep.id,
162
+ nextStep.id
163
+ )
164
+ ) {
165
+ const nameValidation = await onCheckName(value)
166
+
167
+ value = nameValidation.newValue
168
+ stepHasError = stepHasError || nameValidation.stepHasError
169
+ } else if (
170
+ isSphere.value &&
171
+ wizard.isValidateForStep(
172
+ dynamicSteps.selectComputeResource,
173
+ currentStep.id,
174
+ nextStep.id
175
+ )
176
+ ) {
177
+ const computeResourceValidation = await checkComputeResource(value)
178
+
179
+ value = computeResourceValidation.newValue
180
+ stepHasError = stepHasError || computeResourceValidation.stepHasError
181
+ }
182
+ wizard.setLoader(false)
183
+
184
+ return {
185
+ newValue: value,
186
+ stepHasError,
187
+ stepShouldStop,
188
+ }
189
+ }
190
+
191
+ const nameFormSubmit = ref<null | Function>(null)
192
+ const onCheckName = async (
193
+ value: UI_I_WizardStep[]
194
+ ): Promise<UI_I_ValidationReturn> => {
195
+ let stepHasError = false
196
+
197
+ return new Promise((resolve) => {
198
+ const step = isSphere.value
199
+ ? dynamicSteps.selectNameFolder
200
+ : dynamicSteps.selectName
201
+ nameFormSubmit.value = (isValid: boolean) => {
202
+ if (!isValid) {
203
+ stepHasError = wizard.setValidation(step, 'name', {
204
+ fieldMessage: 'aaa',
205
+ alertMessage: 'aaa',
206
+ })
207
+ } else if (wizard.hasMessage(step, 'name')) {
208
+ value = wizard.removeValidation(step, 'name', value)
209
+ }
210
+
211
+ resolve({
212
+ stepHasError,
213
+ newValue: value,
214
+ })
215
+ nameFormSubmit.value = null
216
+ }
217
+ })
218
+ }
219
+ const compatibilityText = computed<[string, string]>(() => {
220
+ const { computeResource } = vmForm.value
221
+
222
+ if (!computeResource)
223
+ return [
224
+ 'none',
225
+ localization.value.vmWizard.noDestinationComputeResourceSelected,
226
+ ]
227
+
228
+ let res: [string, string] = [
229
+ 'success',
230
+ localization.value.common.compatibilityChecksSucceeded,
231
+ ]
232
+
233
+ if (!['cluster', 'host', 'resource_pool'].includes(computeResource?.type)) {
234
+ res = [
235
+ 'error',
236
+ localization.value.common.selectValidClusterOrHostDestination,
237
+ ]
238
+ }
239
+ if (computeResource?.type === 'cluster') {
240
+ const hasHost = !!computeResource.nodes.length
241
+ if (!hasHost) {
242
+ res = ['error', localization.value.common.clusterNotContainAnyHosts]
243
+ }
244
+ }
245
+
246
+ if (computeResource?.type === 'host') {
247
+ if (computeResource.state === 'Error') {
248
+ // TODO check Maintenance Mode
249
+ res = [
250
+ 'error',
251
+ localization.value.common.selectedHostDisconnectedMaintenanceMode,
252
+ ]
253
+ }
254
+ }
255
+
256
+ return res
257
+ })
258
+ const computeResourceAlert = ref<string[]>([])
259
+ const checkComputeResource = (
260
+ value: UI_I_WizardStep[]
261
+ ): UI_I_ValidationReturn => {
262
+ let stepHasError = false
263
+
264
+ const { computeResource } = vmForm.value
265
+
266
+ if (
267
+ !computeResource ||
268
+ // compatibilityText.value[0] !== 1 ||
269
+ computeResource.type === 'datacenter' ||
270
+ computeResource.type === 'folder' ||
271
+ (computeResource.type === 'cluster' && !computeResource.nodes.length)
272
+ ) {
273
+ computeResourceAlert.value = [
274
+ localization.value.common.specifyValidClusterOrHostDestination,
275
+ ]
276
+ stepHasError = wizard.setValidation(
277
+ dynamicSteps.selectComputeResource,
278
+ 'computeResource',
279
+ {
280
+ fieldMessage: 'aaa',
281
+ alertMessage: 'aaa',
282
+ }
283
+ )
284
+ } else {
285
+ computeResourceAlert.value = []
286
+ if (
287
+ wizard.hasMessage(dynamicSteps.selectComputeResource, 'computeResource')
288
+ ) {
289
+ value = wizard.removeValidation(
290
+ dynamicSteps.selectComputeResource,
291
+ 'computeResource',
292
+ value
293
+ )
294
+ }
295
+ }
296
+
297
+ return {
298
+ stepHasError,
299
+ newValue: value,
300
+ }
301
+ }
302
+
303
+ const isLoadingComputeTree = ref<boolean>(false)
304
+ const onChangeName = (name: string, node: UI_I_TreeNode | null): void => {
305
+ vmForm.value.name = name
306
+ if (isSphere.value) {
307
+ vmForm.value.locationPath = node.id
308
+ vmForm.value.dataCenter = $recursion.findParentByValue(
309
+ node,
310
+ 'datacenter',
311
+ 'type',
312
+ 'parent'
313
+ )
314
+ isLoadingComputeTree.value = true
315
+ emits('get-compute-resource-tree', {
316
+ id: node.id,
317
+ cb: () => {
318
+ isLoadingComputeTree.value = false
319
+ },
320
+ })
321
+ }
322
+ }
323
+
324
+ watch(
325
+ () => vmForm.value.computeResource,
326
+ (newValue, oldValue) => {
327
+ if (newValue && newValue.id !== oldValue?.id) {
328
+ onSelectComputeResourceTree(newValue)
329
+ }
330
+ },
331
+ { deep: true }
332
+ )
333
+ const onSelectComputeResourceTree = (node: UI_I_TreeNode): void => {
334
+ emits('select-compute-resource-tree', node)
335
+ }
336
+
337
+ const computeResourceTreeLocal = computed<UI_I_TreeNode | null>(() => { // для сферы
338
+ return props.computeResourceTree?.[0] || null
339
+ })
340
+ </script>
341
+
342
+ <style scoped lang="scss">
343
+ :deep(.modal-body) {
344
+ display: flex;
345
+ flex-direction: column;
346
+ }
347
+ .register-vm-content {
348
+ display: flex;
349
+ flex-direction: column;
350
+ flex: 1;
351
+ }
352
+ </style>