bfg-common 1.1.86 → 1.1.87
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 +3 -1
- package/assets/localization/local_en.json +3 -1
- package/assets/localization/local_hy.json +3 -1
- package/assets/localization/local_kk.json +3 -1
- package/assets/localization/local_ru.json +3 -1
- package/assets/localization/local_zh.json +3 -1
- package/components/common/monitor/advanced/Advanced.vue +19 -6
- package/components/common/monitor/advanced/tools/Tools.vue +15 -28
- package/components/common/monitor/advanced/tools/chartOptionsModal/ChartOptionsModal.vue +65 -5
- package/components/common/monitor/advanced/tools/chartOptionsModal/counters/Counters.vue +8 -0
- package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/Table.vue +9 -0
- package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/config/utils.ts +3 -2
- package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/Timespan.vue +6 -0
- package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/Object.vue +66 -19
- package/components/common/monitor/advanced/tools/chartOptionsModal/models/models.ts +19 -0
- package/components/common/monitor/models/interfaces.ts +1 -0
- package/components/common/vm/actions/add/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +246 -246
- package/components/common/vm/actions/add/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +4 -1
- package/package.json +1 -1
|
@@ -2066,5 +2066,7 @@
|
|
|
2066
2066
|
"removeItem": "Выдаліць элемент",
|
|
2067
2067
|
"downloadCertificate": "Спампаваць сертыфікат",
|
|
2068
2068
|
"invalidCertificateDescription": "Увага! Па змаўчанні ўсталяваны самазавераны сертыфікат SSL. Каб працягваць працаваць з гэтым сертыфікатам SSL, вам неабходна дадаць яго ў каранёвае сховішча. Гэта можна зрабіць на ўсіх кліенцкіх прыладах або замяніць сертыфікатам SSL арганізацыі, або выкарыстоўваць свой уласны.",
|
|
2069
|
-
"youAreHere": "Вы тут"
|
|
2069
|
+
"youAreHere": "Вы тут",
|
|
2070
|
+
"showAllDatastores": "Паказаць усе сховішчы дадзеных",
|
|
2071
|
+
"showDatastoresConnectedAllHosts": "Паказаць сховішчы даных, падлучаныя да ўсіх хостаў"
|
|
2070
2072
|
}
|
|
@@ -2069,5 +2069,7 @@
|
|
|
2069
2069
|
"removeItem": "Remove Item",
|
|
2070
2070
|
"downloadCertificate": "Download certificate",
|
|
2071
2071
|
"invalidCertificateDescription": "Attention! A self-signed SSL certificate is installed by default. To continue working with this SSL certificate, you need to add it to the root store. This can be done on all client devices or replaced with the organization's SSL certificate, or use your own.",
|
|
2072
|
-
"youAreHere": "You are here"
|
|
2072
|
+
"youAreHere": "You are here",
|
|
2073
|
+
"showAllDatastores": "Show all datastores",
|
|
2074
|
+
"showDatastoresConnectedAllHosts": "Show datastores connected to all hosts"
|
|
2073
2075
|
}
|
|
@@ -2069,5 +2069,7 @@
|
|
|
2069
2069
|
"removeItem": "Հեռացնել տարրը",
|
|
2070
2070
|
"downloadCertificate": "Ներբեռնեք վկայականը",
|
|
2071
2071
|
"invalidCertificateDescription": "Ուշադրություն. Լռելյայն տեղադրվում է ինքնաստորագրված SSL վկայագիր: Այս SSL վկայագրի հետ աշխատելը շարունակելու համար դուք պետք է այն ավելացնեք արմատային խանութում: Սա կարելի է անել բոլոր հաճախորդի սարքերում կամ փոխարինել կազմակերպության SSL վկայականով, կամ օգտագործել ձերը:",
|
|
2072
|
-
"youAreHere": "Դու այստեղ ես"
|
|
2072
|
+
"youAreHere": "Դու այստեղ ես",
|
|
2073
|
+
"showAllDatastores": "Ցույց տալ բոլոր տվյալների պահեստները",
|
|
2074
|
+
"showDatastoresConnectedAllHosts": "Ցուցադրել տվյալների պահեստները, որոնք միացված են բոլոր հոսթներին"
|
|
2073
2075
|
}
|
|
@@ -2069,5 +2069,7 @@
|
|
|
2069
2069
|
"removeItem": "Элементті жою",
|
|
2070
2070
|
"downloadCertificate": "Сертификат жүктеп алыңыз",
|
|
2071
2071
|
"invalidCertificateDescription": "Назар аударыңыз! Өздігінен қол қойылған SSL сертификаты әдепкі бойынша орнатылады. Осы SSL сертификатымен жұмыс істеуді жалғастыру үшін оны түбірлік қоймаға қосу керек. Мұны барлық клиенттік құрылғыларда жасауға немесе ұйымның SSL сертификатымен ауыстыруға немесе өзіңізді пайдалануға болады.",
|
|
2072
|
-
"youAreHere": "Сен мындасың"
|
|
2072
|
+
"youAreHere": "Сен мындасың",
|
|
2073
|
+
"showAllDatastores": "Барлық деректер қоймаларын көрсету",
|
|
2074
|
+
"showDatastoresConnectedAllHosts": "Барлық хосттарға қосылған деректер қоймаларын көрсету"
|
|
2073
2075
|
}
|
|
@@ -2069,5 +2069,7 @@
|
|
|
2069
2069
|
"removeItem": "Убрать предмет",
|
|
2070
2070
|
"downloadCertificate": "Скачать сертификат",
|
|
2071
2071
|
"invalidCertificateDescription": "Внимание! Установлен самоподписанный SSL-сертификат по умолчанию. Для продолжения работы с данным SSL-сертификатом необходимо его добавить в корневое хранилище. Это можно сделать на всех клиентских устройствах или заменить на SSL-сертификат организации, либо использовать собственный.",
|
|
2072
|
-
"youAreHere": "Вы здесь"
|
|
2072
|
+
"youAreHere": "Вы здесь",
|
|
2073
|
+
"showAllDatastores": "Показать все хранилища данных",
|
|
2074
|
+
"showDatastoresConnectedAllHosts": "Показать хранилища данных, подключенные ко всем хостам"
|
|
2073
2075
|
}
|
|
@@ -2069,5 +2069,7 @@
|
|
|
2069
2069
|
"removeItem": "除去项目",
|
|
2070
2070
|
"downloadCertificate": "下载证书",
|
|
2071
2071
|
"invalidCertificateDescription": "注意力!默认情况下安装自签名 SSL 证书。要继续使用此 SSL 证书,您需要将其添加到根存储区。这可以在所有客户端设备上完成,或者替换为组织的 SSL 证书,或者使用您自己的证书。",
|
|
2072
|
-
"youAreHere": "你在这里"
|
|
2072
|
+
"youAreHere": "你在这里",
|
|
2073
|
+
"showAllDatastores": "显示所有数据存储",
|
|
2074
|
+
"showDatastoresConnectedAllHosts": "显示连接到所有主机的数据存储"
|
|
2073
2075
|
}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
<div class="fill-parent flex-column">
|
|
13
13
|
<div class="vertical-flex-container fill-parent">
|
|
14
14
|
<common-monitor-advanced-tools
|
|
15
|
+
v-model:selected-timespan-type="localSelectedTimespanType"
|
|
15
16
|
:type="props.type"
|
|
16
17
|
:start-date="props.data?.pointStart || 0"
|
|
17
18
|
:chart-title="props.data?.groupName || ''"
|
|
@@ -21,7 +22,6 @@
|
|
|
21
22
|
:disabled-period="props.disabledPeriod"
|
|
22
23
|
:disabled-view="props.disabledView"
|
|
23
24
|
:selected-chart-type="props.selectedChartType"
|
|
24
|
-
:selected-timespan-type="props.selectedTimespanType"
|
|
25
25
|
:units-count="props.unitsCount"
|
|
26
26
|
:period-type="props.periodType"
|
|
27
27
|
:selected-custom-time="props.selectedCustomTime"
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
:custom-time-to="props.customTimeTo"
|
|
33
33
|
:total-cores="totalCores"
|
|
34
34
|
:host-id="props.hostId"
|
|
35
|
+
:selected-objects="props.selectedObjects"
|
|
35
36
|
@update-tools="emits('update-tools', $event)"
|
|
36
37
|
@exporting="onExporting"
|
|
37
38
|
@open-advanced-page="onGetEmptyPage"
|
|
@@ -42,7 +43,6 @@
|
|
|
42
43
|
@update-unit-count="emits('update-unit-count', $event)"
|
|
43
44
|
@update-period-type="emits('update-period-type', $event)"
|
|
44
45
|
@update-custom-time="emits('update-custom-time', $event)"
|
|
45
|
-
@select-chart-name="emits('select-chart-name', $event)"
|
|
46
46
|
@delete-option="emits('delete-option')"
|
|
47
47
|
@update-custom-date-from="emits('update-custom-date-from', $event)"
|
|
48
48
|
@update-custom-date-to="emits('update-custom-date-to', $event)"
|
|
@@ -91,11 +91,12 @@ import { UI_T_AdvancedType } from '~/components/common/monitor/advanced/models/t
|
|
|
91
91
|
import { I_SeriesLine } from 'bfg-nuxt-3-graph/graph/models/interfaces'
|
|
92
92
|
import { UI_I_MonitorGraphPayload } from '~/components/common/monitor/models/interfaces'
|
|
93
93
|
import { UI_I_PerformanceItem } from '~/components/common/monitor/advanced/table/models/interfaces'
|
|
94
|
-
import { UI_I_AdvancedCounterItem } from '~/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/models/interfaces'
|
|
95
94
|
import {
|
|
96
95
|
T_ChartHost,
|
|
97
96
|
T_ChartVm,
|
|
98
97
|
} from '~/components/common/monitor/advanced/tools/chartOptionsModal/models/types'
|
|
98
|
+
import { UI_I_OptionsForm } from '~/components/common/monitor/advanced/tools/chartOptionsModal/models/models'
|
|
99
|
+
import { UI_I_AdvancedCounterItem } from '~/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/models/interfaces'
|
|
99
100
|
import { getCountCores } from '~/components/common/monitor/advanced/tools/utils/countCores'
|
|
100
101
|
|
|
101
102
|
const props = defineProps<{
|
|
@@ -120,6 +121,7 @@ const props = defineProps<{
|
|
|
120
121
|
customTimeFrom: string
|
|
121
122
|
customTimeTo: string
|
|
122
123
|
hostId: string
|
|
124
|
+
selectedObjects: string
|
|
123
125
|
disabledPeriod?: boolean
|
|
124
126
|
disabledView?: boolean
|
|
125
127
|
}>()
|
|
@@ -135,24 +137,35 @@ const emits = defineEmits<{
|
|
|
135
137
|
(event: 'update-unit-count', value: number): void
|
|
136
138
|
(event: 'update-period-type', value: string): void
|
|
137
139
|
(event: 'update-custom-time', value: string): void
|
|
138
|
-
(event: 'select-chart-name', value: string): void
|
|
139
140
|
(event: 'delete-option'): void
|
|
140
141
|
(event: 'update-custom-date-from', value: string): void
|
|
141
142
|
(event: 'update-custom-date-to', value: string): void
|
|
142
143
|
(event: 'update-custom-time-from', value: string): void
|
|
143
144
|
(event: 'update-custom-time-to', value: string): void
|
|
144
|
-
(event: 'submit-options', value:
|
|
145
|
+
(event: 'submit-options', value: UI_I_OptionsForm): void
|
|
146
|
+
(event: 'update:selected-timespan-type', value: string): void
|
|
145
147
|
}>()
|
|
146
148
|
|
|
147
149
|
const localization = computed<UI_I_Localization>(() => useLocal())
|
|
148
150
|
|
|
151
|
+
const localSelectedTimespanType = computed<string>({
|
|
152
|
+
get() {
|
|
153
|
+
return props.selectedTimespanType
|
|
154
|
+
},
|
|
155
|
+
set(newValue) {
|
|
156
|
+
emits('update:selected-timespan-type', newValue)
|
|
157
|
+
},
|
|
158
|
+
})
|
|
159
|
+
|
|
149
160
|
const totalCores = ref<number>(0)
|
|
161
|
+
let isFirstUpdate = true
|
|
150
162
|
watch(
|
|
151
163
|
() => props.data,
|
|
152
164
|
(newValue) => {
|
|
153
|
-
if (!newValue) return
|
|
165
|
+
if (!newValue || !isFirstUpdate) return
|
|
154
166
|
|
|
155
167
|
totalCores.value = getCountCores(newValue)
|
|
168
|
+
isFirstUpdate = false
|
|
156
169
|
},
|
|
157
170
|
{ immediate: true }
|
|
158
171
|
)
|
|
@@ -101,6 +101,7 @@
|
|
|
101
101
|
:custom-time-to="props.customTimeTo"
|
|
102
102
|
:total-cores="props.totalCores"
|
|
103
103
|
:host-id="props.hostId"
|
|
104
|
+
:selected-objects="props.selectedObjects"
|
|
104
105
|
@hide="isShowModal = false"
|
|
105
106
|
@select-row="emits('select-row', $event)"
|
|
106
107
|
@select-metric="emits('select-metric', $event)"
|
|
@@ -109,7 +110,6 @@
|
|
|
109
110
|
@update-unit-count="emits('update-unit-count', $event)"
|
|
110
111
|
@update-period-type="emits('update-period-type', $event)"
|
|
111
112
|
@update-custom-time="emits('update-custom-time', $event)"
|
|
112
|
-
@select-chart-name="onSelectChartName"
|
|
113
113
|
@delete-option="onDeleteOption"
|
|
114
114
|
@save-option-name="onSaveOptionName"
|
|
115
115
|
@update-custom-date-from="emits('update-custom-date-from', $event)"
|
|
@@ -126,11 +126,12 @@ import { UI_I_Localization } from '~/models/interfaces'
|
|
|
126
126
|
import { UI_I_MonitorGraphPayload } from '~/components/common/monitor/models/interfaces'
|
|
127
127
|
import { UI_I_DropMenu } from '~/components/common/monitor/advanced/tools/models/interfaces'
|
|
128
128
|
import { UI_T_AdvancedType } from '~/components/common/monitor/advanced/models/types'
|
|
129
|
-
import { UI_I_AdvancedCounterItem } from '~/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/models/interfaces'
|
|
130
129
|
import {
|
|
131
130
|
T_ChartHost,
|
|
132
131
|
T_ChartVm,
|
|
133
132
|
} from '~/components/common/monitor/advanced/tools/chartOptionsModal/models/types'
|
|
133
|
+
import { UI_I_OptionsForm } from '~/components/common/monitor/advanced/tools/chartOptionsModal/models/models'
|
|
134
|
+
import { UI_I_AdvancedCounterItem } from '~/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/models/interfaces'
|
|
134
135
|
import { getValidDateByOptionFunc } from '~/components/common/monitor/config/getValidDateByOption'
|
|
135
136
|
import {
|
|
136
137
|
periodFunc,
|
|
@@ -159,6 +160,7 @@ const props = defineProps<{
|
|
|
159
160
|
customTimeTo: string
|
|
160
161
|
totalCores: number
|
|
161
162
|
hostId: string
|
|
163
|
+
selectedObjects: string
|
|
162
164
|
disabledPeriod?: boolean
|
|
163
165
|
disabledView?: boolean
|
|
164
166
|
}>()
|
|
@@ -174,13 +176,13 @@ const emits = defineEmits<{
|
|
|
174
176
|
(event: 'update-unit-count', value: number): void
|
|
175
177
|
(event: 'update-period-type', value: string): void
|
|
176
178
|
(event: 'update-custom-time', value: string): void
|
|
177
|
-
(event: 'select-chart-name', value: string): void
|
|
178
179
|
(event: 'delete-option'): void
|
|
179
180
|
(event: 'update-custom-date-from', value: string): void
|
|
180
181
|
(event: 'update-custom-date-to', value: string): void
|
|
181
182
|
(event: 'update-custom-time-from', value: string): void
|
|
182
183
|
(event: 'update-custom-time-to', value: string): void
|
|
183
|
-
(event: 'submit-options', value:
|
|
184
|
+
(event: 'submit-options', value: UI_I_OptionsForm): void
|
|
185
|
+
(event: 'update:selected-timespan-type', value: string): void
|
|
184
186
|
}>()
|
|
185
187
|
|
|
186
188
|
const routeType = '' + useRoute().params.type
|
|
@@ -212,36 +214,22 @@ watch(
|
|
|
212
214
|
{ immediate: true }
|
|
213
215
|
)
|
|
214
216
|
|
|
215
|
-
const onSelectChartName = (name: string): void => {
|
|
216
|
-
emits('select-chart-name', name)
|
|
217
|
-
optionsNames.value = getCurrentOptionsStorageFunc(routeType)
|
|
218
|
-
}
|
|
219
|
-
|
|
220
217
|
const onDeleteOption = (): void => {
|
|
221
218
|
emits('delete-option')
|
|
222
219
|
optionsNames.value = getCurrentOptionsStorageFunc(routeType)
|
|
223
220
|
}
|
|
224
221
|
|
|
225
|
-
const selectedPeriod = ref<string>('')
|
|
226
222
|
const periodOptions = computed<UI_I_OptionItem[]>(() =>
|
|
227
223
|
periodFunc(localization.value, props.selectedTimespanType)
|
|
228
224
|
)
|
|
229
|
-
|
|
230
|
-
()
|
|
231
|
-
|
|
232
|
-
if (newValue) selectedPeriod.value = newValue[0].value
|
|
225
|
+
const selectedPeriod = computed<string>({
|
|
226
|
+
get() {
|
|
227
|
+
return props.selectedTimespanType || periodOptions.value[0].value
|
|
233
228
|
},
|
|
234
|
-
{
|
|
235
|
-
)
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
(newValue) => {
|
|
239
|
-
if (!newValue) return
|
|
240
|
-
|
|
241
|
-
selectedPeriod.value = newValue
|
|
242
|
-
updateTools()
|
|
243
|
-
}
|
|
244
|
-
)
|
|
229
|
+
set(newValue) {
|
|
230
|
+
emits('update:selected-timespan-type', newValue)
|
|
231
|
+
},
|
|
232
|
+
})
|
|
245
233
|
|
|
246
234
|
const isShowModal = ref<boolean>(false)
|
|
247
235
|
watch(isShowModal, (newValue) => {
|
|
@@ -249,8 +237,6 @@ watch(isShowModal, (newValue) => {
|
|
|
249
237
|
selectedView.value = viewOptions.value[0].value
|
|
250
238
|
})
|
|
251
239
|
|
|
252
|
-
const selectedObjects = ref<string>('')
|
|
253
|
-
|
|
254
240
|
const updateTools = (): void => {
|
|
255
241
|
const periodValue = selectedPeriod.value
|
|
256
242
|
const viewValue = selectedView.value
|
|
@@ -295,6 +281,8 @@ const updateTools = (): void => {
|
|
|
295
281
|
periodType: periodValue,
|
|
296
282
|
view: viewValue,
|
|
297
283
|
}
|
|
284
|
+
if (selectedValue.metric) tools.metricType = selectedValue.metric
|
|
285
|
+
|
|
298
286
|
emits('update-timespan-type', selectedPeriod.value)
|
|
299
287
|
emits('update-tools', tools)
|
|
300
288
|
}
|
|
@@ -421,7 +409,6 @@ onMounted(() => {
|
|
|
421
409
|
min-width: 16px;
|
|
422
410
|
min-height: 16px;
|
|
423
411
|
background-size: 100% auto;
|
|
424
|
-
display: block;
|
|
425
412
|
}
|
|
426
413
|
}
|
|
427
414
|
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
width="1150px"
|
|
5
5
|
:show="true"
|
|
6
6
|
:title="localization.chartOptions"
|
|
7
|
+
:disabled-submit="isDisabledSubmit"
|
|
7
8
|
@hide="onHide"
|
|
8
9
|
@submit="onSubmit"
|
|
9
10
|
>
|
|
@@ -45,6 +46,8 @@
|
|
|
45
46
|
:custom-time-to="props.customTimeTo"
|
|
46
47
|
:total-cores="props.totalCores"
|
|
47
48
|
:host-id="props.hostId"
|
|
49
|
+
:selected-metrics-keys="selectedMetricsKeys"
|
|
50
|
+
:selected-objects="props.selectedObjects"
|
|
48
51
|
@select-row="selectedRows = $event"
|
|
49
52
|
@update-chart-type="selectedChartTypeLocal = $event"
|
|
50
53
|
@update-custom-time="localCustomTime = $event"
|
|
@@ -55,6 +58,7 @@
|
|
|
55
58
|
@update-custom-date-to="onUpdateCustomDateTo"
|
|
56
59
|
@update-custom-time-from="onUpdateCustomTimeFrom"
|
|
57
60
|
@update-custom-time-to="onUpdateCustomTimeTo"
|
|
61
|
+
@select-objects="localSelectedObjects = $event"
|
|
58
62
|
/>
|
|
59
63
|
</div>
|
|
60
64
|
</div>
|
|
@@ -72,9 +76,11 @@ import {
|
|
|
72
76
|
T_ChartHost,
|
|
73
77
|
T_ChartVm,
|
|
74
78
|
} from '~/components/common/monitor/advanced/tools/chartOptionsModal/models/types'
|
|
79
|
+
import { UI_I_OptionsForm } from '~/components/common/monitor/advanced/tools/chartOptionsModal/models/models'
|
|
75
80
|
import { metricsFunc } from '~/components/common/monitor/advanced/tools/chartOptionsModal/metrics/config/optionsMetrics'
|
|
76
81
|
import { getCurrentOptionsStorageFunc } from '~/components/common/monitor/advanced/tools/config/advancedToolbar'
|
|
77
82
|
import { checkDateFunc } from '~/components/common/monitor/overview/filters/customIntervalModal/config/dateChecker'
|
|
83
|
+
import { getValidDateByOptionFunc } from '~/components/common/monitor/config/getValidDateByOption'
|
|
78
84
|
|
|
79
85
|
const props = defineProps<{
|
|
80
86
|
type: UI_T_AdvancedType
|
|
@@ -93,6 +99,7 @@ const props = defineProps<{
|
|
|
93
99
|
customTimeTo: string
|
|
94
100
|
totalCores: number
|
|
95
101
|
hostId: string
|
|
102
|
+
selectedObjects: string
|
|
96
103
|
}>()
|
|
97
104
|
|
|
98
105
|
const emits = defineEmits<{
|
|
@@ -104,14 +111,13 @@ const emits = defineEmits<{
|
|
|
104
111
|
(event: 'update-unit-count', value: number): void
|
|
105
112
|
(event: 'update-period-type', value: string): void
|
|
106
113
|
(event: 'update-custom-time', value: string): void
|
|
107
|
-
(event: 'select-chart-name', value: string): void
|
|
108
114
|
(event: 'delete-option'): void
|
|
109
115
|
(event: 'save-option-name'): void
|
|
110
116
|
(event: 'update-custom-date-from', value: string): void
|
|
111
117
|
(event: 'update-custom-date-to', value: string): void
|
|
112
118
|
(event: 'update-custom-time-from', value: string): void
|
|
113
119
|
(event: 'update-custom-time-to', value: string): void
|
|
114
|
-
(event: 'submit-options', value:
|
|
120
|
+
(event: 'submit-options', value: UI_I_OptionsForm): void
|
|
115
121
|
(event: 'select-objects', value: string): void
|
|
116
122
|
}>()
|
|
117
123
|
|
|
@@ -210,6 +216,9 @@ const onHide = (): void => {
|
|
|
210
216
|
}
|
|
211
217
|
|
|
212
218
|
const selectedRows = ref<UI_I_AdvancedCounterItem[]>([])
|
|
219
|
+
const selectedMetricsKeys = computed<number[]>(() =>
|
|
220
|
+
selectedRows.value.map((item) => item.id)
|
|
221
|
+
)
|
|
213
222
|
const selectedChartTypeLocal = ref<string>('')
|
|
214
223
|
|
|
215
224
|
const checkValidations = (): boolean => {
|
|
@@ -250,7 +259,15 @@ watch(
|
|
|
250
259
|
|
|
251
260
|
const selectedLocalOptionName = ref<string>('')
|
|
252
261
|
|
|
253
|
-
const
|
|
262
|
+
const localSelectedObjects = ref<string>('')
|
|
263
|
+
|
|
264
|
+
const currentFieldsByArray = (data: UI_I_AdvancedCounterItem[]): string => {
|
|
265
|
+
const result: string[] = []
|
|
266
|
+
data.forEach((item) => {
|
|
267
|
+
result.push(item.nameEn)
|
|
268
|
+
})
|
|
269
|
+
return result.join(',')
|
|
270
|
+
}
|
|
254
271
|
|
|
255
272
|
const onSubmit = (): void => {
|
|
256
273
|
if (!checkValidations()) return
|
|
@@ -260,7 +277,6 @@ const onSubmit = (): void => {
|
|
|
260
277
|
|
|
261
278
|
onSaveOptions(selectedLocalOptionName.value)
|
|
262
279
|
|
|
263
|
-
// emits('select-chart-name', selectedLocalOptionName.value) +
|
|
264
280
|
// emits('select-metric', selectedMetric.value) +
|
|
265
281
|
// emits('select-row', selectedRows.value) +
|
|
266
282
|
// emits('update-timespan-type', timespanType.value) +
|
|
@@ -274,7 +290,43 @@ const onSubmit = (): void => {
|
|
|
274
290
|
// emits('update-chart-type', selectedChartTypeLocal.value) +
|
|
275
291
|
// emits('submit-options')
|
|
276
292
|
|
|
293
|
+
// const periodValue = getValidDateByOptionFunc(
|
|
294
|
+
// periodValue,
|
|
295
|
+
// selectedValue,
|
|
296
|
+
// props.unitsCount,
|
|
297
|
+
// props.selectedCustomTime
|
|
298
|
+
// )
|
|
299
|
+
//
|
|
300
|
+
|
|
301
|
+
const currentFields =
|
|
302
|
+
localSelectedObjects.value || currentFieldsByArray(selectedRows.value)
|
|
303
|
+
|
|
304
|
+
const validPeriod = getValidDateByOptionFunc(
|
|
305
|
+
timespanType.value,
|
|
306
|
+
null,
|
|
307
|
+
unitCount.value,
|
|
308
|
+
localCustomTime.value
|
|
309
|
+
).map((item) => Math.round(item / 1000))
|
|
310
|
+
|
|
311
|
+
if (
|
|
312
|
+
timespanType.value === 'custom_interval' &&
|
|
313
|
+
localPeriodType.value === 'period'
|
|
314
|
+
) {
|
|
315
|
+
const checkDateResult = checkDateFunc(
|
|
316
|
+
localization.value,
|
|
317
|
+
localCustomDateFrom.value,
|
|
318
|
+
localCustomDateTo.value,
|
|
319
|
+
localCustomTimeFrom.value,
|
|
320
|
+
localCustomTimeTo.value
|
|
321
|
+
)
|
|
322
|
+
if (Array.isArray(checkDateResult)) {
|
|
323
|
+
validPeriod[0] = Math.round(checkDateResult[0] / 1000)
|
|
324
|
+
validPeriod[1] = Math.round(checkDateResult[1] / 1000)
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
277
328
|
const savedObject = {
|
|
329
|
+
fields: currentFields,
|
|
278
330
|
optionName: selectedLocalOptionName.value,
|
|
279
331
|
metric: selectedMetric.value,
|
|
280
332
|
counters: selectedRows.value,
|
|
@@ -287,7 +339,8 @@ const onSubmit = (): void => {
|
|
|
287
339
|
dateTo: localCustomDateTo.value,
|
|
288
340
|
timeTo: localCustomTimeTo.value,
|
|
289
341
|
chartType: selectedChartTypeLocal.value,
|
|
290
|
-
objects:
|
|
342
|
+
objects: localSelectedObjects.value,
|
|
343
|
+
periodValue: validPeriod,
|
|
291
344
|
}
|
|
292
345
|
|
|
293
346
|
emits('submit-options', savedObject)
|
|
@@ -394,6 +447,13 @@ const onDeleteChartName = (name: string): void => {
|
|
|
394
447
|
emits('delete-option')
|
|
395
448
|
}
|
|
396
449
|
|
|
450
|
+
const isDisabledSubmit = computed<boolean>(
|
|
451
|
+
() =>
|
|
452
|
+
props.type === 'host' &&
|
|
453
|
+
selectedMetric.value === 'cpu' &&
|
|
454
|
+
!localSelectedObjects.value
|
|
455
|
+
)
|
|
456
|
+
|
|
397
457
|
onMounted(() => {
|
|
398
458
|
optionsNames.value = getCurrentOptionsStorageFunc(routeType)
|
|
399
459
|
})
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
:type="props.type"
|
|
6
6
|
:selected-keys="props.selectedKeys"
|
|
7
7
|
@select-row="emits('select-row', $event)"
|
|
8
|
+
@total-items="totalMetricItems = $event"
|
|
8
9
|
/>
|
|
9
10
|
<common-monitor-advanced-tools-chart-options-modal-counters-timespan
|
|
10
11
|
:type="props.type"
|
|
@@ -21,6 +22,9 @@
|
|
|
21
22
|
:custom-time-to="props.customTimeTo"
|
|
22
23
|
:total-cores="props.totalCores"
|
|
23
24
|
:host-id="props.hostId"
|
|
25
|
+
:selected-metrics-keys="props.selectedMetricsKeys"
|
|
26
|
+
:total-metric-items="totalMetricItems"
|
|
27
|
+
:selected-objects="props.selectedObjects"
|
|
24
28
|
@update-chart-type="emits('update-chart-type', $event)"
|
|
25
29
|
@update-custom-time="emits('update-custom-time', $event)"
|
|
26
30
|
@update-timespan-type="emits('update-timespan-type', $event)"
|
|
@@ -59,6 +63,8 @@ const props = defineProps<{
|
|
|
59
63
|
customTimeTo: string
|
|
60
64
|
totalCores: number
|
|
61
65
|
hostId: string
|
|
66
|
+
selectedMetricsKeys: number[]
|
|
67
|
+
selectedObjects: string
|
|
62
68
|
}>()
|
|
63
69
|
|
|
64
70
|
const emits = defineEmits<{
|
|
@@ -74,6 +80,8 @@ const emits = defineEmits<{
|
|
|
74
80
|
(event: 'update-custom-time-to', value: string): void
|
|
75
81
|
(event: 'select-objects', value: string): void
|
|
76
82
|
}>()
|
|
83
|
+
|
|
84
|
+
const totalMetricItems = ref<number>(0)
|
|
77
85
|
</script>
|
|
78
86
|
|
|
79
87
|
<style scoped lang="scss">
|
|
@@ -46,6 +46,7 @@ const props = defineProps<{
|
|
|
46
46
|
|
|
47
47
|
const emits = defineEmits<{
|
|
48
48
|
(event: 'select-row', value: UI_I_AdvancedCounterItem[]): void
|
|
49
|
+
(event: 'total-items', value: number): void
|
|
49
50
|
}>()
|
|
50
51
|
|
|
51
52
|
const localization = computed<UI_I_Localization>(() => useLocal())
|
|
@@ -57,6 +58,14 @@ const counters = computed<UI_I_AdvancedCounterItem[]>(() =>
|
|
|
57
58
|
const totalItems = computed<number>(() => counters.value.length)
|
|
58
59
|
const totalPages = computed<number>(() => 1)
|
|
59
60
|
|
|
61
|
+
watch(
|
|
62
|
+
totalItems,
|
|
63
|
+
(newValue) => {
|
|
64
|
+
emits('total-items', newValue)
|
|
65
|
+
},
|
|
66
|
+
{ immediate: true }
|
|
67
|
+
)
|
|
68
|
+
|
|
60
69
|
const selectedCounters = ref<number[]>([])
|
|
61
70
|
watch(
|
|
62
71
|
() => props.selectedKeys,
|
package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/config/utils.ts
CHANGED
|
@@ -654,8 +654,9 @@ export const getDefaultCounters = (
|
|
|
654
654
|
case 'cpuUsageInPercent':
|
|
655
655
|
return hostItemsFunc('cpu', {}).splice(0, 2)
|
|
656
656
|
case 'disk':
|
|
657
|
-
|
|
658
|
-
|
|
657
|
+
return hostItemsFunc('disk', {}).filter((_, key) =>
|
|
658
|
+
[0, 14].includes(key)
|
|
659
|
+
)
|
|
659
660
|
case 'memory':
|
|
660
661
|
return hostItemsFunc('memory', {})
|
|
661
662
|
case 'network':
|
package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/Timespan.vue
CHANGED
|
@@ -26,6 +26,9 @@
|
|
|
26
26
|
:chart="props.chart"
|
|
27
27
|
:total-cores="props.totalCores"
|
|
28
28
|
:host-id="props.hostId"
|
|
29
|
+
:selected-metrics-keys="props.selectedMetricsKeys"
|
|
30
|
+
:total-metric-items="props.totalMetricItems"
|
|
31
|
+
:selected-objects="props.selectedObjects"
|
|
29
32
|
@select-objects="emits('select-objects', $event)"
|
|
30
33
|
/>
|
|
31
34
|
</div>
|
|
@@ -53,6 +56,9 @@ const props = defineProps<{
|
|
|
53
56
|
customTimeTo: string
|
|
54
57
|
totalCores: number
|
|
55
58
|
hostId: string
|
|
59
|
+
selectedMetricsKeys: number[]
|
|
60
|
+
totalMetricItems: number
|
|
61
|
+
selectedObjects: string
|
|
56
62
|
}>()
|
|
57
63
|
|
|
58
64
|
const emits = defineEmits<{
|
|
@@ -45,6 +45,9 @@ const props = defineProps<{
|
|
|
45
45
|
chart: T_ChartHost | T_ChartVm
|
|
46
46
|
totalCores: number
|
|
47
47
|
hostId: string
|
|
48
|
+
selectedMetricsKeys: number[]
|
|
49
|
+
totalMetricItems: number
|
|
50
|
+
selectedObjects: string
|
|
48
51
|
}>()
|
|
49
52
|
|
|
50
53
|
const emits = defineEmits<{
|
|
@@ -68,38 +71,82 @@ const columnItems = computed<UI_I_ColumnKey[]>(() =>
|
|
|
68
71
|
|
|
69
72
|
const bodyItems = ref<UI_I_BodyItem[][]>([])
|
|
70
73
|
|
|
71
|
-
|
|
74
|
+
let items: UI_I_AdvancedTargetObject[] = []
|
|
72
75
|
watch(
|
|
73
|
-
() => [
|
|
76
|
+
() => [
|
|
77
|
+
props.type,
|
|
78
|
+
props.chart,
|
|
79
|
+
props.totalCores,
|
|
80
|
+
props.hostId,
|
|
81
|
+
props.selectedMetricsKeys,
|
|
82
|
+
],
|
|
74
83
|
(newValue) => {
|
|
84
|
+
items = []
|
|
85
|
+
selectedRow.value = []
|
|
86
|
+
|
|
75
87
|
if (newValue[0] === 'host' && newValue[1] === 'cpu') {
|
|
76
|
-
|
|
77
|
-
id: 'total',
|
|
78
|
-
target_object: newValue[3],
|
|
79
|
-
})
|
|
80
|
-
for (let i = 0; i < newValue[2]; i++) {
|
|
88
|
+
if (newValue[4].includes(0)) {
|
|
81
89
|
items.push({
|
|
82
|
-
id: '
|
|
83
|
-
target_object:
|
|
90
|
+
id: 'total',
|
|
91
|
+
target_object: newValue[3],
|
|
84
92
|
})
|
|
85
93
|
}
|
|
94
|
+
if (newValue[4].includes(1)) {
|
|
95
|
+
for (let i = 0; i < newValue[2]; i++) {
|
|
96
|
+
items.push({
|
|
97
|
+
id: 'core' + i,
|
|
98
|
+
target_object: '' + i,
|
|
99
|
+
})
|
|
100
|
+
}
|
|
101
|
+
}
|
|
86
102
|
bodyItems.value = table.bodyItems(items)
|
|
87
|
-
}
|
|
103
|
+
} else bodyItems.value = []
|
|
88
104
|
},
|
|
89
105
|
{ immediate: true }
|
|
90
106
|
)
|
|
91
107
|
|
|
92
|
-
watch(
|
|
93
|
-
|
|
108
|
+
watch(
|
|
109
|
+
selectedRow,
|
|
110
|
+
(newValue) => {
|
|
111
|
+
const selectedItems: string[] = []
|
|
112
|
+
|
|
113
|
+
newValue.forEach((key) => {
|
|
114
|
+
selectedItems.push(items[key].id)
|
|
115
|
+
})
|
|
94
116
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
117
|
+
const selectedNames =
|
|
118
|
+
items.length === newValue.length &&
|
|
119
|
+
props.selectedMetricsKeys.length === props.totalMetricItems
|
|
120
|
+
? '*'
|
|
121
|
+
: selectedItems.join(', ')
|
|
98
122
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
123
|
+
emits('select-objects', selectedNames)
|
|
124
|
+
},
|
|
125
|
+
{ deep: true }
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
watch(
|
|
129
|
+
() => [props.selectedObjects, bodyItems.value],
|
|
130
|
+
([selected, all]) => {
|
|
131
|
+
if (!all.length) return
|
|
132
|
+
|
|
133
|
+
if (props.type === 'host' && props.chart === 'cpu') {
|
|
134
|
+
if (selected === '*') {
|
|
135
|
+
selectedRow.value = all.map((item) => item[0].id)
|
|
136
|
+
} else {
|
|
137
|
+
const selectedNames = selected.split(', ')
|
|
138
|
+
const selectedKeys: number[] = []
|
|
139
|
+
all.forEach((item) => {
|
|
140
|
+
if (selectedNames.includes('total')) selectedKeys.push(0)
|
|
141
|
+
if (selectedNames.includes(`core${item[0].text}`))
|
|
142
|
+
selectedKeys.push(item[0].id)
|
|
143
|
+
})
|
|
144
|
+
selectedRow.value = selectedKeys
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
{ immediate: true }
|
|
149
|
+
)
|
|
103
150
|
</script>
|
|
104
151
|
|
|
105
152
|
<style scoped lang="scss">
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { UI_I_AdvancedCounterItem } from '~/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/models/interfaces'
|
|
2
|
+
|
|
3
|
+
export interface UI_I_OptionsForm {
|
|
4
|
+
fields: string
|
|
5
|
+
optionName: string
|
|
6
|
+
metric: string
|
|
7
|
+
counters: UI_I_AdvancedCounterItem[]
|
|
8
|
+
timespanType: string
|
|
9
|
+
periodType: string
|
|
10
|
+
unitCount: number
|
|
11
|
+
localTimespanType: string
|
|
12
|
+
dateFrom: string
|
|
13
|
+
timeFrom: string
|
|
14
|
+
dateTo: string
|
|
15
|
+
timeTo: string
|
|
16
|
+
chartType: string
|
|
17
|
+
objects: string
|
|
18
|
+
periodValue: number[]
|
|
19
|
+
}
|
package/components/common/vm/actions/add/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue
CHANGED
|
@@ -1,246 +1,246 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="hardware-cd-dvd-drive">
|
|
3
|
-
<atoms-stack-block
|
|
4
|
-
:has-children="true"
|
|
5
|
-
:is-roll-back="props.type === 'removed'"
|
|
6
|
-
:removable="isRemovable"
|
|
7
|
-
@remove="onRemoveCdDvdDrive"
|
|
8
|
-
@roll-back="onRollBackCdDvdDrive"
|
|
9
|
-
>
|
|
10
|
-
<template #stackBlockKey>
|
|
11
|
-
<div
|
|
12
|
-
class="vm-wizard-toggle-block-cd-dvd-drive vm-wizard-toggle-block-hard-disk"
|
|
13
|
-
>
|
|
14
|
-
<span>{{ label }}</span>
|
|
15
|
-
</div>
|
|
16
|
-
</template>
|
|
17
|
-
<template #stackBlockContent>
|
|
18
|
-
<div class="flex-align-center flex-space-between">
|
|
19
|
-
<template v-if="props.type === 'removed'">
|
|
20
|
-
<span>{{ localization.deviceWillRemoved }}</span>
|
|
21
|
-
<div @click.stop class="flex-align-center">
|
|
22
|
-
<input
|
|
23
|
-
:id="`cd-dvd-delete-files-from-datastore-${props.index}`"
|
|
24
|
-
v-model="deleteFilesFromDatastore"
|
|
25
|
-
:disabled="props.disabled"
|
|
26
|
-
type="checkbox"
|
|
27
|
-
class="pointer"
|
|
28
|
-
@click.stop
|
|
29
|
-
/>
|
|
30
|
-
<label
|
|
31
|
-
:for="`cd-dvd-delete-files-from-datastore-${props.index}`"
|
|
32
|
-
:class="[
|
|
33
|
-
'label-text-normal pointer',
|
|
34
|
-
props.disabled && 'div-disabled',
|
|
35
|
-
]"
|
|
36
|
-
>{{ localization.deleteFilesFromDatastore }}</label
|
|
37
|
-
>
|
|
38
|
-
</div>
|
|
39
|
-
</template>
|
|
40
|
-
<template v-else>
|
|
41
|
-
<div class="select">
|
|
42
|
-
<select
|
|
43
|
-
id="vm-wizard-cd-dvd-drive-field"
|
|
44
|
-
v-model="selectedCdDvdDrive"
|
|
45
|
-
class="vm-wizard-cd-dvd-drive-field"
|
|
46
|
-
@click.stop
|
|
47
|
-
@change="changeCdDvdDrive"
|
|
48
|
-
>
|
|
49
|
-
<option
|
|
50
|
-
v-for="(item, key) in cdDvdDriveOptions"
|
|
51
|
-
:key="key"
|
|
52
|
-
:value="item.value"
|
|
53
|
-
>
|
|
54
|
-
{{ item.text }}
|
|
55
|
-
</option>
|
|
56
|
-
</select>
|
|
57
|
-
</div>
|
|
58
|
-
</template>
|
|
59
|
-
</div>
|
|
60
|
-
</template>
|
|
61
|
-
<template #stackChildren>
|
|
62
|
-
<common-vm-actions-add-customize-hardware-virtual-hardware-cd-dvd-drive-media
|
|
63
|
-
v-if="selectedCdDvdDrive === 'datastoreIsoFile'"
|
|
64
|
-
v-model:cd-dvd-media="cdDvdMedia"
|
|
65
|
-
@browse="isShowFileModal = true"
|
|
66
|
-
/>
|
|
67
|
-
|
|
68
|
-
<common-vm-actions-add-customize-hardware-virtual-hardware-bus
|
|
69
|
-
v-model:bus="bus"
|
|
70
|
-
:index="indexByHardDisks"
|
|
71
|
-
:validation-type="busValidationType"
|
|
72
|
-
:error-validation-fields="props.errorValidationFields"
|
|
73
|
-
:disabled="isRunning"
|
|
74
|
-
component-type="disk_devices"
|
|
75
|
-
@remove-error-by-title="emits('remove-error-by-title', $event)"
|
|
76
|
-
/>
|
|
77
|
-
</template>
|
|
78
|
-
</atoms-stack-block>
|
|
79
|
-
|
|
80
|
-
<Teleport to="body">
|
|
81
|
-
<common-vm-actions-add-customize-hardware-virtual-hardware-browse-view
|
|
82
|
-
v-if="isShowFileModal"
|
|
83
|
-
:show="isShowFileModal"
|
|
84
|
-
:file-types="fileTypes"
|
|
85
|
-
:nodes="props.nodes"
|
|
86
|
-
:files="props.files"
|
|
87
|
-
@submit="onSelectFile"
|
|
88
|
-
@get-storage="emits('get-storage', $event)"
|
|
89
|
-
@get-folders-or-files="emits('get-folders-or-files', $event)"
|
|
90
|
-
@get-active-device-child="emits('get-active-device-child', $event)"
|
|
91
|
-
@show-datastore-child="emits('show-datastore-child', $event)"
|
|
92
|
-
@hide="isShowFileModal = false"
|
|
93
|
-
/>
|
|
94
|
-
</Teleport>
|
|
95
|
-
</div>
|
|
96
|
-
</template>
|
|
97
|
-
|
|
98
|
-
<script lang="ts" setup>
|
|
99
|
-
import { UI_I_FileTreeNode } from '~/components/models/interfaces'
|
|
100
|
-
import { UI_I_TablePayload } from '~/models/store/interfaces'
|
|
101
|
-
import { UI_T_CdDvdDrive } from '~/components/common/vm/actions/add/customizeHardware/virtualHardware/cdDvdDrive/models/types'
|
|
102
|
-
import { UI_I_SendDataNewCdDvdDrive } from '~/components/common/vm/actions/add/customizeHardware/virtualHardware/models/interfaces'
|
|
103
|
-
import { UI_I_Localization, UI_I_HTMLSelectElement } from '~/models/interfaces'
|
|
104
|
-
import { UI_I_ErrorValidationField } from '~/models/store/interfaces'
|
|
105
|
-
import { UI_I_OptionItem } from '~/components/atoms/models/interfaces'
|
|
106
|
-
import { UI_I_FolderOrFileTreePayload } from '~/models/store/storage/interfaces'
|
|
107
|
-
import { UI_T_CdDvdType } from '~/components/common/vm/actions/add/customizeHardware/virtualHardware/models/types'
|
|
108
|
-
import { cdDvdDriveOptionsFunc } from '~/components/common/vm/actions/add/customizeHardware/virtualHardware/cdDvdDrive/config/options'
|
|
109
|
-
import { fileTypesFunc } from '~/components/common/vm/actions/add/customizeHardware/virtualHardware/cdDvdDrive/config/fileTypes'
|
|
110
|
-
|
|
111
|
-
const props = defineProps<{
|
|
112
|
-
hardDisksCount: number
|
|
113
|
-
index: number
|
|
114
|
-
cdDvdDrive: UI_I_SendDataNewCdDvdDrive
|
|
115
|
-
nodes: UI_I_FileTreeNode[]
|
|
116
|
-
files: UI_I_FileTreeNode[]
|
|
117
|
-
errorValidationFields: UI_I_ErrorValidationField<string>[]
|
|
118
|
-
type: UI_T_CdDvdType
|
|
119
|
-
isEdit: boolean
|
|
120
|
-
state?: string | number
|
|
121
|
-
}>()
|
|
122
|
-
|
|
123
|
-
const emits = defineEmits<{
|
|
124
|
-
(event: 'send-data', value: UI_I_SendDataNewCdDvdDrive): void
|
|
125
|
-
(event: 'remove'): void
|
|
126
|
-
(event: 'roll-back'): void
|
|
127
|
-
(event: 'remove-error-by-title', value: string): void
|
|
128
|
-
(event: 'get-storage', value: UI_I_TablePayload): void
|
|
129
|
-
(event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
|
|
130
|
-
(event: 'get-active-device-child', value: UI_I_FileTreeNode): void
|
|
131
|
-
(event: 'show-datastore-child', value: UI_I_FileTreeNode): void
|
|
132
|
-
}>()
|
|
133
|
-
|
|
134
|
-
const localization = computed<UI_I_Localization>(() => useLocal())
|
|
135
|
-
|
|
136
|
-
const isRunning = computed<boolean>(() => {
|
|
137
|
-
return props.state === 2
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
const isRemovable = computed<boolean>(() => {
|
|
141
|
-
return (
|
|
142
|
-
!props.isEdit ||
|
|
143
|
-
!isRunning.value ||
|
|
144
|
-
(isRunning.value && bus.value === 'virtio')
|
|
145
|
-
)
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
const indexByHardDisks = computed<number>(
|
|
149
|
-
() => props.index + props.hardDisksCount
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
const label = computed<string>(() => {
|
|
153
|
-
if (props.type === 'edit' || props.type === 'removed')
|
|
154
|
-
return `${localization.value.cdDvdDrive} ${props.index + 1}`
|
|
155
|
-
|
|
156
|
-
return `${localization.value.newCdDvdDrive} *`
|
|
157
|
-
})
|
|
158
|
-
|
|
159
|
-
const busValidationType = computed<string>(
|
|
160
|
-
() => `disk_devices[${indexByHardDisks}].bus`
|
|
161
|
-
)
|
|
162
|
-
|
|
163
|
-
const selectedCdDvdDrive = ref<UI_T_CdDvdDrive>('clientDevice')
|
|
164
|
-
const cdDvdDriveOptions = ref<UI_I_OptionItem[]>(
|
|
165
|
-
cdDvdDriveOptionsFunc(localization.value)
|
|
166
|
-
)
|
|
167
|
-
const changeCdDvdDrive = (event: UI_I_HTMLSelectElement): void => {
|
|
168
|
-
const isDatastoreIsoFile = event.target.value === 'datastoreIsoFile'
|
|
169
|
-
if (!isDatastoreIsoFile) return
|
|
170
|
-
|
|
171
|
-
isShowFileModal.value = true
|
|
172
|
-
}
|
|
173
|
-
const isShowFileModal = ref<boolean>(false)
|
|
174
|
-
const onSelectFile = (file: UI_I_FileTreeNode): void => {
|
|
175
|
-
cdDvdMedia.value = file.path
|
|
176
|
-
}
|
|
177
|
-
const fileTypes = computed<UI_I_OptionItem[]>(() =>
|
|
178
|
-
fileTypesFunc(localization.value)
|
|
179
|
-
)
|
|
180
|
-
|
|
181
|
-
const onRemoveCdDvdDrive = (): void => {
|
|
182
|
-
emits('remove')
|
|
183
|
-
}
|
|
184
|
-
const onRollBackCdDvdDrive = (): void => {
|
|
185
|
-
emits('roll-back')
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const cdDvdMedia = ref<string>('')
|
|
189
|
-
const bus = ref<string>('ide')
|
|
190
|
-
|
|
191
|
-
const deleteFilesFromDatastore = ref<boolean>(false)
|
|
192
|
-
|
|
193
|
-
watch(
|
|
194
|
-
[cdDvdMedia, bus, deleteFilesFromDatastore, () => props.type],
|
|
195
|
-
() => {
|
|
196
|
-
emits('send-data', {
|
|
197
|
-
create: props.cdDvdDrive.create,
|
|
198
|
-
attach: props.cdDvdDrive.attach,
|
|
199
|
-
source: cdDvdMedia.value,
|
|
200
|
-
size: 0,
|
|
201
|
-
bus: bus.value,
|
|
202
|
-
device_type: 'cdrom',
|
|
203
|
-
provision_type: 'thick',
|
|
204
|
-
disk_mode: 'dependent',
|
|
205
|
-
sharing: false,
|
|
206
|
-
read_only: true,
|
|
207
|
-
shares: 0,
|
|
208
|
-
cache: 'none',
|
|
209
|
-
io: 'native',
|
|
210
|
-
limit_iops: 0,
|
|
211
|
-
discard: 'unmap',
|
|
212
|
-
target: props.cdDvdDrive.target,
|
|
213
|
-
boot_order: props.cdDvdDrive.boot_order,
|
|
214
|
-
detach: props.type === 'removed',
|
|
215
|
-
remove: props.type === 'removed' && deleteFilesFromDatastore.value, // Проверяем если удалили диск и указали Delete files from datastore
|
|
216
|
-
})
|
|
217
|
-
},
|
|
218
|
-
{ immediate: true }
|
|
219
|
-
)
|
|
220
|
-
|
|
221
|
-
// Добавляем данные для редактирования
|
|
222
|
-
watch(
|
|
223
|
-
() => props.cdDvdDrive,
|
|
224
|
-
(newValue) => {
|
|
225
|
-
if (newValue.source !== '') {
|
|
226
|
-
selectedCdDvdDrive.value = 'datastoreIsoFile'
|
|
227
|
-
cdDvdMedia.value = newValue.source
|
|
228
|
-
}
|
|
229
|
-
if (newValue.bus !== '') {
|
|
230
|
-
bus.value = newValue.bus
|
|
231
|
-
}
|
|
232
|
-
},
|
|
233
|
-
{ immediate: true }
|
|
234
|
-
)
|
|
235
|
-
watch(
|
|
236
|
-
isRunning,
|
|
237
|
-
(newValue) => {
|
|
238
|
-
if (newValue && props.type === 'new') {
|
|
239
|
-
bus.value = 'virtio'
|
|
240
|
-
}
|
|
241
|
-
},
|
|
242
|
-
{ immediate: true }
|
|
243
|
-
)
|
|
244
|
-
</script>
|
|
245
|
-
|
|
246
|
-
<style lang="scss" scoped></style>
|
|
1
|
+
<template>
|
|
2
|
+
<div class="hardware-cd-dvd-drive">
|
|
3
|
+
<atoms-stack-block
|
|
4
|
+
:has-children="true"
|
|
5
|
+
:is-roll-back="props.type === 'removed'"
|
|
6
|
+
:removable="isRemovable"
|
|
7
|
+
@remove="onRemoveCdDvdDrive"
|
|
8
|
+
@roll-back="onRollBackCdDvdDrive"
|
|
9
|
+
>
|
|
10
|
+
<template #stackBlockKey>
|
|
11
|
+
<div
|
|
12
|
+
class="vm-wizard-toggle-block-cd-dvd-drive vm-wizard-toggle-block-hard-disk"
|
|
13
|
+
>
|
|
14
|
+
<span>{{ label }}</span>
|
|
15
|
+
</div>
|
|
16
|
+
</template>
|
|
17
|
+
<template #stackBlockContent>
|
|
18
|
+
<div class="flex-align-center flex-space-between">
|
|
19
|
+
<template v-if="props.type === 'removed'">
|
|
20
|
+
<span>{{ localization.deviceWillRemoved }}</span>
|
|
21
|
+
<div @click.stop class="flex-align-center">
|
|
22
|
+
<input
|
|
23
|
+
:id="`cd-dvd-delete-files-from-datastore-${props.index}`"
|
|
24
|
+
v-model="deleteFilesFromDatastore"
|
|
25
|
+
:disabled="props.disabled"
|
|
26
|
+
type="checkbox"
|
|
27
|
+
class="pointer"
|
|
28
|
+
@click.stop
|
|
29
|
+
/>
|
|
30
|
+
<label
|
|
31
|
+
:for="`cd-dvd-delete-files-from-datastore-${props.index}`"
|
|
32
|
+
:class="[
|
|
33
|
+
'label-text-normal pointer',
|
|
34
|
+
props.disabled && 'div-disabled',
|
|
35
|
+
]"
|
|
36
|
+
>{{ localization.deleteFilesFromDatastore }}</label
|
|
37
|
+
>
|
|
38
|
+
</div>
|
|
39
|
+
</template>
|
|
40
|
+
<template v-else>
|
|
41
|
+
<div class="select">
|
|
42
|
+
<select
|
|
43
|
+
id="vm-wizard-cd-dvd-drive-field"
|
|
44
|
+
v-model="selectedCdDvdDrive"
|
|
45
|
+
class="vm-wizard-cd-dvd-drive-field input-text-color"
|
|
46
|
+
@click.stop
|
|
47
|
+
@change="changeCdDvdDrive"
|
|
48
|
+
>
|
|
49
|
+
<option
|
|
50
|
+
v-for="(item, key) in cdDvdDriveOptions"
|
|
51
|
+
:key="key"
|
|
52
|
+
:value="item.value"
|
|
53
|
+
>
|
|
54
|
+
{{ item.text }}
|
|
55
|
+
</option>
|
|
56
|
+
</select>
|
|
57
|
+
</div>
|
|
58
|
+
</template>
|
|
59
|
+
</div>
|
|
60
|
+
</template>
|
|
61
|
+
<template #stackChildren>
|
|
62
|
+
<common-vm-actions-add-customize-hardware-virtual-hardware-cd-dvd-drive-media
|
|
63
|
+
v-if="selectedCdDvdDrive === 'datastoreIsoFile'"
|
|
64
|
+
v-model:cd-dvd-media="cdDvdMedia"
|
|
65
|
+
@browse="isShowFileModal = true"
|
|
66
|
+
/>
|
|
67
|
+
|
|
68
|
+
<common-vm-actions-add-customize-hardware-virtual-hardware-bus
|
|
69
|
+
v-model:bus="bus"
|
|
70
|
+
:index="indexByHardDisks"
|
|
71
|
+
:validation-type="busValidationType"
|
|
72
|
+
:error-validation-fields="props.errorValidationFields"
|
|
73
|
+
:disabled="isRunning"
|
|
74
|
+
component-type="disk_devices"
|
|
75
|
+
@remove-error-by-title="emits('remove-error-by-title', $event)"
|
|
76
|
+
/>
|
|
77
|
+
</template>
|
|
78
|
+
</atoms-stack-block>
|
|
79
|
+
|
|
80
|
+
<Teleport to="body">
|
|
81
|
+
<common-vm-actions-add-customize-hardware-virtual-hardware-browse-view
|
|
82
|
+
v-if="isShowFileModal"
|
|
83
|
+
:show="isShowFileModal"
|
|
84
|
+
:file-types="fileTypes"
|
|
85
|
+
:nodes="props.nodes"
|
|
86
|
+
:files="props.files"
|
|
87
|
+
@submit="onSelectFile"
|
|
88
|
+
@get-storage="emits('get-storage', $event)"
|
|
89
|
+
@get-folders-or-files="emits('get-folders-or-files', $event)"
|
|
90
|
+
@get-active-device-child="emits('get-active-device-child', $event)"
|
|
91
|
+
@show-datastore-child="emits('show-datastore-child', $event)"
|
|
92
|
+
@hide="isShowFileModal = false"
|
|
93
|
+
/>
|
|
94
|
+
</Teleport>
|
|
95
|
+
</div>
|
|
96
|
+
</template>
|
|
97
|
+
|
|
98
|
+
<script lang="ts" setup>
|
|
99
|
+
import { UI_I_FileTreeNode } from '~/components/models/interfaces'
|
|
100
|
+
import { UI_I_TablePayload } from '~/models/store/interfaces'
|
|
101
|
+
import { UI_T_CdDvdDrive } from '~/components/common/vm/actions/add/customizeHardware/virtualHardware/cdDvdDrive/models/types'
|
|
102
|
+
import { UI_I_SendDataNewCdDvdDrive } from '~/components/common/vm/actions/add/customizeHardware/virtualHardware/models/interfaces'
|
|
103
|
+
import { UI_I_Localization, UI_I_HTMLSelectElement } from '~/models/interfaces'
|
|
104
|
+
import { UI_I_ErrorValidationField } from '~/models/store/interfaces'
|
|
105
|
+
import { UI_I_OptionItem } from '~/components/atoms/models/interfaces'
|
|
106
|
+
import { UI_I_FolderOrFileTreePayload } from '~/models/store/storage/interfaces'
|
|
107
|
+
import { UI_T_CdDvdType } from '~/components/common/vm/actions/add/customizeHardware/virtualHardware/models/types'
|
|
108
|
+
import { cdDvdDriveOptionsFunc } from '~/components/common/vm/actions/add/customizeHardware/virtualHardware/cdDvdDrive/config/options'
|
|
109
|
+
import { fileTypesFunc } from '~/components/common/vm/actions/add/customizeHardware/virtualHardware/cdDvdDrive/config/fileTypes'
|
|
110
|
+
|
|
111
|
+
const props = defineProps<{
|
|
112
|
+
hardDisksCount: number
|
|
113
|
+
index: number
|
|
114
|
+
cdDvdDrive: UI_I_SendDataNewCdDvdDrive
|
|
115
|
+
nodes: UI_I_FileTreeNode[]
|
|
116
|
+
files: UI_I_FileTreeNode[]
|
|
117
|
+
errorValidationFields: UI_I_ErrorValidationField<string>[]
|
|
118
|
+
type: UI_T_CdDvdType
|
|
119
|
+
isEdit: boolean
|
|
120
|
+
state?: string | number
|
|
121
|
+
}>()
|
|
122
|
+
|
|
123
|
+
const emits = defineEmits<{
|
|
124
|
+
(event: 'send-data', value: UI_I_SendDataNewCdDvdDrive): void
|
|
125
|
+
(event: 'remove'): void
|
|
126
|
+
(event: 'roll-back'): void
|
|
127
|
+
(event: 'remove-error-by-title', value: string): void
|
|
128
|
+
(event: 'get-storage', value: UI_I_TablePayload): void
|
|
129
|
+
(event: 'get-folders-or-files', value: UI_I_FolderOrFileTreePayload): void
|
|
130
|
+
(event: 'get-active-device-child', value: UI_I_FileTreeNode): void
|
|
131
|
+
(event: 'show-datastore-child', value: UI_I_FileTreeNode): void
|
|
132
|
+
}>()
|
|
133
|
+
|
|
134
|
+
const localization = computed<UI_I_Localization>(() => useLocal())
|
|
135
|
+
|
|
136
|
+
const isRunning = computed<boolean>(() => {
|
|
137
|
+
return props.state === 2
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
const isRemovable = computed<boolean>(() => {
|
|
141
|
+
return (
|
|
142
|
+
!props.isEdit ||
|
|
143
|
+
!isRunning.value ||
|
|
144
|
+
(isRunning.value && bus.value === 'virtio')
|
|
145
|
+
)
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
const indexByHardDisks = computed<number>(
|
|
149
|
+
() => props.index + props.hardDisksCount
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
const label = computed<string>(() => {
|
|
153
|
+
if (props.type === 'edit' || props.type === 'removed')
|
|
154
|
+
return `${localization.value.cdDvdDrive} ${props.index + 1}`
|
|
155
|
+
|
|
156
|
+
return `${localization.value.newCdDvdDrive} *`
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
const busValidationType = computed<string>(
|
|
160
|
+
() => `disk_devices[${indexByHardDisks}].bus`
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
const selectedCdDvdDrive = ref<UI_T_CdDvdDrive>('clientDevice')
|
|
164
|
+
const cdDvdDriveOptions = ref<UI_I_OptionItem[]>(
|
|
165
|
+
cdDvdDriveOptionsFunc(localization.value)
|
|
166
|
+
)
|
|
167
|
+
const changeCdDvdDrive = (event: UI_I_HTMLSelectElement): void => {
|
|
168
|
+
const isDatastoreIsoFile = event.target.value === 'datastoreIsoFile'
|
|
169
|
+
if (!isDatastoreIsoFile) return
|
|
170
|
+
|
|
171
|
+
isShowFileModal.value = true
|
|
172
|
+
}
|
|
173
|
+
const isShowFileModal = ref<boolean>(false)
|
|
174
|
+
const onSelectFile = (file: UI_I_FileTreeNode): void => {
|
|
175
|
+
cdDvdMedia.value = file.path
|
|
176
|
+
}
|
|
177
|
+
const fileTypes = computed<UI_I_OptionItem[]>(() =>
|
|
178
|
+
fileTypesFunc(localization.value)
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
const onRemoveCdDvdDrive = (): void => {
|
|
182
|
+
emits('remove')
|
|
183
|
+
}
|
|
184
|
+
const onRollBackCdDvdDrive = (): void => {
|
|
185
|
+
emits('roll-back')
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const cdDvdMedia = ref<string>('')
|
|
189
|
+
const bus = ref<string>('ide')
|
|
190
|
+
|
|
191
|
+
const deleteFilesFromDatastore = ref<boolean>(false)
|
|
192
|
+
|
|
193
|
+
watch(
|
|
194
|
+
[cdDvdMedia, bus, deleteFilesFromDatastore, () => props.type],
|
|
195
|
+
() => {
|
|
196
|
+
emits('send-data', {
|
|
197
|
+
create: props.cdDvdDrive.create,
|
|
198
|
+
attach: props.cdDvdDrive.attach,
|
|
199
|
+
source: cdDvdMedia.value,
|
|
200
|
+
size: 0,
|
|
201
|
+
bus: bus.value,
|
|
202
|
+
device_type: 'cdrom',
|
|
203
|
+
provision_type: 'thick',
|
|
204
|
+
disk_mode: 'dependent',
|
|
205
|
+
sharing: false,
|
|
206
|
+
read_only: true,
|
|
207
|
+
shares: 0,
|
|
208
|
+
cache: 'none',
|
|
209
|
+
io: 'native',
|
|
210
|
+
limit_iops: 0,
|
|
211
|
+
discard: 'unmap',
|
|
212
|
+
target: props.cdDvdDrive.target,
|
|
213
|
+
boot_order: props.cdDvdDrive.boot_order,
|
|
214
|
+
detach: props.type === 'removed',
|
|
215
|
+
remove: props.type === 'removed' && deleteFilesFromDatastore.value, // Проверяем если удалили диск и указали Delete files from datastore
|
|
216
|
+
})
|
|
217
|
+
},
|
|
218
|
+
{ immediate: true }
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
// Добавляем данные для редактирования
|
|
222
|
+
watch(
|
|
223
|
+
() => props.cdDvdDrive,
|
|
224
|
+
(newValue) => {
|
|
225
|
+
if (newValue.source !== '') {
|
|
226
|
+
selectedCdDvdDrive.value = 'datastoreIsoFile'
|
|
227
|
+
cdDvdMedia.value = newValue.source
|
|
228
|
+
}
|
|
229
|
+
if (newValue.bus !== '') {
|
|
230
|
+
bus.value = newValue.bus
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
{ immediate: true }
|
|
234
|
+
)
|
|
235
|
+
watch(
|
|
236
|
+
isRunning,
|
|
237
|
+
(newValue) => {
|
|
238
|
+
if (newValue && props.type === 'new') {
|
|
239
|
+
bus.value = 'virtio'
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
{ immediate: true }
|
|
243
|
+
)
|
|
244
|
+
</script>
|
|
245
|
+
|
|
246
|
+
<style lang="scss" scoped></style>
|
package/components/common/vm/actions/add/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue
CHANGED
|
@@ -202,6 +202,8 @@ const onSelectLocation = (network: UI_I_NetworkTableItem): void => {
|
|
|
202
202
|
|
|
203
203
|
const adapterType = ref<string>('rtl8139')
|
|
204
204
|
|
|
205
|
+
const target = ref<string>('')
|
|
206
|
+
|
|
205
207
|
const macAddress = ref<string>('')
|
|
206
208
|
const macAddressType = ref<string>('automatic')
|
|
207
209
|
const newNetworkInvalid = ref<boolean>(false)
|
|
@@ -224,7 +226,7 @@ watch(
|
|
|
224
226
|
emits('send-data', {
|
|
225
227
|
network: option.text,
|
|
226
228
|
net_bridge: option.value,
|
|
227
|
-
target:
|
|
229
|
+
target: target.value,
|
|
228
230
|
model: adapterType.value,
|
|
229
231
|
mac: macAddress.value,
|
|
230
232
|
boot_order: props.network.boot_order,
|
|
@@ -247,6 +249,7 @@ watch(
|
|
|
247
249
|
|
|
248
250
|
adapterType.value = newValue.model
|
|
249
251
|
macAddress.value = newValue.mac
|
|
252
|
+
target.value = newValue.target
|
|
250
253
|
},
|
|
251
254
|
{ immediate: true }
|
|
252
255
|
)
|