bfg-common 1.5.697 → 1.5.698

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 (102) 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/scss/common/icons/icons-2.scss +282 -282
  7. package/components/atoms/TheIcon3.vue +50 -50
  8. package/components/atoms/collapse/CollapseNav.vue +170 -170
  9. package/components/atoms/perPage/PerPage.vue +58 -58
  10. package/components/atoms/switch/Switch.vue +103 -103
  11. package/components/atoms/table/dataGrid/DataGrid.vue +1718 -1718
  12. package/components/atoms/table/dataGrid/DataGridPagination.vue +97 -97
  13. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  14. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  15. package/components/common/backup/storage/actions/add/lib/utils.ts +51 -51
  16. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  17. package/components/common/diagramMain/modals/lib/config/vCenterModal.ts +48 -48
  18. package/components/common/diagramMain/port/Port.vue +580 -580
  19. package/components/common/layout/theHeader/TheHeaderNew.vue +315 -315
  20. package/components/common/layout/theHeader/TheHeaderOld.vue +262 -262
  21. package/components/common/layout/theHeader/helpMenu/About.vue +79 -79
  22. package/components/common/layout/theHeader/helpMenu/aboutOld/AboutOld.vue +79 -79
  23. package/components/common/layout/theHeader/userMenu/modals/preferences/PreferencesOld.vue +144 -144
  24. package/components/common/layout/theHeader/userMenu/modals/preferences/lib/models/types.ts +7 -7
  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 +243 -243
  28. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/config/options.ts +6 -6
  29. package/components/common/pages/backups/modals/createBackup/lib/config/readyToCompleteOptions.ts +69 -69
  30. package/components/common/pages/backups/modals/lib/config/restore.ts +115 -115
  31. package/components/common/pages/backups/modals/lib/models/interfaces.ts +186 -186
  32. package/components/common/pages/backups/modals/restore/name/lib/models/interfaces.ts +6 -6
  33. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  34. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  35. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  36. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  37. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  38. package/components/common/pages/scheduledTasks/lib/utils/utils.ts +84 -84
  39. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  40. package/components/common/select/radio/RadioGroup.vue +137 -137
  41. package/components/common/spiceConsole/Drawer.vue +420 -420
  42. package/components/common/spiceConsole/SpiceConsole.vue +184 -184
  43. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  44. package/components/common/tools/Actions.vue +207 -207
  45. package/components/common/treeView/TreeView.vue +52 -52
  46. package/components/common/vm/actions/clone/lib/config/steps.ts +295 -295
  47. package/components/common/vm/actions/clone/new/New.vue +438 -438
  48. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +706 -706
  49. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  50. package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/Memory.vue +283 -283
  51. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDisk.vue +489 -489
  52. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +253 -253
  53. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +156 -156
  54. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  55. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  56. package/components/common/vm/actions/common/select/options/New.vue +264 -264
  57. package/components/common/vm/actions/common/select/options/Old.vue +109 -109
  58. package/components/common/vm/actions/common/select/options/Options.vue +58 -58
  59. package/components/common/vm/actions/common/select/storage/Old.vue +125 -125
  60. package/components/common/vm/actions/common/select/storage/new/New.vue +311 -311
  61. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  62. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  63. package/components/common/vm/actions/common/select/template/old/Old.vue +50 -50
  64. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  65. package/components/common/wizards/common/compatibility/Compatibility.vue +35 -35
  66. package/components/common/wizards/common/steps/computeResource/New.vue +93 -93
  67. package/components/common/wizards/common/steps/name/Name.vue +178 -178
  68. package/components/common/wizards/common/steps/name/New.vue +221 -221
  69. package/components/common/wizards/common/steps/name/Old.vue +121 -121
  70. package/components/common/wizards/common/steps/name/lib/models/interfaces.ts +4 -4
  71. package/components/common/wizards/common/steps/name/location/New.vue +40 -40
  72. package/components/common/wizards/datastore/add/Add.vue +228 -228
  73. package/components/common/wizards/datastore/add/lib/utils.ts +85 -85
  74. package/components/common/wizards/datastore/add/steps/nameAndDevice/NameAndDeviceNew.vue +232 -232
  75. package/components/common/wizards/datastore/add/steps/nameAndDevice/NameAndDeviceOld.vue +231 -231
  76. package/components/common/wizards/datastore/add/steps/nameAndDevice/advancedOptions/AdvancedOptions.vue +43 -43
  77. package/components/common/wizards/datastore/add/steps/nameAndDevice/advancedOptions/New.vue +114 -101
  78. package/components/common/wizards/datastore/add/steps/nameAndDevice/advancedOptions/Old.vue +114 -101
  79. package/components/common/wizards/datastore/add/steps/typeMode/lib/config/typeOptions.ts +43 -43
  80. package/composables/useAppVersion.ts +21 -21
  81. package/composables/useEnvLanguage.ts +22 -22
  82. package/composables/useLocal.ts +6 -6
  83. package/composables/useLocalCommon.ts +39 -39
  84. package/package.json +1 -1
  85. package/plugins/console.ts +21 -21
  86. package/plugins/date.ts +375 -375
  87. package/plugins/mouse.ts +21 -21
  88. package/plugins/panelStates.ts +70 -70
  89. package/plugins/text.ts +59 -59
  90. package/public/spice-console/application/clientgui.js +854 -854
  91. package/public/spice-console/application/packetfactory.js +211 -211
  92. package/public/spice-console/application/virtualmouse.js +147 -147
  93. package/public/spice-console/lib/images/bitmap.js +203 -203
  94. package/public/spice-console/network/spicechannel.js +440 -440
  95. package/public/spice-console/process/cursorprocess.js +128 -128
  96. package/public/spice-console/process/inputprocess.js +227 -227
  97. package/public/spice-console/process/mainprocess.js +212 -212
  98. package/public/spice-console/run.js +210 -210
  99. package/store/main/mutations.ts +7 -7
  100. package/store/main/state.ts +7 -7
  101. package/store/tasks/mappers/recentTasks.ts +123 -123
  102. package/store/tasks/mutations.ts +82 -82
