bfg-common 1.4.734 → 1.4.799

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 (84) hide show
  1. package/assets/img/icons/icons-sprite-dark-3.svg +227 -227
  2. package/assets/img/icons/icons-sprite-dark-5.svg +488 -488
  3. package/assets/img/icons/icons-sprite-light-3.svg +227 -227
  4. package/assets/img/icons/icons-sprite-light-5.svg +488 -488
  5. package/assets/localization/local_be.json +2 -16
  6. package/assets/localization/local_en.json +2 -16
  7. package/assets/localization/local_hy.json +2 -16
  8. package/assets/localization/local_kk.json +2 -16
  9. package/assets/localization/local_ru.json +2 -16
  10. package/assets/localization/local_zh.json +2 -16
  11. package/components/atoms/select/TheSelect.vue +1 -10
  12. package/components/common/browse/blocks/lib/models/types.ts +1 -1
  13. package/components/common/browse/lib/models/interfaces.ts +5 -5
  14. package/components/common/{monitor/advanced/tools/chartOptionsModal → chartOptionsModal}/counters/timespan/form/Form.vue +544 -539
  15. package/components/common/{pages/hardwareHealth/historyTestimony/tools/chartOptionsModal → chartOptionsModal}/counters/timespan/form/lib/config/dateForm.ts +116 -115
  16. package/components/common/diagramMain/Header.vue +211 -211
  17. package/components/common/diagramMain/adapter/AdapterItems.vue +61 -61
  18. package/components/common/diagramMain/lib/config/initial.ts +50 -50
  19. package/components/common/diagramMain/lib/models/types.ts +21 -21
  20. package/components/common/diagramMain/lib/utils/utils.ts +331 -331
  21. package/components/common/diagramMain/modals/ManagePhysicalAdaptersModal.vue +330 -330
  22. package/components/common/diagramMain/modals/editSettings/ConfirmTeamingSettingsModal.vue +40 -40
  23. package/components/common/diagramMain/modals/editSettings/EditSettings.vue +497 -497
  24. package/components/common/diagramMain/modals/editSettings/EditSettingsModal.vue +812 -812
  25. package/components/common/diagramMain/modals/editSettings/tabs/NetworkProperties.vue +214 -214
  26. package/components/common/diagramMain/modals/editSettings/tabs/Security.vue +189 -189
  27. package/components/common/diagramMain/modals/editSettings/tabs/SwitchProperties.vue +163 -163
  28. package/components/common/diagramMain/modals/editSettings/tabs/TeamingFailover.vue +175 -175
  29. package/components/common/diagramMain/modals/editSettings/tabs/TrafficShaping.vue +398 -398
  30. package/components/common/diagramMain/modals/editSettings/tabs/port/IpvFourSettings.vue +346 -346
  31. package/components/common/diagramMain/modals/editSettings/tabs/port/PortProperties.vue +205 -205
  32. package/components/common/diagramMain/modals/lib/config/diagramConfig.ts +23 -23
  33. package/components/common/diagramMain/modals/lib/config/initial.ts +180 -180
  34. package/components/common/diagramMain/modals/lib/config/vmKernelAdapter.ts +90 -90
  35. package/components/common/diagramMain/modals/lib/mappers/mappers.ts +87 -87
  36. package/components/common/diagramMain/modals/lib/utils/index.ts +24 -24
  37. package/components/common/diagramMain/modals/migrateVmkernelAdapter/lib/config/steps.ts +114 -114
  38. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/ConnectionSettings.vue +169 -169
  39. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/SelectVmkernelAdapter.vue +159 -159
  40. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/common.ts +14 -14
  41. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/connectionSettings.ts +137 -137
  42. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/selectVmkernelAdapter.ts +52 -52
  43. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/validations.ts +19 -19
  44. package/components/common/diagramMain/port/Ports.vue +47 -47
  45. package/components/common/monitor/advanced/Advanced.vue +5 -0
  46. package/components/common/monitor/advanced/tools/Tools.vue +9 -2
  47. package/components/common/monitor/advanced/tools/chartOptionsModal/ChartOptionsModal.vue +9 -2
  48. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/Counters.vue +2 -0
  49. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/Timespan.vue +95 -93
  50. package/components/common/monitor/overview/filters/Filters.vue +3 -0
  51. package/components/common/monitor/overview/filters/customIntervalModal/CustomIntervalModal.vue +15 -5
  52. package/components/common/monitor/overview/filters/customIntervalModal/lib/config/dateChecker.ts +24 -14
  53. package/components/common/pages/hardwareHealth/HardwareHealth.vue +12 -5
  54. package/components/common/pages/hardwareHealth/historyTestimony/Graph.vue +456 -451
  55. package/components/common/pages/hardwareHealth/historyTestimony/tools/Tools.vue +387 -380
  56. package/components/common/pages/hardwareHealth/historyTestimony/tools/chartOptionsModal/ChartOptionsModal.vue +13 -6
  57. package/components/common/pages/hardwareHealth/historyTestimony/tools/chartOptionsModal/counters/Counters.vue +94 -94
  58. package/components/common/pages/hardwareHealth/historyTestimony/tools/chartOptionsModal/counters/timespan/Timespan.vue +66 -66
  59. package/components/common/pages/tasks/Tasks.vue +0 -9
  60. package/components/common/pages/tasks/table/Table.vue +1 -0
  61. package/components/common/pages/tasks/table/errorInfo/ErrorInfo.vue +6 -10
  62. package/components/common/pages/tasks/table/expandDetails/ExpandDetails.vue +8 -8
  63. package/components/common/vm/actions/add/Add.vue +0 -2
  64. package/components/common/vm/actions/clone/Clone.vue +0 -2
  65. package/components/common/vm/actions/common/customizeHardware/CustomizeHardware.vue +0 -3
  66. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareNew.vue +0 -2
  67. package/components/common/vm/actions/common/customizeHardware/CustomizeHardwareOld.vue +0 -2
  68. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardware.vue +1 -9
  69. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareNew.vue +2 -5
  70. package/components/common/vm/actions/common/customizeHardware/virtualHardware/VirtualHardwareOld.vue +1 -3
  71. package/components/common/vm/actions/common/customizeHardware/virtualHardware/lib/config/dropdownItems.ts +4 -6
  72. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDevice.vue +10 -52
  73. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDeviceNew.vue +5 -31
  74. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/NewPciDeviceOld.vue +5 -31
  75. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/dynamicDirectPathIo/DynamicDirectPathIo.vue +2 -9
  76. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/lib/config/options.ts +4 -11
  77. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/typeSelection/TypeSelectionNew.vue +1 -1
  78. package/components/common/vm/actions/common/customizeHardware/virtualHardware/newPciDevice/typeSelection/TypeSelectionOld.vue +1 -1
  79. package/components/common/vm/actions/editSettings/EditSettings.vue +0 -3
  80. package/components/common/vm/actions/editSettings/EditSettingsOld.vue +0 -2
  81. package/components/common/vm/actions/editSettings/new/New.vue +0 -2
  82. package/package.json +3 -3
  83. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/timespan/form/lib/config/dateForm.ts +0 -114
  84. package/components/common/pages/hardwareHealth/historyTestimony/tools/chartOptionsModal/counters/timespan/form/Form.vue +0 -539
