bfg-common 1.5.674 → 1.5.676

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 (26) hide show
  1. package/components/common/pages/auth/TheFooter.vue +104 -0
  2. package/lib/models/enums.ts +1 -65
  3. package/package.json +1 -1
  4. package/components/common/layout/bottomPanel/BottomPanel.vue +0 -80
  5. package/components/common/layout/bottomPanel/New.vue +0 -239
  6. package/components/common/layout/bottomPanel/Old.vue +0 -154
  7. package/components/common/layout/bottomPanel/alarms/Alarms.vue +0 -76
  8. package/components/common/layout/bottomPanel/alarms/lib/models/interfaces.ts +0 -23
  9. package/components/common/layout/bottomPanel/alarms/new/New.vue +0 -212
  10. package/components/common/layout/bottomPanel/alarms/new/lib/config/config.ts +0 -193
  11. package/components/common/layout/bottomPanel/alarms/new/lib/models/enums.ts +0 -10
  12. package/components/common/layout/bottomPanel/alarms/new/lib/models/interfaces.ts +0 -12
  13. package/components/common/layout/bottomPanel/alarms/old/Old.vue +0 -191
  14. package/components/common/layout/bottomPanel/alarms/old/lib/config/alarmTables.ts +0 -89
  15. package/components/common/layout/bottomPanel/alarms/old/lib/config/tableKeys.ts +0 -11
  16. package/components/common/layout/bottomPanel/alarms/old/lib/models/types.ts +0 -8
  17. package/components/common/layout/bottomPanel/lib/config/statusFilter.ts +0 -19
  18. package/components/common/layout/bottomPanel/lib/models/types.ts +0 -1
  19. package/components/common/layout/bottomPanel/recentTasks/RecentTasks.vue +0 -43
  20. package/components/common/layout/bottomPanel/recentTasks/lib/models/interfaces.ts +0 -14
  21. package/components/common/layout/bottomPanel/recentTasks/new/New.vue +0 -419
  22. package/components/common/layout/bottomPanel/recentTasks/new/lib/config/config.ts +0 -259
  23. package/components/common/layout/bottomPanel/recentTasks/old/Old.vue +0 -275
  24. package/components/common/layout/bottomPanel/recentTasks/old/lib/config/recentTaskTable.ts +0 -240
  25. package/components/common/layout/bottomPanel/recentTasks/old/lib/config/tableKeys.ts +0 -15
  26. package/components/common/layout/bottomPanel/recentTasks/old/lib/models/types.ts +0 -14
