bfg-common 1.1.86 → 1.1.88

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. package/assets/localization/local_be.json +3 -1
  2. package/assets/localization/local_en.json +3 -1
  3. package/assets/localization/local_hy.json +3 -1
  4. package/assets/localization/local_kk.json +3 -1
  5. package/assets/localization/local_ru.json +3 -1
  6. package/assets/localization/local_zh.json +3 -1
  7. package/components/common/monitor/advanced/Advanced.vue +19 -6
  8. package/components/common/monitor/advanced/tools/Tools.vue +15 -28
  9. package/components/common/monitor/advanced/tools/chartOptionsModal/ChartOptionsModal.vue +65 -5
  10. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/Counters.vue +8 -0
  11. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/Table.vue +9 -0
  12. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/config/utils.ts +3 -2
  13. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/Timespan.vue +6 -0
  14. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/object/Object.vue +66 -19
  15. package/components/common/monitor/advanced/tools/chartOptionsModal/models/models.ts +19 -0
  16. package/components/common/monitor/models/interfaces.ts +1 -0
  17. package/components/common/vm/actions/add/customizeHardware/virtualHardware/cdDvdDrive/CdDvdDrive.vue +246 -246
  18. package/components/common/vm/actions/add/customizeHardware/virtualHardware/cpu/Cpu.vue +2 -2
  19. package/components/common/vm/actions/add/customizeHardware/virtualHardware/newNetwork/NewNetwork.vue +4 -1
  20. 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: string): void
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: string): void
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
- watch(
230
- () => periodOptions.value,
231
- (newValue: UI_I_OptionItem[]) => {
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
- { immediate: true }
235
- )
236
- watch(
237
- () => props.selectedTimespanType,
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: string): void
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 selectedObjects = ref<string>('')
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: selectedObjects.value,
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,
@@ -654,8 +654,9 @@ export const getDefaultCounters = (
654
654
  case 'cpuUsageInPercent':
655
655
  return hostItemsFunc('cpu', {}).splice(0, 2)
656
656
  case 'disk':
657
- const allItems = hostItemsFunc('disk', {})
658
- return allItems.filter((_, key) => [0, 14].includes(key))
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':
@@ -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
- const items: UI_I_AdvancedTargetObject[] = []
74
+ let items: UI_I_AdvancedTargetObject[] = []
72
75
  watch(
73
- () => [props.type, props.chart, props.totalCores, props.hostId],
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
- items.push({
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: 'core' + i,
83
- target_object: '' + i,
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(selectedRow, (newValue) => {
93
- const selectedItems: number[] = []
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
- newValue.forEach((key) => {
96
- selectedItems.push(+items[key].id)
97
- })
117
+ const selectedNames =
118
+ items.length === newValue.length &&
119
+ props.selectedMetricsKeys.length === props.totalMetricItems
120
+ ? '*'
121
+ : selectedItems.join(', ')
98
122
 
99
- const selectedNames =
100
- items.length === newValue.length ? '*' : selectedItems.join(', ')
101
- emits('select-objects', selectedNames)
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
+ }
@@ -16,4 +16,5 @@ export interface UI_I_MonitorGraphPayload {
16
16
  storageId?: string
17
17
  hostName?: string
18
18
  fields?: string
19
+ metricType?: string
19
20
  }
@@ -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>
@@ -170,11 +170,11 @@ const isCpuDisabled = computed<boolean>(
170
170
  )
171
171
  watch(selectedCpu, (newValue) => {
172
172
  selectedCpu.value = Math.floor(+newValue)
173
- if (!(selectedCpu.value % selectedCorePerSocket.value)) return
173
+ if (!(selectedCpu.value % selectedCorePerSocket.value) || props.isEdit) return
174
174
  selectedCorePerSocket.value = 1
175
175
  })
176
176
  const maxCpuOptions = computed<UI_I_OptionItem[]>(() =>
177
- cpuOptionsFunc(localization.value, selectedCpu.value + 1, props.maxCpus)
177
+ cpuOptionsFunc(localization.value, selectedCpu.value, props.maxCpus)
178
178
  )
179
179
  watch(selectedCpu, (newValue) => {
180
180
  if (newValue >= props.maxCpus) {
@@ -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
  )
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bfg-common",
3
3
  "private": false,
4
- "version": "1.1.86",
4
+ "version": "1.1.88",
5
5
  "scripts": {
6
6
  "build": "nuxt build",
7
7
  "dev": "nuxt dev --port=3002",