@@ -1,451 +1,456 @@
1
- <template>
2
- <common-pages-hardware-health-history-testimony-tools
3
- v-model:selected-view="selectedView"
4
- v-model:selected-timespan-type="selectedTimespanType"
5
- :selected-chart-option-name="selectedChartOptionName"
6
- :is-show-chart-modal="isShowChartModal"
7
- :chart-title="props.powerData?.groupName || ''"
8
- :selected-metric="selectedMetric"
9
- :selected-power-counters-keys="selectedPowerCountersKeys"
10
- :power-selected-rows-local="powerSelectedRowsLocal"
11
- :selected-temperature-counters-keys="selectedTemperatureCountersKeys"
12
- :temperature-selected-rows-local="temperatureSelectedRowsLocal"
13
- :units-count="unitsCount"
14
- :power-counters-table-data="powerCountersTableData"
15
- :temperature-counters-table-data="temperatureCountersTableData"
16
- :language="props.language"
17
- :custom-date-from="customDateFrom"
18
- :custom-date-to="customDateTo"
19
- :custom-time-from="customTimeFrom"
20
- :custom-time-to="customTimeTo"
21
- :start-date="props.powerData?.pointStart || 0"
22
- :timespan-period-type="timespanPeriodType"
23
- @power-selected-rows-local="powerSelectedRowsLocal = $event"
24
- @temperature-selected-rows-local="temperatureSelectedRowsLocal = $event"
25
- @show-chart-modal="isShowChartModal = true"
26
- @hide-chart-modal="isShowChartModal = false"
27
- @update-tools="onUpdateTools"
28
- @delete-option="onDeleteOption"
29
- @submit-options="onSubmitOptions"
30
- @update-timespan-period-type="timespanPeriodType = $event"
31
- />
32
- <div
33
- ref="historyTestimonyGraph"
34
- :class="[
35
- `history-testimony-graph ${selectedView}`,
36
- { medium: isMediumSizeGraphsContainer },
37
- ]"
38
- >
39
- <div class="graph-container">
40
- <common-graph
41
- v-if="powerDataLocal && !props.powerLoading"
42
- :data="powerDataLocal"
43
- :update="updatePowerHelper"
44
- :chart="powerChart"
45
- :selected-row="selectedRowPower"
46
- />
47
- <div
48
- v-else-if="props.powerLoading"
49
- class="history-testimony-graph__loader-block"
50
- >
51
- <div class="spinner"></div>
52
- </div>
53
- <div v-else class="history-testimony-graph__empty-content"></div>
54
- </div>
55
- <div class="graph-container">
56
- <common-graph
57
- v-if="temperatureDataLocal && !props.temperatureLoading"
58
- :data="temperatureDataLocal"
59
- :update="updateTemperatureHelper"
60
- :chart="temperatureChart"
61
- :selected-row="selectedRowTemperature"
62
- />
63
- <div
64
- v-else-if="props.temperatureLoading"
65
- class="history-testimony-graph__loader-block"
66
- >
67
- <div class="spinner"></div>
68
- </div>
69
- <div v-else class="history-testimony-graph__empty-content"></div>
70
- </div>
71
- </div>
72
- </template>
73
-
74
- <script setup lang="ts">
75
- import { useElementSize } from '@vueuse/core'
76
- import { format } from 'date-fns'
77
- import type {
78
- I_SeriesLine,
79
- I_LineGraph,
80
- } from '~/node_modules/bfg-nuxt-3-graph/graph/lib/models/interfaces'
81
- import { graphDataFunc } from '~/node_modules/bfg-nuxt-3-graph/graph/lib/utils/renderGraph'
82
- import type { UI_I_OptionsForm } from '~/components/common/pages/hardwareHealth/historyTestimony/tools/chartOptionsModal/lib/models/interfaces'
83
- import type { UI_I_Localization } from '~/lib/models/interfaces'
84
- import type { UI_T_Chart } from '~/components/common/pages/hardwareHealth/historyTestimony/tools/chartOptionsModal/lib/models/types'
85
- import type { UI_I_HardwareHealthSensors } from '~/components/common/pages/hardwareHealth/tableView/lib/models/interfaces'
86
- import type {
87
- UI_I_HardwareHealthHistoryTestimonyTools,
88
- UI_I_HardwareHealthSensorsGraph
89
- } from '~/components/common/pages/hardwareHealth/historyTestimony/lib/models/interfaces'
90
- import type { UI_I_SensorsGraphPayload } from '~/components/common/pages/hardwareHealth/historyTestimony/tools/lib/models/interfaces'
91
- import { containerMediumSize } from '~/components/common/pages/hardwareHealth/historyTestimony/lib/config/containerSizes'
92
-
93
- const emits = defineEmits<{
94
- (event: 'update-tools', value: UI_I_HardwareHealthHistoryTestimonyTools): void
95
- }>()
96
- const props = defineProps<{
97
- powerData: I_SeriesLine | null
98
- temperatureData: I_SeriesLine | null
99
- countersTableData: UI_I_HardwareHealthSensors[]
100
- language: string
101
- powerLoading: boolean
102
- temperatureLoading: boolean
103
- formattedDatetime: any
104
- isDarkMode: boolean
105
- getDateFormat: any
106
- mainSelectedRow: number[]
107
- }>()
108
- const selectedView = defineModel<string>('selectedView')
109
-
110
- const { $store }: any = useNuxtApp()
111
-
112
- const historyTestimonyGraph = ref<any>(null)
113
- const { width } = useElementSize(historyTestimonyGraph)
114
- const isMediumSizeGraphsContainer = computed<boolean>(
115
- () => width.value < containerMediumSize
116
- )
117
-
118
- // const historyTestimonyGraph = ref(null)
119
- // const contentWidth = ref<number>(
120
- // useElementSize(historyTestimonyGraph)?.width || 0
121
- // )
122
- // watch(contentWidth, (newValue) => {
123
- // if (newValue) {
124
- // updatePowerChart()
125
- // updateTemperatureChart()
126
- // }
127
- // if (!powerChart.value || !temperatureChart.value) return
128
- //
129
- // powerChart.value.setSize(1, powerChart.chartHeight)
130
- // temperatureChart.value.setSize(1, temperatureChart.chartHeight)
131
- //
132
- // setTimeout(() => {
133
- // powerChart.value.setSize(newValue, powerChart.chartHeight)
134
- // temperatureChart.value.setSize(newValue, temperatureChart.chartHeight)
135
- // }, 1000)
136
- // })
137
- // const isContentMediumSize = computed<boolean>(() => contentWidth.value <= 1200)
138
-
139
- const selectedChartOptionName = ref<string>('')
140
- const isShowChartModal = ref<boolean>(false)
141
- const selectedMetric = ref<UI_T_Chart>('power')
142
- const selectedPowerCountersKeys = ref<number[]>([])
143
- const selectedTemperatureCountersKeys = ref<number[]>([])
144
- const selectedTimespanType = ref<string>('')
145
- const customDateFrom = ref<string>('')
146
- const customDateTo = ref<string>('')
147
- const customTimeFrom = ref<string>('')
148
- const customTimeTo = ref<string>('')
149
-
150
- const selectedRowPower = ref<number[]>([])
151
- const selectedRowTemperature = ref<number[]>([])
152
- let powerCounters: UI_I_HardwareHealthSensors[] = []
153
- let temperatureCounters: UI_I_HardwareHealthSensors[] = []
154
- const updateAllSelectedSelectedRow = (): void => {
155
- selectedRowPower.value = []
156
- selectedRowTemperature.value = []
157
-
158
- if (!props.mainSelectedRow.length) return
159
-
160
- props.mainSelectedRow.forEach((key) => {
161
- const selectedItem = props.countersTableData[key]
162
- const category = selectedItem.category.toLowerCase()
163
-
164
- if (category === 'power') {
165
- const currentKey = powerCounters.findIndex(
166
- (item) => item.id === selectedItem.id
167
- )
168
- selectedRowPower.value.push(currentKey)
169
- } else if (category === 'temperature') {
170
- const currentKey = temperatureCounters.findIndex(
171
- (item) => item.id === selectedItem.id
172
- )
173
- selectedRowTemperature.value.push(currentKey)
174
- }
175
- })
176
- }
177
- watch(
178
- () => props.countersTableData,
179
- (newValue) => {
180
- powerCounters = newValue.filter(
181
- (item) => item.category.toLowerCase() === 'power'
182
- )
183
- temperatureCounters = newValue.filter(
184
- (item) => item.category.toLowerCase() === 'temperature'
185
- )
186
- },
187
- { deep: true, immediate: true }
188
- )
189
- watch(
190
- () => props.mainSelectedRow,
191
- () => {
192
- updateAllSelectedSelectedRow()
193
- },
194
- { deep: true, immediate: true }
195
- )
196
- watch(
197
- selectedView,
198
- () => {
199
- updateAllSelectedSelectedRow()
200
- },
201
- { deep: true }
202
- )
203
-
204
- const unitsCount = ref<number>(0)
205
- const powerCountersTableData = ref<UI_I_HardwareHealthSensorsGraph[]>([])
206
- const temperatureCountersTableData = ref<UI_I_HardwareHealthSensorsGraph[]>([])
207
- const powerSelectedRowsLocal = ref<UI_I_HardwareHealthSensorsGraph[]>([])
208
- const temperatureSelectedRowsLocal = ref<UI_I_HardwareHealthSensorsGraph[]>([])
209
-
210
- watch(
211
- () => props.countersTableData,
212
- (newValue) => {
213
- if (!newValue.length) return
214
-
215
- powerCountersTableData.value = []
216
- temperatureCountersTableData.value = []
217
-
218
- newValue.forEach((item, key) => {
219
- const newData: UI_I_HardwareHealthSensorsGraph = {
220
- id: key,
221
- name: item.name,
222
- description: item.category,
223
- measurement: '',
224
- units: '',
225
- nameEn: item.mainName || '',
226
- testId: `counters-table-${item.name}-item`,
227
- hidden: item.hidden,
228
- }
229
- if (item.category.toLowerCase() === 'power')
230
- powerCountersTableData.value.push(newData)
231
- else if (item.category.toLowerCase() === 'temperature')
232
- temperatureCountersTableData.value.push(newData)
233
- })
234
- },
235
- { immediate: true, deep: true }
236
- )
237
-
238
- const selectAllCounters = (): void => {
239
- if (!powerCountersTableData.value)
240
- setTimeout(() => {
241
- selectAllCounters()
242
- }, 2000)
243
- else {
244
- powerCountersTableData.value.forEach((item) => {
245
- selectedPowerCountersKeys.value.push(item.id)
246
- })
247
- temperatureCountersTableData.value.forEach((item) => {
248
- if (!item.hidden) selectedTemperatureCountersKeys.value.push(item.id)
249
- })
250
- }
251
- }
252
-
253
- onMounted(() => {
254
- selectAllCounters()
255
- })
256
-
257
- const localization = computed<UI_I_Localization>(() => useLocal())
258
-
259
- const powerDataLocal = ref<I_LineGraph | null>(null)
260
- const temperatureDataLocal = ref<I_LineGraph | null>(null)
261
- const updatePowerHelper = ref<number>(0)
262
- const updateTemperatureHelper = ref<number>(0)
263
- let dateFormat = ''
264
- const powerChart = ref<any>(null)
265
- const temperatureChart = ref<any>(null)
266
- const timespanPeriodType = ref<string>('last')
267
-
268
- const powerChartCallback = (newValue: any): void => {
269
- newValue && (powerChart.value = newValue)
270
- }
271
-
272
- const temperatureChartCallback = (newValue: any): void => {
273
- newValue && (temperatureChart.value = newValue)
274
- }
275
-
276
- const updatePowerChart = (): void => {
277
- if (!props.powerData) return
278
-
279
- powerDataLocal.value = graphDataFunc(
280
- props.powerData,
281
- props.isDarkMode,
282
- localization.value,
283
- () => {},
284
- false,
285
- false,
286
- true,
287
- 'spline',
288
- '',
289
- undefined,
290
- powerChartCallback,
291
- props.formattedDatetime,
292
- format,
293
- dateFormat
294
- )
295
-
296
- updatePowerHelper.value++
297
- }
298
-
299
- const updateTemperatureChart = (): void => {
300
- if (!props.temperatureData) return
301
-
302
- temperatureDataLocal.value = graphDataFunc(
303
- props.temperatureData,
304
- props.isDarkMode,
305
- localization.value,
306
- () => {},
307
- false,
308
- false,
309
- true,
310
- 'spline',
311
- '',
312
- undefined,
313
- temperatureChartCallback,
314
- props.formattedDatetime,
315
- format,
316
- dateFormat
317
- )
318
-
319
- updateTemperatureHelper.value++
320
- }
321
-
322
- watch(
323
- () => [props.powerData, props.isDarkMode, props.language],
324
- (newValue) => {
325
- dateFormat = props.getDateFormat(newValue[2])
326
- updatePowerChart()
327
- },
328
- { immediate: true, deep: true }
329
- )
330
-
331
- watch(
332
- () => [props.temperatureData, props.isDarkMode, props.language],
333
- (newValue) => {
334
- dateFormat = props.getDateFormat(newValue[2])
335
- updateTemperatureChart()
336
- },
337
- { immediate: true, deep: true }
338
- )
339
-
340
- const updateSelectedCountersKeys = (metricType: string): void => {
341
- if (metricType === 'power') {
342
- const newKeys: number[] = []
343
-
344
- powerSelectedRowsLocal.value.forEach((item) => {
345
- newKeys.push(item.id)
346
- })
347
- selectedPowerCountersKeys.value = newKeys
348
- } else if (metricType === 'temperature') {
349
- const newKeys: number[] = []
350
-
351
- temperatureSelectedRowsLocal.value.forEach((item) => {
352
- newKeys.push(item.id)
353
- })
354
- selectedTemperatureCountersKeys.value = newKeys
355
- }
356
- }
357
-
358
- const tools: UI_I_HardwareHealthHistoryTestimonyTools = {
359
- periodName: 'real_time',
360
- view: 'power',
361
- metricType: selectedMetric.value,
362
- period: [],
363
- }
364
-
365
- const onSubmitOptions = (data: UI_I_OptionsForm): void => {
366
- selectedTimespanType.value = data.periodName
367
- updateSelectedCountersKeys(data.metric)
368
- if (data.metric === 'power')
369
- $store.dispatch(
370
- 'monitor/A_GET_HARDWARE_HEALTH_HISTORY_TESTIMONY_POWER',
371
- data
372
- )
373
- if (data.metric === 'temperature')
374
- $store.dispatch(
375
- 'monitor/A_GET_HARDWARE_HEALTH_HISTORY_TESTIMONY_TEMPERATURE',
376
- data
377
- )
378
- }
379
-
380
- const onUpdateTools = (data: UI_I_SensorsGraphPayload): void => {
381
- const storageChartOptions = useLocalStorage(
382
- data.view + 'ChartOptionsSensors',
383
- undefined
384
- )
385
-
386
- selectedChartOptionName.value = ''
387
-
388
- if (storageChartOptions) {
389
- selectedChartOptionName.value = data.view
390
- } else {
391
- selectedMetric.value = 'power'
392
- }
393
-
394
- tools.periodName = data.periodName
395
- tools.view = data.view
396
- tools.period = data.period
397
- tools.metricType = data.metricType || selectedMetric.value
398
-
399
- emits('update-tools', tools)
400
- }
401
-
402
- const onDeleteOption = (): void => {}
403
- </script>
404
-
405
- <style scoped lang="scss">
406
- .history-testimony-graph {
407
- display: flex;
408
- align-items: center;
409
- grid-gap: 20px;
410
-
411
- &.medium {
412
- flex-direction: column;
413
-
414
- .graph-container {
415
- width: 100%;
416
- }
417
- }
418
- .graph-container {
419
- width: calc(50% - 10px);
420
- }
421
- &.power {
422
- & > div:nth-child(1) {
423
- width: 100%;
424
- }
425
- & > div:nth-child(2) {
426
- display: none;
427
- width: 0;
428
- }
429
- }
430
- &.temperature {
431
- & > div:nth-child(1) {
432
- display: none;
433
- width: 0;
434
- }
435
- & > div:nth-child(2) {
436
- width: 100%;
437
- }
438
- }
439
-
440
- &__loader-block {
441
- height: inherit;
442
- display: flex;
443
- justify-content: center;
444
- align-items: center;
445
- min-height: 300px;
446
- }
447
- &__empty-content {
448
- height: inherit;
449
- }
450
- }
451
- </style>
1
+ <template>
2
+ <common-pages-hardware-health-history-testimony-tools
3
+ v-model:selected-view="selectedView"
4
+ v-model:selected-timespan-type="selectedTimespanType"
5
+ :selected-chart-option-name="selectedChartOptionName"
6
+ :is-show-chart-modal="isShowChartModal"
7
+ :chart-title="props.powerData?.groupName || ''"
8
+ :selected-metric="selectedMetric"
9
+ :selected-power-counters-keys="selectedPowerCountersKeys"
10
+ :power-selected-rows-local="powerSelectedRowsLocal"
11
+ :selected-temperature-counters-keys="selectedTemperatureCountersKeys"
12
+ :temperature-selected-rows-local="temperatureSelectedRowsLocal"
13
+ :units-count="unitsCount"
14
+ :power-counters-table-data="powerCountersTableData"
15
+ :temperature-counters-table-data="temperatureCountersTableData"
16
+ :language="props.language"
17
+ :custom-date-from="customDateFrom"
18
+ :custom-date-to="customDateTo"
19
+ :custom-time-from="customTimeFrom"
20
+ :custom-time-to="customTimeTo"
21
+ :start-date="props.powerData?.pointStart || 0"
22
+ :end-date="props.powerData?.pointEnd || 0"
23
+ :timespan-period-type="timespanPeriodType"
24
+ :valid-date-end="props.validDateEnd"
25
+ :format-date="props.formatDate"
26
+ @power-selected-rows-local="powerSelectedRowsLocal = $event"
27
+ @temperature-selected-rows-local="temperatureSelectedRowsLocal = $event"
28
+ @show-chart-modal="isShowChartModal = true"
29
+ @hide-chart-modal="isShowChartModal = false"
30
+ @update-tools="onUpdateTools"
31
+ @delete-option="onDeleteOption"
32
+ @submit-options="onSubmitOptions"
33
+ @update-period-type="timespanPeriodType = $event"
34
+ />
35
+ <div
36
+ ref="historyTestimonyGraph"
37
+ :class="[
38
+ `history-testimony-graph ${selectedView}`,
39
+ { medium: isMediumSizeGraphsContainer },
40
+ ]"
41
+ >
42
+ <div class="graph-container">
43
+ <common-graph
44
+ v-if="powerDataLocal && !props.powerLoading"
45
+ :data="powerDataLocal"
46
+ :update="updatePowerHelper"
47
+ :chart="powerChart"
48
+ :selected-row="selectedRowPower"
49
+ />
50
+ <div
51
+ v-else-if="props.powerLoading"
52
+ class="history-testimony-graph__loader-block"
53
+ >
54
+ <div class="spinner"></div>
55
+ </div>
56
+ <div v-else class="history-testimony-graph__empty-content"></div>
57
+ </div>
58
+ <div class="graph-container">
59
+ <common-graph
60
+ v-if="temperatureDataLocal && !props.temperatureLoading"
61
+ :data="temperatureDataLocal"
62
+ :update="updateTemperatureHelper"
63
+ :chart="temperatureChart"
64
+ :selected-row="selectedRowTemperature"
65
+ />
66
+ <div
67
+ v-else-if="props.temperatureLoading"
68
+ class="history-testimony-graph__loader-block"
69
+ >
70
+ <div class="spinner"></div>
71
+ </div>
72
+ <div v-else class="history-testimony-graph__empty-content"></div>
73
+ </div>
74
+ </div>
75
+ </template>
76
+
77
+ <script setup lang="ts">
78
+ import { useElementSize } from '@vueuse/core'
79
+ import { format } from 'date-fns'
80
+ import type {
81
+ I_SeriesLine,
82
+ I_LineGraph,
83
+ } from '~/node_modules/bfg-nuxt-3-graph/graph/lib/models/interfaces'
84
+ import { graphDataFunc } from '~/node_modules/bfg-nuxt-3-graph/graph/lib/utils/renderGraph'
85
+ import type { UI_I_OptionsForm } from '~/components/common/pages/hardwareHealth/historyTestimony/tools/chartOptionsModal/lib/models/interfaces'
86
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
87
+ import type { UI_T_Chart } from '~/components/common/pages/hardwareHealth/historyTestimony/tools/chartOptionsModal/lib/models/types'
88
+ import type { UI_I_HardwareHealthSensors } from '~/components/common/pages/hardwareHealth/tableView/lib/models/interfaces'
89
+ import type {
90
+ UI_I_HardwareHealthHistoryTestimonyTools,
91
+ UI_I_HardwareHealthSensorsGraph,
92
+ } from '~/components/common/pages/hardwareHealth/historyTestimony/lib/models/interfaces'
93
+ import type { UI_I_SensorsGraphPayload } from '~/components/common/pages/hardwareHealth/historyTestimony/tools/lib/models/interfaces'
94
+ import { containerMediumSize } from '~/components/common/pages/hardwareHealth/historyTestimony/lib/config/containerSizes'
95
+
96
+ const emits = defineEmits<{
97
+ (event: 'update-tools', value: UI_I_HardwareHealthHistoryTestimonyTools): void
98
+ }>()
99
+ const props = defineProps<{
100
+ powerData: I_SeriesLine | null
101
+ temperatureData: I_SeriesLine | null
102
+ countersTableData: UI_I_HardwareHealthSensors[]
103
+ language: string
104
+ powerLoading: boolean
105
+ temperatureLoading: boolean
106
+ formattedDatetime: any
107
+ isDarkMode: boolean
108
+ getDateFormat: any
109
+ mainSelectedRow: number[]
110
+ validDateEnd: number
111
+ formatDate: string
112
+ }>()
113
+ const selectedView = defineModel<string>('selectedView')
114
+
115
+ const { $store }: any = useNuxtApp()
116
+
117
+ const historyTestimonyGraph = ref<any>(null)
118
+ const { width } = useElementSize(historyTestimonyGraph)
119
+ const isMediumSizeGraphsContainer = computed<boolean>(
120
+ () => width.value < containerMediumSize
121
+ )
122
+
123
+ // const historyTestimonyGraph = ref(null)
124
+ // const contentWidth = ref<number>(
125
+ // useElementSize(historyTestimonyGraph)?.width || 0
126
+ // )
127
+ // watch(contentWidth, (newValue) => {
128
+ // if (newValue) {
129
+ // updatePowerChart()
130
+ // updateTemperatureChart()
131
+ // }
132
+ // if (!powerChart.value || !temperatureChart.value) return
133
+ //
134
+ // powerChart.value.setSize(1, powerChart.chartHeight)
135
+ // temperatureChart.value.setSize(1, temperatureChart.chartHeight)
136
+ //
137
+ // setTimeout(() => {
138
+ // powerChart.value.setSize(newValue, powerChart.chartHeight)
139
+ // temperatureChart.value.setSize(newValue, temperatureChart.chartHeight)
140
+ // }, 1000)
141
+ // })
142
+ // const isContentMediumSize = computed<boolean>(() => contentWidth.value <= 1200)
143
+
144
+ const selectedChartOptionName = ref<string>('')
145
+ const isShowChartModal = ref<boolean>(false)
146
+ const selectedMetric = ref<UI_T_Chart>('power')
147
+ const selectedPowerCountersKeys = ref<number[]>([])
148
+ const selectedTemperatureCountersKeys = ref<number[]>([])
149
+ const selectedTimespanType = ref<string>('')
150
+ const customDateFrom = ref<string>('')
151
+ const customDateTo = ref<string>('')
152
+ const customTimeFrom = ref<string>('')
153
+ const customTimeTo = ref<string>('')
154
+
155
+ const selectedRowPower = ref<number[]>([])
156
+ const selectedRowTemperature = ref<number[]>([])
157
+ let powerCounters: UI_I_HardwareHealthSensors[] = []
158
+ let temperatureCounters: UI_I_HardwareHealthSensors[] = []
159
+ const updateAllSelectedSelectedRow = (): void => {
160
+ selectedRowPower.value = []
161
+ selectedRowTemperature.value = []
162
+
163
+ if (!props.mainSelectedRow.length) return
164
+
165
+ props.mainSelectedRow.forEach((key) => {
166
+ const selectedItem = props.countersTableData[key]
167
+ const category = selectedItem.category.toLowerCase()
168
+
169
+ if (category === 'power') {
170
+ const currentKey = powerCounters.findIndex(
171
+ (item) => item.id === selectedItem.id
172
+ )
173
+ selectedRowPower.value.push(currentKey)
174
+ } else if (category === 'temperature') {
175
+ const currentKey = temperatureCounters.findIndex(
176
+ (item) => item.id === selectedItem.id
177
+ )
178
+ selectedRowTemperature.value.push(currentKey)
179
+ }
180
+ })
181
+ }
182
+ watch(
183
+ () => props.countersTableData,
184
+ (newValue) => {
185
+ powerCounters = newValue.filter(
186
+ (item) => item.category.toLowerCase() === 'power'
187
+ )
188
+ temperatureCounters = newValue.filter(
189
+ (item) => item.category.toLowerCase() === 'temperature'
190
+ )
191
+ },
192
+ { deep: true, immediate: true }
193
+ )
194
+ watch(
195
+ () => props.mainSelectedRow,
196
+ () => {
197
+ updateAllSelectedSelectedRow()
198
+ },
199
+ { deep: true, immediate: true }
200
+ )
201
+ watch(
202
+ selectedView,
203
+ () => {
204
+ updateAllSelectedSelectedRow()
205
+ },
206
+ { deep: true }
207
+ )
208
+
209
+ const unitsCount = ref<number>(0)
210
+ const powerCountersTableData = ref<UI_I_HardwareHealthSensorsGraph[]>([])
211
+ const temperatureCountersTableData = ref<UI_I_HardwareHealthSensorsGraph[]>([])
212
+ const powerSelectedRowsLocal = ref<UI_I_HardwareHealthSensorsGraph[]>([])
213
+ const temperatureSelectedRowsLocal = ref<UI_I_HardwareHealthSensorsGraph[]>([])
214
+
215
+ watch(
216
+ () => props.countersTableData,
217
+ (newValue) => {
218
+ if (!newValue.length) return
219
+
220
+ powerCountersTableData.value = []
221
+ temperatureCountersTableData.value = []
222
+
223
+ newValue.forEach((item, key) => {
224
+ const newData: UI_I_HardwareHealthSensorsGraph = {
225
+ id: key,
226
+ name: item.name,
227
+ description: item.category,
228
+ measurement: '',
229
+ units: '',
230
+ nameEn: item.mainName || '',
231
+ testId: `counters-table-${item.name}-item`,
232
+ hidden: item.hidden,
233
+ }
234
+ if (item.category.toLowerCase() === 'power')
235
+ powerCountersTableData.value.push(newData)
236
+ else if (item.category.toLowerCase() === 'temperature')
237
+ temperatureCountersTableData.value.push(newData)
238
+ })
239
+ },
240
+ { immediate: true, deep: true }
241
+ )
242
+
243
+ const selectAllCounters = (): void => {
244
+ if (!powerCountersTableData.value)
245
+ setTimeout(() => {
246
+ selectAllCounters()
247
+ }, 2000)
248
+ else {
249
+ powerCountersTableData.value.forEach((item) => {
250
+ selectedPowerCountersKeys.value.push(item.id)
251
+ })
252
+ temperatureCountersTableData.value.forEach((item) => {
253
+ if (!item.hidden) selectedTemperatureCountersKeys.value.push(item.id)
254
+ })
255
+ }
256
+ }
257
+
258
+ onMounted(() => {
259
+ selectAllCounters()
260
+ })
261
+
262
+ const localization = computed<UI_I_Localization>(() => useLocal())
263
+
264
+ const powerDataLocal = ref<I_LineGraph | null>(null)
265
+ const temperatureDataLocal = ref<I_LineGraph | null>(null)
266
+ const updatePowerHelper = ref<number>(0)
267
+ const updateTemperatureHelper = ref<number>(0)
268
+ let dateFormat = ''
269
+ const powerChart = ref<any>(null)
270
+ const temperatureChart = ref<any>(null)
271
+ const timespanPeriodType = ref<string>('last')
272
+
273
+ const powerChartCallback = (newValue: any): void => {
274
+ newValue && (powerChart.value = newValue)
275
+ }
276
+
277
+ const temperatureChartCallback = (newValue: any): void => {
278
+ newValue && (temperatureChart.value = newValue)
279
+ }
280
+
281
+ const updatePowerChart = (): void => {
282
+ if (!props.powerData) return
283
+
284
+ powerDataLocal.value = graphDataFunc(
285
+ props.powerData,
286
+ props.isDarkMode,
287
+ localization.value,
288
+ () => {},
289
+ false,
290
+ false,
291
+ true,
292
+ 'spline',
293
+ '',
294
+ undefined,
295
+ powerChartCallback,
296
+ props.formattedDatetime,
297
+ format,
298
+ dateFormat
299
+ )
300
+
301
+ updatePowerHelper.value++
302
+ }
303
+
304
+ const updateTemperatureChart = (): void => {
305
+ if (!props.temperatureData) return
306
+
307
+ temperatureDataLocal.value = graphDataFunc(
308
+ props.temperatureData,
309
+ props.isDarkMode,
310
+ localization.value,
311
+ () => {},
312
+ false,
313
+ false,
314
+ true,
315
+ 'spline',
316
+ '',
317
+ undefined,
318
+ temperatureChartCallback,
319
+ props.formattedDatetime,
320
+ format,
321
+ dateFormat
322
+ )
323
+
324
+ updateTemperatureHelper.value++
325
+ }
326
+
327
+ watch(
328
+ () => [props.powerData, props.isDarkMode, props.language],
329
+ (newValue) => {
330
+ dateFormat = props.getDateFormat(newValue[2])
331
+ updatePowerChart()
332
+ },
333
+ { immediate: true, deep: true }
334
+ )
335
+
336
+ watch(
337
+ () => [props.temperatureData, props.isDarkMode, props.language],
338
+ (newValue) => {
339
+ dateFormat = props.getDateFormat(newValue[2])
340
+ updateTemperatureChart()
341
+ },
342
+ { immediate: true, deep: true }
343
+ )
344
+
345
+ const updateSelectedCountersKeys = (metricType: string): void => {
346
+ if (metricType === 'power') {
347
+ const newKeys: number[] = []
348
+
349
+ powerSelectedRowsLocal.value.forEach((item) => {
350
+ newKeys.push(item.id)
351
+ })
352
+ selectedPowerCountersKeys.value = newKeys
353
+ } else if (metricType === 'temperature') {
354
+ const newKeys: number[] = []
355
+
356
+ temperatureSelectedRowsLocal.value.forEach((item) => {
357
+ newKeys.push(item.id)
358
+ })
359
+ selectedTemperatureCountersKeys.value = newKeys
360
+ }
361
+ }
362
+
363
+ const tools: UI_I_HardwareHealthHistoryTestimonyTools = {
364
+ periodName: 'real_time',
365
+ view: 'power',
366
+ metricType: selectedMetric.value,
367
+ period: [],
368
+ }
369
+
370
+ const onSubmitOptions = (data: UI_I_OptionsForm): void => {
371
+ selectedTimespanType.value = data.periodName
372
+ updateSelectedCountersKeys(data.metric)
373
+ if (data.metric === 'power')
374
+ $store.dispatch(
375
+ 'monitor/A_GET_HARDWARE_HEALTH_HISTORY_TESTIMONY_POWER',
376
+ data
377
+ )
378
+ if (data.metric === 'temperature')
379
+ $store.dispatch(
380
+ 'monitor/A_GET_HARDWARE_HEALTH_HISTORY_TESTIMONY_TEMPERATURE',
381
+ data
382
+ )
383
+ }
384
+
385
+ const onUpdateTools = (data: UI_I_SensorsGraphPayload): void => {
386
+ const storageChartOptions = useLocalStorage(
387
+ data.view + 'ChartOptionsSensors',
388
+ undefined
389
+ )
390
+
391
+ selectedChartOptionName.value = ''
392
+
393
+ if (storageChartOptions) {
394
+ selectedChartOptionName.value = data.view
395
+ } else {
396
+ selectedMetric.value = 'power'
397
+ }
398
+
399
+ tools.periodName = data.periodName
400
+ tools.view = data.view
401
+ tools.period = data.period
402
+ tools.metricType = data.metricType || selectedMetric.value
403
+
404
+ emits('update-tools', tools)
405
+ }
406
+
407
+ const onDeleteOption = (): void => {}
408
+ </script>
409
+
410
+ <style scoped lang="scss">
411
+ .history-testimony-graph {
412
+ display: flex;
413
+ align-items: center;
414
+ grid-gap: 20px;
415
+
416
+ &.medium {
417
+ flex-direction: column;
418
+
419
+ .graph-container {
420
+ width: 100%;
421
+ }
422
+ }
423
+ .graph-container {
424
+ width: calc(50% - 10px);
425
+ }
426
+ &.power {
427
+ & > div:nth-child(1) {
428
+ width: 100%;
429
+ }
430
+ & > div:nth-child(2) {
431
+ display: none;
432
+ width: 0;
433
+ }
434
+ }
435
+ &.temperature {
436
+ & > div:nth-child(1) {
437
+ display: none;
438
+ width: 0;
439
+ }
440
+ & > div:nth-child(2) {
441
+ width: 100%;
442
+ }
443
+ }
444
+
445
+ &__loader-block {
446
+ height: inherit;
447
+ display: flex;
448
+ justify-content: center;
449
+ align-items: center;
450
+ min-height: 300px;
451
+ }
452
+ &__empty-content {
453
+ height: inherit;
454
+ }
455
+ }
456
+ </style>