@@ -1,85 +1,85 @@
1
- import Wizard from '~/node_modules/bfg-uikit/components/ui/wizard/lib/utils/utils'
2
- import type { API_UI_I_Error } from '~/lib/models/store/interfaces'
3
- import type { UI_T_Project } from '~/lib/models/types'
4
- import { UI_E_Kind } from '~/lib/models/enums'
5
-
6
- export const checkValidityName = async ({
7
- name,
8
- wizard,
9
- project,
10
- sendMessage,
11
- datacenterId,
12
- }: {
13
- name: string
14
- wizard: Wizard
15
- project: UI_T_Project
16
- sendMessage: (message: string) => void
17
- datacenterId?: string
18
- }): Promise<void> => {
19
- wizard.setLoader(true)
20
- const url = buildValidationUrl(name, project, datacenterId)
21
-
22
- const { error } = await useMyFetch<null, API_UI_I_Error>(url, {
23
- method: 'GET',
24
- })
25
-
26
- wizard.setLoader(false)
27
-
28
- if (error.value && error.value.data.error_code !== 0) {
29
- const existError = error.value.data?.error_message || error.value.data
30
- sendMessage(existError)
31
- return
32
- }
33
- sendMessage('')
34
- }
35
-
36
- const buildValidationUrl = (
37
- name: string,
38
- project: UI_T_Project,
39
- datacenterId?: string
40
- ): string => {
41
- if (project === 'procurator') {
42
- const params = new URLSearchParams({ name })
43
- return `/ui/ds/validate?${params.toString()}`
44
- }
45
-
46
- const params = new URLSearchParams()
47
- params.set('name', name)
48
- params.set('kind', String(UI_E_Kind.STORAGE_VALIDATION_NAME))
49
- if (datacenterId) params.set('datacenter', datacenterId)
50
-
51
- return `/ui/object/validate_name_datacenter?${params.toString()}`
52
- }
53
-
54
- export const validateNameAndGenerateDataId = (
55
- name: string,
56
- _errorMessage: string,
57
- defaultDataId?: string
58
- ): string => {
59
- let baseDataId = defaultDataId || 'storage-name-alert-error'
60
-
61
- const patterns = [
62
- {
63
- regex: /^[a-zA-Z0-9_\-\.]+$/,
64
- error_message:
65
- /invalid name, must only contain letters, numbers, and '_', '-' '.' symbols/,
66
- suffix: '-invalid-name-symbols',
67
- },
68
- {
69
- regex: /^.{3,64}$/,
70
- error_message:
71
- /invalid name length, must be between: \d+ and \d+ characters/,
72
- suffix: '-invalid-name-length',
73
- },
74
- ]
75
-
76
- // Проверка error_message на соответствие шаблонам
77
-
78
- for (const pattern of patterns) {
79
- if (!pattern.regex.test(name)) {
80
- return `${baseDataId}${pattern.suffix}`
81
- }
82
- }
83
-
84
- return baseDataId
85
- }
1
+ import Wizard from '~/node_modules/bfg-uikit/components/ui/wizard/lib/utils/utils'
2
+ import type { API_UI_I_Error } from '~/lib/models/store/interfaces'
3
+ import type { UI_T_Project } from '~/lib/models/types'
4
+ import { UI_E_Kind } from '~/lib/models/enums'
5
+
6
+ export const checkValidityName = async ({
7
+ name,
8
+ wizard,
9
+ project,
10
+ sendMessage,
11
+ datacenterId,
12
+ }: {
13
+ name: string
14
+ wizard: Wizard
15
+ project: UI_T_Project
16
+ sendMessage: (message: string) => void
17
+ datacenterId?: string
18
+ }): Promise<void> => {
19
+ wizard.setLoader(true)
20
+ const url = buildValidationUrl(name, project, datacenterId)
21
+
22
+ const { error } = await useMyFetch<null, API_UI_I_Error>(url, {
23
+ method: 'GET',
24
+ })
25
+
26
+ wizard.setLoader(false)
27
+
28
+ if (error.value && error.value.data.error_code !== 0) {
29
+ const existError = error.value.data?.error_message || error.value.data
30
+ sendMessage(existError)
31
+ return
32
+ }
33
+ sendMessage('')
34
+ }
35
+
36
+ const buildValidationUrl = (
37
+ name: string,
38
+ project: UI_T_Project,
39
+ datacenterId?: string
40
+ ): string => {
41
+ if (project === 'procurator') {
42
+ const params = new URLSearchParams({ name })
43
+ return `/ui/ds/validate?${params.toString()}`
44
+ }
45
+
46
+ const params = new URLSearchParams()
47
+ params.set('name', name)
48
+ params.set('kind', String(UI_E_Kind.STORAGE_VALIDATION_NAME))
49
+ if (datacenterId) params.set('datacenter', datacenterId)
50
+
51
+ return `/ui/object/validate_name_datacenter?${params.toString()}`
52
+ }
53
+
54
+ export const validateNameAndGenerateDataId = (
55
+ name: string,
56
+ _errorMessage: string,
57
+ defaultDataId?: string
58
+ ): string => {
59
+ let baseDataId = defaultDataId || 'storage-name-alert-error'
60
+
61
+ const patterns = [
62
+ {
63
+ regex: /^[a-zA-Z0-9_\-\.]+$/,
64
+ error_message:
65
+ /invalid name, must only contain letters, numbers, and '_', '-' '.' symbols/,
66
+ suffix: '-invalid-name-symbols',
67
+ },
68
+ {
69
+ regex: /^.{3,64}$/,
70
+ error_message:
71
+ /invalid name length, must be between: \d+ and \d+ characters/,
72
+ suffix: '-invalid-name-length',
73
+ },
74
+ ]
75
+
76
+ // Проверка error_message на соответствие шаблонам
77
+
78
+ for (const pattern of patterns) {
79
+ if (!pattern.regex.test(name)) {
80
+ return `${baseDataId}${pattern.suffix}`
81
+ }
82
+ }
83
+
84
+ return baseDataId
85
+ }
@@ -1,232 +1,232 @@
1
- <template>
2
- <div class="name-and-device">
3
- <div class="name-and-device__row row">
4
- <div class="row__title">
5
- <span class="row__title-text">
6
- {{ localization.common.name }}
7
- </span>
8
- </div>
9
- <div class="row__content">
10
- <ui-input
11
- id="device-selection-input"
12
- v-model="formModelLocal.name"
13
- :placeholder="localization.common.name"
14
- :error="nameErrorText"
15
- test-id="device-selection-input"
16
- @blur="initValidation(true)"
17
- @input="initValidation(false)"
18
- />
19
- </div>
20
- </div>
21
-
22
- <ui-alert
23
- v-if="isShowInfoAlert"
24
- :messages="[alertInfoDescription]"
25
- test-id="device-selection-information-alert"
26
- type="info"
27
- size="md"
28
- class="name-and-device__alert"
29
- />
30
-
31
- <div class="name-and-device__row row">
32
- <div class="row__title">
33
- <span class="row__title-text">
34
- {{ selectedHostLabel }}
35
- </span>
36
-
37
- <common-tooltip-help
38
- v-if="props.isShowSelectHost"
39
- :title="localization.common.information"
40
- :help-text="localization.common.selectHostToViewAccessible"
41
- test-id="device-select-host-tooltip"
42
- help-id="device-select-host-tooltip"
43
- dropdown-width="272px"
44
- dropdown-left
45
- dropdown-top
46
- />
47
- </div>
48
- <div v-if="props.isShowSelectHost" class="row__content">
49
- <ui-select
50
- v-model="selectedHostLocal"
51
- :items="props.hostOptions"
52
- :placeholder="localization.common.selectHost"
53
- select-width="100%"
54
- show-text
55
- test-id="device-host-select"
56
- size="md"
57
- theme="light"
58
- @change="onSelectHost"
59
- />
60
- </div>
61
-
62
- <div v-else class="row__host-name">
63
- <span class="icon vsphere-icon-host" />
64
- {{ props.selectedHostName }}
65
- </div>
66
- </div>
67
-
68
- <div class="name-and-device__disk-list">
69
- <common-wizards-datastore-add-steps-name-and-device-table
70
- v-model="formModelLocal.dev_names"
71
- :lun-disks-data="props.lunDisksData"
72
- :pagination="props.pagination"
73
- :loading="props.loading"
74
- :is-main-filter="props.isMainFilter"
75
- @sort="emits('sort', $event)"
76
- @main-filter="emits('main-filter', $event)"
77
- />
78
- </div>
79
-
80
- <common-wizards-datastore-add-steps-name-and-device-advanced-options
81
- v-model="formModelLocal.level"
82
- :dev-names-count="formModelLocal.dev_names.length"
83
- />
84
- </div>
85
- </template>
86
-
87
- <script lang="ts" setup>
88
- import type { UI_I_ErrorFields } from '~/node_modules/bfg-uikit/components/ui/wizard/lib/models/interfaces'
89
- import type {
90
- UI_I_Localization,
91
- UI_I_ArbitraryObject,
92
- } from '~/lib/models/interfaces'
93
- import type { UI_I_Pagination } from '~/lib/models/table/interfaces'
94
- import type { UI_I_SelectHostOptions } from '~/components/common/wizards/datastore/add/steps/nameAndDevice/lib/models/interfaces'
95
- import type { UI_I_CreateDatastoreForm } from '~/components/common/wizards/datastore/add/lib/models/interfaces'
96
- import type { UI_I_CreateStorageLunDisks } from '~/components/common/wizards/datastore/add/steps/nameAndDevice/table/lib/models/interfaces'
97
-
98
- const formModelLocal = defineModel<UI_I_CreateDatastoreForm>({ required: true })
99
- const isShowInfoAlert = defineModel<boolean>('isShowInfoAlert', {
100
- required: true,
101
- })
102
- const props = withDefaults(
103
- defineProps<{
104
- selectedHostName: string
105
- lunDisksData: UI_I_CreateStorageLunDisks
106
- hostOptions: UI_I_SelectHostOptions[]
107
- alertMessages: string[]
108
- messagesFields: UI_I_ArbitraryObject<UI_I_ErrorFields>
109
- pagination: UI_I_Pagination
110
- isShowSelectHost: boolean
111
- loading: boolean
112
- isMainFilter?: boolean
113
- }>(),
114
- {
115
- isMainFilter: undefined,
116
- }
117
- )
118
- const emits = defineEmits<{
119
- (event: 'select-host'): void
120
- (event: 'main-filter', value: string): void
121
- (event: 'sort', value: string): void
122
- }>()
123
-
124
- const localization = computed<UI_I_Localization>(() => useLocal())
125
-
126
- const selectedHostLocal = ref<string>(formModelLocal.value.hosts[0] || '')
127
-
128
- const isInitDatastoreNameValidation = ref<boolean>(false)
129
- const initValidation = (onlyBlur: boolean): void => {
130
- onlyBlur && (isInitDatastoreNameValidation.value = true)
131
- }
132
-
133
- const alertInfoDescription = computed<string>(() =>
134
- props.isShowSelectHost
135
- ? localization.value.common.nameAndDeviceSelectionAlertInfo
136
- : localization.value.common.nameAndDeviceSelectionHostAlertInfo
137
- )
138
- const selectedHostLabel = computed<string>(() =>
139
- props.isShowSelectHost
140
- ? localization.value.common.selectHost
141
- : localization.value.common.host
142
- )
143
-
144
- const nameErrorText = computed<string>(() => {
145
- if (
146
- props.messagesFields?.datastoreName?.field &&
147
- !formModelLocal.value.name
148
- ) {
149
- return props.messagesFields.datastoreName.field
150
- }
151
-
152
- if (!isInitDatastoreNameValidation.value) return ''
153
- return !formModelLocal.value.name
154
- ? localization.value.common.fieldRequired
155
- : ''
156
- })
157
-
158
- const onSelectHost = (event: string): void => {
159
- formModelLocal.value.hosts = [event]
160
- emits('select-host')
161
- }
162
- </script>
163
-
164
- <style lang="scss" scoped>
165
- .name-and-device {
166
- display: flex;
167
- flex-direction: column;
168
- row-gap: 16px;
169
- margin: 16px 0 10px 2px;
170
-
171
- &__alert {
172
- align-items: flex-start;
173
- }
174
-
175
- &__row {
176
- width: 100%;
177
- min-height: 36px;
178
- display: flex;
179
- align-items: center;
180
- column-gap: 16px;
181
- border-bottom: 1px solid var(--wizard-content-line);
182
- padding-bottom: 16px;
183
- }
184
- .row {
185
- &__title {
186
- max-width: 240px;
187
- width: 100%;
188
- display: flex;
189
- align-items: center;
190
- column-gap: 8px;
191
- color: var(--wizard-content-title);
192
- font-weight: 400;
193
- font-size: 13px;
194
- line-height: 20px;
195
- white-space: nowrap;
196
- text-overflow: ellipsis;
197
- overflow: hidden;
198
-
199
- &-text {
200
- display: block;
201
- white-space: nowrap;
202
- text-overflow: ellipsis;
203
- overflow: hidden;
204
- }
205
- }
206
- &__content {
207
- max-width: 480px;
208
- width: 100%;
209
- color: var(--wizard-content-value);
210
- font-weight: 400;
211
- font-size: 13px;
212
- line-height: 20px;
213
- letter-spacing: 0;
214
- vertical-align: middle;
215
- }
216
- &__host-name {
217
- font-family: 'Inter', sans-serif;
218
- height: 36px;
219
- display: flex;
220
- align-items: center;
221
- column-gap: 8px;
222
- color: var(--wizard-content-value);
223
- font-size: 13px;
224
- font-weight: 400;
225
- .icon {
226
- width: 20px;
227
- height: 20px;
228
- }
229
- }
230
- }
231
- }
232
- </style>
1
+ <template>
2
+ <div class="name-and-device">
3
+ <div class="name-and-device__row row">
4
+ <div class="row__title">
5
+ <span class="row__title-text">
6
+ {{ localization.common.name }}
7
+ </span>
8
+ </div>
9
+ <div class="row__content">
10
+ <ui-input
11
+ id="device-selection-input"
12
+ v-model="formModelLocal.name"
13
+ :placeholder="localization.common.name"
14
+ :error="nameErrorText"
15
+ test-id="device-selection-input"
16
+ @blur="initValidation(true)"
17
+ @input="initValidation(false)"
18
+ />
19
+ </div>
20
+ </div>
21
+
22
+ <ui-alert
23
+ v-if="isShowInfoAlert"
24
+ :messages="[alertInfoDescription]"
25
+ test-id="device-selection-information-alert"
26
+ type="info"
27
+ size="md"
28
+ class="name-and-device__alert"
29
+ />
30
+
31
+ <div class="name-and-device__row row">
32
+ <div class="row__title">
33
+ <span class="row__title-text">
34
+ {{ selectedHostLabel }}
35
+ </span>
36
+
37
+ <common-tooltip-help
38
+ v-if="props.isShowSelectHost"
39
+ :title="localization.common.information"
40
+ :help-text="localization.common.selectHostToViewAccessible"
41
+ test-id="device-select-host-tooltip"
42
+ help-id="device-select-host-tooltip"
43
+ dropdown-width="272px"
44
+ dropdown-left
45
+ dropdown-top
46
+ />
47
+ </div>
48
+ <div v-if="props.isShowSelectHost" class="row__content">
49
+ <ui-select
50
+ v-model="selectedHostLocal"
51
+ :items="props.hostOptions"
52
+ :placeholder="localization.common.selectHost"
53
+ select-width="100%"
54
+ show-text
55
+ test-id="device-host-select"
56
+ size="md"
57
+ theme="light"
58
+ @change="onSelectHost"
59
+ />
60
+ </div>
61
+
62
+ <div v-else class="row__host-name">
63
+ <span class="icon vsphere-icon-host" />
64
+ {{ props.selectedHostName }}
65
+ </div>
66
+ </div>
67
+
68
+ <div class="name-and-device__disk-list">
69
+ <common-wizards-datastore-add-steps-name-and-device-table
70
+ v-model="formModelLocal.dev_names"
71
+ :lun-disks-data="props.lunDisksData"
72
+ :pagination="props.pagination"
73
+ :loading="props.loading"
74
+ :is-main-filter="props.isMainFilter"
75
+ @sort="emits('sort', $event)"
76
+ @main-filter="emits('main-filter', $event)"
77
+ />
78
+ </div>
79
+
80
+ <common-wizards-datastore-add-steps-name-and-device-advanced-options
81
+ v-model="formModelLocal.level"
82
+ :dev-names-count="formModelLocal.dev_names.length"
83
+ />
84
+ </div>
85
+ </template>
86
+
87
+ <script lang="ts" setup>
88
+ import type { UI_I_ErrorFields } from '~/node_modules/bfg-uikit/components/ui/wizard/lib/models/interfaces'
89
+ import type {
90
+ UI_I_Localization,
91
+ UI_I_ArbitraryObject,
92
+ } from '~/lib/models/interfaces'
93
+ import type { UI_I_Pagination } from '~/lib/models/table/interfaces'
94
+ import type { UI_I_SelectHostOptions } from '~/components/common/wizards/datastore/add/steps/nameAndDevice/lib/models/interfaces'
95
+ import type { UI_I_CreateDatastoreForm } from '~/components/common/wizards/datastore/add/lib/models/interfaces'
96
+ import type { UI_I_CreateStorageLunDisks } from '~/components/common/wizards/datastore/add/steps/nameAndDevice/table/lib/models/interfaces'
97
+
98
+ const formModelLocal = defineModel<UI_I_CreateDatastoreForm>({ required: true })
99
+ const isShowInfoAlert = defineModel<boolean>('isShowInfoAlert', {
100
+ required: true,
101
+ })
102
+ const props = withDefaults(
103
+ defineProps<{
104
+ selectedHostName: string
105
+ lunDisksData: UI_I_CreateStorageLunDisks
106
+ hostOptions: UI_I_SelectHostOptions[]
107
+ alertMessages: string[]
108
+ messagesFields: UI_I_ArbitraryObject<UI_I_ErrorFields>
109
+ pagination: UI_I_Pagination
110
+ isShowSelectHost: boolean
111
+ loading: boolean
112
+ isMainFilter?: boolean
113
+ }>(),
114
+ {
115
+ isMainFilter: undefined,
116
+ }
117
+ )
118
+ const emits = defineEmits<{
119
+ (event: 'select-host'): void
120
+ (event: 'main-filter', value: string): void
121
+ (event: 'sort', value: string): void
122
+ }>()
123
+
124
+ const localization = computed<UI_I_Localization>(() => useLocal())
125
+
126
+ const selectedHostLocal = ref<string>(formModelLocal.value.hosts[0] || '')
127
+
128
+ const isInitDatastoreNameValidation = ref<boolean>(false)
129
+ const initValidation = (onlyBlur: boolean): void => {
130
+ onlyBlur && (isInitDatastoreNameValidation.value = true)
131
+ }
132
+
133
+ const alertInfoDescription = computed<string>(() =>
134
+ props.isShowSelectHost
135
+ ? localization.value.common.nameAndDeviceSelectionAlertInfo
136
+ : localization.value.common.nameAndDeviceSelectionHostAlertInfo
137
+ )
138
+ const selectedHostLabel = computed<string>(() =>
139
+ props.isShowSelectHost
140
+ ? localization.value.common.selectHost
141
+ : localization.value.common.host
142
+ )
143
+
144
+ const nameErrorText = computed<string>(() => {
145
+ if (
146
+ props.messagesFields?.datastoreName?.field &&
147
+ !formModelLocal.value.name
148
+ ) {
149
+ return props.messagesFields.datastoreName.field
150
+ }
151
+
152
+ if (!isInitDatastoreNameValidation.value) return ''
153
+ return !formModelLocal.value.name
154
+ ? localization.value.common.fieldRequired
155
+ : ''
156
+ })
157
+
158
+ const onSelectHost = (event: string): void => {
159
+ formModelLocal.value.hosts = [event]
160
+ emits('select-host')
161
+ }
162
+ </script>
163
+
164
+ <style lang="scss" scoped>
165
+ .name-and-device {
166
+ display: flex;
167
+ flex-direction: column;
168
+ row-gap: 16px;
169
+ margin: 16px 0 10px 2px;
170
+
171
+ &__alert {
172
+ align-items: flex-start;
173
+ }
174
+
175
+ &__row {
176
+ width: 100%;
177
+ min-height: 36px;
178
+ display: flex;
179
+ align-items: center;
180
+ column-gap: 16px;
181
+ border-bottom: 1px solid var(--wizard-content-line);
182
+ padding-bottom: 16px;
183
+ }
184
+ .row {
185
+ &__title {
186
+ max-width: 240px;
187
+ width: 100%;
188
+ display: flex;
189
+ align-items: center;
190
+ column-gap: 8px;
191
+ color: var(--wizard-content-title);
192
+ font-weight: 400;
193
+ font-size: 13px;
194
+ line-height: 20px;
195
+ white-space: nowrap;
196
+ text-overflow: ellipsis;
197
+ overflow: hidden;
198
+
199
+ &-text {
200
+ display: block;
201
+ white-space: nowrap;
202
+ text-overflow: ellipsis;
203
+ overflow: hidden;
204
+ }
205
+ }
206
+ &__content {
207
+ max-width: 480px;
208
+ width: 100%;
209
+ color: var(--wizard-content-value);
210
+ font-weight: 400;
211
+ font-size: 13px;
212
+ line-height: 20px;
213
+ letter-spacing: 0;
214
+ vertical-align: middle;
215
+ }
216
+ &__host-name {
217
+ font-family: 'Inter', sans-serif;
218
+ height: 36px;
219
+ display: flex;
220
+ align-items: center;
221
+ column-gap: 8px;
222
+ color: var(--wizard-content-value);
223
+ font-size: 13px;
224
+ font-weight: 400;
225
+ .icon {
226
+ width: 20px;
227
+ height: 20px;
228
+ }
229
+ }
230
+ }
231
+ }
232
+ </style>