bfg-common 1.5.718 → 1.5.719

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 (94) hide show
  1. package/CODE_STYLE.md +109 -109
  2. package/assets/img/icons/icons-sprite-dark-3.svg +227 -227
  3. package/assets/img/icons/icons-sprite-dark-5.svg +488 -488
  4. package/assets/img/icons/icons-sprite-light-3.svg +227 -227
  5. package/assets/img/icons/icons-sprite-light-5.svg +488 -488
  6. package/components/atoms/TheIcon3.vue +50 -50
  7. package/components/atoms/collapse/CollapseNav.vue +170 -170
  8. package/components/atoms/perPage/PerPage.vue +58 -58
  9. package/components/atoms/table/dataGrid/DataGrid.vue +1718 -1718
  10. package/components/atoms/table/dataGrid/DataGridPagination.vue +97 -97
  11. package/components/atoms/table/dataGrid/lib/config/settingsTable.ts +94 -94
  12. package/components/atoms/table/dataGrid/lib/utils/export.ts +16 -16
  13. package/components/common/backup/storage/actions/add/lib/utils.ts +51 -51
  14. package/components/common/browse/blocks/contents/filesNew/Skeleton.vue +18 -18
  15. package/components/common/diagramMain/modals/lib/config/vCenterModal.ts +48 -48
  16. package/components/common/diagramMain/port/Port.vue +580 -580
  17. package/components/common/layout/theHeader/helpMenu/About.vue +79 -79
  18. package/components/common/layout/theHeader/helpMenu/aboutOld/AboutOld.vue +79 -79
  19. package/components/common/layout/theHeader/userMenu/modals/preferences/lib/models/types.ts +7 -7
  20. package/components/common/pages/backups/DetailView.vue +52 -52
  21. package/components/common/pages/backups/lib/models/interfaces.ts +36 -36
  22. package/components/common/pages/backups/modals/Modals.vue +243 -243
  23. package/components/common/pages/backups/modals/createBackup/configuration/maxBandwidth/lib/config/options.ts +6 -6
  24. package/components/common/pages/backups/modals/createBackup/lib/config/readyToCompleteOptions.ts +69 -69
  25. package/components/common/pages/backups/modals/lib/config/restore.ts +115 -115
  26. package/components/common/pages/backups/modals/lib/models/interfaces.ts +186 -186
  27. package/components/common/pages/backups/modals/restore/name/lib/models/interfaces.ts +6 -6
  28. package/components/common/pages/files/lib/models/enums.ts +28 -2
  29. package/components/common/pages/home/lib/models/interfaces.ts +48 -48
  30. package/components/common/pages/home/widgets/hosts/Hosts.vue +27 -27
  31. package/components/common/pages/home/widgets/hosts/lib/config/items.ts +23 -23
  32. package/components/common/pages/home/widgets/vms/VmsOld.vue +35 -35
  33. package/components/common/pages/home/widgets/vms/lib/config/items.ts +19 -19
  34. package/components/common/pages/scheduledTasks/lib/utils/utils.ts +84 -84
  35. package/components/common/pages/tasks/Tasks.vue +125 -125
  36. package/components/common/pages/tasks/table/Table.vue +373 -373
  37. package/components/common/pages/tasks/table/lib/config/config.ts +279 -279
  38. package/components/common/pages/tasks/table/lib/models/interfaces.ts +9 -6
  39. package/components/common/readyToComplete/ReadyToComplete.vue +17 -17
  40. package/components/common/select/radio/RadioGroup.vue +137 -137
  41. package/components/common/spiceConsole/Drawer.vue +420 -420
  42. package/components/common/spiceConsole/SpiceConsole.vue +184 -184
  43. package/components/common/spiceConsole/lib/models/interfaces.ts +5 -5
  44. package/components/common/tools/Actions.vue +207 -207
  45. package/components/common/treeView/TreeView.vue +52 -52
  46. package/components/common/vm/actions/clone/lib/config/steps.ts +295 -295
  47. package/components/common/vm/actions/clone/new/New.vue +438 -438
  48. package/components/common/vm/actions/common/customizeHardware/virtualHardware/cpu/shares/lib/config/options.ts +28 -28
  49. package/components/common/vm/actions/common/customizeHardware/virtualHardware/memory/Memory.vue +283 -283
  50. package/components/common/vm/actions/common/customizeHardware/vmoptions/bootOptions/order/Order.vue +156 -156
  51. package/components/common/vm/actions/common/select/compatibility/Old.vue +107 -107
  52. package/components/common/vm/actions/common/select/createType/lib/models/interfaces.ts +5 -5
  53. package/components/common/vm/actions/common/select/options/New.vue +264 -264
  54. package/components/common/vm/actions/common/select/options/Options.vue +58 -58
  55. package/components/common/vm/actions/common/select/storage/Old.vue +125 -125
  56. package/components/common/vm/actions/common/select/storage/new/New.vue +311 -311
  57. package/components/common/vm/actions/common/select/storage/new/lib/models/interfaces.ts +5 -5
  58. package/components/common/vm/actions/common/select/storage/new/lib/utils/utils.ts +21 -21
  59. package/components/common/vm/actions/common/select/template/old/Old.vue +50 -50
  60. package/components/common/vm/actions/editSettings/new/Skeleton.vue +88 -88
  61. package/components/common/wizards/common/compatibility/Compatibility.vue +35 -35
  62. package/components/common/wizards/common/steps/computeResource/New.vue +93 -93
  63. package/components/common/wizards/common/steps/name/Name.vue +178 -178
  64. package/components/common/wizards/common/steps/name/New.vue +221 -221
  65. package/components/common/wizards/common/steps/name/Old.vue +121 -121
  66. package/components/common/wizards/common/steps/name/lib/models/interfaces.ts +4 -4
  67. package/components/common/wizards/common/steps/name/location/New.vue +40 -40
  68. package/components/common/wizards/datastore/add/Add.vue +228 -228
  69. package/components/common/wizards/datastore/add/lib/utils.ts +85 -85
  70. package/components/common/wizards/datastore/add/steps/typeMode/lib/config/typeOptions.ts +43 -43
  71. package/composables/useAppVersion.ts +21 -21
  72. package/composables/useLocal.ts +6 -6
  73. package/composables/useLocalCommon.ts +39 -39
  74. package/lib/models/enums.ts +14 -0
  75. package/lib/models/types.ts +59 -60
  76. package/lib/utils/localizationMapper.ts +1 -2
  77. package/package.json +1 -1
  78. package/plugins/console.ts +21 -21
  79. package/plugins/mouse.ts +21 -21
  80. package/plugins/panelStates.ts +70 -70
  81. package/plugins/text.ts +59 -59
  82. package/public/spice-console/application/clientgui.js +854 -854
  83. package/public/spice-console/application/packetfactory.js +211 -211
  84. package/public/spice-console/application/virtualmouse.js +147 -147
  85. package/public/spice-console/lib/images/bitmap.js +203 -203
  86. package/public/spice-console/network/spicechannel.js +440 -440
  87. package/public/spice-console/process/cursorprocess.js +128 -128
  88. package/public/spice-console/process/inputprocess.js +227 -227
  89. package/public/spice-console/process/mainprocess.js +212 -212
  90. package/public/spice-console/run.js +210 -210
  91. package/store/main/mutations.ts +7 -7
  92. package/store/main/state.ts +7 -7
  93. package/store/tasks/mappers/recentTasks.ts +123 -123
  94. package/store/tasks/mutations.ts +82 -82
