bfg-common 1.4.355 → 1.4.357

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 (33) hide show
  1. package/assets/localization/local_be.json +2823 -2796
  2. package/assets/localization/local_en.json +2827 -2800
  3. package/assets/localization/local_hy.json +28 -1
  4. package/assets/localization/local_kk.json +28 -1
  5. package/assets/localization/local_ru.json +28 -1
  6. package/assets/localization/local_zh.json +28 -1
  7. package/components/common/layout/theHeader/feedback/Feedback.vue +12 -7
  8. package/components/common/layout/theHeader/feedback/lib/config/sendFeedback.ts +9 -0
  9. package/components/common/layout/theHeader/feedback/new/New.vue +131 -0
  10. package/components/common/layout/theHeader/feedback/new/additionalDetails/AdditionalDetails.vue +14 -0
  11. package/components/common/layout/theHeader/feedback/new/description/Description.vue +58 -0
  12. package/components/common/layout/theHeader/feedback/new/email/Email.vue +43 -0
  13. package/components/common/layout/theHeader/feedback/new/subtitle/Subtitle.vue +83 -0
  14. package/components/common/layout/theHeader/feedback/new/tabs/Tabs.vue +79 -0
  15. package/components/common/layout/theHeader/feedback/new/tabs/lib/config/tabs.ts +25 -0
  16. package/components/common/layout/theHeader/feedback/new/tabs/lib/models/interfaces.ts +17 -0
  17. package/components/common/layout/theHeader/feedback/new/tabs/lib/models/types.ts +1 -0
  18. package/components/common/layout/theHeader/helpMenu/About.vue +45 -72
  19. package/components/common/layout/theHeader/helpMenu/HelpMenu.vue +1 -1
  20. package/components/common/layout/theHeader/helpMenu/aboutNew/AboutNew.vue +92 -0
  21. package/components/common/layout/theHeader/helpMenu/aboutOld/AboutOld.vue +95 -0
  22. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/lib/config/utils.ts +136 -64
  23. package/components/common/portlets/tag/CreateCategory.vue +276 -276
  24. package/components/common/portlets/tag/{TagsNew.vue → Portlet.vue} +450 -450
  25. package/components/common/portlets/tag/TagAddNew.vue +578 -578
  26. package/components/common/portlets/tag/lib/config/config.ts +199 -199
  27. package/components/common/portlets/tag/lib/models/interfaces.ts +27 -27
  28. package/components/common/portlets/tag/lib/models/types.ts +15 -15
  29. package/components/common/spiceConsole/Drawer.vue +28 -0
  30. package/lib/models/interfaces.ts +1 -0
  31. package/package.json +2 -2
  32. package/store/tasks/mappers/recentTasks.ts +8 -1
  33. package/components/common/layout/theHeader/feedback/FeedbackNew.vue +0 -63
