From 518dc56eb209d5d25b33fcc7669bda6ddd345b1d Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Wed, 15 Jan 2025 13:19:30 +0100
Subject: [PATCH] fix: refs #6321 solve conflicts

---
 src/components/VnTable/VnColumn.vue           |  15 +--
 src/components/VnTable/VnDescriptor.vue       |  49 -------
 src/components/VnTable/VnTable.vue            |   6 +-
 src/components/ui/CatalogItem.vue             |   2 +-
 .../Ticket/Negative/TicketLackDetail.vue      |  16 ++-
 .../Ticket/Negative/TicketLackFilter.vue      |  44 +++++++
 src/pages/Ticket/Negative/TicketLackList.vue  | 124 +++++++++---------
 src/pages/Ticket/Negative/TicketLackTable.vue |  15 ++-
 8 files changed, 134 insertions(+), 137 deletions(-)
 delete mode 100644 src/components/VnTable/VnDescriptor.vue

diff --git a/src/components/VnTable/VnColumn.vue b/src/components/VnTable/VnColumn.vue
index 3e430865c..a06592002 100644
--- a/src/components/VnTable/VnColumn.vue
+++ b/src/components/VnTable/VnColumn.vue
@@ -11,8 +11,7 @@ import VnInputNumber from 'components/common/VnInputNumber.vue';
 import VnInputDate from 'components/common/VnInputDate.vue';
 import VnInputTime from 'components/common/VnInputTime.vue';
 import VnComponent from 'components/common/VnComponent.vue';
-import VnDescriptor from 'components/VnTable/VnDescriptor.vue';
-import { QBtn } from 'quasar';
+
 import VnUserLink from 'components/ui/VnUserLink.vue';
 
 const model = defineModel(undefined, { required: true });
