bfg-common 1.5.514 → 1.5.516

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 (52) hide show
  1. package/assets/localization/local_be.json +5 -3
  2. package/assets/localization/local_en.json +6 -4
  3. package/assets/localization/local_hy.json +5 -3
  4. package/assets/localization/local_kk.json +5 -3
  5. package/assets/localization/local_ru.json +5 -3
  6. package/assets/localization/local_zh.json +5 -3
  7. package/components/atoms/sortableView/SortableView.vue +2 -2
  8. package/components/common/browse/blocks/lib/models/types.ts +1 -1
  9. package/components/common/browse/lib/models/interfaces.ts +5 -5
  10. package/components/common/diagramMain/modals/lib/config/portModal.ts +251 -251
  11. package/components/common/diagramMain/modals/lib/config/vCenterModal.ts +48 -48
  12. package/components/common/diagramMain/network/Contents.vue +497 -497
  13. package/components/common/diagramMain/port/Port.vue +580 -580
  14. package/components/common/pages/backups/modals/createBackup/CreateBackup.vue +196 -379
  15. package/components/common/pages/backups/modals/createBackup/New.vue +267 -0
  16. package/components/common/pages/backups/modals/createBackup/Old.vue +142 -0
  17. package/components/common/pages/backups/modals/createBackup/configuration/Configuration.vue +29 -29
  18. package/components/common/pages/backups/modals/createBackup/configuration/ConfigurationNew.vue +218 -0
  19. package/components/common/pages/backups/modals/createBackup/configuration/ConfigurationOld.vue +29 -0
  20. package/components/common/pages/backups/modals/createBackup/configuration/backupWindow/BackupWindow.vue +29 -29
  21. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/MaxBandwidth.vue +69 -69
  22. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/config/options.ts +6 -6
  23. package/components/common/pages/backups/modals/createBackup/configuration/strategy/Strategy.vue +38 -38
  24. package/components/common/pages/backups/modals/createBackup/datastores/Datastores.vue +34 -59
  25. package/components/common/pages/backups/modals/createBackup/datastores/DatastoresNew.vue +23 -0
  26. package/components/common/pages/backups/modals/createBackup/datastores/DatastoresOld.vue +33 -0
  27. package/components/common/pages/backups/modals/createBackup/datastores/tableView/new/TableView.vue +134 -0
  28. package/components/common/pages/backups/modals/createBackup/datastores/tableView/new/lib/config/table.ts +219 -0
  29. package/components/common/pages/backups/modals/createBackup/datastores/tableView/new/lib/models/enums.ts +15 -0
  30. package/components/common/pages/backups/modals/createBackup/datastores/tableView/new/lib/models/interfaces.ts +5 -0
  31. package/components/common/pages/backups/modals/createBackup/datastores/tableView/{TableView.vue → old/TableView.vue} +95 -95
  32. package/components/common/pages/backups/modals/createBackup/datastores/tableView/{lib → old/lib}/config/keys.ts +14 -14
  33. package/components/common/pages/backups/modals/createBackup/datastores/tableView/{lib → old/lib}/config/table.ts +127 -127
  34. package/components/common/pages/backups/modals/createBackup/datastores/tableView/{lib → old/lib}/models/types.ts +10 -10
  35. package/components/common/pages/backups/modals/createBackup/disks/Disks.vue +34 -28
  36. package/components/common/pages/backups/modals/createBackup/disks/DisksNew.vue +22 -0
  37. package/components/common/pages/backups/modals/createBackup/disks/DisksOld.vue +28 -0
  38. package/components/common/pages/backups/modals/createBackup/disks/tableView/new/TableView.vue +131 -0
  39. package/components/common/pages/backups/modals/createBackup/disks/tableView/new/lib/config/table.ts +178 -0
  40. package/components/common/pages/backups/modals/createBackup/disks/tableView/{TableView.vue → old/TableView.vue} +119 -108
  41. package/components/common/pages/backups/modals/createBackup/disks/tableView/{lib → old/lib}/config/keys.ts +12 -12
  42. package/components/common/pages/backups/modals/createBackup/disks/tableView/{lib → old/lib}/config/table.ts +125 -125
  43. package/components/common/pages/backups/modals/createBackup/disks/tableView/{lib → old/lib}/models/types.ts +10 -10
  44. package/components/common/pages/backups/modals/createBackup/general/General.vue +33 -141
  45. package/components/common/pages/backups/modals/createBackup/general/GeneralNew.vue +128 -0
  46. package/components/common/pages/backups/modals/createBackup/general/GeneralOld.vue +66 -0
  47. package/components/common/pages/backups/modals/createBackup/lib/config/readyToCompleteOptions.ts +59 -0
  48. package/components/common/pages/backups/modals/createBackup/lib/config/steps.ts +123 -117
  49. package/components/common/pages/backups/modals/createBackup/lib/config/strategyOptions.ts +13 -12
  50. package/components/common/pages/backups/modals/createBackup/lib/models/interfaces.ts +8 -8
  51. package/components/common/pages/backups/modals/createBackup/lib/validation/validations.ts +145 -0
  52. package/package.json +1 -1