@@ -1,373 +1,373 @@
1
- <template>
2
- <ui-data-table
3
- :data="data"
4
- :options="options"
5
- :loading="props.loading"
6
- :total-pages="props.totalPages"
7
- :total-items="props.totalItems"
8
- :texts="texts"
9
- :skeleton="skeletonData"
10
- test-id="task-table"
11
- @sort="onSorting"
12
- @pagination="onPagination"
13
- @column-filter="onColumnFilter"
14
- >
15
- <template #icon="{ item }">
16
- <span class="flex-align-center">
17
- <span :class="['icon', item.data.icon]" />
18
-
19
- <span
20
- :data-id="`rtask-${item.data.testId}`"
21
- :class="item.data.isLink && 'target-link'"
22
- @click.stop="onSelectNodeOfTree(item.data)"
23
- >
24
- {{ item.text }}
25
- </span>
26
- </span>
27
- </template>
28
-
29
- <template #status="{ item }">
30
- <ui-chip :test-id="item.data.testId" :color="item.data.chipColor" rounded>
31
- <ui-icon
32
- :name="item.data.icon"
33
- width="14px"
34
- height="14px"
35
- class="chip-icon"
36
- ></ui-icon>
37
- {{ item.text }}
38
- </ui-chip>
39
-
40
- <div v-if="item.data.error" class="task-table__tooltip">
41
- <common-tooltip-help
42
- :test-id="item.data.testId"
43
- :help-id="item.data.testId + 'icon'"
44
- :title="localization.common.failureReason"
45
- :help-text="item.data.error"
46
- status="error"
47
- dropdown-width="232px"
48
- dropdown-left
49
- dropdown-top
50
- />
51
- </div>
52
- </template>
53
-
54
- <template #default-actions="{ item }">
55
- <div class="actions">
56
- <ui-button
57
- :id="`data-table-task-action-${item.data.id}`"
58
- :test-id="`data-table-task-action-${item.data.id}`"
59
- variant="text"
60
- is-without-height
61
- is-without-sizes
62
- @click.stop="onToggleActions(item.data.id)"
63
- >
64
- <span
65
- :class="['action-icon', { active: actionsShowId === item.data.id }]"
66
- >
67
- <ui-icon name="vertical-dotes" width="20" height="20" />
68
- </span>
69
- </ui-button>
70
- <ui-dropdown
71
- :show="actionsShowId === item.data.id"
72
- :test-id="`data-table-task-dropdown-${item.data.id}`"
73
- :items="actions"
74
- :elem-id="`data-table-task-action-${item.data.id}`"
75
- width="max-content"
76
- left
77
- @select="onSelectAction(item.data.target, $event)"
78
- @hide="onHideActionsDropdown"
79
- >
80
- <template #row="{ item: dropMenu }">
81
- <ui-icon
82
- v-if="dropMenu.iconName === 'hide'"
83
- name="password-hide"
84
- width="16"
85
- height="16"
86
- />
87
- <span class="action-text">
88
- {{ dropMenu.text }}
89
- </span>
90
- </template>
91
- </ui-dropdown>
92
- </div>
93
- </template>
94
-
95
- <template #expand="{ item }">
96
- <common-pages-tasks-table-expand-details :data="item.data" />
97
- </template>
98
-
99
- <template #skeleton-header>
100
- <div class="skeleton-header">
101
- <div class="left-skeleton">
102
- <ui-skeleton-item width="70" height="16" />
103
- <div class="vertical-line"></div>
104
- <ui-skeleton-item width="70" height="16" />
105
- <ui-skeleton-item width="70" height="16" />
106
- </div>
107
- <div class="right-skeleton">
108
- <ui-skeleton-item width="128" height="36" border-radius="8" />
109
- </div>
110
- </div>
111
- </template>
112
- </ui-data-table>
113
- </template>
114
-
115
- <script setup lang="ts">
116
- import type { UI_I_Dropdown } from '~/node_modules/bfg-uikit/components/ui/dropdown/models/interfaces'
117
- import type {
118
- UI_I_DataTable,
119
- UI_I_DataTableHeader,
120
- UI_I_DataTableBody,
121
- UI_I_DataTableSkeleton,
122
- UI_I_Pagination,
123
- UI_I_TableTexts,
124
- } from '~/node_modules/bfg-uikit/components/ui/dataTable/models/interfaces'
125
- import type { UI_T_ArbitraryObject } from '~/node_modules/bfg-uikit/models/types'
126
- import type {
127
- UI_T_Project,
128
- UI_T_ProcuratorTypeNodes,
129
- UI_T_LangValue,
130
- } from '~/lib/models/types'
131
- import type { UI_I_Localization } from '~/lib/models/interfaces'
132
- import type { UI_I_TaskItem } from '~/lib/models/store/tasks/interfaces'
133
- import type { UI_I_TableTarget } from '~/lib/models/table/interfaces'
134
- import type { UI_T_TimeValue } from '~/components/common/layout/theHeader/userMenu/modals/preferences/timeFormat/lib/models/types'
135
- import type { UI_I_TaskConfig } from '~/components/common/pages/tasks/table/lib/models/interfaces'
136
- import {
137
- options,
138
- getTargetActionsFunc,
139
- getHeaderDataFunc,
140
- getBodyDataFunc,
141
- } from '~/components/common/pages/tasks/table/lib/config/config'
142
- import { useDebounceFn } from '@vueuse/core'
143
-
144
- const props = defineProps<{
145
- project: UI_T_Project
146
- tableData: UI_I_TaskItem<UI_T_ProcuratorTypeNodes>[]
147
- totalPages: number
148
- totalItems: number
149
- loading: boolean
150
- config: UI_I_TaskConfig
151
- }>()
152
- const emits = defineEmits<{
153
- (event: 'sort', value: string): void
154
- (event: 'pagination', value: UI_I_Pagination): void
155
- (event: 'col-search', value: string): void
156
- }>()
157
-
158
- const localization = computed<UI_I_Localization>(() => useLocal())
159
- const { $store }: any = useNuxtApp()
160
-
161
- const texts = computed<UI_I_TableTexts>(() => ({
162
- searchHere: localization.value.common.searchHere,
163
- rowsPerPage: localization.value.common.rowsPerPage,
164
- of: localization.value.common.of,
165
- selected: localization.value.common.selected,
166
- columns: localization.value.common.columns,
167
- previous: localization.value.common.previous,
168
- next: localization.value.common.next,
169
- noItemsFound: localization.value.common.noItemsFound,
170
- exportAll: localization.value.common.exportAll,
171
- exportSelected: localization.value.common.exportSelected,
172
- all: localization.value.common.all,
173
- filter: localization.value.common.filter,
174
- }))
175
- const skeletonData = ref<UI_I_DataTableSkeleton>({
176
- columnsCount: 6,
177
- headColumns: [],
178
- bodyColumns: [],
179
- })
180
-
181
- const actionsShowId = ref<number>(-1)
182
-
183
- const data = computed<UI_I_DataTable>(() => ({
184
- id: 'tasks-table',
185
- header: taskHeadItems.value,
186
- body: taskBodyItems.value,
187
- }))
188
-
189
- const taskHeadItems = computed<UI_I_DataTableHeader[]>(() =>
190
- getHeaderDataFunc(localization.value)
191
- )
192
-
193
- const timeFormat = computed<UI_T_TimeValue>(
194
- () => $store.getters['main/getTimeFormat']
195
- )
196
-
197
- const interfaceLang = computed<UI_T_LangValue>(
198
- () => $store.getters['main/getInterfaceLang']
199
- )
200
-
201
- const taskBodyItems = ref<UI_I_DataTableBody[]>([])
202
- watch(
203
- () => [props.tableData, timeFormat.value, interfaceLang.value],
204
- (
205
- newValue: [
206
- UI_I_TaskItem<UI_T_ProcuratorTypeNodes>[],
207
- UI_T_TimeValue,
208
- UI_T_LangValue
209
- ]
210
- ) => {
211
- if (!newValue[0]?.length) {
212
- taskBodyItems.value = []
213
- return
214
- }
215
-
216
- taskBodyItems.value = getBodyDataFunc(
217
- newValue[0],
218
- localization.value,
219
- props.project,
220
- props.config
221
- )
222
- },
223
- { deep: true, immediate: true }
224
- )
225
-
226
- // const openedError = ref<string>('')
227
-
228
- // const onToggleError = (value: string): void => {
229
- // if (!value || value === openedError.value) {
230
- // openedError.value = ''
231
- // } else {
232
- // openedError.value = value
233
- // }
234
- // }
235
-
236
- const onSorting = (value: string): void => {
237
- emits('sort', value)
238
- }
239
- const onPagination = (value: UI_I_Pagination): void => {
240
- emits('pagination', value)
241
- }
242
- const sendFilter = useDebounceFn((searchText: string) => {
243
- emits('col-search', searchText)
244
- }, 1000)
245
- const onColumnFilter = (obj: UI_T_ArbitraryObject<string>): void => {
246
- let searchText = ''
247
-
248
- for (const [key, value] of Object.entries(obj)) {
249
- const currentFilter = searchText
250
- ? ',' + key + '.' + value
251
- : key + '.' + value
252
-
253
- searchText = searchText + (value ? currentFilter : '')
254
- }
255
- sendFilter(searchText)
256
- }
257
-
258
- const actions = computed<UI_I_Dropdown[]>(() =>
259
- getTargetActionsFunc(localization.value, props.project)
260
- )
261
- const onToggleActions = (id: number): void => {
262
- if (actionsShowId.value === id) {
263
- actionsShowId.value = -1
264
- } else {
265
- actionsShowId.value = id
266
- }
267
- }
268
- const onSelectAction = (
269
- data: UI_I_TableTarget<typeof props.project>,
270
- action: 'view-target' | 'view-zone'
271
- ): void => {
272
- switch (action) {
273
- case 'view-target':
274
- onSelectNodeOfTree(data)
275
- break
276
- case 'view-zone':
277
- onSelectNodeOfTree({ ...data, type: 'zone', nav: 'h' })
278
- break
279
- }
280
- onHideActionsDropdown()
281
- }
282
- const onHideActionsDropdown = (): void => {
283
- actionsShowId.value = -1
284
- }
285
-
286
- const onSelectNodeOfTree = (
287
- data: UI_I_TableTarget<typeof props.project>
288
- ): void => {
289
- if (!data.isLink) return
290
-
291
- const { type, id, nav } = data
292
-
293
- const node = {
294
- id,
295
- type,
296
- }
297
-
298
- const path = `/inventory/type=${type};nav=${nav};id=${id}/summary`
299
- navigateTo(path)
300
-
301
- $store.dispatch('inventory/A_SELECT_NODE', { node, type })
302
- }
303
- </script>
304
-
305
- <style scoped lang="scss">
306
- .task-table {
307
- height: inherit;
308
-
309
- .target-link {
310
- font-family: 'Inter', sans-serif;
311
- font-size: 13px;
312
- color: var(--bottom-pannel-rtask-link-text);
313
- font-weight: 400;
314
- line-height: 15.73px;
315
- cursor: pointer;
316
- &:hover {
317
- color: var(--bottom-pannel-rtask-link-hover-text);
318
- }
319
- }
320
- .chip-icon {
321
- min-width: 14px;
322
- }
323
- .icon {
324
- margin-right: 4px;
325
- }
326
-
327
- .actions {
328
- width: 100%;
329
-
330
- .action-icon {
331
- width: 20px;
332
- height: 20px;
333
- color: var(--tasks-actions-icon-color);
334
-
335
- &:hover {
336
- color: var(--tasks-actions-icon-hover-color);
337
- }
338
- &.active {
339
- color: var(--tasks-actions-icon-icative-color);
340
- }
341
- }
342
-
343
- .action-text {
344
- margin-left: 8px;
345
- }
346
- }
347
- &__tooltip {
348
- margin-left: 8px;
349
- }
350
- }
351
-
352
- .skeleton-header {
353
- display: flex;
354
- justify-content: space-between;
355
- align-items: center;
356
-
357
- .left-skeleton {
358
- display: flex;
359
- align-items: center;
360
- column-gap: 16px;
361
- .vertical-line {
362
- height: 24px;
363
- border-right: 1px solid var(--table-line);
364
- }
365
- }
366
-
367
- .right-skeleton {
368
- display: flex;
369
- align-items: center;
370
- column-gap: 16px;
371
- }
372
- }
373
- </style>
1
+ <template>
2
+ <ui-data-table
3
+ :data="data"
4
+ :options="options"
5
+ :loading="props.loading"
6
+ :total-pages="props.totalPages"
7
+ :total-items="props.totalItems"
8
+ :texts="texts"
9
+ :skeleton="skeletonData"
10
+ test-id="task-table"
11
+ @sort="onSorting"
12
+ @pagination="onPagination"
13
+ @column-filter="onColumnFilter"
14
+ >
15
+ <template #icon="{ item }">
16
+ <span class="flex-align-center">
17
+ <span :class="['icon', item.data.icon]" />
18
+
19
+ <span
20
+ :data-id="`rtask-${item.data.testId}`"
21
+ :class="item.data.isLink && 'target-link'"
22
+ @click.stop="onSelectNodeOfTree(item.data)"
23
+ >
24
+ {{ item.text }}
25
+ </span>
26
+ </span>
27
+ </template>
28
+
29
+ <template #status="{ item }">
30
+ <ui-chip :test-id="item.data.testId" :color="item.data.chipColor" rounded>
31
+ <ui-icon
32
+ :name="item.data.icon"
33
+ width="14px"
34
+ height="14px"
35
+ class="chip-icon"
36
+ ></ui-icon>
37
+ {{ item.text }}
38
+ </ui-chip>
39
+
40
+ <div v-if="item.data.error" class="task-table__tooltip">
41
+ <common-tooltip-help
42
+ :test-id="item.data.testId"
43
+ :help-id="item.data.testId + 'icon'"
44
+ :title="localization.common.failureReason"
45
+ :help-text="item.data.error"
46
+ status="error"
47
+ dropdown-width="232px"
48
+ dropdown-left
49
+ dropdown-top
50
+ />
51
+ </div>
52
+ </template>
53
+
54
+ <template #default-actions="{ item }">
55
+ <div class="actions">
56
+ <ui-button
57
+ :id="`data-table-task-action-${item.data.id}`"
58
+ :test-id="`data-table-task-action-${item.data.id}`"
59
+ variant="text"
60
+ is-without-height
61
+ is-without-sizes
62
+ @click.stop="onToggleActions(item.data.id)"
63
+ >
64
+ <span
65
+ :class="['action-icon', { active: actionsShowId === item.data.id }]"
66
+ >
67
+ <ui-icon name="vertical-dotes" width="20" height="20" />
68
+ </span>
69
+ </ui-button>
70
+ <ui-dropdown
71
+ :show="actionsShowId === item.data.id"
72
+ :test-id="`data-table-task-dropdown-${item.data.id}`"
73
+ :items="actions"
74
+ :elem-id="`data-table-task-action-${item.data.id}`"
75
+ width="max-content"
76
+ left
77
+ @select="onSelectAction(item.data.target, $event)"
78
+ @hide="onHideActionsDropdown"
79
+ >
80
+ <template #row="{ item: dropMenu }">
81
+ <ui-icon
82
+ v-if="dropMenu.iconName === 'hide'"
83
+ name="password-hide"
84
+ width="16"
85
+ height="16"
86
+ />
87
+ <span class="action-text">
88
+ {{ dropMenu.text }}
89
+ </span>
90
+ </template>
91
+ </ui-dropdown>
92
+ </div>
93
+ </template>
94
+
95
+ <template #expand="{ item }">
96
+ <common-pages-tasks-table-expand-details :data="item.data" />
97
+ </template>
98
+
99
+ <template #skeleton-header>
100
+ <div class="skeleton-header">
101
+ <div class="left-skeleton">
102
+ <ui-skeleton-item width="70" height="16" />
103
+ <div class="vertical-line"></div>
104
+ <ui-skeleton-item width="70" height="16" />
105
+ <ui-skeleton-item width="70" height="16" />
106
+ </div>
107
+ <div class="right-skeleton">
108
+ <ui-skeleton-item width="128" height="36" border-radius="8" />
109
+ </div>
110
+ </div>
111
+ </template>
112
+ </ui-data-table>
113
+ </template>
114
+
115
+ <script setup lang="ts">
116
+ import type { UI_I_Dropdown } from '~/node_modules/bfg-uikit/components/ui/dropdown/models/interfaces'
117
+ import type {
118
+ UI_I_DataTable,
119
+ UI_I_DataTableHeader,
120
+ UI_I_DataTableBody,
121
+ UI_I_DataTableSkeleton,
122
+ UI_I_Pagination,
123
+ UI_I_TableTexts,
124
+ } from '~/node_modules/bfg-uikit/components/ui/dataTable/models/interfaces'
125
+ import type { UI_T_ArbitraryObject } from '~/node_modules/bfg-uikit/models/types'
126
+ import type {
127
+ UI_T_Project,
128
+ UI_T_ProcuratorTypeNodes,
129
+ UI_T_LangValue,
130
+ } from '~/lib/models/types'
131
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
132
+ import type { UI_I_TaskItem } from '~/lib/models/store/tasks/interfaces'
133
+ import type { UI_I_TableTarget } from '~/lib/models/table/interfaces'
134
+ import type { UI_T_TimeValue } from '~/components/common/layout/theHeader/userMenu/modals/preferences/timeFormat/lib/models/types'
135
+ import type { UI_I_TaskConfig } from '~/components/common/pages/tasks/table/lib/models/interfaces'
136
+ import {
137
+ options,
138
+ getTargetActionsFunc,
139
+ getHeaderDataFunc,
140
+ getBodyDataFunc,
141
+ } from '~/components/common/pages/tasks/table/lib/config/config'
142
+ import { useDebounceFn } from '@vueuse/core'
143
+
144
+ const props = defineProps<{
145
+ project: UI_T_Project
146
+ tableData: UI_I_TaskItem<UI_T_ProcuratorTypeNodes>[]
147
+ totalPages: number
148
+ totalItems: number
149
+ loading: boolean
150
+ config: UI_I_TaskConfig
151
+ }>()
152
+ const emits = defineEmits<{
153
+ (event: 'sort', value: string): void
154
+ (event: 'pagination', value: UI_I_Pagination): void
155
+ (event: 'col-search', value: string): void
156
+ }>()
157
+
158
+ const localization = computed<UI_I_Localization>(() => useLocal())
159
+ const { $store }: any = useNuxtApp()
160
+
161
+ const texts = computed<UI_I_TableTexts>(() => ({
162
+ searchHere: localization.value.common.searchHere,
163
+ rowsPerPage: localization.value.common.rowsPerPage,
164
+ of: localization.value.common.of,
165
+ selected: localization.value.common.selected,
166
+ columns: localization.value.common.columns,
167
+ previous: localization.value.common.previous,
168
+ next: localization.value.common.next,
169
+ noItemsFound: localization.value.common.noItemsFound,
170
+ exportAll: localization.value.common.exportAll,
171
+ exportSelected: localization.value.common.exportSelected,
172
+ all: localization.value.common.all,
173
+ filter: localization.value.common.filter,
174
+ }))
175
+ const skeletonData = ref<UI_I_DataTableSkeleton>({
176
+ columnsCount: 6,
177
+ headColumns: [],
178
+ bodyColumns: [],
179
+ })
180
+
181
+ const actionsShowId = ref<number>(-1)
182
+
183
+ const data = computed<UI_I_DataTable>(() => ({
184
+ id: 'tasks-table',
185
+ header: taskHeadItems.value,
186
+ body: taskBodyItems.value,
187
+ }))
188
+
189
+ const taskHeadItems = computed<UI_I_DataTableHeader[]>(() =>
190
+ getHeaderDataFunc(localization.value)
191
+ )
192
+
193
+ const timeFormat = computed<UI_T_TimeValue>(
194
+ () => $store.getters['main/getTimeFormat']
195
+ )
196
+
197
+ const interfaceLang = computed<UI_T_LangValue>(
198
+ () => $store.getters['main/getInterfaceLang']
199
+ )
200
+
201
+ const taskBodyItems = ref<UI_I_DataTableBody[]>([])
202
+ watch(
203
+ () => [props.tableData, timeFormat.value, interfaceLang.value],
204
+ (
205
+ newValue: [
206
+ UI_I_TaskItem<UI_T_ProcuratorTypeNodes>[],
207
+ UI_T_TimeValue,
208
+ UI_T_LangValue
209
+ ]
210
+ ) => {
211
+ if (!newValue[0]?.length) {
212
+ taskBodyItems.value = []
213
+ return
214
+ }
215
+
216
+ taskBodyItems.value = getBodyDataFunc(
217
+ newValue[0],
218
+ localization.value,
219
+ props.project,
220
+ props.config
221
+ )
222
+ },
223
+ { deep: true, immediate: true }
224
+ )
225
+
226
+ // const openedError = ref<string>('')
227
+
228
+ // const onToggleError = (value: string): void => {
229
+ // if (!value || value === openedError.value) {
230
+ // openedError.value = ''
231
+ // } else {
232
+ // openedError.value = value
233
+ // }
234
+ // }
235
+
236
+ const onSorting = (value: string): void => {
237
+ emits('sort', value)
238
+ }
239
+ const onPagination = (value: UI_I_Pagination): void => {
240
+ emits('pagination', value)
241
+ }
242
+ const sendFilter = useDebounceFn((searchText: string) => {
243
+ emits('col-search', searchText)
244
+ }, 1000)
245
+ const onColumnFilter = (obj: UI_T_ArbitraryObject<string>): void => {
246
+ let searchText = ''
247
+
248
+ for (const [key, value] of Object.entries(obj)) {
249
+ const currentFilter = searchText
250
+ ? ',' + key + '.' + value
251
+ : key + '.' + value
252
+
253
+ searchText = searchText + (value ? currentFilter : '')
254
+ }
255
+ sendFilter(searchText)
256
+ }
257
+
258
+ const actions = computed<UI_I_Dropdown[]>(() =>
259
+ getTargetActionsFunc(localization.value, props.project)
260
+ )
261
+ const onToggleActions = (id: number): void => {
262
+ if (actionsShowId.value === id) {
263
+ actionsShowId.value = -1
264
+ } else {
265
+ actionsShowId.value = id
266
+ }
267
+ }
268
+ const onSelectAction = (
269
+ data: UI_I_TableTarget<typeof props.project>,
270
+ action: 'view-target' | 'view-zone'
271
+ ): void => {
272
+ switch (action) {
273
+ case 'view-target':
274
+ onSelectNodeOfTree(data)
275
+ break
276
+ case 'view-zone':
277
+ onSelectNodeOfTree({ ...data, type: 'zone', nav: 'h' })
278
+ break
279
+ }
280
+ onHideActionsDropdown()
281
+ }
282
+ const onHideActionsDropdown = (): void => {
283
+ actionsShowId.value = -1
284
+ }
285
+
286
+ const onSelectNodeOfTree = (
287
+ data: UI_I_TableTarget<typeof props.project>
288
+ ): void => {
289
+ if (!data.isLink) return
290
+
291
+ const { type, id, nav } = data
292
+
293
+ const node = {
294
+ id,
295
+ type,
296
+ }
297
+
298
+ const path = `/inventory/type=${type};nav=${nav};id=${id}/summary`
299
+ navigateTo(path)
300
+
301
+ $store.dispatch('inventory/A_SELECT_NODE', { node, type })
302
+ }
303
+ </script>
304
+
305
+ <style scoped lang="scss">
306
+ .task-table {
307
+ height: inherit;
308
+
309
+ .target-link {
310
+ font-family: 'Inter', sans-serif;
311
+ font-size: 13px;
312
+ color: var(--bottom-pannel-rtask-link-text);
313
+ font-weight: 400;
314
+ line-height: 15.73px;
315
+ cursor: pointer;
316
+ &:hover {
317
+ color: var(--bottom-pannel-rtask-link-hover-text);
318
+ }
319
+ }
320
+ .chip-icon {
321
+ min-width: 14px;
322
+ }
323
+ .icon {
324
+ margin-right: 4px;
325
+ }
326
+
327
+ .actions {
328
+ width: 100%;
329
+
330
+ .action-icon {
331
+ width: 20px;
332
+ height: 20px;
333
+ color: var(--tasks-actions-icon-color);
334
+
335
+ &:hover {
336
+ color: var(--tasks-actions-icon-hover-color);
337
+ }
338
+ &.active {
339
+ color: var(--tasks-actions-icon-icative-color);
340
+ }
341
+ }
342
+
343
+ .action-text {
344
+ margin-left: 8px;
345
+ }
346
+ }
347
+ &__tooltip {
348
+ margin-left: 8px;
349
+ }
350
+ }
351
+
352
+ .skeleton-header {
353
+ display: flex;
354
+ justify-content: space-between;
355
+ align-items: center;
356
+
357
+ .left-skeleton {
358
+ display: flex;
359
+ align-items: center;
360
+ column-gap: 16px;
361
+ .vertical-line {
362
+ height: 24px;
363
+ border-right: 1px solid var(--table-line);
364
+ }
365
+ }
366
+
367
+ .right-skeleton {
368
+ display: flex;
369
+ align-items: center;
370
+ column-gap: 16px;
371
+ }
372
+ }
373
+ </style>