bfg-common 1.5.386 → 1.5.388

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.
@@ -1,501 +1,501 @@
1
- <template>
2
- <div class="virtual-hardware">
3
- <div class="action-wrap py-3">
4
- <span class="device-count">{{ deviceCountText }}</span>
5
-
6
- <div class="add-device-dropdown-wrap">
7
- <button
8
- id="add-device-dropdown"
9
- :class="['cursor-pointer', { active: isShowAddDeviceDropdown }]"
10
- data-id="add-device-dropdown"
11
- @click="isShowAddDeviceDropdown = !isShowAddDeviceDropdown"
12
- >
13
- <ui-icon name="plus" width="18" height="18" />
14
- <span class="add-device-dropdown-text">
15
- {{ addNewDeviceText }}
16
- </span>
17
- </button>
18
- <ui-dropdown
19
- :items="dropdownItems"
20
- :show="isShowAddDeviceDropdown"
21
- :margin-between-trigger="4"
22
- show-from-left
23
- width="max-content"
24
- elem-id="add-device-dropdown"
25
- test-id="add-device-dropdown"
26
- left
27
- max-height="400px"
28
- @select="onAddDevice"
29
- @hide="isShowAddDeviceDropdown = false"
30
- />
31
- </div>
32
- </div>
33
-
34
- <div class="overflow-auto virtual-hardware-content-block">
35
- <div class="stack-view">
36
- <common-vm-actions-common-customize-hardware-virtual-hardware-cpu
37
- :max-cpus="props.maxCpus"
38
- :cpu-models="props.cpuModels"
39
- :cpu="props.cpu"
40
- :is-edit="props.isEdit"
41
- :state="props.state"
42
- :error-validation-fields="props.errorValidationFields"
43
- :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
44
- @send-data="emits('send-data-cpu-method', $event)"
45
- @remove-error-by-title="emits('remove-error-by-title', $event)"
46
- @invalid="cpuInvalid = $event"
47
- />
48
- <common-vm-actions-common-customize-hardware-virtual-hardware-memory
49
- :max-memory="props.maxMemory"
50
- :is-edit="props.isEdit"
51
- :memory="props.memory"
52
- :state="props.state"
53
- :error-validation-fields="props.errorValidationFields"
54
- @send-data="emits('send-data-memory-method', $event)"
55
- @invalid="memoryInvalid = $event"
56
- @remove-error-by-title="emits('remove-error-by-title', $event)"
57
- />
58
- <common-vm-actions-common-customize-hardware-virtual-hardware-new-hard-disk
59
- v-for="(item, key) in props.hardDisks"
60
- :key="props.hardDisksIndex[key]"
61
- :index="props.hardDisksIndex[key]"
62
- :type="props.hardDisksType[key]"
63
- :storage="props.storage"
64
- :hard-disk="item"
65
- :error-validation-fields="props.errorValidationFields"
66
- :get-datastore-table-func="props.getDatastoreTableFunc"
67
- :datastore="props.datastore"
68
- :is-datastore-loading="props.isDatastoreLoading"
69
- :is-edit="props.isEdit"
70
- :state="props.state"
71
- :guest-machine-type="props.guestMachineType"
72
- :compute-resource="props.computeResource"
73
- @remove="emits('remove-hard-disk', [props.hardDisksIndex[key], item])"
74
- @roll-back="emits('roll-back-hard-disk', props.hardDisksIndex[key])"
75
- @send-data="
76
- emits('send-data-new-hard-disk-method', [
77
- $event,
78
- props.hardDisksIndex[key],
79
- ])
80
- "
81
- @invalid="
82
- emits('set-invalid-hard-disk', [$event, props.hardDisksIndex[key]])
83
- "
84
- @remove-error-by-title="emits('remove-error-by-title', $event)"
85
- />
86
- <common-vm-actions-common-customize-hardware-virtual-hardware-new-network
87
- v-for="(item, key) in props.networks"
88
- :key="props.networksIndex[key]"
89
- :index="props.networksIndex[key]"
90
- :type="props.networksType[key]"
91
- :network="item"
92
- :networks-table="props.networksTable"
93
- :error-validation-fields="props.errorValidationFields"
94
- :is-edit="props.isEdit"
95
- :state="props.state"
96
- :project="props.project"
97
- @remove="emits('remove-network', props.networksIndex[key])"
98
- @send-data="
99
- emits('send-data-new-network-method', [
100
- $event,
101
- props.networksIndex[key],
102
- ])
103
- "
104
- @invalid="
105
- emits('set-invalid-network', [$event, props.networksIndex[key]])
106
- "
107
- @remove-error-by-title="emits('remove-error-by-title', $event)"
108
- @get-networks-table="emits('get-networks-table', $event)"
109
- />
110
- <common-vm-actions-common-customize-hardware-virtual-hardware-cd-dvd-drive
111
- v-for="(item, key) in props.cdDvdDrives"
112
- :key="props.cdDvdDrivesIndex[key]"
113
- :index="props.cdDvdDrivesIndex[key]"
114
- :hard-disks-count="props.hardDisks?.length || 0"
115
- :type="props.cdDvdDrivesType[key]"
116
- :cd-dvd-drive="item"
117
- :nodes="props.nodes"
118
- :files="props.files"
119
- :error-validation-fields="props.errorValidationFields"
120
- :is-edit="props.isEdit"
121
- :state="props.state"
122
- :guest-machine-type="props.guestMachineType"
123
- :compute-resource="props.computeResource"
124
- @remove-error-by-title="emits('remove-error-by-title', $event)"
125
- @get-storage="emits('get-storage', $event)"
126
- @get-folders-or-files="emits('get-folders-or-files', $event)"
127
- @get-active-device-child="emits('get-active-device-child', $event)"
128
- @show-datastore-child="emits('show-datastore-child', $event)"
129
- @remove="
130
- emits('remove-cd-dvd-drive', [props.cdDvdDrivesIndex[key], item])
131
- "
132
- @roll-back="
133
- emits('roll-back-cd-dvd-drive', props.cdDvdDrivesIndex[key])
134
- "
135
- @send-data="
136
- emits('send-data-new-cd-dvd-drive-method', [
137
- $event,
138
- props.cdDvdDrivesIndex[key],
139
- ])
140
- "
141
- />
142
- <common-vm-actions-common-customize-hardware-virtual-hardware-new-usb-controller
143
- :usb-controller="props.usbController"
144
- :is-edit="props.isEdit"
145
- :state="props.state"
146
- @send-data="emits('send-data-new-usb-controller-method', $event)"
147
- />
148
- <template v-if="props.passthroughDevices || props.mediatedDevices">
149
- <common-vm-actions-common-customize-hardware-virtual-hardware-new-pci-device
150
- v-for="(item, key) in props.pciDevices"
151
- :key="props.pciDevicesIndex[key]"
152
- :index="props.pciDevicesIndex[key]"
153
- :pci-device="item"
154
- :error-validation-fields="props.errorValidationFields"
155
- :passthrough-devices="props.passthroughDevices"
156
- :mediated-devices="props.mediatedDevices"
157
- :type="props.pciDevicesType[key]"
158
- :is-edit="props.isEdit"
159
- :state="props.state"
160
- @remove="emits('remove-pci-device', props.pciDevicesIndex[key])"
161
- @send-data="
162
- emits('send-data-pci-devices-method', [
163
- $event,
164
- props.pciDevicesIndex[key],
165
- ])
166
- "
167
- @invalid="
168
- emits('set-invalid-pci-device', [
169
- $event,
170
- props.pciDevicesIndex[key],
171
- ])
172
- "
173
- @remove-error-by-title="emits('remove-error-by-title', $event)"
174
- />
175
- </template>
176
- <common-vm-actions-common-customize-hardware-virtual-hardware-video-card
177
- :is-edit="props.isEdit"
178
- :video-card="props.videoCard"
179
- :error-validation-fields="props.errorValidationFields"
180
- :state="props.state"
181
- @send-data="emits('send-data-video-card-method', $event)"
182
- @invalid="videoCardInvalid = $event"
183
- @remove-error-by-title="emits('remove-error-by-title', $event)"
184
- />
185
- <common-vm-actions-common-customize-hardware-virtual-hardware-other />
186
- <div class="vm-hardware-version-wrap justify-end flex flex-1 mt-4">
187
- <span class="vm-hardware-version">
188
- {{ props.compatibilityInfo }}
189
- </span>
190
- </div>
191
- </div>
192
- </div>
193
-
194
- <Teleport to="body">
195
- <common-vm-actions-common-customize-hardware-virtual-hardware-browse-view
196
- v-if="props.isShowFileModal"
197
- show
198
- :nodes="props.nodes"
199
- :files="props.files"
200
- @submit="emits('add-exist-hard-disk', $event)"
201
- @get-storage="emits('get-storage', $event)"
202
- @get-folders-or-files="emits('get-folders-or-files', $event)"
203
- @get-active-device-child="emits('get-active-device-child', $event)"
204
- @show-datastore-child="emits('show-datastore-child', $event)"
205
- @hide="emits('hide-file-modal')"
206
- />
207
- </Teleport>
208
- </div>
209
- </template>
210
-
211
- <script setup lang="ts">
212
- import type { UI_I_Dropdown } from '~/node_modules/bfg-uikit/components/ui/dropdown/models/interfaces'
213
- import type { UI_T_Project } from '~/lib/models/types'
214
- import type { UI_I_DatastoreTableItem } from '~/lib/models/store/storage/interfaces'
215
- import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
216
- import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
217
- import type { UI_I_FolderOrFileTreePayload } from '~/lib/models/store/storage/interfaces'
218
- import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
219
- import type {
220
- UI_I_SendDataCpu,
221
- UI_I_SendDataMemory,
222
- UI_I_SendDataNewHardDisk,
223
- UI_I_SendDataNewNetwork,
224
- UI_I_SendDataVideoCard,
225
- UI_I_SendDataNewCdDvdDrive,
226
- UI_I_SendDataNewPciDevice,
227
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
228
- import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
229
- import type {
230
- UI_T_HardDiskType,
231
- UI_T_NetworkType,
232
- } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
233
- import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
234
- import type { UI_I_Localization } from '~/lib/models/interfaces'
235
- import type {
236
- API_UI_I_VmEditCpu,
237
- API_UI_I_VmEditMemory,
238
- UI_I_MediatedDevice,
239
- UI_I_PciDevice,
240
- } from '~/lib/models/store/vm/interfaces'
241
- import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
242
- import { dropdownItemsNewFunc } from './lib/config/dropdownItems'
243
-
244
- const cpuInvalid = defineModel<boolean>('cpuInvalid', { required: true })
245
- const memoryInvalid = defineModel<boolean>('memoryInvalid', { required: true })
246
- const videoCardInvalid = defineModel<boolean>('videoCardInvalid', {
247
- required: true,
248
- })
249
-
250
- const props = defineProps<{
251
- nodes: UI_I_FileTreeNode[]
252
- files: UI_I_FileTreeNode[]
253
- isEdit: boolean
254
- storage: UI_I_DatastoreTableItem | null
255
- project: UI_T_Project
256
- maxCpus: number
257
- maxMemory: number
258
- cpuModels: UI_I_OptionItem[]
259
- datastore: UI_I_DatastoreTableItem[]
260
- isDatastoreLoading: boolean
261
- networksType: UI_T_NetworkType[]
262
- networksTable: UI_I_NetworkTableItem[]
263
- // dropdownItems: UI_I_DropdownTreeItem[]
264
- hardDisksType: UI_T_HardDiskType[]
265
- networksIndex: number[]
266
- hardDisksIndex: number[]
267
- pciDevicesType: UI_T_NetworkType[]
268
- isShowFileModal: boolean
269
- pciDevicesIndex: number[]
270
- cdDvdDrivesType: UI_T_NetworkType[]
271
- cdDvdDrivesIndex: number[]
272
- errorValidationFields: UI_I_ErrorValidationField<string>[]
273
- getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
274
- cpu?: API_UI_I_VmEditCpu
275
- state?: string | number
276
- memory?: API_UI_I_VmEditMemory
277
- networks?: UI_I_SendDataNewNetwork[] | null
278
- hardDisks?: UI_I_SendDataNewHardDisk[] | null
279
- videoCard?: UI_I_SendDataVideoCard
280
- pciDevices?: UI_I_SendDataNewPciDevice[]
281
- cdDvdDrives?: UI_I_SendDataNewCdDvdDrive[] | null
282
- usbController?: string
283
- guestMachineType?: UI_I_OptionItem | null
284
- passthroughDevices?: UI_I_PciDevice[]
285
- mediatedDevices?: UI_I_MediatedDevice[]
286
- vmCpuHelpTextSecond?: string
287
- computeResource?: UI_I_TreeNode | null
288
- compatibilityInfo?: string
289
- }>()
290
- const emits = defineEmits<{
291
- (event: 'add-device', value: { value: number }): void
292
- (event: 'get-storage', value: UI_I_TablePayload): void
293
- (event: 'remove-network', value: number): void
294
- (event: 'hide-file-modal'): void
295
- (event: 'remove-hard-disk', value: [number, UI_I_SendDataNewHardDisk]): void
296
- (event: 'remove-pci-device', value: number): void
297
- (event: 'get-networks-table', value: UI_I_TablePayload): void
298
- (event: 'add-exist-hard-disk', value: UI_I_FileTreeNode): void
299
- (event: 'roll-back-hard-disk', value: number): void
300
- (event: 'set-invalid-network', value: [boolean, number]): void
301
- (
302
- event: 'remove-cd-dvd-drive',
303
- value: [number, UI_I_SendDataNewCdDvdDrive]
304
- ): void
305
- (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
306
- (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
307
- (event: 'send-data-cpu-method', value: UI_I_SendDataCpu): void
308
- (event: 'set-invalid-hard-disk', value: [boolean, number]): void
309
- (event: 'remove-error-by-title', value: string): void
310
- (event: 'roll-back-cd-dvd-drive', value: number): void
311
- (event: 'set-invalid-pci-device', value: [boolean, number]): void
312
- (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
313
- (event: 'send-data-memory-method', value: UI_I_SendDataMemory): void
314
- (event: 'send-data-video-card-method', value: UI_I_SendDataVideoCard): void
315
- (
316
- event: 'send-data-new-network-method',
317
- value: [UI_I_SendDataNewNetwork, number]
318
- ): void
319
- (
320
- event: 'send-data-pci-devices-method',
321
- value: [UI_I_SendDataNewPciDevice, number]
322
- ): void
323
- (
324
- event: 'send-data-new-hard-disk-method',
325
- value: [UI_I_SendDataNewHardDisk, number]
326
- ): void
327
- (
328
- event: 'send-data-new-cd-dvd-drive-method',
329
- value: [UI_I_SendDataNewCdDvdDrive, number]
330
- ): void
331
- (event: 'send-data-new-usb-controller-method', value: string): void
332
- }>()
333
-
334
- const { $text } = useNuxtApp()
335
-
336
- const localization = computed<UI_I_Localization>(() => useLocal())
337
-
338
- const isShowAddDeviceDropdown = ref<boolean>(false)
339
-
340
- // TODO
341
- const addNewDeviceText = computed<string>(() =>
342
- $text.toCapitalize(localization.value.common.addNewDevice)
343
- )
344
- const deviceCount = computed<number>(
345
- () =>
346
- (props.hardDisks?.length || 0) +
347
- (props.networks?.length || 0) +
348
- (props.cdDvdDrives?.length || 0) +
349
- (props.pciDevices?.length || 0) +
350
- 6
351
- )
352
- const deviceCountText = computed<string>(() =>
353
- localization.value.vmWizard.devices.replace(
354
- '{0}',
355
- deviceCount.value.toString()
356
- )
357
- )
358
- const dropdownItems = computed<UI_I_Dropdown[]>(() =>
359
- dropdownItemsNewFunc(
360
- localization.value,
361
- props.state,
362
- props.passthroughDevices,
363
- props.mediatedDevices
364
- )
365
- )
366
-
367
- const onAddDevice = (data: number): void => {
368
- isShowAddDeviceDropdown.value = false
369
- // из-за старого компонента
370
- emits('add-device', { value: data })
371
- }
372
- </script>
373
-
374
- <style>
375
- :root {
376
- --vm-wizard-block-view-bg-color: #fafafa;
377
- --add-device-dropdown-bg-color: #fff;
378
- --add-device-dropdown-bg-color-hover: #f6f7f8;
379
- --add-device-dropdown-active-bg-color-hover: #f0f8fd;
380
- --add-device-dropdown-border-color: #e9ebed;
381
- --add-device-dropdown-border-color-hover: #e9ebed;
382
- --add-device-dropdown-color: #4d5d69;
383
- --add-device-dropdown-color-hover: #4d5d69;
384
- --add-device-dropdown-item-title-color: #182531;
385
- }
386
- :root.dark-theme {
387
- --vm-wizard-block-view-bg-color: transparent;
388
- --add-device-dropdown-bg-color: #1b2a373d;
389
- //--add-device-dropdown-bg-color-hover: #2585b614;
390
- --add-device-dropdown-bg-color-hover: #b8bcc10a;
391
- --add-device-dropdown-active-bg-color-hover: #2785b614;
392
- --add-device-dropdown-border-color: #e9ebed1f;
393
- --add-device-dropdown-border-color-hover: #2ba2de;
394
- --add-device-dropdown-color: #e9eaec;
395
- --add-device-dropdown-color-hover: #2ba2de;
396
- --add-device-dropdown-item-title-color: #e9eaec;
397
- }
398
- </style>
399
-
400
- <style scoped lang="scss">
401
- .virtual-hardware {
402
- height: 100%;
403
- display: grid;
404
-
405
- .action-wrap {
406
- display: flex;
407
- align-items: center;
408
- justify-content: space-between;
409
- //padding: 12px;
410
-
411
- .device-count {
412
- font-size: 13px;
413
- font-weight: 500;
414
- line-height: 15.73px;
415
- color: #9da6ad;
416
- }
417
-
418
- .add-device-dropdown-wrap {
419
- #add-device-dropdown {
420
- display: flex;
421
- align-items: center;
422
- gap: 8px;
423
- background-color: var(--add-device-dropdown-bg-color);
424
- border: 1px solid var(--add-device-dropdown-border-color);
425
- border-radius: 6px;
426
- padding: 7px 12px;
427
- color: var(--add-device-dropdown-color);
428
- font-size: 13px;
429
- font-weight: 500;
430
- line-height: 15.73px;
431
- height: 32px;
432
-
433
- &:hover {
434
- background-color: var(--add-device-dropdown-bg-color-hover);
435
- border-color: var(--add-device-dropdown-border-color-hover);
436
- color: var(--add-device-dropdown-color-hover);
437
- }
438
-
439
- &.active {
440
- color: #008fd6;
441
- border-color: #008fd6;
442
-
443
- &:hover {
444
- background-color: var(--add-device-dropdown-active-bg-color-hover);
445
- }
446
- }
447
-
448
- .add-device-dropdown-text {
449
- font-weight: 500;
450
- font-family: 'Inter', sans-serif;
451
- text-transform: capitalize;
452
- }
453
- }
454
- :deep(.ui-popup-window) {
455
- overflow: hidden;
456
- padding: 8px 0;
457
-
458
- .ui-dropdown {
459
- overflow: auto;
460
- //max-height: calc(300px - 24px);
461
-
462
- .ui-dropdown-menu.md {
463
- padding: 0 8px;
464
-
465
- li {
466
- &.has-items .group-title {
467
- padding: 4px 8px 0;
468
- color: var(--add-device-dropdown-item-title-color);
469
- }
470
- &:not(:last-child) {
471
- margin-bottom: 4px;
472
- }
473
- //&:last-child ul li:last-child {
474
- //height: 26px;
475
- //align-items: flex-end;
476
- //}
477
- }
478
- }
479
- }
480
- }
481
- }
482
- }
483
- }
484
- .stack-view {
485
- display: flex;
486
- flex-direction: column;
487
- gap: 12px;
488
- padding-bottom: 12px;
489
- background-color: var(--vm-wizard-block-view-bg-color);
490
-
491
- .vm-hardware-version-wrap {
492
- align-items: flex-end;
493
- text-align: right;
494
-
495
- .vm-hardware-version {
496
- font-size: 13px;
497
- color: #9da6ad; // for light and dark
498
- }
499
- }
500
- }
501
- </style>
1
+ <template>
2
+ <div class="virtual-hardware">
3
+ <div class="action-wrap py-3">
4
+ <span class="device-count">{{ deviceCountText }}</span>
5
+
6
+ <div class="add-device-dropdown-wrap">
7
+ <button
8
+ id="add-device-dropdown"
9
+ :class="['cursor-pointer', { active: isShowAddDeviceDropdown }]"
10
+ data-id="add-device-dropdown"
11
+ @click="isShowAddDeviceDropdown = !isShowAddDeviceDropdown"
12
+ >
13
+ <ui-icon name="plus" width="18" height="18" />
14
+ <span class="add-device-dropdown-text">
15
+ {{ addNewDeviceText }}
16
+ </span>
17
+ </button>
18
+ <ui-dropdown
19
+ :items="dropdownItems"
20
+ :show="isShowAddDeviceDropdown"
21
+ :margin-between-trigger="4"
22
+ show-from-left
23
+ width="max-content"
24
+ elem-id="add-device-dropdown"
25
+ test-id="add-device-dropdown"
26
+ left
27
+ max-height="400px"
28
+ @select="onAddDevice"
29
+ @hide="isShowAddDeviceDropdown = false"
30
+ />
31
+ </div>
32
+ </div>
33
+
34
+ <div class="overflow-auto virtual-hardware-content-block">
35
+ <div class="stack-view">
36
+ <common-vm-actions-common-customize-hardware-virtual-hardware-cpu
37
+ :max-cpus="props.maxCpus"
38
+ :cpu-models="props.cpuModels"
39
+ :cpu="props.cpu"
40
+ :is-edit="props.isEdit"
41
+ :state="props.state"
42
+ :error-validation-fields="props.errorValidationFields"
43
+ :vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
44
+ @send-data="emits('send-data-cpu-method', $event)"
45
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
46
+ @invalid="cpuInvalid = $event"
47
+ />
48
+ <common-vm-actions-common-customize-hardware-virtual-hardware-memory
49
+ :max-memory="props.maxMemory"
50
+ :is-edit="props.isEdit"
51
+ :memory="props.memory"
52
+ :state="props.state"
53
+ :error-validation-fields="props.errorValidationFields"
54
+ @send-data="emits('send-data-memory-method', $event)"
55
+ @invalid="memoryInvalid = $event"
56
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
57
+ />
58
+ <common-vm-actions-common-customize-hardware-virtual-hardware-new-hard-disk
59
+ v-for="(item, key) in props.hardDisks"
60
+ :key="props.hardDisksIndex[key]"
61
+ :index="props.hardDisksIndex[key]"
62
+ :type="props.hardDisksType[key]"
63
+ :storage="props.storage"
64
+ :hard-disk="item"
65
+ :error-validation-fields="props.errorValidationFields"
66
+ :get-datastore-table-func="props.getDatastoreTableFunc"
67
+ :datastore="props.datastore"
68
+ :is-datastore-loading="props.isDatastoreLoading"
69
+ :is-edit="props.isEdit"
70
+ :state="props.state"
71
+ :guest-machine-type="props.guestMachineType"
72
+ :compute-resource="props.computeResource"
73
+ @remove="emits('remove-hard-disk', [props.hardDisksIndex[key], item])"
74
+ @roll-back="emits('roll-back-hard-disk', props.hardDisksIndex[key])"
75
+ @send-data="
76
+ emits('send-data-new-hard-disk-method', [
77
+ $event,
78
+ props.hardDisksIndex[key],
79
+ ])
80
+ "
81
+ @invalid="
82
+ emits('set-invalid-hard-disk', [$event, props.hardDisksIndex[key]])
83
+ "
84
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
85
+ />
86
+ <common-vm-actions-common-customize-hardware-virtual-hardware-new-network
87
+ v-for="(item, key) in props.networks"
88
+ :key="props.networksIndex[key]"
89
+ :index="props.networksIndex[key]"
90
+ :type="props.networksType[key]"
91
+ :network="item"
92
+ :networks-table="props.networksTable"
93
+ :error-validation-fields="props.errorValidationFields"
94
+ :is-edit="props.isEdit"
95
+ :state="props.state"
96
+ :project="props.project"
97
+ @remove="emits('remove-network', props.networksIndex[key])"
98
+ @send-data="
99
+ emits('send-data-new-network-method', [
100
+ $event,
101
+ props.networksIndex[key],
102
+ ])
103
+ "
104
+ @invalid="
105
+ emits('set-invalid-network', [$event, props.networksIndex[key]])
106
+ "
107
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
108
+ @get-networks-table="emits('get-networks-table', $event)"
109
+ />
110
+ <common-vm-actions-common-customize-hardware-virtual-hardware-cd-dvd-drive
111
+ v-for="(item, key) in props.cdDvdDrives"
112
+ :key="props.cdDvdDrivesIndex[key]"
113
+ :index="props.cdDvdDrivesIndex[key]"
114
+ :hard-disks-count="props.hardDisks?.length || 0"
115
+ :type="props.cdDvdDrivesType[key]"
116
+ :cd-dvd-drive="item"
117
+ :nodes="props.nodes"
118
+ :files="props.files"
119
+ :error-validation-fields="props.errorValidationFields"
120
+ :is-edit="props.isEdit"
121
+ :state="props.state"
122
+ :guest-machine-type="props.guestMachineType"
123
+ :compute-resource="props.computeResource"
124
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
125
+ @get-storage="emits('get-storage', $event)"
126
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
127
+ @get-active-device-child="emits('get-active-device-child', $event)"
128
+ @show-datastore-child="emits('show-datastore-child', $event)"
129
+ @remove="
130
+ emits('remove-cd-dvd-drive', [props.cdDvdDrivesIndex[key], item])
131
+ "
132
+ @roll-back="
133
+ emits('roll-back-cd-dvd-drive', props.cdDvdDrivesIndex[key])
134
+ "
135
+ @send-data="
136
+ emits('send-data-new-cd-dvd-drive-method', [
137
+ $event,
138
+ props.cdDvdDrivesIndex[key],
139
+ ])
140
+ "
141
+ />
142
+ <common-vm-actions-common-customize-hardware-virtual-hardware-new-usb-controller
143
+ :usb-controller="props.usbController"
144
+ :is-edit="props.isEdit"
145
+ :state="props.state"
146
+ @send-data="emits('send-data-new-usb-controller-method', $event)"
147
+ />
148
+ <template v-if="props.passthroughDevices || props.mediatedDevices">
149
+ <common-vm-actions-common-customize-hardware-virtual-hardware-new-pci-device
150
+ v-for="(item, key) in props.pciDevices"
151
+ :key="props.pciDevicesIndex[key]"
152
+ :index="props.pciDevicesIndex[key]"
153
+ :pci-device="item"
154
+ :error-validation-fields="props.errorValidationFields"
155
+ :passthrough-devices="props.passthroughDevices"
156
+ :mediated-devices="props.mediatedDevices"
157
+ :type="props.pciDevicesType[key]"
158
+ :is-edit="props.isEdit"
159
+ :state="props.state"
160
+ @remove="emits('remove-pci-device', props.pciDevicesIndex[key])"
161
+ @send-data="
162
+ emits('send-data-pci-devices-method', [
163
+ $event,
164
+ props.pciDevicesIndex[key],
165
+ ])
166
+ "
167
+ @invalid="
168
+ emits('set-invalid-pci-device', [
169
+ $event,
170
+ props.pciDevicesIndex[key],
171
+ ])
172
+ "
173
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
174
+ />
175
+ </template>
176
+ <common-vm-actions-common-customize-hardware-virtual-hardware-video-card
177
+ :is-edit="props.isEdit"
178
+ :video-card="props.videoCard"
179
+ :error-validation-fields="props.errorValidationFields"
180
+ :state="props.state"
181
+ @send-data="emits('send-data-video-card-method', $event)"
182
+ @invalid="videoCardInvalid = $event"
183
+ @remove-error-by-title="emits('remove-error-by-title', $event)"
184
+ />
185
+ <common-vm-actions-common-customize-hardware-virtual-hardware-other />
186
+ <div v-if="props.compatibilityInfo" class="vm-hardware-version-wrap justify-end flex flex-1 mt-4">
187
+ <span class="vm-hardware-version">
188
+ {{ props.compatibilityInfo }}
189
+ </span>
190
+ </div>
191
+ </div>
192
+ </div>
193
+
194
+ <Teleport to="body">
195
+ <common-vm-actions-common-customize-hardware-virtual-hardware-browse-view
196
+ v-if="props.isShowFileModal"
197
+ show
198
+ :nodes="props.nodes"
199
+ :files="props.files"
200
+ @submit="emits('add-exist-hard-disk', $event)"
201
+ @get-storage="emits('get-storage', $event)"
202
+ @get-folders-or-files="emits('get-folders-or-files', $event)"
203
+ @get-active-device-child="emits('get-active-device-child', $event)"
204
+ @show-datastore-child="emits('show-datastore-child', $event)"
205
+ @hide="emits('hide-file-modal')"
206
+ />
207
+ </Teleport>
208
+ </div>
209
+ </template>
210
+
211
+ <script setup lang="ts">
212
+ import type { UI_I_Dropdown } from '~/node_modules/bfg-uikit/components/ui/dropdown/models/interfaces'
213
+ import type { UI_T_Project } from '~/lib/models/types'
214
+ import type { UI_I_DatastoreTableItem } from '~/lib/models/store/storage/interfaces'
215
+ import type { UI_I_NetworkTableItem } from '~/lib/models/store/network/interfaces'
216
+ import type { UI_I_TablePayload } from '~/lib/models/table/interfaces'
217
+ import type { UI_I_FolderOrFileTreePayload } from '~/lib/models/store/storage/interfaces'
218
+ import type { UI_I_FileTreeNode } from '~/components/lib/models/interfaces'
219
+ import type {
220
+ UI_I_SendDataCpu,
221
+ UI_I_SendDataMemory,
222
+ UI_I_SendDataNewHardDisk,
223
+ UI_I_SendDataNewNetwork,
224
+ UI_I_SendDataVideoCard,
225
+ UI_I_SendDataNewCdDvdDrive,
226
+ UI_I_SendDataNewPciDevice,
227
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/interfaces'
228
+ import type { UI_I_ErrorValidationField } from '~/lib/models/store/interfaces'
229
+ import type {
230
+ UI_T_HardDiskType,
231
+ UI_T_NetworkType,
232
+ } from '~/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/models/types'
233
+ import type { UI_I_OptionItem } from '~/components/atoms/lib/models/interfaces'
234
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
235
+ import type {
236
+ API_UI_I_VmEditCpu,
237
+ API_UI_I_VmEditMemory,
238
+ UI_I_MediatedDevice,
239
+ UI_I_PciDevice,
240
+ } from '~/lib/models/store/vm/interfaces'
241
+ import type { UI_I_TreeNode } from '~/components/common/recursionTree/lib/models/interfaces'
242
+ import { dropdownItemsNewFunc } from './lib/config/dropdownItems'
243
+
244
+ const cpuInvalid = defineModel<boolean>('cpuInvalid', { required: true })
245
+ const memoryInvalid = defineModel<boolean>('memoryInvalid', { required: true })
246
+ const videoCardInvalid = defineModel<boolean>('videoCardInvalid', {
247
+ required: true,
248
+ })
249
+
250
+ const props = defineProps<{
251
+ nodes: UI_I_FileTreeNode[]
252
+ files: UI_I_FileTreeNode[]
253
+ isEdit: boolean
254
+ storage: UI_I_DatastoreTableItem | null
255
+ project: UI_T_Project
256
+ maxCpus: number
257
+ maxMemory: number
258
+ cpuModels: UI_I_OptionItem[]
259
+ datastore: UI_I_DatastoreTableItem[]
260
+ isDatastoreLoading: boolean
261
+ networksType: UI_T_NetworkType[]
262
+ networksTable: UI_I_NetworkTableItem[]
263
+ // dropdownItems: UI_I_DropdownTreeItem[]
264
+ hardDisksType: UI_T_HardDiskType[]
265
+ networksIndex: number[]
266
+ hardDisksIndex: number[]
267
+ pciDevicesType: UI_T_NetworkType[]
268
+ isShowFileModal: boolean
269
+ pciDevicesIndex: number[]
270
+ cdDvdDrivesType: UI_T_NetworkType[]
271
+ cdDvdDrivesIndex: number[]
272
+ errorValidationFields: UI_I_ErrorValidationField<string>[]
273
+ getDatastoreTableFunc: (payload: UI_I_TablePayload) => Promise<void>
274
+ cpu?: API_UI_I_VmEditCpu
275
+ state?: string | number
276
+ memory?: API_UI_I_VmEditMemory
277
+ networks?: UI_I_SendDataNewNetwork[] | null
278
+ hardDisks?: UI_I_SendDataNewHardDisk[] | null
279
+ videoCard?: UI_I_SendDataVideoCard
280
+ pciDevices?: UI_I_SendDataNewPciDevice[]
281
+ cdDvdDrives?: UI_I_SendDataNewCdDvdDrive[] | null
282
+ usbController?: string
283
+ guestMachineType?: UI_I_OptionItem | null
284
+ passthroughDevices?: UI_I_PciDevice[]
285
+ mediatedDevices?: UI_I_MediatedDevice[]
286
+ vmCpuHelpTextSecond?: string
287
+ computeResource?: UI_I_TreeNode | null
288
+ compatibilityInfo?: string
289
+ }>()
290
+ const emits = defineEmits<{
291
+ (event: 'add-device', value: { value: number }): void
292
+ (event: 'get-storage', value: UI_I_TablePayload): void
293
+ (event: 'remove-network', value: number): void
294
+ (event: 'hide-file-modal'): void
295
+ (event: 'remove-hard-disk', value: [number, UI_I_SendDataNewHardDisk]): void
296
+ (event: 'remove-pci-device', value: number): void
297
+ (event: 'get-networks-table', value: UI_I_TablePayload): void
298
+ (event: 'add-exist-hard-disk', value: UI_I_FileTreeNode): void
299
+ (event: 'roll-back-hard-disk', value: number): void
300
+ (event: 'set-invalid-network', value: [boolean, number]): void
301
+ (
302
+ event: 'remove-cd-dvd-drive',
303
+ value: [number, UI_I_SendDataNewCdDvdDrive]
304
+ ): void
305
+ (event: 'show-datastore-child', value: UI_I_FileTreeNode): void
306
+ (event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
307
+ (event: 'send-data-cpu-method', value: UI_I_SendDataCpu): void
308
+ (event: 'set-invalid-hard-disk', value: [boolean, number]): void
309
+ (event: 'remove-error-by-title', value: string): void
310
+ (event: 'roll-back-cd-dvd-drive', value: number): void
311
+ (event: 'set-invalid-pci-device', value: [boolean, number]): void
312
+ (event: 'get-active-device-child', value: UI_I_FileTreeNode): void
313
+ (event: 'send-data-memory-method', value: UI_I_SendDataMemory): void
314
+ (event: 'send-data-video-card-method', value: UI_I_SendDataVideoCard): void
315
+ (
316
+ event: 'send-data-new-network-method',
317
+ value: [UI_I_SendDataNewNetwork, number]
318
+ ): void
319
+ (
320
+ event: 'send-data-pci-devices-method',
321
+ value: [UI_I_SendDataNewPciDevice, number]
322
+ ): void
323
+ (
324
+ event: 'send-data-new-hard-disk-method',
325
+ value: [UI_I_SendDataNewHardDisk, number]
326
+ ): void
327
+ (
328
+ event: 'send-data-new-cd-dvd-drive-method',
329
+ value: [UI_I_SendDataNewCdDvdDrive, number]
330
+ ): void
331
+ (event: 'send-data-new-usb-controller-method', value: string): void
332
+ }>()
333
+
334
+ const { $text } = useNuxtApp()
335
+
336
+ const localization = computed<UI_I_Localization>(() => useLocal())
337
+
338
+ const isShowAddDeviceDropdown = ref<boolean>(false)
339
+
340
+ // TODO
341
+ const addNewDeviceText = computed<string>(() =>
342
+ $text.toCapitalize(localization.value.common.addNewDevice)
343
+ )
344
+ const deviceCount = computed<number>(
345
+ () =>
346
+ (props.hardDisks?.length || 0) +
347
+ (props.networks?.length || 0) +
348
+ (props.cdDvdDrives?.length || 0) +
349
+ (props.pciDevices?.length || 0) +
350
+ 6
351
+ )
352
+ const deviceCountText = computed<string>(() =>
353
+ localization.value.vmWizard.devices.replace(
354
+ '{0}',
355
+ deviceCount.value.toString()
356
+ )
357
+ )
358
+ const dropdownItems = computed<UI_I_Dropdown[]>(() =>
359
+ dropdownItemsNewFunc(
360
+ localization.value,
361
+ props.state,
362
+ props.passthroughDevices,
363
+ props.mediatedDevices
364
+ )
365
+ )
366
+
367
+ const onAddDevice = (data: number): void => {
368
+ isShowAddDeviceDropdown.value = false
369
+ // из-за старого компонента
370
+ emits('add-device', { value: data })
371
+ }
372
+ </script>
373
+
374
+ <style>
375
+ :root {
376
+ --vm-wizard-block-view-bg-color: #fafafa;
377
+ --add-device-dropdown-bg-color: #fff;
378
+ --add-device-dropdown-bg-color-hover: #f6f7f8;
379
+ --add-device-dropdown-active-bg-color-hover: #f0f8fd;
380
+ --add-device-dropdown-border-color: #e9ebed;
381
+ --add-device-dropdown-border-color-hover: #e9ebed;
382
+ --add-device-dropdown-color: #4d5d69;
383
+ --add-device-dropdown-color-hover: #4d5d69;
384
+ --add-device-dropdown-item-title-color: #182531;
385
+ }
386
+ :root.dark-theme {
387
+ --vm-wizard-block-view-bg-color: transparent;
388
+ --add-device-dropdown-bg-color: #1b2a373d;
389
+ //--add-device-dropdown-bg-color-hover: #2585b614;
390
+ --add-device-dropdown-bg-color-hover: #b8bcc10a;
391
+ --add-device-dropdown-active-bg-color-hover: #2785b614;
392
+ --add-device-dropdown-border-color: #e9ebed1f;
393
+ --add-device-dropdown-border-color-hover: #2ba2de;
394
+ --add-device-dropdown-color: #e9eaec;
395
+ --add-device-dropdown-color-hover: #2ba2de;
396
+ --add-device-dropdown-item-title-color: #e9eaec;
397
+ }
398
+ </style>
399
+
400
+ <style scoped lang="scss">
401
+ .virtual-hardware {
402
+ height: 100%;
403
+ display: grid;
404
+
405
+ .action-wrap {
406
+ display: flex;
407
+ align-items: center;
408
+ justify-content: space-between;
409
+ //padding: 12px;
410
+
411
+ .device-count {
412
+ font-size: 13px;
413
+ font-weight: 500;
414
+ line-height: 15.73px;
415
+ color: #9da6ad;
416
+ }
417
+
418
+ .add-device-dropdown-wrap {
419
+ #add-device-dropdown {
420
+ display: flex;
421
+ align-items: center;
422
+ gap: 8px;
423
+ background-color: var(--add-device-dropdown-bg-color);
424
+ border: 1px solid var(--add-device-dropdown-border-color);
425
+ border-radius: 6px;
426
+ padding: 7px 12px;
427
+ color: var(--add-device-dropdown-color);
428
+ font-size: 13px;
429
+ font-weight: 500;
430
+ line-height: 15.73px;
431
+ height: 32px;
432
+
433
+ &:hover {
434
+ background-color: var(--add-device-dropdown-bg-color-hover);
435
+ border-color: var(--add-device-dropdown-border-color-hover);
436
+ color: var(--add-device-dropdown-color-hover);
437
+ }
438
+
439
+ &.active {
440
+ color: #008fd6;
441
+ border-color: #008fd6;
442
+
443
+ &:hover {
444
+ background-color: var(--add-device-dropdown-active-bg-color-hover);
445
+ }
446
+ }
447
+
448
+ .add-device-dropdown-text {
449
+ font-weight: 500;
450
+ font-family: 'Inter', sans-serif;
451
+ text-transform: capitalize;
452
+ }
453
+ }
454
+ :deep(.ui-popup-window) {
455
+ overflow: hidden;
456
+ padding: 8px 0;
457
+
458
+ .ui-dropdown {
459
+ overflow: auto;
460
+ //max-height: calc(300px - 24px);
461
+
462
+ .ui-dropdown-menu.md {
463
+ padding: 0 8px;
464
+
465
+ li {
466
+ &.has-items .group-title {
467
+ padding: 4px 8px 0;
468
+ color: var(--add-device-dropdown-item-title-color);
469
+ }
470
+ &:not(:last-child) {
471
+ margin-bottom: 4px;
472
+ }
473
+ //&:last-child ul li:last-child {
474
+ //height: 26px;
475
+ //align-items: flex-end;
476
+ //}
477
+ }
478
+ }
479
+ }
480
+ }
481
+ }
482
+ }
483
+ }
484
+ .stack-view {
485
+ display: flex;
486
+ flex-direction: column;
487
+ gap: 12px;
488
+ padding-bottom: 12px;
489
+ background-color: var(--vm-wizard-block-view-bg-color);
490
+
491
+ .vm-hardware-version-wrap {
492
+ align-items: flex-end;
493
+ text-align: right;
494
+
495
+ .vm-hardware-version {
496
+ font-size: 13px;
497
+ color: #9da6ad; // for light and dark
498
+ }
499
+ }
500
+ }
501
+ </style>