@@ -1,450 +1,450 @@
1
- <template>
2
- <div>
3
- <ui-portlet
4
- class="tags"
5
- test-id="tags-portlet"
6
- :title="localization.common.assignedTags"
7
- :dragged="props.dragged"
8
- :dragged-any="props.draggedAny"
9
- :is-open="props.isOpen"
10
- :portlet-id="props.portletId"
11
- @toggle="onTogglePortlet"
12
- >
13
- <template #portletBody>
14
- <ui-data-table
15
- test-id="tags-portlet-table"
16
- :data="data"
17
- :options="options"
18
- server-off
19
- :default-layout="false"
20
- size="sm"
21
- >
22
- <!-- :loading="loading"-->
23
- <template #icon="{ item }">
24
- <div style="display: flex; justify-content: flex-end; width: 100%">
25
- <span
26
- :id="`actions-${item.data.row}`"
27
- :class="[
28
- 'icon-container',
29
- {
30
- selected: isShow[`action-${item.data.row}`],
31
- },
32
- ]"
33
- @click="onShowActions(item.data.row)"
34
- >
35
- <ui-icon :name="item.data.icon" width="16" height="16" />
36
- </span>
37
- <ui-popup-window
38
- v-model="isShow[`action-${item.data.row}`]"
39
- :elem-id="`actions-${item.data.row}`"
40
- width="fit-content"
41
- >
42
- <div style="padding: 8px">
43
- <div
44
- class="action"
45
- data-id="view-tag-details-action"
46
- @click="onShowDetails(item.data.row)"
47
- >
48
- <ui-icon name="details" width="16" height="16" />
49
- <span>{{ localization.common.viewDetails }}</span>
50
- </div>
51
- <div
52
- class="action-remove"
53
- data-id="show-remove-tag-dialog-action"
54
- @click="onShowRemoveDialog(item.data.row)"
55
- >
56
- <ui-icon name="delete" width="16" height="16" />
57
- <span>{{ localization.common.remove }}</span>
58
- </div>
59
- </div>
60
- </ui-popup-window>
61
- </div>
62
- </template>
63
- </ui-data-table>
64
- </template>
65
- <template #portletFooter>
66
- <div class="footer">
67
- <ui-button
68
- test-id="show-assign-new-tag-modal"
69
- variant="text"
70
- is-without-height
71
- is-without-sizes
72
- @click="onShowAssignModal"
73
- >
74
- {{ localization.common.assignNew }}...
75
- </ui-button>
76
- </div>
77
- </template>
78
- </ui-portlet>
79
-
80
- <ui-popup
81
- v-if="isShowRemoveDialog"
82
- test-id="remove-tag-dialog"
83
- icon-name="info-status"
84
- :texts="removeTagDialogTexts"
85
- :message="removeTagMessage"
86
- :title="localization.common.removeTag"
87
- @hide="onHideRemoveDialog"
88
- @submit="onRemoveTag"
89
- />
90
-
91
- <common-portlets-tag-add-new
92
- v-if="isShowModal"
93
- :is-show-modal="isShowModal"
94
- :assign-data="assignData"
95
- :selected-item-name="props.selectedItemName"
96
- @add-new-tag="onAddNewTag"
97
- @create-category="onCreateCategory"
98
- @cancel="onHideAssignModal"
99
- @assign="onAssignSelectedTags"
100
- />
101
-
102
- </div>
103
- </template>
104
-
105
- <script setup lang="ts">
106
- import type {
107
- UI_I_ArbitraryObject,
108
- UI_I_Localization,
109
- } from '~/lib/models/interfaces'
110
- import type {
111
- UI_I_DataTable,
112
- UI_I_DataTableOptions,
113
- UI_I_DataTableHeader,
114
- UI_I_DataTableBody,
115
- } from '~/node_modules/bfg-uikit/components/ui/dataTable/models/interfaces'
116
- import type { UI_I_ModalTexts } from '~/node_modules/bfg-uikit/components/ui/modal/models/interfaces'
117
- import type { I_CreateCategoryData } from '~/components/common/portlets/tag/lib/models/interfaces'
118
- import {
119
- tagTableHeaderOptions,
120
- tagTableHeaderDataFunc,
121
- tagsAssignBodyItemsTemporary,
122
- } from '~/components/common/portlets/tag/lib/config/config'
123
-
124
- const props = defineProps<{
125
- portletId: string
126
- dragged?: boolean
127
- isOpen?: boolean
128
- draggedAny?: boolean
129
- selectedItemName: string
130
- objectSummary: any
131
- }>()
132
-
133
- const localization = computed<UI_I_Localization>(() => useLocal())
134
-
135
- const isShow = ref<UI_I_ArbitraryObject<boolean>>({})
136
- const isShowModal = ref<boolean>(false)
137
- const onShowAssignModal = (): void => {
138
- isShowModal.value = true
139
- }
140
-
141
- const onHideAssignModal = (): void => {
142
- isShowModal.value = false
143
- }
144
- const onShowActions = (id: number): void => {
145
- isShow.value[`action-${id}`] = !isShow.value[`action-${id}`]
146
- }
147
- const onShowDetails = (_id: number): void => {
148
- navigateTo('/tags-attributes/tags')
149
- }
150
-
151
- const isShowRemoveDialog = ref<boolean>(false)
152
-
153
- const onHideRemoveDialog = (): void => {
154
- isShowRemoveDialog.value = false
155
- }
156
- const tagIdForRemove = ref<number>(0)
157
- const tagNameForRemove = computed<string>(
158
- () =>
159
- (tagsBodyItems.value.find(
160
- (row: UI_I_DataTableBody) => row.row === tagIdForRemove.value
161
- )?.data[0]?.text || '') as string
162
- )
163
-
164
- const removeTagMessage = computed<string>(() =>
165
- localization.value.common.removeTagDialog
166
- .replace?.('{tagName}', tagNameForRemove.value)
167
- .replace('{selectedItemName}', props.selectedItemName)
168
- )
169
- const onShowRemoveDialog = (id: number): void => {
170
- tagIdForRemove.value = id
171
- isShowRemoveDialog.value = true
172
- }
173
-
174
- const removeTagDialogTexts = computed<UI_I_ModalTexts>(() => ({
175
- button1: localization.value.common.cancel,
176
- button2: localization.value.common.remove,
177
- }))
178
-
179
- const onRemoveTag = (): void => {
180
- onHideRemoveDialog()
181
- tagsBodyItems.value = tagsBodyItems.value.filter(
182
- (row) => row.row !== tagIdForRemove.value
183
- )
184
- }
185
-
186
- const options: UI_I_DataTableOptions = {
187
- ...tagTableHeaderOptions,
188
- isSelectable: false,
189
- }
190
-
191
- const tagsHeadItems = computed<UI_I_DataTableHeader[]>(() =>
192
- tagTableHeaderDataFunc(localization.value)
193
- )
194
- // const tagsBodyItems = computed<UI_I_TableBodyItem[][]>(() => {
195
- // return $store.getters['inventory/getTags'] || []
196
- // })
197
-
198
- // const { $store } = useNuxtApp()
199
-
200
- const tagsBodyItems = ref<UI_I_DataTableBody[]>([])
201
-
202
- watch(
203
- () => props.objectSummary,
204
- (newValue: any) => {
205
- let result: UI_I_DataTableBody[] = []
206
- const attr = newValue.portlets?.find((portlet) => portlet.kind === 2)
207
-
208
- if (attr) {
209
- const rows = []
210
-
211
- for (const key in attr.rows) {
212
- // @ts-ignore
213
- rows.push({
214
- row: +key,
215
- data: [
216
- { col: 0, text: attr.rows[key][0] },
217
- { col: 1, text: attr.rows[key][1] },
218
- { col: 2, text: attr.rows[key][2] },
219
- {
220
- col: 3,
221
- text: '',
222
- key: 'icon',
223
- data: {
224
- icon: 'vertical-dotes',
225
- row: +key,
226
- },
227
- },
228
- ],
229
- })
230
- }
231
- result = rows
232
- }
233
-
234
- tagsBodyItems.value = result
235
- },
236
- { deep: true, immediate: true }
237
- )
238
- const tagsAssignBodyItems = ref<UI_I_DataTableBody[]>(
239
- useDeepCopy(tagsAssignBodyItemsTemporary)
240
- )
241
-
242
- const data = computed<UI_I_DataTable>(() => ({
243
- id: '0',
244
- selectedRows: [],
245
- isAllSelected: false,
246
- title: '',
247
- subTitle: '',
248
- header: tagsHeadItems.value,
249
- body: tagsBodyItems.value,
250
- }))
251
-
252
- const assignData = computed<UI_I_DataTable>(() => ({
253
- id: '1',
254
- selectedRows: [],
255
- isAllSelected: false,
256
- title: '',
257
- subTitle: '',
258
- header: tagsHeadItems.value,
259
- body: tagsAssignBodyItems.value,
260
- }))
261
-
262
- // const showTagModal = (): void => {
263
- // isShowTagModal.value = true
264
- // }
265
-
266
- // const routeParams = useRoute().params
267
- // const routeId: string = routeParams?.id.toString()
268
- // const routeType: string = routeParams?.type.toString()
269
- // const getTags = async (): Promise<void> => {
270
- // const payload: I_GetTagsPayload = {
271
- // id: routeId,
272
- // type: `${routeType}s`,
273
- // }
274
- //
275
- // return await $store.dispatch('inventory/A_GET_TAGS', payload)
276
- // }
277
- // getTags()
278
-
279
- const onAddNewTag = (newTag: UI_I_DataTableBody): void => {
280
- tagsAssignBodyItems.value.push(newTag)
281
- emits('create-new-tag', newTag)
282
- }
283
-
284
- const onAssignSelectedTags = async (
285
- data: UI_I_DataTableBody[]
286
- ): Promise<void> => {
287
- if (data.length > 0) {
288
- const sortedIds = tagsBodyItems.value.map((row: UI_I_DataTableBody) => Number(row.row)).sort()
289
- let lastId = sortedIds[sortedIds.length - 1]
290
- lastId = lastId === undefined ? -1 : lastId
291
-
292
- const selectedNewTags = data.map((row, index) => {
293
- return {
294
- ...row,
295
- row: lastId + index + 1,
296
- isSelected: false,
297
- data: [
298
- row.data[0],
299
- row.data[1],
300
- row.data[2],
301
- {
302
- ...row.data[3],
303
- key: 'icon',
304
- data: {
305
- icon: 'vertical-dotes',
306
- row: lastId + index + 1,
307
- },
308
- },
309
- ],
310
- }
311
- })
312
-
313
- const addedTagsName = selectedNewTags.map((row) => row.data[0].text)
314
-
315
- tagsAssignBodyItems.value = tagsAssignBodyItems.value.filter(
316
- (row: UI_I_DataTableBody) => !addedTagsName.includes(row.data[0].text)
317
- )
318
-
319
- tagsBodyItems.value = [...tagsBodyItems.value, ...selectedNewTags]
320
- emits('assign-new-tags', selectedNewTags)
321
- }
322
- onHideAssignModal()
323
- // const tags = data.map((row) => {
324
- // return {
325
- // name: row[0].text,
326
- // description: row[1].text,
327
- // category: 'none',
328
- // }
329
- // })
330
- // const payload: I_UpdateTagsPayload = {
331
- // tags,
332
- // id: routeId,
333
- // type: `${routeType}s`,
334
- // }
335
- // hideTagModal()
336
- // await $store.dispatch('inventory/A_UPDATE_TAGS', payload)
337
- //
338
- // globalRefresh()
339
- }
340
- // const globalRefresh = (): void => {
341
- // $store.dispatch('main/A_GLOBAL_REFRESH', null)
342
- // }
343
-
344
- const onCreateCategory = (data: I_CreateCategoryData): void => {
345
- emits('create-category', data)
346
- }
347
-
348
- const emits = defineEmits<{
349
- (event: 'toggle-portlet', id: string): void
350
- (event: 'create-category', value: I_CreateCategoryData): void
351
- (event: 'create-new-tag', value: UI_I_DataTableBody): void
352
- (event: 'assign-new-tags', value: UI_I_DataTableBody[]): void
353
- }>()
354
-
355
- const onTogglePortlet = (id: string): void => {
356
- emits('toggle-portlet', id)
357
- }
358
- </script>
359
-
360
- <style>
361
- :root {
362
- --table-actions-icon: #4d5d69;
363
- --table-actions-icon-hover: #008fd6;
364
- --table-actions-view: #182531;
365
- --table-actions-remove: #ea3223;
366
- --table-actions-bg-hover: #e9ebed66;
367
- }
368
- :root.dark-theme {
369
- --table-actions-icon: #e9eaec;
370
- --table-actions-icon-hover: #ffffff;
371
- --table-actions-view: #ffffff;
372
- --table-actions-remove: #ea3223;
373
- --table-actions-bg-hover: #e9ebed0f;
374
- }
375
- </style>
376
-
377
- <style scoped lang="scss">
378
- .footer {
379
- padding: 0 10px 5px;
380
-
381
- .edit-trigger {
382
- color: var(--global-text-color);
383
- cursor: pointer;
384
- margin-right: 10px;
385
- }
386
- }
387
-
388
- .icon-container {
389
- width: 16px;
390
- height: 16px;
391
- display: block;
392
- cursor: pointer;
393
- color: var(--table-actions-icon);
394
-
395
- &:hover,
396
- &.selected {
397
- color: var(--table-actions-icon-hover);
398
- }
399
- }
400
-
401
- .action-remove {
402
- display: flex;
403
- align-items: center;
404
- column-gap: 8px;
405
-
406
- height: 32px;
407
- border-radius: 4px;
408
- padding: 8px;
409
- color: var(--table-actions-remove);
410
- cursor: pointer;
411
-
412
- font-size: 13px;
413
- font-weight: 500;
414
- line-height: 15.73px;
415
-
416
- &:hover {
417
- background: var(--table-actions-bg-hover);
418
- }
419
- }
420
-
421
- .action {
422
- display: flex;
423
- align-items: center;
424
- column-gap: 8px;
425
-
426
- height: 32px;
427
- border-radius: 4px;
428
- padding: 8px;
429
- color: var(--table-actions-view);
430
- margin-bottom: 8px;
431
- cursor: pointer;
432
-
433
- font-size: 13px;
434
- font-weight: 500;
435
- line-height: 15.73px;
436
-
437
- &:hover {
438
- background: var(--table-actions-bg-hover);
439
- }
440
- }
441
-
442
- .footer {
443
- :deep(button.ui-btn) {
444
- line-height: 16px;
445
- margin-bottom: 11px;
446
- margin-left: 6px;
447
- width: fit-content;
448
- }
449
- }
450
- </style>
1
+ <template>
2
+ <div>
3
+ <ui-portlet
4
+ class="tags"
5
+ test-id="tags-portlet"
6
+ :title="localization.common.assignedTags"
7
+ :dragged="props.dragged"
8
+ :dragged-any="props.draggedAny"
9
+ :is-open="props.isOpen"
10
+ :portlet-id="props.portletId"
11
+ @toggle="onTogglePortlet"
12
+ >
13
+ <template #portletBody>
14
+ <ui-data-table
15
+ test-id="tags-portlet-table"
16
+ :data="data"
17
+ :options="options"
18
+ server-off
19
+ :default-layout="false"
20
+ size="sm"
21
+ >
22
+ <!-- :loading="loading"-->
23
+ <template #icon="{ item }">
24
+ <div style="display: flex; justify-content: flex-end; width: 100%">
25
+ <span
26
+ :id="`actions-${item.data.row}`"
27
+ :class="[
28
+ 'icon-container',
29
+ {
30
+ selected: isShow[`action-${item.data.row}`],
31
+ },
32
+ ]"
33
+ @click="onShowActions(item.data.row)"
34
+ >
35
+ <ui-icon :name="item.data.icon" width="16" height="16" />
36
+ </span>
37
+ <ui-popup-window
38
+ v-model="isShow[`action-${item.data.row}`]"
39
+ :elem-id="`actions-${item.data.row}`"
40
+ width="fit-content"
41
+ >
42
+ <div style="padding: 8px">
43
+ <div
44
+ class="action"
45
+ data-id="view-tag-details-action"
46
+ @click="onShowDetails(item.data.row)"
47
+ >
48
+ <ui-icon name="details" width="16" height="16" />
49
+ <span>{{ localization.common.viewDetails }}</span>
50
+ </div>
51
+ <div
52
+ class="action-remove"
53
+ data-id="show-remove-tag-dialog-action"
54
+ @click="onShowRemoveDialog(item.data.row)"
55
+ >
56
+ <ui-icon name="delete" width="16" height="16" />
57
+ <span>{{ localization.common.remove }}</span>
58
+ </div>
59
+ </div>
60
+ </ui-popup-window>
61
+ </div>
62
+ </template>
63
+ </ui-data-table>
64
+ </template>
65
+ <template #portletFooter>
66
+ <div class="footer">
67
+ <ui-button
68
+ test-id="show-assign-new-tag-modal"
69
+ variant="text"
70
+ is-without-height
71
+ is-without-sizes
72
+ @click="onShowAssignModal"
73
+ >
74
+ {{ localization.common.assignNew }}...
75
+ </ui-button>
76
+ </div>
77
+ </template>
78
+ </ui-portlet>
79
+
80
+ <ui-popup
81
+ v-if="isShowRemoveDialog"
82
+ test-id="remove-tag-dialog"
83
+ icon-name="info-status"
84
+ :texts="removeTagDialogTexts"
85
+ :message="removeTagMessage"
86
+ :title="localization.common.removeTag"
87
+ @hide="onHideRemoveDialog"
88
+ @submit="onRemoveTag"
89
+ />
90
+
91
+ <common-portlets-tag-add-new
92
+ v-if="isShowModal"
93
+ :is-show-modal="isShowModal"
94
+ :assign-data="assignData"
95
+ :selected-item-name="props.selectedItemName"
96
+ @add-new-tag="onAddNewTag"
97
+ @create-category="onCreateCategory"
98
+ @cancel="onHideAssignModal"
99
+ @assign="onAssignSelectedTags"
100
+ />
101
+
102
+ </div>
103
+ </template>
104
+
105
+ <script setup lang="ts">
106
+ import type {
107
+ UI_I_ArbitraryObject,
108
+ UI_I_Localization,
109
+ } from '~/lib/models/interfaces'
110
+ import type {
111
+ UI_I_DataTable,
112
+ UI_I_DataTableOptions,
113
+ UI_I_DataTableHeader,
114
+ UI_I_DataTableBody,
115
+ } from '~/node_modules/bfg-uikit/components/ui/dataTable/models/interfaces'
116
+ import type { UI_I_ModalTexts } from '~/node_modules/bfg-uikit/components/ui/modal/models/interfaces'
117
+ import type { I_CreateCategoryData } from '~/components/common/portlets/tag/lib/models/interfaces'
118
+ import {
119
+ tagTableHeaderOptions,
120
+ tagTableHeaderDataFunc,
121
+ tagsAssignBodyItemsTemporary,
122
+ } from '~/components/common/portlets/tag/lib/config/config'
123
+
124
+ const props = defineProps<{
125
+ portletId: string
126
+ dragged?: boolean
127
+ isOpen?: boolean
128
+ draggedAny?: boolean
129
+ selectedItemName: string
130
+ objectSummary: any
131
+ }>()
132
+
133
+ const localization = computed<UI_I_Localization>(() => useLocal())
134
+
135
+ const isShow = ref<UI_I_ArbitraryObject<boolean>>({})
136
+ const isShowModal = ref<boolean>(false)
137
+ const onShowAssignModal = (): void => {
138
+ isShowModal.value = true
139
+ }
140
+
141
+ const onHideAssignModal = (): void => {
142
+ isShowModal.value = false
143
+ }
144
+ const onShowActions = (id: number): void => {
145
+ isShow.value[`action-${id}`] = !isShow.value[`action-${id}`]
146
+ }
147
+ const onShowDetails = (_id: number): void => {
148
+ navigateTo('/tags-attributes/tags')
149
+ }
150
+
151
+ const isShowRemoveDialog = ref<boolean>(false)
152
+
153
+ const onHideRemoveDialog = (): void => {
154
+ isShowRemoveDialog.value = false
155
+ }
156
+ const tagIdForRemove = ref<number>(0)
157
+ const tagNameForRemove = computed<string>(
158
+ () =>
159
+ (tagsBodyItems.value.find(
160
+ (row: UI_I_DataTableBody) => row.row === tagIdForRemove.value
161
+ )?.data[0]?.text || '') as string
162
+ )
163
+
164
+ const removeTagMessage = computed<string>(() =>
165
+ localization.value.common.removeTagDialog
166
+ .replace?.('{tagName}', tagNameForRemove.value)
167
+ .replace('{selectedItemName}', props.selectedItemName)
168
+ )
169
+ const onShowRemoveDialog = (id: number): void => {
170
+ tagIdForRemove.value = id
171
+ isShowRemoveDialog.value = true
172
+ }
173
+
174
+ const removeTagDialogTexts = computed<UI_I_ModalTexts>(() => ({
175
+ button1: localization.value.common.cancel,
176
+ button2: localization.value.common.remove,
177
+ }))
178
+
179
+ const onRemoveTag = (): void => {
180
+ onHideRemoveDialog()
181
+ tagsBodyItems.value = tagsBodyItems.value.filter(
182
+ (row) => row.row !== tagIdForRemove.value
183
+ )
184
+ }
185
+
186
+ const options: UI_I_DataTableOptions = {
187
+ ...tagTableHeaderOptions,
188
+ isSelectable: false,
189
+ }
190
+
191
+ const tagsHeadItems = computed<UI_I_DataTableHeader[]>(() =>
192
+ tagTableHeaderDataFunc(localization.value)
193
+ )
194
+ // const tagsBodyItems = computed<UI_I_TableBodyItem[][]>(() => {
195
+ // return $store.getters['inventory/getTags'] || []
196
+ // })
197
+
198
+ // const { $store } = useNuxtApp()
199
+
200
+ const tagsBodyItems = ref<UI_I_DataTableBody[]>([])
201
+
202
+ watch(
203
+ () => props.objectSummary,
204
+ (newValue: any) => {
205
+ let result: UI_I_DataTableBody[] = []
206
+ const attr = newValue.portlets?.find((portlet) => portlet.kind === 2)
207
+
208
+ if (attr) {
209
+ const rows = []
210
+
211
+ for (const key in attr.rows) {
212
+ // @ts-ignore
213
+ rows.push({
214
+ row: +key,
215
+ data: [
216
+ { col: 0, text: attr.rows[key][0] },
217
+ { col: 1, text: attr.rows[key][1] },
218
+ { col: 2, text: attr.rows[key][2] },
219
+ {
220
+ col: 3,
221
+ text: '',
222
+ key: 'icon',
223
+ data: {
224
+ icon: 'vertical-dotes',
225
+ row: +key,
226
+ },
227
+ },
228
+ ],
229
+ })
230
+ }
231
+ result = rows
232
+ }
233
+
234
+ tagsBodyItems.value = result
235
+ },
236
+ { deep: true, immediate: true }
237
+ )
238
+ const tagsAssignBodyItems = ref<UI_I_DataTableBody[]>(
239
+ useDeepCopy(tagsAssignBodyItemsTemporary)
240
+ )
241
+
242
+ const data = computed<UI_I_DataTable>(() => ({
243
+ id: '0',
244
+ selectedRows: [],
245
+ isAllSelected: false,
246
+ title: '',
247
+ subTitle: '',
248
+ header: tagsHeadItems.value,
249
+ body: tagsBodyItems.value,
250
+ }))
251
+
252
+ const assignData = computed<UI_I_DataTable>(() => ({
253
+ id: '1',
254
+ selectedRows: [],
255
+ isAllSelected: false,
256
+ title: '',
257
+ subTitle: '',
258
+ header: tagsHeadItems.value,
259
+ body: tagsAssignBodyItems.value,
260
+ }))
261
+
262
+ // const showTagModal = (): void => {
263
+ // isShowTagModal.value = true
264
+ // }
265
+
266
+ // const routeParams = useRoute().params
267
+ // const routeId: string = routeParams?.id.toString()
268
+ // const routeType: string = routeParams?.type.toString()
269
+ // const getTags = async (): Promise<void> => {
270
+ // const payload: I_GetTagsPayload = {
271
+ // id: routeId,
272
+ // type: `${routeType}s`,
273
+ // }
274
+ //
275
+ // return await $store.dispatch('inventory/A_GET_TAGS', payload)
276
+ // }
277
+ // getTags()
278
+
279
+ const onAddNewTag = (newTag: UI_I_DataTableBody): void => {
280
+ tagsAssignBodyItems.value.push(newTag)
281
+ emits('create-new-tag', newTag)
282
+ }
283
+
284
+ const onAssignSelectedTags = async (
285
+ data: UI_I_DataTableBody[]
286
+ ): Promise<void> => {
287
+ if (data.length > 0) {
288
+ const sortedIds = tagsBodyItems.value.map((row: UI_I_DataTableBody) => Number(row.row)).sort()
289
+ let lastId = sortedIds[sortedIds.length - 1]
290
+ lastId = lastId === undefined ? -1 : lastId
291
+
292
+ const selectedNewTags = data.map((row, index) => {
293
+ return {
294
+ ...row,
295
+ row: lastId + index + 1,
296
+ isSelected: false,
297
+ data: [
298
+ row.data[0],
299
+ row.data[1],
300
+ row.data[2],
301
+ {
302
+ ...row.data[3],
303
+ key: 'icon',
304
+ data: {
305
+ icon: 'vertical-dotes',
306
+ row: lastId + index + 1,
307
+ },
308
+ },
309
+ ],
310
+ }
311
+ })
312
+
313
+ const addedTagsName = selectedNewTags.map((row) => row.data[0].text)
314
+
315
+ tagsAssignBodyItems.value = tagsAssignBodyItems.value.filter(
316
+ (row: UI_I_DataTableBody) => !addedTagsName.includes(row.data[0].text)
317
+ )
318
+
319
+ tagsBodyItems.value = [...tagsBodyItems.value, ...selectedNewTags]
320
+ emits('assign-new-tags', selectedNewTags)
321
+ }
322
+ onHideAssignModal()
323
+ // const tags = data.map((row) => {
324
+ // return {
325
+ // name: row[0].text,
326
+ // description: row[1].text,
327
+ // category: 'none',
328
+ // }
329
+ // })
330
+ // const payload: I_UpdateTagsPayload = {
331
+ // tags,
332
+ // id: routeId,
333
+ // type: `${routeType}s`,
334
+ // }
335
+ // hideTagModal()
336
+ // await $store.dispatch('inventory/A_UPDATE_TAGS', payload)
337
+ //
338
+ // globalRefresh()
339
+ }
340
+ // const globalRefresh = (): void => {
341
+ // $store.dispatch('main/A_GLOBAL_REFRESH', null)
342
+ // }
343
+
344
+ const onCreateCategory = (data: I_CreateCategoryData): void => {
345
+ emits('create-category', data)
346
+ }
347
+
348
+ const emits = defineEmits<{
349
+ (event: 'toggle-portlet', id: string): void
350
+ (event: 'create-category', value: I_CreateCategoryData): void
351
+ (event: 'create-new-tag', value: UI_I_DataTableBody): void
352
+ (event: 'assign-new-tags', value: UI_I_DataTableBody[]): void
353
+ }>()
354
+
355
+ const onTogglePortlet = (id: string): void => {
356
+ emits('toggle-portlet', id)
357
+ }
358
+ </script>
359
+
360
+ <style>
361
+ :root {
362
+ --table-actions-icon: #4d5d69;
363
+ --table-actions-icon-hover: #008fd6;
364
+ --table-actions-view: #182531;
365
+ --table-actions-remove: #ea3223;
366
+ --table-actions-bg-hover: #e9ebed66;
367
+ }
368
+ :root.dark-theme {
369
+ --table-actions-icon: #e9eaec;
370
+ --table-actions-icon-hover: #ffffff;
371
+ --table-actions-view: #ffffff;
372
+ --table-actions-remove: #ea3223;
373
+ --table-actions-bg-hover: #e9ebed0f;
374
+ }
375
+ </style>
376
+
377
+ <style scoped lang="scss">
378
+ .footer {
379
+ padding: 0 10px 5px;
380
+
381
+ .edit-trigger {
382
+ color: var(--global-text-color);
383
+ cursor: pointer;
384
+ margin-right: 10px;
385
+ }
386
+ }
387
+
388
+ .icon-container {
389
+ width: 16px;
390
+ height: 16px;
391
+ display: block;
392
+ cursor: pointer;
393
+ color: var(--table-actions-icon);
394
+
395
+ &:hover,
396
+ &.selected {
397
+ color: var(--table-actions-icon-hover);
398
+ }
399
+ }
400
+
401
+ .action-remove {
402
+ display: flex;
403
+ align-items: center;
404
+ column-gap: 8px;
405
+
406
+ height: 32px;
407
+ border-radius: 4px;
408
+ padding: 8px;
409
+ color: var(--table-actions-remove);
410
+ cursor: pointer;
411
+
412
+ font-size: 13px;
413
+ font-weight: 500;
414
+ line-height: 15.73px;
415
+
416
+ &:hover {
417
+ background: var(--table-actions-bg-hover);
418
+ }
419
+ }
420
+
421
+ .action {
422
+ display: flex;
423
+ align-items: center;
424
+ column-gap: 8px;
425
+
426
+ height: 32px;
427
+ border-radius: 4px;
428
+ padding: 8px;
429
+ color: var(--table-actions-view);
430
+ margin-bottom: 8px;
431
+ cursor: pointer;
432
+
433
+ font-size: 13px;
434
+ font-weight: 500;
435
+ line-height: 15.73px;
436
+
437
+ &:hover {
438
+ background: var(--table-actions-bg-hover);
439
+ }
440
+ }
441
+
442
+ .footer {
443
+ :deep(button.ui-btn) {
444
+ line-height: 16px;
445
+ margin-bottom: 11px;
446
+ margin-left: 6px;
447
+ width: fit-content;
448
+ }
449
+ }
450
+ </style>