bfg-common 1.5.188 → 1.5.190
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.
- package/assets/localization/local_be.json +6 -1
- package/assets/localization/local_en.json +6 -1
- package/assets/localization/local_hy.json +6 -1
- package/assets/localization/local_kk.json +6 -1
- package/assets/localization/local_ru.json +7 -2
- package/assets/localization/local_zh.json +6 -1
- package/assets/scss/common/theme.scss +8 -4
- package/components/common/portlets/customAttributes/Portlet.vue +9 -5
- package/components/common/portlets/customAttributes/lib/config/config.ts +1 -0
- package/components/common/portlets/tag/Portlet.vue +9 -5
- package/components/common/portlets/tag/lib/config/config.ts +1 -0
- package/components/common/split/horizontal/HorizontalNew.vue +5 -2
- package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareNew.vue +76 -73
- package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/NewHardDiskNew.vue +0 -6
- package/components/common/vm/actions/common/customizeHardware/virtualHardware/newHardDisk/cache/lib/config/options.ts +4 -4
- package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/OrderNew.vue +15 -2
- package/components/common/vm/actions/common/customizeHardware/vmoptions/generalOptions/GeneralOptionsNew.vue +4 -1
- package/components/common/vm/actions/common/customizeHardware/vmoptions/remoteConsoleOptions/password/PasswordNew.vue +27 -2
- package/lib/utils/utils.ts +48 -48
- package/package.json +2 -2
|
@@ -2949,6 +2949,7 @@
|
|
|
2949
2949
|
"createdHosts": "Створаны хасты",
|
|
2950
2950
|
"availableZabbixServer": "Даступна на серверы Zabbix",
|
|
2951
2951
|
"addNew": "Дадаць новы",
|
|
2952
|
+
"addNew2": "Дадаць новы",
|
|
2952
2953
|
"main": "Асноўны",
|
|
2953
2954
|
"useIp": "Выкарыстоўвайце IP",
|
|
2954
2955
|
"ip": "IP",
|
|
@@ -3058,7 +3059,11 @@
|
|
|
3058
3059
|
"sameFormatAsSource": "Той жа фармат, што і крыніца",
|
|
3059
3060
|
"thickProvisionLazyZeroed": "Тоўстае выдзяленне з адкладзеным абнуленнем",
|
|
3060
3061
|
"thickProvisionEagerZeroed": "Тоўстае выдзяленне з неадкладным абнуленнем",
|
|
3061
|
-
"thinProvision": "Тонкае выдзяленне"
|
|
3062
|
+
"thinProvision": "Тонкае выдзяленне",
|
|
3063
|
+
"writeThrough": "Скразны запіс",
|
|
3064
|
+
"writeBack": "Адкладзены запіс",
|
|
3065
|
+
"directSync": "Сінхронны прамы запіс",
|
|
3066
|
+
"unsafe": "Небяспечны рэжым"
|
|
3062
3067
|
},
|
|
3063
3068
|
"feedback": {
|
|
3064
3069
|
"additionalDetailsHelp": "Даведка па дадатковых звестках",
|
|
@@ -2953,6 +2953,7 @@
|
|
|
2953
2953
|
"createdHosts": "Created Hosts",
|
|
2954
2954
|
"availableZabbixServer": "Available in Zabbix Server",
|
|
2955
2955
|
"addNew": "Add New",
|
|
2956
|
+
"addNew2": "Add New",
|
|
2956
2957
|
"main": "Main",
|
|
2957
2958
|
"useIp": "Use IP",
|
|
2958
2959
|
"ip": "IP",
|
|
@@ -3062,7 +3063,11 @@
|
|
|
3062
3063
|
"sameFormatAsSource": "Same Format as source",
|
|
3063
3064
|
"thickProvisionLazyZeroed": "Thick Provision Lazy Zeroed",
|
|
3064
3065
|
"thickProvisionEagerZeroed": "Thick Provision Eager Zeroed",
|
|
3065
|
-
"thinProvision": "Thin Provision"
|
|
3066
|
+
"thinProvision": "Thin Provision",
|
|
3067
|
+
"writeThrough": "Write Through",
|
|
3068
|
+
"writeBack": "Write Back",
|
|
3069
|
+
"directSync": "Direct Sync",
|
|
3070
|
+
"unsafe": "Unsafe"
|
|
3066
3071
|
},
|
|
3067
3072
|
"feedback": {
|
|
3068
3073
|
"additionalDetailsHelp": "Additional Details Help",
|
|
@@ -2953,6 +2953,7 @@
|
|
|
2953
2953
|
"createdHosts": "Ստեղծված Հոսթեր",
|
|
2954
2954
|
"availableZabbixServer": "Հասանելի է Zabbix սերվերում",
|
|
2955
2955
|
"addNew": "Ավելացնել նոր",
|
|
2956
|
+
"addNew2": "Ավելացնել նորը",
|
|
2956
2957
|
"main": "Հիմնական",
|
|
2957
2958
|
"useIp": "Օգտագործվող IP",
|
|
2958
2959
|
"ip": "IP",
|
|
@@ -3062,7 +3063,11 @@
|
|
|
3062
3063
|
"sameFormatAsSource": "Նույն ձևաչափը, ինչպես աղբյուրը",
|
|
3063
3064
|
"thickProvisionLazyZeroed": "Հաստ պահուստ Ծույլ զրոյացում",
|
|
3064
3065
|
"thickProvisionEagerZeroed": "Անհամբերի ճարպի պաշարը զրոյացվել է",
|
|
3065
|
-
"thinProvision": "Նուրբ պատրաստում"
|
|
3066
|
+
"thinProvision": "Նուրբ պատրաստում",
|
|
3067
|
+
"writeThrough": "Ձայնագրման միջոցով",
|
|
3068
|
+
"writeBack": "Ձայնագրման ուշացում",
|
|
3069
|
+
"directSync": "Սինխրոն ուղիղ ձայնագրություն",
|
|
3070
|
+
"unsafe": "Անապահով ռեժիմ"
|
|
3066
3071
|
},
|
|
3067
3072
|
"feedback": {
|
|
3068
3073
|
"additionalDetailsHelp": "Լրացուցիչ մանրամասներ Օգնություն",
|
|
@@ -2952,6 +2952,7 @@
|
|
|
2952
2952
|
"createdHosts": "Жасалған хосттар",
|
|
2953
2953
|
"availableZabbixServer": "Zabbix серверінде қол жетімді",
|
|
2954
2954
|
"addNew": "Жаңа қосу",
|
|
2955
|
+
"addNew2": "Жаңа қосу",
|
|
2955
2956
|
"main": "Негізгі",
|
|
2956
2957
|
"useIp": "IP пайдаланыңыз",
|
|
2957
2958
|
"ip": "IP",
|
|
@@ -3061,7 +3062,11 @@
|
|
|
3061
3062
|
"sameFormatAsSource": "Дереккөзбен бірдей пішім",
|
|
3062
3063
|
"thickProvisionLazyZeroed": "Қалың резерв Жалқау нөлдеу",
|
|
3063
3064
|
"thickProvisionEagerZeroed": "Шыдамсыз адамның май қоры нөлге дейін қалпына келтірілді",
|
|
3064
|
-
"thinProvision": "Жақсы дайындық"
|
|
3065
|
+
"thinProvision": "Жақсы дайындық",
|
|
3066
|
+
"writeThrough": "Жазба арқылы",
|
|
3067
|
+
"writeBack": "Кешіктірілген жазу",
|
|
3068
|
+
"directSync": "Синхронды тікелей жазу",
|
|
3069
|
+
"unsafe": "Қауіпті режим"
|
|
3065
3070
|
},
|
|
3066
3071
|
"feedback": {
|
|
3067
3072
|
"additionalDetailsHelp": "Қосымша мәліметтер анықтамасы",
|
|
@@ -1638,7 +1638,7 @@
|
|
|
1638
1638
|
"virtualApp": "Виртуальное приложение",
|
|
1639
1639
|
"virtualDeviceNode": "Узел виртуального устройства",
|
|
1640
1640
|
"virtualDisk": "Виртуальный диск",
|
|
1641
|
-
"virtualFlash": "
|
|
1641
|
+
"virtualFlash": " Виртуальный флеш-накопитель",
|
|
1642
1642
|
"virtualFlashHostSwapCache": "Виртуальный флэш-кэш подкачки хоста",
|
|
1643
1643
|
"virtualFlashResource": "Виртуальный флэш-ресурс",
|
|
1644
1644
|
"virtualFlashResourceManagement": "Управление виртуальными флэш-ресурсами",
|
|
@@ -2952,6 +2952,7 @@
|
|
|
2952
2952
|
"createdHosts": "Созданные хосты",
|
|
2953
2953
|
"availableZabbixServer": "Доступно на Zabbix сервере",
|
|
2954
2954
|
"addNew": "Добавить",
|
|
2955
|
+
"addNew2": "Добавить новый",
|
|
2955
2956
|
"main": "Основной",
|
|
2956
2957
|
"useIp": "Использовать IP",
|
|
2957
2958
|
"ip": "IP",
|
|
@@ -3061,7 +3062,11 @@
|
|
|
3061
3062
|
"sameFormatAsSource": "Тот же формат, что и источник",
|
|
3062
3063
|
"thickProvisionLazyZeroed": "\"Толстый\" том",
|
|
3063
3064
|
"thickProvisionEagerZeroed": "\"Толстый\" том с очисткой",
|
|
3064
|
-
"thinProvision": "\"Тонкий\" том"
|
|
3065
|
+
"thinProvision": "\"Тонкий\" том",
|
|
3066
|
+
"writeThrough": "Сквозная запись",
|
|
3067
|
+
"writeBack": "Отложенная запись",
|
|
3068
|
+
"directSync": "Синхронная прямая запись",
|
|
3069
|
+
"unsafe": "Небезопасный режим"
|
|
3065
3070
|
},
|
|
3066
3071
|
"feedback": {
|
|
3067
3072
|
"additionalDetailsHelp": "Дополнительная информация Помощь",
|
|
@@ -2950,6 +2950,7 @@
|
|
|
2950
2950
|
"createdHosts": "创建的主机",
|
|
2951
2951
|
"availableZabbixServer": "在 Zabbix 服务器中可用",
|
|
2952
2952
|
"addNew": "添加新内容",
|
|
2953
|
+
"addNew2": "添加新内容",
|
|
2953
2954
|
"main": "主要的",
|
|
2954
2955
|
"useIp": "使用IP",
|
|
2955
2956
|
"ip": "IP",
|
|
@@ -3059,7 +3060,11 @@
|
|
|
3059
3060
|
"sameFormatAsSource": "与源格式相同",
|
|
3060
3061
|
"thickProvisionLazyZeroed": "厚储备延迟归零",
|
|
3061
3062
|
"thickProvisionEagerZeroed": "不耐烦的脂肪供应已归零",
|
|
3062
|
-
"thinProvision": "苗条的位置"
|
|
3063
|
+
"thinProvision": "苗条的位置",
|
|
3064
|
+
"writeThrough": "直写式",
|
|
3065
|
+
"writeBack": "延迟录音",
|
|
3066
|
+
"directSync": "同步直接记录",
|
|
3067
|
+
"unsafe": "不安全模式"
|
|
3063
3068
|
},
|
|
3064
3069
|
"feedback": {
|
|
3065
3070
|
"additionalDetailsHelp": "其他详细信息帮助",
|
|
@@ -143,8 +143,10 @@
|
|
|
143
143
|
|
|
144
144
|
/* Table Action */
|
|
145
145
|
--table-actions-icon: #4d5d69;
|
|
146
|
-
--table-actions-icon-hover: #
|
|
147
|
-
--table-actions-
|
|
146
|
+
--table-actions-icon-hover: #182531;
|
|
147
|
+
--table-actions-icon-active: #008fd6;
|
|
148
|
+
--table-actions-view: #4d5d69;
|
|
149
|
+
--table-actions-view-hover: #182531;
|
|
148
150
|
--table-actions-remove: #ea3223;
|
|
149
151
|
--table-actions-bg-hover: #e9ebed66;
|
|
150
152
|
|
|
@@ -262,7 +264,7 @@
|
|
|
262
264
|
--nav-panel-border-color: #495865;
|
|
263
265
|
|
|
264
266
|
//--gutter-bg-color: #25333d; // for old
|
|
265
|
-
--gutter-bg-color: #
|
|
267
|
+
--gutter-bg-color: #e9ebed1f; // for new
|
|
266
268
|
--gutter-hover-bg-color: #495a67;
|
|
267
269
|
--gutter-active-bg-color: #495a67;
|
|
268
270
|
--gutter-before-bg: rgba(157, 166, 173, 0.32);
|
|
@@ -303,7 +305,9 @@
|
|
|
303
305
|
/* Table Action */
|
|
304
306
|
--table-actions-icon: #e9eaec;
|
|
305
307
|
--table-actions-icon-hover: #ffffff;
|
|
306
|
-
--table-actions-
|
|
308
|
+
--table-actions-icon-active: #2ba2de;
|
|
309
|
+
--table-actions-view: #e9eaec;
|
|
310
|
+
--table-actions-view-hover: #ffffff;
|
|
307
311
|
--table-actions-remove: #ea3223;
|
|
308
312
|
--table-actions-bg-hover: #e9ebed0f;
|
|
309
313
|
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
:is-open="props.isOpen"
|
|
10
10
|
:portlet-id="props.portletId"
|
|
11
11
|
:is-loading="props.isLoading"
|
|
12
|
+
:is-last="props.isLast"
|
|
12
13
|
@toggle="onTogglePortlet"
|
|
13
14
|
>
|
|
14
15
|
<template #portletBody="{ isLoadingBody }">
|
|
@@ -166,7 +167,7 @@
|
|
|
166
167
|
is-without-sizes
|
|
167
168
|
@click="onAddNew"
|
|
168
169
|
>
|
|
169
|
-
{{ localization.zabbix.
|
|
170
|
+
{{ localization.zabbix.addNew2 }}...
|
|
170
171
|
</ui-button>
|
|
171
172
|
<ui-portlet-skeleton-footer v-else />
|
|
172
173
|
</div>
|
|
@@ -217,6 +218,7 @@ const props = defineProps<{
|
|
|
217
218
|
type: UI_I_Dropdown
|
|
218
219
|
bodyItems: UI_I_DataTableBody[]
|
|
219
220
|
isLoading: boolean
|
|
221
|
+
isLast: boolean
|
|
220
222
|
}>()
|
|
221
223
|
|
|
222
224
|
const localization = computed<UI_I_Localization>(() => useLocal())
|
|
@@ -492,10 +494,12 @@ const onTogglePortlet = (id: string): void => {
|
|
|
492
494
|
cursor: pointer;
|
|
493
495
|
color: var(--table-actions-icon);
|
|
494
496
|
|
|
495
|
-
&:hover
|
|
496
|
-
&.selected {
|
|
497
|
+
&:hover {
|
|
497
498
|
color: var(--table-actions-icon-hover);
|
|
498
499
|
}
|
|
500
|
+
&.selected {
|
|
501
|
+
color: var(--table-actions-icon-active);
|
|
502
|
+
}
|
|
499
503
|
}
|
|
500
504
|
|
|
501
505
|
.action-remove {
|
|
@@ -543,6 +547,7 @@ const onTogglePortlet = (id: string): void => {
|
|
|
543
547
|
|
|
544
548
|
&:hover {
|
|
545
549
|
background: var(--table-actions-bg-hover);
|
|
550
|
+
color: var(--table-actions-view-hover);
|
|
546
551
|
}
|
|
547
552
|
}
|
|
548
553
|
|
|
@@ -551,8 +556,7 @@ const onTogglePortlet = (id: string): void => {
|
|
|
551
556
|
|
|
552
557
|
:deep(button.ui-btn) {
|
|
553
558
|
line-height: 16px;
|
|
554
|
-
margin-bottom:
|
|
555
|
-
margin-left: 6px;
|
|
559
|
+
margin-bottom: 8px;
|
|
556
560
|
width: fit-content;
|
|
557
561
|
}
|
|
558
562
|
}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
:is-open="props.isOpen"
|
|
8
8
|
:portlet-id="props.portletId"
|
|
9
9
|
:is-loading="props.isLoading"
|
|
10
|
+
:is-last="props.isLast"
|
|
10
11
|
class="tags"
|
|
11
12
|
test-id="tags-portlet"
|
|
12
13
|
@toggle="onTogglePortlet"
|
|
@@ -26,6 +27,7 @@
|
|
|
26
27
|
<template #icon="{ item }">
|
|
27
28
|
<div class="actions-dropdown-button-container">
|
|
28
29
|
<span
|
|
30
|
+
v-development="true"
|
|
29
31
|
:id="`actions-tags-${item.data.row}`"
|
|
30
32
|
:class="[
|
|
31
33
|
'icon-container',
|
|
@@ -54,7 +56,6 @@
|
|
|
54
56
|
<span>{{ localization.common.viewDetails }}</span>
|
|
55
57
|
</div>
|
|
56
58
|
<div
|
|
57
|
-
v-development="true"
|
|
58
59
|
class="action-remove"
|
|
59
60
|
data-id="show-remove-tag-dialog-action"
|
|
60
61
|
@click="onShowRemoveDialog(item.data.row)"
|
|
@@ -138,6 +139,7 @@ const props = defineProps<{
|
|
|
138
139
|
selectedItemName: string
|
|
139
140
|
bodyItems: UI_I_DataTableBody[]
|
|
140
141
|
isLoading: boolean
|
|
142
|
+
isLast: boolean
|
|
141
143
|
}>()
|
|
142
144
|
|
|
143
145
|
const emits = defineEmits<{
|
|
@@ -363,10 +365,12 @@ const onTogglePortlet = (id: string): void => {
|
|
|
363
365
|
cursor: pointer;
|
|
364
366
|
color: var(--table-actions-icon);
|
|
365
367
|
|
|
366
|
-
&:hover
|
|
367
|
-
&.selected {
|
|
368
|
+
&:hover {
|
|
368
369
|
color: var(--table-actions-icon-hover);
|
|
369
370
|
}
|
|
371
|
+
&.selected {
|
|
372
|
+
color: var(--table-actions-icon-active);
|
|
373
|
+
}
|
|
370
374
|
}
|
|
371
375
|
|
|
372
376
|
.action-remove {
|
|
@@ -407,6 +411,7 @@ const onTogglePortlet = (id: string): void => {
|
|
|
407
411
|
|
|
408
412
|
&:hover {
|
|
409
413
|
background: var(--table-actions-bg-hover);
|
|
414
|
+
color: var(--table-actions-view-hover);
|
|
410
415
|
}
|
|
411
416
|
}
|
|
412
417
|
|
|
@@ -415,8 +420,7 @@ const onTogglePortlet = (id: string): void => {
|
|
|
415
420
|
|
|
416
421
|
:deep(button.ui-btn) {
|
|
417
422
|
line-height: 16px;
|
|
418
|
-
margin-bottom:
|
|
419
|
-
margin-left: 6px;
|
|
423
|
+
margin-bottom: 8px;
|
|
420
424
|
width: fit-content;
|
|
421
425
|
}
|
|
422
426
|
}
|
|
@@ -10,7 +10,10 @@
|
|
|
10
10
|
v-if="props.showToggleButton"
|
|
11
11
|
:class="['panel-toggle', { collapsed: leftPanelCollapsed }]"
|
|
12
12
|
>
|
|
13
|
-
<div
|
|
13
|
+
<div
|
|
14
|
+
v-show="!leftPanelCollapsed"
|
|
15
|
+
class="left-panel-toggle-content-block"
|
|
16
|
+
>
|
|
14
17
|
<slot name="toggleContent" />
|
|
15
18
|
</div>
|
|
16
19
|
<button
|
|
@@ -207,7 +210,7 @@ onUnmounted(() => {
|
|
|
207
210
|
:root.is-new-view {
|
|
208
211
|
--split-horizontal-border-color: #e9ebed;
|
|
209
212
|
--horizontal-panel-bg-color: #fff;
|
|
210
|
-
--trigger-bg-color: #
|
|
213
|
+
--trigger-bg-color: #e9ebeda3;
|
|
211
214
|
--trigger-color: #213444;
|
|
212
215
|
--new-gutter-bg-color: #e9ebed;
|
|
213
216
|
--new-gutter-hover-bg-color: #008fd6;
|
|
@@ -1,80 +1,80 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div :class="['customize-hardware', themeMode]">
|
|
3
3
|
<ui-tabs
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
v-model="selectedNavItem"
|
|
5
|
+
:tabs="navItemsLocal"
|
|
6
|
+
test-id="vm-wizard-tabs"
|
|
7
|
+
type="underline"
|
|
8
|
+
class="navigation mx-8"
|
|
9
9
|
/>
|
|
10
10
|
<ui-alert
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
v-show="props.errors.length"
|
|
12
|
+
:messages="props.errors"
|
|
13
|
+
status="alert-danger"
|
|
14
|
+
test-id="customize-hardware-alert"
|
|
15
|
+
class="errors-alert"
|
|
16
|
+
@remove="emits('remove-validation-errors')"
|
|
17
17
|
/>
|
|
18
18
|
|
|
19
19
|
<div v-show="selectedNavItem === 0">
|
|
20
20
|
<common-vm-actions-common-customize-hardware-virtual-hardware
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
21
|
+
:vm-name="vmName"
|
|
22
|
+
:storage="props.storage"
|
|
23
|
+
:max-cpus="props.maxCpus"
|
|
24
|
+
:max-memory="props.maxMemory"
|
|
25
|
+
:cpu-models="props.cpuModels"
|
|
26
|
+
:cpu="props.cpu"
|
|
27
|
+
:memory="props.memory"
|
|
28
|
+
:is-edit="props.isEdit"
|
|
29
|
+
:is-clone="props.isClone"
|
|
30
|
+
:state="props.state"
|
|
31
|
+
:hard-disks="props.hardDisks"
|
|
32
|
+
:cd-dvd-drives="props.cdDvdDrives"
|
|
33
|
+
:networks="props.networks"
|
|
34
|
+
:networks-table="props.networksTable"
|
|
35
|
+
:video-card="props.videoCard"
|
|
36
|
+
:usb-controller="props.usbController"
|
|
37
|
+
:pci-devices="props.pciDevices"
|
|
38
|
+
:nodes="props.nodes"
|
|
39
|
+
:files="props.files"
|
|
40
|
+
:error-validation-fields="props.errorValidationFields"
|
|
41
|
+
:get-datastore-table-func="props.getDatastoreTableFunc"
|
|
42
|
+
:datastore="props.datastore"
|
|
43
|
+
:vm-cpu-help-text-second="props.vmCpuHelpTextSecond"
|
|
44
|
+
:passthrough-devices="props.passthroughDevices"
|
|
45
|
+
:mediated-devices="props.mediatedDevices"
|
|
46
|
+
:project="props.project"
|
|
47
|
+
:guest-machine-type="guestMachineType"
|
|
48
|
+
:computeResource="props.computeResource"
|
|
49
|
+
@send-data="emits('send-data-virtual-hardware-method', $event)"
|
|
50
|
+
@get-storage="emits('get-storage', $event)"
|
|
51
|
+
@get-folders-or-files="emits('get-folders-or-files', $event)"
|
|
52
|
+
@get-active-device-child="emits('get-active-device-child', $event)"
|
|
53
|
+
@show-datastore-child="emits('show-datastore-child', $event)"
|
|
54
|
+
@remove-error-by-title="emits('remove-error-by-title', $event)"
|
|
55
|
+
@invalid="virtualHardwareInvalid = $event"
|
|
56
|
+
@get-networks-table="emits('get-networks-table', $event)"
|
|
57
|
+
@get-pci-devices="emits('get-pci-devices')"
|
|
58
58
|
/>
|
|
59
59
|
</div>
|
|
60
60
|
<div v-show="selectedNavItem === 1">
|
|
61
61
|
<common-vm-actions-common-customize-hardware-vmoptions
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
62
|
+
v-model:vm-name="vmName"
|
|
63
|
+
v-model:guest-machine-type="guestMachineType"
|
|
64
|
+
v-model:guest-os-family="guestOsFamily"
|
|
65
|
+
v-model:guest-os-version="guestOsVersion"
|
|
66
|
+
:hard-disks="props.hardDisksForBootOptions"
|
|
67
|
+
:cd-dvd-drives="props.cdDvdDrivesForBootOptions"
|
|
68
|
+
:networks="props.networksForBootOptions"
|
|
69
|
+
:options="props.options"
|
|
70
|
+
:is-edit="props.isEdit"
|
|
71
|
+
:is-clone="props.isClone"
|
|
72
|
+
:error-validation-fields="props.errorValidationFields"
|
|
73
|
+
:state="props.state"
|
|
74
|
+
@change-boot-order="emits('change-boot-order', $event)"
|
|
75
|
+
@send-data="emits('send-data-vm-options-method', $event)"
|
|
76
|
+
@invalid="vmOptionsInvalid = $event"
|
|
77
|
+
@remove-error-by-title="emits('remove-error-by-title', $event)"
|
|
78
78
|
/>
|
|
79
79
|
</div>
|
|
80
80
|
</div>
|
|
@@ -122,8 +122,8 @@ const selectedNavItem = defineModel<UI_T_SelectedNavItem>('selectedNavItem', {
|
|
|
122
122
|
required: true,
|
|
123
123
|
})
|
|
124
124
|
const guestMachineType = defineModel<UI_I_OptionItem | null>(
|
|
125
|
-
|
|
126
|
-
|
|
125
|
+
'guestMachineType',
|
|
126
|
+
{ required: true }
|
|
127
127
|
)
|
|
128
128
|
const vmOptionsInvalid = defineModel<string[]>('vmOptionsInvalid', {
|
|
129
129
|
required: true,
|
|
@@ -177,8 +177,8 @@ const emits = defineEmits<{
|
|
|
177
177
|
(event: 'remove-validation-errors'): void
|
|
178
178
|
(event: 'send-data-vm-options-method', value: UI_I_SendDataVmoptions): void
|
|
179
179
|
(
|
|
180
|
-
|
|
181
|
-
|
|
180
|
+
event: 'send-data-virtual-hardware-method',
|
|
181
|
+
value: UI_I_SendDataVirtualHardware
|
|
182
182
|
): void
|
|
183
183
|
(event: 'change-boot-order', value: UI_T_ChangeBootOrder): void
|
|
184
184
|
}>()
|
|
@@ -186,7 +186,7 @@ const emits = defineEmits<{
|
|
|
186
186
|
const localization = computed<UI_I_Localization>(() => useLocal())
|
|
187
187
|
|
|
188
188
|
const navItemsLocal = computed<UI_I_TabItem[]>(() =>
|
|
189
|
-
|
|
189
|
+
navItemsNewViewFunc(localization.value)
|
|
190
190
|
)
|
|
191
191
|
|
|
192
192
|
const themeMode = useLocalStorage('themeMode')
|
|
@@ -228,6 +228,9 @@ const themeMode = useLocalStorage('themeMode')
|
|
|
228
228
|
.ui-checkbox-label {
|
|
229
229
|
min-height: 32px;
|
|
230
230
|
}
|
|
231
|
+
.drag-drop-item .ui-checkbox-label {
|
|
232
|
+
min-height: auto;
|
|
233
|
+
}
|
|
231
234
|
}
|
|
232
235
|
</style>
|
|
233
236
|
<style lang="scss">
|
|
@@ -262,7 +265,7 @@ const themeMode = useLocalStorage('themeMode')
|
|
|
262
265
|
border-color: #e9ebed3d;
|
|
263
266
|
color: #e9eaec;
|
|
264
267
|
}
|
|
265
|
-
.stack-block-expanded {
|
|
268
|
+
.stack-block-expanded > .stack-block-label {
|
|
266
269
|
.ui-custom-checkbox {
|
|
267
270
|
background-color: transparent;
|
|
268
271
|
}
|
|
@@ -292,10 +295,10 @@ const themeMode = useLocalStorage('themeMode')
|
|
|
292
295
|
border-color: #9da6ad;
|
|
293
296
|
}
|
|
294
297
|
&.open {
|
|
295
|
-
border-color: #
|
|
298
|
+
border-color: #008fd6;
|
|
296
299
|
|
|
297
300
|
.ui-arrow-icon {
|
|
298
|
-
color: #
|
|
301
|
+
color: #008fd6;
|
|
299
302
|
}
|
|
300
303
|
}
|
|
301
304
|
.ui-arrow-icon {
|
|
@@ -322,7 +325,7 @@ const themeMode = useLocalStorage('themeMode')
|
|
|
322
325
|
border-color: #d3d6da14;
|
|
323
326
|
color: #bdc3c770;
|
|
324
327
|
}
|
|
325
|
-
.stack-block-expanded {
|
|
328
|
+
.stack-block-expanded > .stack-block-label {
|
|
326
329
|
.ui-custom-checkbox {
|
|
327
330
|
background-color: transparent;
|
|
328
331
|
}
|
|
@@ -240,9 +240,6 @@ const localization = computed<UI_I_Localization>(() => useLocal())
|
|
|
240
240
|
.ui-custom-checkbox {
|
|
241
241
|
background-color: transparent;
|
|
242
242
|
}
|
|
243
|
-
.ui-checkbox-label-text {
|
|
244
|
-
color: #e9eaec;
|
|
245
|
-
}
|
|
246
243
|
}
|
|
247
244
|
}
|
|
248
245
|
.dark-theme {
|
|
@@ -253,9 +250,6 @@ const localization = computed<UI_I_Localization>(() => useLocal())
|
|
|
253
250
|
.ui-custom-checkbox {
|
|
254
251
|
background-color: transparent;
|
|
255
252
|
}
|
|
256
|
-
.ui-checkbox-label-text {
|
|
257
|
-
color: #4d5d69;
|
|
258
|
-
}
|
|
259
253
|
}
|
|
260
254
|
}
|
|
261
255
|
</style>
|
|
@@ -4,9 +4,9 @@ import type {UI_I_OptionItem} from "~/components/atoms/lib/models/interfaces";
|
|
|
4
4
|
export const cacheOptionsFunc = (localization: UI_I_Localization): UI_I_OptionItem[] => {
|
|
5
5
|
return [
|
|
6
6
|
{ text: localization.common.none2, value: 'none' },
|
|
7
|
-
{ text: localization.
|
|
8
|
-
{ text: localization.
|
|
9
|
-
{ text: localization.
|
|
10
|
-
{ text: localization.
|
|
7
|
+
{ text: localization.vmWizard.writeThrough, value: 'writethrough' },
|
|
8
|
+
{ text: localization.vmWizard.writeBack, value: 'writeback' },
|
|
9
|
+
{ text: localization.vmWizard.directSync, value: 'directsync' },
|
|
10
|
+
{ text: localization.vmWizard.unsafe, value: 'unsafe' },
|
|
11
11
|
]
|
|
12
12
|
}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
:items="props.bootList"
|
|
9
9
|
grab-item-key="text"
|
|
10
10
|
@drop="emits('change-order', $event)"
|
|
11
|
+
@grab="onGrab"
|
|
11
12
|
>
|
|
12
13
|
<template
|
|
13
14
|
v-for="(item, index) in props.bootList"
|
|
@@ -26,7 +27,10 @@
|
|
|
26
27
|
#[`rightSide${index}`]
|
|
27
28
|
>
|
|
28
29
|
<div :class="['device-icon', item.iconClassName]" />
|
|
29
|
-
<span>{{ item.text }}</span>
|
|
30
|
+
<span class="device-name">{{ item.text }}</span>
|
|
31
|
+
</template>
|
|
32
|
+
<template #icon v-if="grabedItem">
|
|
33
|
+
<div :class="['device-icon', grabedItem.iconClassName]" />
|
|
30
34
|
</template>
|
|
31
35
|
</ui-drag-drop-list>
|
|
32
36
|
</template>
|
|
@@ -46,6 +50,15 @@ const props = defineProps<{
|
|
|
46
50
|
const emits = defineEmits<{
|
|
47
51
|
(event: 'change-order', value: UI_I_DropEvent): void
|
|
48
52
|
}>()
|
|
53
|
+
|
|
54
|
+
const grabedItem = ref<any>(null)
|
|
55
|
+
const onGrab = (item: any): void => {
|
|
56
|
+
grabedItem.value = item
|
|
57
|
+
}
|
|
49
58
|
</script>
|
|
50
59
|
|
|
51
|
-
<style scoped lang="scss"
|
|
60
|
+
<style scoped lang="scss">
|
|
61
|
+
.device-name {
|
|
62
|
+
margin-left: -4px;
|
|
63
|
+
}
|
|
64
|
+
</style>
|
|
@@ -25,7 +25,10 @@
|
|
|
25
25
|
{{ localization.common.vmName }}
|
|
26
26
|
</template>
|
|
27
27
|
<template #stackBlockContent>
|
|
28
|
-
<
|
|
28
|
+
<div class="vm-name-wrap">
|
|
29
|
+
<span class="vsphere-icon-vm"></span>
|
|
30
|
+
<span>{{ vmName }}</span>
|
|
31
|
+
</div>
|
|
29
32
|
<!-- <span v-if="!props.isEdit">{{ vmName }}</span>-->
|
|
30
33
|
<!-- <input-->
|
|
31
34
|
<!-- v-else-->
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
:label-text="localization.common.enable"
|
|
13
13
|
test-id="enable-password-input"
|
|
14
14
|
size="md"
|
|
15
|
+
class="mr-2"
|
|
15
16
|
@change="emits('set-password-disable')"
|
|
16
17
|
/>
|
|
17
18
|
|
|
@@ -27,7 +28,13 @@
|
|
|
27
28
|
@change="onChangePassword"
|
|
28
29
|
>
|
|
29
30
|
<template #icon>
|
|
30
|
-
<div
|
|
31
|
+
<div
|
|
32
|
+
:class="[
|
|
33
|
+
'copy-icon pointer',
|
|
34
|
+
{ disabled: !isEnabledPassword || props.disabled },
|
|
35
|
+
]"
|
|
36
|
+
@click="onCopyToClipboard"
|
|
37
|
+
>
|
|
31
38
|
<ui-icon
|
|
32
39
|
name="copy-to-clipboard"
|
|
33
40
|
type="input"
|
|
@@ -46,7 +53,12 @@
|
|
|
46
53
|
class="generate-password-button"
|
|
47
54
|
@click="emits('generate-password')"
|
|
48
55
|
>
|
|
49
|
-
<ui-icon
|
|
56
|
+
<ui-icon
|
|
57
|
+
name="key"
|
|
58
|
+
width="16"
|
|
59
|
+
height="16"
|
|
60
|
+
class="generate-password-icon"
|
|
61
|
+
/>
|
|
50
62
|
</ui-button>
|
|
51
63
|
</div>
|
|
52
64
|
</template>
|
|
@@ -89,8 +101,21 @@ const onCopyToClipboard = (): void => {
|
|
|
89
101
|
grid-template-columns: max-content 144px max-content;
|
|
90
102
|
grid-gap: 8px;
|
|
91
103
|
|
|
104
|
+
.copy-icon {
|
|
105
|
+
color: #9da6ad;
|
|
106
|
+
|
|
107
|
+
&.disabled {
|
|
108
|
+
color: #bdc3c770;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
92
111
|
.generate-password-button {
|
|
93
112
|
padding: 8px;
|
|
113
|
+
|
|
114
|
+
&:disabled {
|
|
115
|
+
.generate-password-icon {
|
|
116
|
+
color: #e9eaec;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
94
119
|
}
|
|
95
120
|
}
|
|
96
121
|
|
package/lib/utils/utils.ts
CHANGED
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
import type { UI_I_ArbitraryObject } from '~/lib/models/interfaces'
|
|
2
|
-
export const enumKeyFromValue = (
|
|
3
|
-
enumObj: UI_I_ArbitraryObject<string | number>,
|
|
4
|
-
value: string
|
|
5
|
-
): string | undefined => {
|
|
6
|
-
// Преобразуем enum в массив пар [ключ, значение] и находим нужную пару
|
|
7
|
-
const dataFromEnum = Object.entries(enumObj).find(([_, val]) => val === value)
|
|
8
|
-
|
|
9
|
-
// Возвращаем ключ, если найдена пара, иначе undefined
|
|
10
|
-
return dataFromEnum ? dataFromEnum[0] : undefined
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export const extractContentLastSlash = (
|
|
14
|
-
inputString: string,
|
|
15
|
-
after = false
|
|
16
|
-
): string => {
|
|
17
|
-
const regex = after ? /\/([^/]+)\/?$/ : /(.*)\//
|
|
18
|
-
|
|
19
|
-
const match = inputString.match(regex)
|
|
20
|
-
|
|
21
|
-
return match ? match[1] : ''
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export const intToIp = (value: number): string => {
|
|
25
|
-
return [
|
|
26
|
-
(value >> 24) & 0xff,
|
|
27
|
-
(value >> 16) & 0xff,
|
|
28
|
-
(value >> 8) & 0xff,
|
|
29
|
-
value & 0xff,
|
|
30
|
-
].join('.')
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export const ipToUint32 = (ip: string): number => {
|
|
34
|
-
const octets = ip.split('.').map(Number)
|
|
35
|
-
if (
|
|
36
|
-
octets.length !== 4 ||
|
|
37
|
-
octets.some((octet) => isNaN(octet) || octet < 0 || octet > 255)
|
|
38
|
-
) {
|
|
39
|
-
return 0
|
|
40
|
-
}
|
|
41
|
-
return (
|
|
42
|
-
(((octets[0] << 24) >>> 0) |
|
|
43
|
-
(octets[1] << 16) |
|
|
44
|
-
(octets[2] << 8) |
|
|
45
|
-
octets[3]) >>>
|
|
46
|
-
0
|
|
47
|
-
)
|
|
48
|
-
}
|
|
1
|
+
import type { UI_I_ArbitraryObject } from '~/lib/models/interfaces'
|
|
2
|
+
export const enumKeyFromValue = (
|
|
3
|
+
enumObj: UI_I_ArbitraryObject<string | number>,
|
|
4
|
+
value: string
|
|
5
|
+
): string | undefined => {
|
|
6
|
+
// Преобразуем enum в массив пар [ключ, значение] и находим нужную пару
|
|
7
|
+
const dataFromEnum = Object.entries(enumObj).find(([_, val]) => val === value)
|
|
8
|
+
|
|
9
|
+
// Возвращаем ключ, если найдена пара, иначе undefined
|
|
10
|
+
return dataFromEnum ? dataFromEnum[0] : undefined
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const extractContentLastSlash = (
|
|
14
|
+
inputString: string,
|
|
15
|
+
after = false
|
|
16
|
+
): string => {
|
|
17
|
+
const regex = after ? /\/([^/]+)\/?$/ : /(.*)\//
|
|
18
|
+
|
|
19
|
+
const match = inputString.match(regex)
|
|
20
|
+
|
|
21
|
+
return match ? match[1] : ''
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const intToIp = (value: number): string => {
|
|
25
|
+
return [
|
|
26
|
+
(value >> 24) & 0xff,
|
|
27
|
+
(value >> 16) & 0xff,
|
|
28
|
+
(value >> 8) & 0xff,
|
|
29
|
+
value & 0xff,
|
|
30
|
+
].join('.')
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const ipToUint32 = (ip: string): number => {
|
|
34
|
+
const octets = ip.split('.').map(Number)
|
|
35
|
+
if (
|
|
36
|
+
octets.length !== 4 ||
|
|
37
|
+
octets.some((octet) => isNaN(octet) || octet < 0 || octet > 255)
|
|
38
|
+
) {
|
|
39
|
+
return 0
|
|
40
|
+
}
|
|
41
|
+
return (
|
|
42
|
+
(((octets[0] << 24) >>> 0) |
|
|
43
|
+
(octets[1] << 16) |
|
|
44
|
+
(octets[2] << 8) |
|
|
45
|
+
octets[3]) >>>
|
|
46
|
+
0
|
|
47
|
+
)
|
|
48
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bfg-common",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.5.
|
|
4
|
+
"version": "1.5.190",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "nuxt build",
|
|
7
7
|
"dev": "nuxt dev --port=3002",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"@vueuse/components": "^10.1.2",
|
|
36
36
|
"date-fns": "^2.29.3",
|
|
37
37
|
"bfg-nuxt-3-graph": "1.0.25",
|
|
38
|
-
"bfg-uikit": "1.0.
|
|
38
|
+
"bfg-uikit": "1.0.421",
|
|
39
39
|
"html2canvas": "^1.4.1",
|
|
40
40
|
"prettier-eslint": "^15.0.1"
|
|
41
41
|
}
|