@@ -1,419 +0,0 @@
1
- <template>
2
- <ui-data-table
3
- :data="data"
4
- :options="options"
5
- :loading="props.loading"
6
- test-id="resent-task-table"
7
- @sort="onSort"
8
- >
9
- <template #icon="{ item }">
10
- <span class="flex-align-center">
11
- <span :class="['icon', item.data.icon]" />
12
-
13
- <span
14
- :data-id="`rtask-${item.data.testId}`"
15
- :class="item.data.isLink && 'target-link'"
16
- @click="onSelectNodeOfTree(item.data)"
17
- >
18
- {{ item.text }}
19
- </span>
20
- </span>
21
- </template>
22
-
23
- <template #status="{ item }">
24
- <ui-chip :test-id="item.data.testId" :color="item.data.chipColor" rounded>
25
- <ui-icon
26
- :name="item.data.icon"
27
- width="14px"
28
- height="14px"
29
- class="chip-icon"
30
- ></ui-icon>
31
- {{ item.text }}
32
- </ui-chip>
33
-
34
- <div v-if="item.data.operations.length" class="ml-2">
35
- <common-tooltip-help
36
- :test-id="item.data.index + '-operations'"
37
- :help-id="item.data.index + '-operations-icon'"
38
- :title="localization.tasks.vmUpdateSteps"
39
- :help-text="item.data.error"
40
- status="info"
41
- @toggle-show="onToggleOperationsTooltip"
42
- >
43
- <template #default>
44
- <div class="operations-container">
45
- <div
46
- v-for="(item2, key2) in item.data.operations"
47
- :key="key2"
48
- :data-id="item2.testId"
49
- class="status-detail-item flex flex-align-center"
50
- >
51
- <div class="left-block">
52
- <ui-icon
53
- :name="item2.iconClassName"
54
- class="status-detail-item__icon"
55
- width="16"
56
- height="16"
57
- />
58
- <span class="text-ellipsis">{{ item2.operation_type }}:</span>
59
- </div>
60
- <div class="right-block text-ellipsis">
61
- <span
62
- :title="item2.message"
63
- class="status-detail-item-message text-ellipsis text-3 font-[500]"
64
- >{{ item2.message || '--' }}</span
65
- >
66
- <ui-icon
67
- name="arrow"
68
- width="16"
69
- height="16"
70
- class="toggle-text-icon pointer"
71
- :data-id="`toggle-text-icon-${key2}`"
72
- @click="onToggleLongText(key2)"
73
- />
74
- </div>
75
- </div>
76
- <div class="bottom-info-block">
77
- <span class="completed-text"
78
- >{{
79
- item.data.operations.length -
80
- item.data.failedOperationsCount
81
- }}
82
- {{ localization.common.of }}
83
- {{ item.data.operations.length }}
84
- {{ localization.common.completed }}</span
85
- >
86
- <span
87
- :class="[
88
- 'failed-text',
89
- { error: item.data.failedOperationsCount },
90
- ]"
91
- >{{ item.data.failedOperationsCount }}
92
- {{ localization.common.failed }}</span
93
- >
94
- </div>
95
- </div>
96
- </template>
97
- </common-tooltip-help>
98
- </div>
99
-
100
- <div v-if="item.data.error" class="ml-2">
101
- <common-tooltip-help
102
- :test-id="`${item.data.index}`"
103
- :help-id="item.data.index + 'icon'"
104
- :title="localization.common.failureReason"
105
- :help-text="item.data.error"
106
- dropdown-width="max-content"
107
- dropdown-max-width="480px"
108
- dropdown-max-height="200px"
109
- status="error"
110
- dropdown-top
111
- dropdown-left
112
- />
113
- </div>
114
- </template>
115
-
116
- <template #default-actions="{ item }">
117
- <div class="actions w-full">
118
- <ui-button
119
- :test-id="`resent-task-item-${item.data.id}-action`"
120
- variant="text"
121
- is-without-height
122
- is-without-sizes
123
- @click="onToggleActions(item.data.id)"
124
- >
125
- <span
126
- :class="['action-icon', { active: actionsIsShow[item.data.id] }]"
127
- >
128
- <ui-icon name="vertical-dotes" width="20" height="20" />
129
- </span>
130
- </ui-button>
131
- <ui-dropdown
132
- :show="actionsIsShow[item.data.id] || false"
133
- :test-id="`resent-task-item-action-${item.data.id}`"
134
- :items="actions"
135
- :elem-id="`resent-task-item-${item.data.id}-action`"
136
- width="max-content"
137
- left
138
- @select="onSelectAction(item.data.target, $event, item.data.id)"
139
- @hide="onHideActionsDropdown(item.data.id)"
140
- >
141
- <template #row="{ item: dropMenu }">
142
- <ui-icon
143
- v-if="dropMenu.iconName === 'hide'"
144
- name="password-hide"
145
- width="16"
146
- height="16"
147
- />
148
- <span class="action-text">
149
- {{ dropMenu.text }}
150
- </span>
151
- </template>
152
- </ui-dropdown>
153
- </div>
154
- </template>
155
- </ui-data-table>
156
- </template>
157
-
158
- <script setup lang="ts">
159
- import type { UI_I_Dropdown } from '~/node_modules/bfg-uikit/components/ui/dropdown/models/interfaces'
160
- import type {
161
- UI_I_DataTable,
162
- UI_I_DataTableHeader,
163
- UI_I_DataTableBody,
164
- } from '~/node_modules/bfg-uikit/components/ui/dataTable/models/interfaces'
165
- import type { UI_I_Pagination } from '~/lib/models/table/interfaces'
166
- import type { UI_I_Localization } from '~/lib/models/interfaces'
167
- import type { UI_I_RecentTaskItem } from '~/lib/models/store/tasks/interfaces'
168
- import type { UI_I_DataTargetForTable } from '~/components/common/layout/bottomPanel/recentTasks/lib/models/interfaces'
169
- import type { UI_T_NodeType } from '~/components/common/pages/home/lib/models/types'
170
- import {
171
- options,
172
- getHeaderDataFunc,
173
- getBodyDataFunc,
174
- } from '~/components/common/layout/bottomPanel/recentTasks/new/lib/config/config'
175
-
176
- const props = defineProps<{
177
- dataTable: UI_I_RecentTaskItem<UI_T_NodeType>[]
178
- loading: boolean
179
- pagination: UI_I_Pagination // Для Warning props
180
- }>()
181
- const emits = defineEmits<{
182
- (event: 'sort', value: string): void
183
- }>()
184
-
185
- const localization = computed<UI_I_Localization>(() => useLocal())
186
- const { $store }: any = useNuxtApp()
187
-
188
- const actionsIsShow = ref<boolean[]>([])
189
-
190
- const data = computed<UI_I_DataTable>(() => ({
191
- id: 'resent-task-table',
192
- header: resentTaskHeadItems.value,
193
- body: resentTaskBodyItems.value,
194
- }))
195
-
196
- const resentTaskHeadItems = computed<UI_I_DataTableHeader[]>(() =>
197
- getHeaderDataFunc(localization.value)
198
- )
199
-
200
- const resentTaskBodyItems = ref<UI_I_DataTableBody[]>([])
201
- watch(
202
- () => props.dataTable,
203
- (newValue) => {
204
- if (!newValue?.length) {
205
- resentTaskBodyItems.value = []
206
- return
207
- }
208
-
209
- resentTaskBodyItems.value = getBodyDataFunc(newValue, localization.value)
210
- },
211
- { deep: true, immediate: true }
212
- )
213
- const onSort = (value: string): void => {
214
- emits('sort', value)
215
- }
216
-
217
- const actions = computed<UI_I_Dropdown[]>(() => [
218
- {
219
- value: 'view',
220
- text: localization.value.common.viewTarget,
221
- iconName: 'hide',
222
- selected: false,
223
- },
224
- ])
225
- const onToggleActions = (id: number): void => {
226
- actionsIsShow.value[id] = !actionsIsShow.value[id]
227
- }
228
- const onSelectAction = (
229
- data: UI_I_DataTargetForTable,
230
- action: 'view',
231
- actionId: number
232
- ): void => {
233
- switch (action) {
234
- case 'view':
235
- onSelectNodeOfTree(data)
236
- break
237
- }
238
- onHideActionsDropdown(actionId)
239
- }
240
- const onHideActionsDropdown = (id: number): void => {
241
- actionsIsShow.value[id] = false
242
- }
243
-
244
- const onSelectNodeOfTree = (data: UI_I_DataTargetForTable): void => {
245
- if (!data.isLink) return
246
-
247
- const { type, id, nav } = data
248
-
249
- const node = {
250
- id,
251
- type,
252
- }
253
-
254
- const path = `/inventory/type=${type};nav=${nav};id=${id}/summary`
255
- navigateTo(path)
256
-
257
- $store.dispatch('inventory/A_SELECT_NODE', { node, type })
258
- }
259
-
260
- const onToggleOperationsTooltip = (): void => {
261
- setTimeout(() => {
262
- document.querySelectorAll('.status-detail-item').forEach((item) => {
263
- const messageItem = item.querySelector('.status-detail-item-message')
264
-
265
- if (!messageItem) return
266
-
267
- const isEllipsisActive = messageItem.scrollWidth > messageItem.clientWidth
268
-
269
- isEllipsisActive &&
270
- item.querySelector('.right-block')?.classList.toggle('active')
271
- })
272
- }, 0)
273
- }
274
- const onToggleLongText = (index: number): void => {
275
- document
276
- .querySelectorAll('.status-detail-item')
277
- [index].querySelectorAll('.right-block')[0]
278
- .classList.toggle('show-full')
279
- }
280
- </script>
281
-
282
- <style>
283
- /*TODO move up*/
284
- :root {
285
- --actions-icon-color: #4d5d69;
286
- --actions-icon-hover-color: #213444;
287
- --actions-icon-icative-color: #008fd6;
288
- --status-operations-container-border: #e9ebeda3;
289
- --status-operations-container-completed-info-text: #4d5d69;
290
- --status-operations-container-failed-error-text: #ea3223;
291
- }
292
- :root.dark-theme {
293
- --actions-icon-color: #e9eaec;
294
- --actions-icon-hover-color: #ffffff;
295
- --actions-icon-icative-color: #2ba2de;
296
- --status-operations-container-border: #e9ebed1f;
297
- --status-operations-container-completed-info-text: #e9eaec;
298
- --status-operations-container-failed-error-text: #ec4235;
299
- }
300
- </style>
301
- <style scoped lang="scss">
302
- .resent-task-table {
303
- height: inherit;
304
-
305
- .target-link {
306
- font-family: 'Inter', sans-serif;
307
- font-size: 13px;
308
- color: var(--bottom-pannel-rtask-link-text);
309
- font-weight: 400;
310
- line-height: 15.73px;
311
- cursor: pointer;
312
- &:hover {
313
- color: var(--bottom-pannel-rtask-link-hover-text);
314
- }
315
- }
316
- .chip-icon {
317
- min-width: 14px;
318
- //margin-right: 6px;
319
- }
320
- .icon {
321
- margin-right: 4px;
322
- }
323
-
324
- .actions {
325
- .action-icon {
326
- width: 16px;
327
- height: 16px;
328
- color: var(--actions-icon-color);
329
-
330
- &:hover {
331
- color: var(--actions-icon-hover-color);
332
- }
333
- &.active {
334
- color: var(--actions-icon-icative-color);
335
- }
336
- }
337
-
338
- .action-text {
339
- margin-left: 8px;
340
- }
341
- }
342
-
343
- .operations-container {
344
- max-width: 448px;
345
- min-width: 288px;
346
- padding-top: 16px;
347
- border-top: 1px solid var(--status-operations-container-border);
348
- display: grid;
349
- grid-row-gap: 20px;
350
-
351
- .status-detail-item {
352
- display: grid;
353
- grid-template-columns: 50% 50%;
354
-
355
- .left-block {
356
- display: flex;
357
- align-items: center;
358
- grid-gap: 8px;
359
- padding-right: 24px;
360
- }
361
- .right-block {
362
- display: grid;
363
- align-items: flex-start;
364
-
365
- &.active {
366
- grid-template-columns: 1fr max-content;
367
- grid-column-gap: 8px;
368
-
369
- .toggle-text-icon {
370
- display: unset;
371
- }
372
- }
373
- &.show-full {
374
- .status-detail-item-message {
375
- white-space: break-spaces;
376
- }
377
- .toggle-text-icon {
378
- transform: rotate(0deg);
379
- }
380
- }
381
-
382
- .status-detail-item-message {
383
- color: #9da6ad;
384
- }
385
- .toggle-text-icon {
386
- transform: rotate(180deg);
387
- display: none;
388
- }
389
- }
390
-
391
- &__icon {
392
- min-width: 16px;
393
- color: #ea3223;
394
- :deep(path) {
395
- fill-opacity: 1;
396
- }
397
- }
398
- }
399
- .bottom-info-block {
400
- display: flex;
401
- justify-content: space-between;
402
- padding-top: 16px;
403
- border-top: 1px solid var(--status-operations-container-border);
404
-
405
- .completed-text {
406
- font-weight: 500;
407
- color: var(--status-operations-container-completed-info-text);
408
- }
409
- .failed-text {
410
- color: #9da6ad;
411
-
412
- &.error {
413
- color: var(--status-operations-container-failed-error-text);
414
- }
415
- }
416
- }
417
- }
418
- }
419
- </style>
@@ -1,259 +0,0 @@
1
- import type {
2
- UI_I_DataTableBody,
3
- UI_I_DataTableOptions,
4
- UI_I_DataTableHeader,
5
- } from '~/node_modules/bfg-uikit/components/ui/dataTable/models/interfaces'
6
- import type { UI_I_Localization } from '~/lib/models/interfaces'
7
- import type { UI_I_RecentTaskItem } from '~/lib/models/store/tasks/interfaces'
8
- import type { UI_T_NodeType } from '~/components/common/pages/home/lib/models/types'
9
- import { UI_E_RecentTaskStatus } from '~/lib/models/store/tasks/enums'
10
- import { UI_E_NodeIconsByState } from '~/lib/models/enums'
11
- import { UI_E_TabsByTypeEnum } from '~/components/common/pages/home/widgets/warnings/table/lib/models/enums'
12
- import {
13
- UI_E_RTaskChipColor,
14
- UI_E_RTaskStatusIcon,
15
- } from '~/components/common/pages/tasks/table/lib/models/enums'
16
-
17
- export const getHeaderDataFunc = (
18
- localization: UI_I_Localization
19
- ): UI_I_DataTableHeader[] => [
20
- {
21
- col: 0,
22
- colName: 'taskName',
23
- text: localization.tasks.taskName,
24
- isSortable: true,
25
- sort: 'asc',
26
- sortColumn: true,
27
- width: '180px',
28
- show: true,
29
- filter: true,
30
- },
31
- {
32
- col: 1,
33
- colName: 'target',
34
- text: localization.common.target,
35
- isSortable: true,
36
- sort: 'asc',
37
- width: '180px',
38
- show: true,
39
- filter: true,
40
- },
41
- {
42
- col: 2,
43
- colName: 'status',
44
- text: localization.common.status,
45
- isSortable: true,
46
- sort: 'asc',
47
- width: '180px',
48
- show: true,
49
- filter: true,
50
- },
51
- {
52
- col: 3,
53
- colName: 'details',
54
- text: localization.common.details,
55
- isSortable: true,
56
- sort: 'asc',
57
- width: '180px',
58
- show: true,
59
- filter: true,
60
- },
61
- {
62
- col: 4,
63
- colName: 'initiator',
64
- text: localization.common.initiator,
65
- isSortable: true,
66
- sort: 'asc',
67
- width: '180px',
68
- show: true,
69
- filter: true,
70
- },
71
- {
72
- col: 5,
73
- colName: 'queuedFor',
74
- text: localization.common.queuedFor,
75
- isSortable: true,
76
- sort: 'asc',
77
- width: '180px',
78
- show: true,
79
- filter: true,
80
- },
81
- {
82
- col: 6,
83
- colName: 'startTime',
84
- text: localization.common.startTime,
85
- isSortable: true,
86
- sort: 'asc',
87
- width: '180px',
88
- show: true,
89
- filter: true,
90
- },
91
- {
92
- col: 7,
93
- colName: 'completionTime',
94
- text: localization.common.completionTime,
95
- isSortable: true,
96
- sort: 'asc',
97
- width: '180px',
98
- show: true,
99
- filter: true,
100
- },
101
- {
102
- col: 8,
103
- colName: 'executionTime',
104
- text: localization.common.executionTime,
105
- isSortable: true,
106
- sort: 'asc',
107
- width: '180px',
108
- show: true,
109
- filter: true,
110
- },
111
- {
112
- col: 9,
113
- colName: 'server',
114
- text: localization.common.server,
115
- isSortable: true,
116
- sort: 'asc',
117
- width: '180px',
118
- show: true,
119
- filter: true,
120
- },
121
- {
122
- col: 10,
123
- colName: 'zone',
124
- text: localization.common.zone,
125
- isSortable: true,
126
- sort: 'asc',
127
- width: '180px',
128
- show: true,
129
- filter: true,
130
- },
131
- {
132
- col: 11,
133
- colName: 'default-actions',
134
- text: '',
135
- show: true,
136
- },
137
- ]
138
-
139
- export const options: UI_I_DataTableOptions = {
140
- perPageOptions: [
141
- { text: '10', value: 10 },
142
- { text: '25', value: 25 },
143
- { text: '50', value: 50 },
144
- { text: '100', value: 100 },
145
- ],
146
- isSelectable: false,
147
- isFocusable: false,
148
- showPagination: true,
149
- showPageInfo: true,
150
- isSortable: true,
151
- server: false,
152
- isResizable: true,
153
- showSearch: false,
154
- showColumnManager: true,
155
- withActions: true,
156
- inBlock: true,
157
- inBlockOnlyLightMode: true,
158
- }
159
-
160
- export const getBodyDataFunc = (
161
- bodyData: UI_I_RecentTaskItem<UI_T_NodeType>[],
162
- localization: UI_I_Localization
163
- ): UI_I_DataTableBody[] => {
164
- const { $store, $text, $formattedDatetime }: any = useNuxtApp()
165
-
166
- return bodyData.map((task, index: number) => {
167
- const iconClassName = UI_E_NodeIconsByState[`${task.targetType}_Normal`]
168
- const id = task.extra?.created_id || task.target
169
- const targetData = {
170
- id,
171
- icon: iconClassName,
172
- nav: UI_E_TabsByTypeEnum[task.targetType],
173
- type: task.targetType,
174
- isLink: true,
175
- testId: `${task.targetType}-item`,
176
- }
177
-
178
- const lang = $store.getters['main/getInterfaceLang']
179
- const currentOperations = task.statusDetails.map((item) => {
180
- return {
181
- ...item,
182
- operation_type:
183
- lang === 'en_US'
184
- ? $text.toCapitalizeEveryWord(item.operation_type)
185
- : item.operation_type,
186
- }
187
- })
188
- const statusData = {
189
- icon: UI_E_RTaskStatusIcon[task.status],
190
- chipColor: UI_E_RTaskChipColor[task.status],
191
- error: task.error,
192
- operations: currentOperations,
193
- failedOperationsCount: task.statusDetails?.filter(
194
- (item) => item.status !== 4
195
- ).length,
196
- testId: `${task.taskName}-progress`,
197
- index,
198
- }
199
-
200
- const formattedStartTime =
201
- task.startTime === '--'
202
- ? '--'
203
- : $formattedDatetime(+task.startTime * 1000, {
204
- hasSeconds: true,
205
- })
206
-
207
- const formattedCompletionTime =
208
- task.completion === '--'
209
- ? '--'
210
- : $formattedDatetime(+task.completion * 1000, {
211
- hasSeconds: true,
212
- })
213
-
214
- return {
215
- row: index,
216
- collapse: false,
217
- isHiddenCollapse: false,
218
- collapseToggle: false,
219
- data: [
220
- { col: 0, text: task.taskName },
221
- {
222
- key: 'icon',
223
- col: 1,
224
- text: task.target,
225
- data: targetData,
226
- },
227
- {
228
- key: 'status',
229
- col: 2,
230
- text: localization.common[UI_E_RecentTaskStatus[task.status]],
231
- data: statusData,
232
- },
233
- { col: 3, text: task.details || '--' },
234
- { col: 4, text: task.initiator },
235
- { col: 5, text: `${task.queuedFor} ms` },
236
- { col: 6, text: formattedStartTime },
237
- { col: 7, text: formattedCompletionTime },
238
- { col: 8, text: `${task.execution} ms` },
239
- { col: 9, text: task.server },
240
- {
241
- key: 'icon',
242
- col: 10,
243
- text: task.zone,
244
- data: {
245
- icon: 'vsphere-icon-vcenter',
246
- isLink: false,
247
- testId: 'zone-item',
248
- },
249
- },
250
- {
251
- key: 'default-actions',
252
- col: 'default-actions',
253
- text: '',
254
- data: { id: index, target: targetData },
255
- },
256
- ],
257
- }
258
- })
259
- }