@@ -130,17 +129,7 @@ const defaultComponents = {
     icon: {
         component: markRaw(QIcon),
     },
-    descriptor: {
-        component: markRaw(VnDescriptor),
-        attrs: {
-            class: 'link',
-            flat: true,
-            dense: true,
-        },
-        forceAttrs: {
-            row: $props.row,
-        },
-    },
+
     userLink: {
         component: markRaw(VnUserLink),
     },
diff --git a/src/components/VnTable/VnDescriptor.vue b/src/components/VnTable/VnDescriptor.vue
deleted file mode 100644
index b280c7f6c..000000000
--- a/src/components/VnTable/VnDescriptor.vue
+++ /dev/null
@@ -1,49 +0,0 @@
-<script setup>
-import { useQuasar } from 'quasar';
-const quasar = useQuasar();
-import VnComponent from 'components/common/VnComponent.vue';
-import { onMounted, ref } from 'vue';
-import ItemDescriptor from 'src/pages/Item/Card/ItemDescriptor.vue';
-
-const $props = defineProps({
-    label: {
-        type: Function,
-        required: true,
-    },
-    row: {
-        type: Object,
-        default: null,
-    },
-    proxy: {
-        type: Object,
-        default: null,
-    },
-});
-const btnRow = ref(null);
-const popupVisible = ref(true);
-const handleClick = (event) => {
-    event.preventDefault();
-    event.stopPropagation();
-    console.log(event);
-    popupVisible.value = true;
-    // quasar.dialog({
-    //     component: $props.proxy.component,
-    //     componentProps: {
-    //         id: $props.row[$props.proxy.key],
-
-    //     },
-    // });
-};
-onMounted(() => {
-    // btnRow.value = btnRow.value.$el;
-});
-</script>
-<template>
-    <QBtn class="link" flat dense ref="btnRow" @click="handleClick"
-        >{{ $props.label($props.row) }}
-    </QBtn>
-    <!-- <VnComponent :id="row.itemFk" /> -->
-
-    <QPopupProxy :target="btnRow"> <ItemDescriptor :id="1" /></QPopupProxy>
-</template>
-<style lang="scss"></style>
diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue
index 23fd81f3c..d6c961456 100644
--- a/src/components/VnTable/VnTable.vue
+++ b/src/components/VnTable/VnTable.vue
@@ -314,7 +314,11 @@ function handleSelection({ evt, added, rows: selectedRows }, rows) {
         show-if-above
     >
         <QScrollArea class="fit">
-            <VnTableFilter :data-key="$attrs['data-key']" :columns="columns" :redirect="redirect" />
+            <VnTableFilter
+                :data-key="$attrs['data-key']"
+                :columns="columns"
+                :redirect="redirect"
+            />
         </QScrollArea>
     </QDrawer>
     <CrudModel
diff --git a/src/components/ui/CatalogItem.vue b/src/components/ui/CatalogItem.vue
index 9670d9b68..7806562b2 100644
--- a/src/components/ui/CatalogItem.vue
+++ b/src/components/ui/CatalogItem.vue
@@ -41,7 +41,7 @@ const card = toRef(props, 'item');
                 </div>
             </div>
             <div class="content">
-                <span class="link">
+                <span class="link" @click.stop>
                     {{ card.name }}
                     <ItemDescriptorProxy :id="card.id" />
                 </span>
diff --git a/src/pages/Ticket/Negative/TicketLackDetail.vue b/src/pages/Ticket/Negative/TicketLackDetail.vue
index 0dd099dad..d1dfce79d 100644
--- a/src/pages/Ticket/Negative/TicketLackDetail.vue
+++ b/src/pages/Ticket/Negative/TicketLackDetail.vue
@@ -101,6 +101,12 @@ const itemProposalSelected = ref(null);
 //             itemProposalSelected.value.available;
 //     }
 // };
+function onBuysFetched(data) {
+    Object.assign(item.value, data[0]);
+}
+function onTicketLackFetched(data) {
+    itemLack.value = data[0];
+}
 </script>
 
 <template>
@@ -119,17 +125,13 @@ const itemProposalSelected = ref(null);
         :url="`Buys/latestBuysFilter`"
         :fields="['longName']"
         :filter="{ where: { 'i.id': '2' } }"
-        @on-fetch="(data) => Object.assign(item.value, data[0])"
+        @on-fetch="onBuysFetched"
         auto-load
     />
     <FetchData
         :url="`Tickets/itemLack`"
         :params="{ itemFk: entityId }"
-        @on-fetch="
-            (data) => {
-                itemLack = data[0];
-            }
-        "
+        @on-fetch="onTicketLackFetched"
         auto-load
     />
     <VnSubToolbar>
@@ -232,7 +234,7 @@ const itemProposalSelected = ref(null);
                             {{ item.longName }}
                             <ItemDescriptorProxy :id="entityId" />
                         </QBtn>
-                        <FetchedTags class="q-ml-md" :item="item" />
+                        <FetchedTags class="q-ml-md" :item="item" :columns="3" />
                     </div>
                 </template>
             </VnPaginate>
diff --git a/src/pages/Ticket/Negative/TicketLackFilter.vue b/src/pages/Ticket/Negative/TicketLackFilter.vue
index 6482052a3..a3f8a8def 100644
--- a/src/pages/Ticket/Negative/TicketLackFilter.vue
+++ b/src/pages/Ticket/Negative/TicketLackFilter.vue
@@ -13,10 +13,17 @@ const props = defineProps({
         required: true,
     },
 });
+// const arrayData = useArrayData(props.dataKey);
+// const warehouse = ref(null);
+// onMounted(async () => {
+//     warehouse.value = arrayData.store?.userParams?.warehouse;
+// });
 
 const to = Date.vnNew();
 to.setDate(to.getDate() + 1);
 
+const warehouses = ref();
+const categoriesOptions = ref([]);
 const itemTypesRef = ref(null);
 const itemTypesOptions = ref([]);
 
@@ -26,9 +33,27 @@ const itemTypesFilter = {
     order: 'name ASC',
     where: {},
 };
+const onCategoryChange = async (categoryFk, search) => {
+    if (!categoryFk) {
+        itemTypesFilter.where.categoryFk = null;
+        delete itemTypesFilter.where.categoryFk;
+    } else {
+        itemTypesFilter.where.categoryFk = categoryFk;
+    }
+    search();
+    await itemTypesRef.value.fetch();
+};
 </script>
 
 <template>
+    <FetchData url="Warehouses" @on-fetch="(data) => (warehouses = data)" auto-load />
+    <FetchData
+        url="ItemCategories"
+        :filter="{ fields: ['id', 'name'], order: 'name ASC' }"
+        @on-fetch="(data) => (categoriesOptions = data)"
+        auto-load
+    />
+
     <FetchData
         ref="itemTypesRef"
         url="ItemTypes"
@@ -85,6 +110,25 @@ const itemTypesFilter = {
                             dense
                             is-outlined
                         />
+                    </QItemSection> </QItem
+                ><QItem>
+                    <QItemSection v-if="categoriesOptions">
+                        <VnSelect
+                            :label="t('negative.categoryFk')"
+                            v-model="params.categoryFk"
+                            @update:model-value="
+                                ($event) => onCategoryChange($event, searchFn)
+                            "
+                            :options="categoriesOptions"
+                            option-value="id"
+                            option-label="name"
+                            hide-selected
+                            dense
+                            outlined
+                            rounded
+                        /> </QItemSection
+                    ><QItemSection v-else>
+                        <QSkeleton class="full-width" type="QSelect" />
                     </QItemSection>
                 </QItem>
                 <QItem>
diff --git a/src/pages/Ticket/Negative/TicketLackList.vue b/src/pages/Ticket/Negative/TicketLackList.vue
index b42881051..ac4529f32 100644
--- a/src/pages/Ticket/Negative/TicketLackList.vue
+++ b/src/pages/Ticket/Negative/TicketLackList.vue
@@ -11,6 +11,7 @@ import { useRole } from 'src/composables/useRole';
 import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue';
 const router = useRouter();
 import TicketLackFilter from './TicketLackFilter.vue';
+import { markRaw } from 'vue';
 
 const stateStore = useStateStore();
 const { t } = useI18n();
@@ -67,16 +68,7 @@ const columns = computed(() => [
         align: 'left',
         label: t('negative.longName'),
         field: ({ longName }) => longName,
-        columnField: {
-            component: 'descriptor',
-            attrs: {
-                label: ({ longName }) => longName,
-                proxy: {
-                    key: 'itemFk',
-                    component: ItemDescriptorProxy,
-                },
-            },
-        },
+
         sortable: true,
         headerStyle: 'width: 350px',
         cardVisible: true,
@@ -153,61 +145,73 @@ onBeforeMount(() => {
 </script>
 
 <template>
-    <QPage class="column items-center">
-        <VnSubToolbar class="bg-vn-dark justify-end">
-            <template #st-actions>
-                <QBtn
-                    color="primary"
-                    :disable="!selectedRows?.length"
-                    @click="showNegativeOriginDialog = true"
-                    :label="t('negative.negativeAction')"
-                >
-                    <QPopupProxy ref="popupProxyRef" style="max-width: none">
-                        <QCard>
-                            <NegativeOriginDialog
-                                ref="originDialogRef"
-                                :selected-rows="selectedRows"
-                            /> </QCard
-                    ></QPopupProxy>
-                    <QTooltip>{{ t('negative.negativeAction') }}</QTooltip>
-                </QBtn>
-            </template>
-        </VnSubToolbar>
-        <RightMenu>
-            <template #right-panel>
-                <TicketLackFilter data-key="NegativeList" />
-            </template>
-        </RightMenu>
-        <VnTable
-            ref="tableRef"
-            data-key="NegativeList"
-            :url="`Tickets/itemLack`"
-            :order="['itemFk DESC, date DESC, timed DESC']"
-            :user-params="negativeParams"
-            auto-load
-            :columns="columns"
-            default-mode="table"
-            :right-search="false"
-            :is-editable="false"
-            :use-model="true"
-            :row-click="redirectToCreateView"
-            v-model:selected="selectedRows"
-            :create="false"
-            :table="{
-                'row-key': 'itemFk',
-                selection: 'multiple',
-            }"
-        >
-            <template #column-itemFk="{ row }">
-                {{ row.itemFk }}
+    <VnSubToolbar class="bg-vn-dark justify-end">
+        <template #st-actions>
+            <QBtn
+                color="primary"
+                :disable="!selectedRows?.length"
+                @click="showNegativeOriginDialog = true"
+                :label="t('negative.negativeAction')"
+            >
+                <QPopupProxy ref="popupProxyRef" style="max-width: none">
+                    <QCard>
+                        <NegativeOriginDialog
+                            ref="originDialogRef"
+                            :selected-rows="selectedRows"
+                        /> </QCard
+                ></QPopupProxy>
+                <QTooltip>{{ t('negative.negativeAction') }}</QTooltip>
+            </QBtn>
+        </template>
+    </VnSubToolbar>
+    <RightMenu>
+        <template #right-panel>
+            <TicketLackFilter data-key="NegativeList" />
+        </template>
+    </RightMenu>
+    <VnTable
+        ref="tableRef"
+        data-key="NegativeList"
+        :url="`Tickets/itemLack`"
+        :order="['itemFk DESC, date DESC, timed DESC']"
+        :user-params="negativeParams"
+        auto-load
+        :columns="columns"
+        default-mode="table"
+        :right-search="false"
+        :is-editable="false"
+        :use-model="true"
+        :map-key="false"
+        :row-click="redirectToCreateView"
+        v-model:selected="selectedRows"
+        :create="false"
+        :crud-model="{
+            disableInfiniteScroll: true,
+        }"
+        :table="{
+            'row-key': 'itemFk',
+            selection: 'multiple',
+        }"
+    >
+        <template #column-longName="{ row }">
+            <span class="link" @click.stop>
+                {{ row.longName }}
+                <ItemDescriptorProxy :id="row.itemFk" />
+            </span>
+        </template>
+        <template #column-itemFk="{ row }">
+            <div
+                style="display: flex; justify-content: space-around; align-items: center"
+            >
+                <span class="link" @click.stop>{{ row.itemFk }}</span>
                 <VnImg
                     style="width: 50px; height: 50px; float: inline-end"
                     :id="row.itemFk"
                     class="rounded"
                 ></VnImg>
-            </template>
-        </VnTable>
-    </QPage>
+            </div>
+        </template>
+    </VnTable>
 </template>
 
 <style lang="scss" scoped>
diff --git a/src/pages/Ticket/Negative/TicketLackTable.vue b/src/pages/Ticket/Negative/TicketLackTable.vue
index f6d7f9f13..c33ed1344 100644
--- a/src/pages/Ticket/Negative/TicketLackTable.vue
+++ b/src/pages/Ticket/Negative/TicketLackTable.vue
@@ -184,6 +184,12 @@ const emit = defineEmits(['update:selection']);
 
 const tableRef = ref(null);
 watch(selectedRows, () => emit('update:selection', selectedRows));
+function onBuysFetched(data) {
+    Object.assign(item.value, data[0]);
+}
+function onTicketLackFetched(data) {
+    itemLack.value = data[0];
+}
 </script>
 
 <template>
@@ -202,22 +208,19 @@ watch(selectedRows, () => emit('update:selection', selectedRows));
         :url="`Buys/latestBuysFilter`"
         :fields="['longName']"
         :filter="{ where: { 'i.id': '2' } }"
-        @on-fetch="(data) => Object.assign(item.value, data[0])"
+        @on-fetch="onBuysFetched"
         auto-load
     />
     <FetchData
         :url="`Tickets/itemLack`"
         :params="{ itemFk: entityId }"
-        @on-fetch="
-            (data) => {
-                itemLack = data[0];
-            }
-        "
+        @on-fetch="onTicketLackFetched"
         auto-load
     />
     <VnTable
         ref="tableRef"
         :data-key="URL_KEY"
+        :map-key="false"
         :url="`${URL_KEY}/${entityId}`"
         :columns="columns"
         :without-header="true"