bfg-common 1.4.881 → 1.4.882

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