@@ -0,0 +1,267 @@
1
+ <template>
2
+ <ui-wizard
3
+ :steps="props.wizard.steps"
4
+ :selected-scheme="props.selectedScheme"
5
+ :is-loading="props.wizard.wizardLoader.status"
6
+ :title="props.title"
7
+ :texts="texts"
8
+ test-id="add-vm-backup-wizard"
9
+ show
10
+ @change-steps="onChangeSteps"
11
+ @hide="onHideModal"
12
+ @submit="onCreateDatastore"
13
+ >
14
+ <template #content="{ selectedStep }">
15
+ <ui-wizard-block
16
+ v-if="selectedStep.id === dynamicSteps.general"
17
+ :sub-title-height="height0"
18
+ >
19
+ <template #subTitle>
20
+ <div ref="subTitleBlock0">
21
+ <ui-alert
22
+ v-if="props.alertMessages[dynamicSteps.general].length"
23
+ :messages="props.alertMessages[dynamicSteps.general]"
24
+ test-id="add-vm-backup-general-error-alert"
25
+ type="error"
26
+ size="md"
27
+ class="mb-3"
28
+ />
29
+
30
+ <div class="subtitle-block flex-row items-start">
31
+ <ui-wizard-subtitle :sub-title="selectedStep.subTitle" />
32
+ </div>
33
+ </div>
34
+ </template>
35
+ <template #content>
36
+ <div class="mt-4">
37
+ <common-pages-backups-modals-create-backup-general
38
+ v-model="model"
39
+ :show="selectedStep.id === dynamicSteps.general"
40
+ :messages-fields="selectedStep.fields"
41
+ />
42
+ </div>
43
+ </template>
44
+ </ui-wizard-block>
45
+
46
+ <ui-wizard-block
47
+ v-if="selectedStep.id === dynamicSteps.disks"
48
+ :sub-title-height="height1"
49
+ >
50
+ <template #subTitle>
51
+ <div ref="subTitleBlock1">
52
+ <ui-alert
53
+ v-if="props.alertMessages[dynamicSteps.disks].length"
54
+ :messages="props.alertMessages[dynamicSteps.disks]"
55
+ test-id="add-vm-backup-disks-error-alert"
56
+ type="error"
57
+ size="md"
58
+ class="mb-3"
59
+ />
60
+
61
+ <div class="subtitle-block flex-row w-full items-start">
62
+ <ui-wizard-subtitle :sub-title="selectedStep.subTitle" />
63
+ </div>
64
+ </div>
65
+ </template>
66
+ <template #content>
67
+ <div class="mt-3 mb-4">
68
+ <common-pages-backups-modals-create-backup-disks
69
+ v-model="model"
70
+ :disks="props.disks"
71
+ :disks-loading="props.disksLoading"
72
+ />
73
+ </div>
74
+ </template>
75
+ </ui-wizard-block>
76
+
77
+ <ui-wizard-block
78
+ v-if="selectedStep.id === dynamicSteps.datastores"
79
+ :sub-title-height="height2"
80
+ >
81
+ <template #subTitle>
82
+ <div ref="subTitleBlock2">
83
+ <ui-alert
84
+ v-if="props.alertMessages[dynamicSteps.datastores].length"
85
+ :messages="props.alertMessages[dynamicSteps.datastores]"
86
+ test-id="add-vm-backup-datastores-error-alert"
87
+ type="error"
88
+ size="md"
89
+ class="mb-3"
90
+ />
91
+
92
+ <div class="subtitle-block flex-row w-full items-start">
93
+ <ui-wizard-subtitle :sub-title="selectedStep.subTitle" />
94
+ </div>
95
+ </div>
96
+ </template>
97
+ <template #content>
98
+ <div class="mt-3 mb-4">
99
+ <common-pages-backups-modals-create-backup-datastores
100
+ v-show="selectedStep.id === dynamicSteps.datastores"
101
+ v-model="model"
102
+ :datastore-table="props.datastoreTable"
103
+ :datastore-table-loading="props.datastoreTableLoading"
104
+ />
105
+ </div>
106
+ </template>
107
+ </ui-wizard-block>
108
+
109
+ <ui-wizard-block
110
+ v-if="selectedStep.id === dynamicSteps.configuration"
111
+ :sub-title-height="height3"
112
+ >
113
+ <template #subTitle>
114
+ <div ref="subTitleBlock3">
115
+ <ui-alert
116
+ v-if="props.alertMessages[dynamicSteps.configuration].length"
117
+ :messages="props.alertMessages[dynamicSteps.configuration]"
118
+ test-id="add-vm-backup-configuration-error-alert"
119
+ type="error"
120
+ size="md"
121
+ class="mb-3"
122
+ />
123
+
124
+ <div class="subtitle-block flex-row items-start">
125
+ <ui-wizard-subtitle :sub-title="selectedStep.subTitle" />
126
+ </div>
127
+ </div>
128
+ </template>
129
+ <template #content>
130
+ <div class="mt-4">
131
+ <common-pages-backups-modals-create-backup-configuration
132
+ v-model="model"
133
+ :messages-fields="selectedStep.fields"
134
+ />
135
+ </div>
136
+ </template>
137
+ </ui-wizard-block>
138
+
139
+ <ui-wizard-block
140
+ v-if="selectedStep.id === dynamicSteps.readyComplete"
141
+ :sub-title-height="height4"
142
+ >
143
+ <template #subTitle>
144
+ <div ref="subTitleBlock4">
145
+ <div class="subtitle-block flex-row items-start">
146
+ <ui-wizard-subtitle :sub-title="selectedStep.subTitle" />
147
+ </div>
148
+ </div>
149
+ </template>
150
+ <template #content>
151
+ <div class="mt-4">
152
+ <div class="ready-to-complete"></div>
153
+ <common-ready-to-complete :data="props.readyToCompleteData" />
154
+ </div>
155
+ </template>
156
+ </ui-wizard-block>
157
+ </template>
158
+ </ui-wizard>
159
+ </template>
160
+
161
+ <script setup lang="ts">
162
+ import { useElementSize } from '@vueuse/core'
163
+ import type {
164
+ UI_I_WizardStep,
165
+ UI_I_WizardTexts,
166
+ } from '~/node_modules/bfg-uikit/components/ui/wizard/lib/models/interfaces'
167
+ import type Wizard from '~/node_modules/bfg-uikit/components/ui/wizard/lib/utils/utils'
168
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
169
+ import type { UI_I_TableInfoItem } from '~/components/atoms/table/info/lib/models/interfaces'
170
+ import { dynamicSteps } from '~/components/common/pages/backups/modals/createBackup/lib/config/steps'
171
+ import type {
172
+ UI_I_BackupDatastoreTable,
173
+ UI_I_CreateBackupForm,
174
+ UI_I_Pvm,
175
+ } from '~/components/common/pages/backups/modals/lib/models/interfaces'
176
+
177
+ const model = defineModel<UI_I_CreateBackupForm>({ required: true })
178
+ // ToDo в новом дизайне пока нет страница scheduledTasks
179
+ // const modelSchedulerTask = defineModel<UI_I_ScheduleNewTasksForm>(
180
+ // 'schedulerForm',
181
+ // { required: true }
182
+ // )
183
+ const props = defineProps<{
184
+ wizard: Wizard
185
+ selectedScheme: number[]
186
+ alertMessages: string[][]
187
+ title: string
188
+ target: string
189
+ isScheduledTasks: boolean
190
+ isEditScheduledTasks: boolean
191
+ selectedVmName: string
192
+ disks: UI_I_Pvm['disk_devices']
193
+ disksLoading: boolean
194
+ datastoreTable: UI_I_BackupDatastoreTable | null
195
+ datastoreTableLoading: boolean
196
+ readyToCompleteData: UI_I_TableInfoItem[]
197
+ }>()
198
+ const emits = defineEmits<{
199
+ (event: 'change-steps', value: UI_I_WizardStep[]): void
200
+ (event: 'hide'): void
201
+ (event: 'submit'): void
202
+ }>()
203
+
204
+ const localization = computed<UI_I_Localization>(() => useLocal())
205
+
206
+ const texts = computed<UI_I_WizardTexts>(() => ({
207
+ cancel: localization.value.common.cancel,
208
+ back: localization.value.common.backCap,
209
+ processing: localization.value.common.processing,
210
+ next: localization.value.common.next,
211
+ finish: localization.value.common.create,
212
+ incompleteTitle: localization.value.common.incompleteProcess,
213
+ incompleteMessage: localization.value.common.incompleteProcessMessage,
214
+ incompleteCancel: localization.value.common.cancel,
215
+ incompleteLeave: localization.value.common.leave,
216
+ step: localization.value.common.step,
217
+ of: localization.value.common.of2,
218
+ }))
219
+
220
+ const subTitleBlock0 = ref<HTMLElement | null>(null)
221
+ const { height: height0 } = useElementSize(subTitleBlock0)
222
+
223
+ const subTitleBlock1 = ref<HTMLElement | null>(null)
224
+ const { height: height1 } = useElementSize(subTitleBlock1)
225
+
226
+ const subTitleBlock2 = ref<HTMLElement | null>(null)
227
+ const { height: height2 } = useElementSize(subTitleBlock2)
228
+
229
+ const subTitleBlock3 = ref<HTMLElement | null>(null)
230
+ const { height: height3 } = useElementSize(subTitleBlock3)
231
+
232
+ const subTitleBlock4 = ref<HTMLElement | null>(null)
233
+ const { height: height4 } = useElementSize(subTitleBlock4)
234
+
235
+ const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> =>
236
+ emits('change-steps', value)
237
+
238
+ const onHideModal = (): void => emits('hide')
239
+ const onCreateDatastore = (): void => emits('submit')
240
+ </script>
241
+
242
+ <style scoped lang="scss">
243
+ .subtitle-block {
244
+ display: flex;
245
+ flex-direction: column;
246
+ row-gap: 16px;
247
+ border-bottom: 1px solid var(--wizard-line);
248
+ padding-bottom: 12px;
249
+
250
+ &.flex-row {
251
+ flex-direction: row;
252
+ }
253
+
254
+ :deep(&__alert) {
255
+ padding: 10px 12px;
256
+ }
257
+ }
258
+
259
+ .ready-to-complete {
260
+ :deep(.details-list):nth-child(1) {
261
+ .details-item-value {
262
+ white-space: break-spaces;
263
+ overflow: auto;
264
+ }
265
+ }
266
+ }
267
+ </style>
@@ -0,0 +1,142 @@
1
+ <template>
2
+ <div class="create-backup">
3
+ <atoms-wizard
4
+ show
5
+ :wizard="props.wizard"
6
+ :selected-scheme="props.selectedScheme"
7
+ :title="props.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="props.alertErrors.length"
17
+ status="alert-danger"
18
+ :items="props.alertErrors"
19
+ test-id="create-backup-alert"
20
+ @remove="emits('remove-validation-errors')"
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
+ />
35
+
36
+ <common-pages-backups-modals-create-backup-disks
37
+ v-show="selectedStep.id === dynamicSteps.disks"
38
+ v-model="model"
39
+ :disks="props.disks"
40
+ :disks-loading="props.disksLoading"
41
+ />
42
+
43
+ <common-pages-backups-modals-create-backup-datastores
44
+ v-show="selectedStep.id === dynamicSteps.datastores"
45
+ v-model="model"
46
+ :datastore-table="props.datastoreTable"
47
+ :datastore-table-loading="props.datastoreTableLoading"
48
+ />
49
+
50
+ <common-pages-backups-modals-create-backup-configuration
51
+ v-show="selectedStep.id === dynamicSteps.configuration"
52
+ v-model="model"
53
+ />
54
+
55
+ <common-ready-to-complete
56
+ v-show="selectedStep.id === dynamicSteps.readyComplete"
57
+ :data="props.readyToCompleteData"
58
+ />
59
+ </template>
60
+ </atoms-wizard>
61
+ </div>
62
+ </template>
63
+
64
+ <script setup lang="ts">
65
+ import type {
66
+ UI_I_WizardStep,
67
+ } from '~/node_modules/bfg-uikit/components/ui/wizard/lib/models/interfaces'
68
+ import Wizard from '~/node_modules/bfg-uikit/components/ui/wizard/lib/utils/utils'
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 {
78
+ dynamicSteps,
79
+ } from '~/components/common/pages/backups/modals/createBackup/lib/config/steps'
80
+
81
+ const model = defineModel<UI_I_CreateBackupForm>({ required: true })
82
+ const modelSchedulerTask = defineModel<UI_I_ScheduleNewTasksForm>(
83
+ 'schedulerForm',
84
+ { required: true }
85
+ )
86
+
87
+ const props = defineProps<{
88
+ wizard: Wizard
89
+ selectedScheme: number[]
90
+ alertMessages: string[][]
91
+ title: string
92
+ isEdit?: boolean // ToDo проверить на использование
93
+ target: string
94
+ isScheduledTasks: boolean
95
+ isEditScheduledTasks: boolean
96
+ selectedVmName: string
97
+ disks: UI_I_Pvm['disk_devices']
98
+ disksLoading: boolean
99
+ datastoreTable: UI_I_BackupDatastoreTable | null
100
+ datastoreTableLoading: boolean
101
+ alertErrors: string[]
102
+ readyToCompleteData: UI_I_TableInfoItem[]
103
+ }>()
104
+
105
+ const emits = defineEmits<{
106
+ (event: 'change-step-create-backup', value: UI_I_WizardStep[]): void
107
+ (event: 'remove-validation-errors'): void
108
+ (event: 'finish'): void
109
+ (event: 'hide'): void
110
+ }>()
111
+
112
+ const localization = computed<UI_I_Localization>(() => useLocal())
113
+
114
+ const testId = ref<string>(props.isEdit ? 'update-backup' : 'create-backup') // ToDo проверить на использованиe(isEdit)
115
+
116
+ watch(
117
+ modelSchedulerTask,
118
+ (newValue: UI_I_ScheduleNewTasksForm) => {
119
+ if (props.isScheduledTasks) props.wizard.setDisabledNextButton(newValue.isValid)
120
+ },
121
+ { immediate: true, deep: true }
122
+ )
123
+
124
+ const onChangeSteps = async (value: UI_I_WizardStep[]): Promise<void> => {
125
+ emits('change-step-create-backup', value)
126
+ }
127
+
128
+
129
+ const onFinish = (): void => {
130
+ emits('finish')
131
+ }
132
+ const onHideModal = (): void => {
133
+ emits('hide')
134
+ }
135
+ </script>
136
+
137
+ <style scoped lang="scss">
138
+ :deep(.modal-body) {
139
+ display: flex;
140
+ flex-direction: column;
141
+ }
142
+ </style>
@@ -1,29 +1,29 @@
1
- <template>
2
- <div class="configuration">
3
- <div class="stack-view">
4
- <common-pages-backups-modals-create-backup-configuration-strategy
5
- v-model="model"
6
- />
7
- <!-- <common-pages-backups-modals-create-backup-configuration-backup-window-->
8
- <!-- v-model="model"-->
9
- <!-- />-->
10
- <common-pages-backups-modals-create-backup-configuration-max-bandwidth
11
- v-model="model"
12
- />
13
- </div>
14
- </div>
15
- </template>
16
-
17
- <script lang="ts" setup>
18
- import type { UI_I_CreateBackupForm } from '~/components/common/pages/backups/modals/lib/models/interfaces'
19
-
20
- const model = defineModel<UI_I_CreateBackupForm>({ required: true })
21
- </script>
22
-
23
- <style lang="scss" scoped>
24
- .stack-view {
25
- :deep(.select-input__inner) {
26
- min-width: max-content;
27
- }
28
- }
29
- </style>
1
+ <template>
2
+ <common-pages-backups-modals-create-backup-configuration-new
3
+ v-if="isNewView"
4
+ v-model="model"
5
+ :messages-fields="props.messagesFields"
6
+ />
7
+ <common-pages-backups-modals-create-backup-configuration-old
8
+ v-else
9
+ v-model="model"
10
+ />
11
+ </template>
12
+
13
+ <script lang="ts" setup>
14
+ import type { UI_I_ErrorFields } from '~/node_modules/bfg-uikit/components/ui/wizard/lib/models/interfaces'
15
+ import type { UI_I_CreateBackupForm } from '~/components/common/pages/backups/modals/lib/models/interfaces'
16
+ import type { UI_I_ArbitraryObject } from '~/lib/models/interfaces'
17
+
18
+ const model = defineModel<UI_I_CreateBackupForm>({ required: true })
19
+ const props = defineProps<{
20
+ messagesFields?: UI_I_ArbitraryObject<UI_I_ErrorFields>
21
+ }>()
22
+
23
+ const { $store }: any = useNuxtApp()
24
+
25
+ const isNewView = computed<boolean>(() => $store.getters['main/getIsNewView'])
26
+ </script>
27
+
28
+ <style lang="scss" scoped>
29
+ </style>
@@ -0,0 +1,218 @@
1
+ <template>
2
+ <div class="basics-step-row">
3
+ <div class="basics-step-row-title">
4
+ <span class="basics-step-row-title-text">
5
+ {{ localization.common.strategy }}
6
+ </span>
7
+ </div>
8
+ <div class="basics-step-row-content">
9
+ <ui-select
10
+ id="vm-backup-name-input"
11
+ v-model="model.strategy"
12
+ :items="strategyOptionsLocal"
13
+ test-id="vm-backup-name-input"
14
+ select-width="100%"
15
+ :class="['strategy-select', { capitalize: isLangEn }]"
16
+ />
17
+ </div>
18
+ </div>
19
+
20
+ <div class="basics-step-line"></div>
21
+
22
+ <div class="basics-step-row">
23
+ <div class="basics-step-row-title">
24
+ <span class="basics-step-row-title-text">
25
+ {{ localization.common.maxBandwidth }}
26
+ </span>
27
+ </div>
28
+
29
+ <div class="basics-step-row-content">
30
+ <div class="basics-step-row-content-max-band">
31
+ <ui-input
32
+ v-model="maxBindwidthLocal"
33
+ :error="props.messagesFields.bandWidth.field"
34
+ test-id="vm-backup-max-bandwidth-input"
35
+ class="max-bandwidth-input"
36
+ />
37
+
38
+ <ui-select
39
+ id="vm-backup-name-input"
40
+ v-model="selectedType"
41
+ :items="maxBandWidthOptionsLocal"
42
+ test-id="vm-backup-max-bandwidth-select"
43
+ class="max-bandwidth-select"
44
+ select-width="100%"
45
+ />
46
+ </div>
47
+ </div>
48
+ </div>
49
+ </template>
50
+ <script setup lang="ts">
51
+ import type { UI_I_Dropdown } from '~/node_modules/bfg-uikit/components/ui/dropdown/models/interfaces'
52
+ import type { UI_I_ArbitraryObject } from '~/node_modules/bfg-uikit/models/interfaces'
53
+ import type {UI_I_ErrorFields} from "~/node_modules/bfg-uikit/components/ui/wizard/lib/models/interfaces";
54
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
55
+ import { strategyOptionsFunc } from '~/components/common/pages/backups/modals/createBackup/lib/config/strategyOptions'
56
+ import {
57
+ maxBandwidthOptions
58
+ } from '~/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/config/options'
59
+ import type {UI_I_CreateBackupForm} from "~/components/common/pages/backups/modals/lib/models/interfaces";
60
+ import type {
61
+ UI_T_BandwidthOption
62
+ } from "~/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/models/types";
63
+
64
+ const model = defineModel<UI_I_CreateBackupForm>({ required: true })
65
+ const props = defineProps<{
66
+ messagesFields: UI_I_ArbitraryObject<UI_I_ErrorFields>
67
+ }>()
68
+
69
+ const { $binary }: any = useNuxtApp()
70
+
71
+ const localization = computed<UI_I_Localization>(() => useLocal())
72
+
73
+ const isLangEn = ref(useLocalStorage('lang') === 'en_US')
74
+
75
+ const strategyOptionsLocal = computed<UI_I_Dropdown[]>(() =>
76
+ strategyOptionsFunc(localization.value).map((item) => ({
77
+ text: item.label,
78
+ ...item
79
+ })
80
+ )
81
+ )
82
+
83
+ const maxBandWidthOptionsLocal = computed(() =>
84
+ maxBandwidthOptions.map(item => ({
85
+ text: item.label,
86
+ ...item
87
+ }))
88
+ )
89
+
90
+ const selectedType = ref<UI_T_BandwidthOption>(0)
91
+ watch(selectedType, (newValue) => {
92
+ if (newValue === 1) model.value.bandwidth_limit *= 1_024
93
+ else model.value.bandwidth_limit /= 1_024
94
+ })
95
+
96
+ const maxBindwidthLocal = computed<number>({
97
+ get() {
98
+ return selectedType.value === 1
99
+ ? $binary.bToGb(model.value.bandwidth_limit)
100
+ : $binary.bToMb(model.value.bandwidth_limit)
101
+ },
102
+ set(newValue: number) {
103
+ model.value.bandwidth_limit =
104
+ selectedType.value === 1
105
+ ? $binary.gbToB(newValue)
106
+ : $binary.mbToB(newValue)
107
+ }
108
+ })
109
+ </script>
110
+ <style scoped lang="scss">
111
+ .basics-step {
112
+ padding: 16px 0 16px;
113
+
114
+ &-row {
115
+ min-height: 36px;
116
+ width: 100%;
117
+ display: flex;
118
+ column-gap: 16px;
119
+ align-items: center;
120
+
121
+ &-title {
122
+ padding-top: 8px;
123
+ max-width: 240px;
124
+ width: 100%;
125
+ display: flex;
126
+ align-items: center;
127
+ column-gap: 8px;
128
+ font-weight: 400;
129
+ font-size: 13px;
130
+ line-height: 20px;
131
+ letter-spacing: 0;
132
+ vertical-align: middle;
133
+ align-self: flex-start;
134
+ color: var(--wizard-content-title);
135
+ white-space: nowrap;
136
+ text-overflow: ellipsis;
137
+ overflow: hidden;
138
+
139
+ &-text {
140
+ display: block;
141
+ white-space: nowrap;
142
+ text-overflow: ellipsis;
143
+ overflow: hidden;
144
+ }
145
+ }
146
+
147
+ &-content {
148
+ max-width: 480px;
149
+ width: 100%;
150
+ font-weight: 400;
151
+ font-size: 13px;
152
+ line-height: 20px;
153
+ letter-spacing: 0;
154
+ vertical-align: middle;
155
+ color: var(--wizard-content-value);
156
+
157
+ &-text {
158
+ display: flex;
159
+ column-gap: 8px;
160
+ align-items: center;
161
+
162
+ &-icon {
163
+ width: 20px;
164
+ min-width: 20px;
165
+ height: 20px;
166
+ min-height: 20px;
167
+ }
168
+ }
169
+
170
+ &-switch-container {
171
+ width: fit-content;
172
+ }
173
+
174
+ .strategy-select.capitalize, :deep(.ui-select-toggle-button) {
175
+ text-transform: capitalize;
176
+ }
177
+ &-max-band {
178
+ display: flex;
179
+ gap: 12px;
180
+
181
+ .max-bandwidth-input {
182
+ max-width: 276px;
183
+ width: 100%;
184
+ }
185
+
186
+ .max-bandwidth-select {
187
+ max-width: 192px;
188
+ width: 100%;
189
+ }
190
+ }
191
+ }
192
+ }
193
+
194
+ &-line {
195
+ height: 0;
196
+ width: 100%;
197
+ border-bottom: 1px solid var(--wizard-content-line);
198
+ margin: 16px 0;
199
+ }
200
+ }
201
+
202
+
203
+ @media (max-width: 1024px) {
204
+ .basics-step {
205
+ &-row {
206
+ &-content {
207
+ &-max-band {
208
+ flex-direction: column;
209
+
210
+ .max-bandwidth-input, .max-bandwidth-select {
211
+ max-width: 100%;
212
+ }
213
+ }
214
+ }
215
+ }
216
+ }
217
+ }
218
+ </style>