From 91f317dfe67b87bdf860dbf485e8c53f72e559f9 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 11 Feb 2025 23:31:43 +0100 Subject: [PATCH 01/22] style: refs #7347 updates --- src/css/app.scss | 8 +- .../Supplier/Card/SupplierConsumption.vue | 332 +++++++++++++++--- src/pages/Zone/ZoneUpcoming.vue | 26 +- 3 files changed, 310 insertions(+), 56 deletions(-) diff --git a/src/css/app.scss b/src/css/app.scss index 2a60830bf..4c4a556a7 100644 --- a/src/css/app.scss +++ b/src/css/app.scss @@ -320,8 +320,12 @@ input::-webkit-inner-spin-button { .q-item > .q-item__section:has(.q-checkbox) { max-width: fit-content; } - -.row > .column:has(.q-checkbox) { +.vn-row > * .q-checkbox r { + min-width: 80%; + display: flex; + justify-content: space-between; +} +.vn-row > .q-checkbox.row.items-center { max-width: fit-content; } .q-field__inner { diff --git a/src/pages/Supplier/Card/SupplierConsumption.vue b/src/pages/Supplier/Card/SupplierConsumption.vue index 718de95dd..25ac773f0 100644 --- a/src/pages/Supplier/Card/SupplierConsumption.vue +++ b/src/pages/Supplier/Card/SupplierConsumption.vue @@ -8,8 +8,9 @@ import SendEmailDialog from 'components/common/SendEmailDialog.vue'; import SupplierConsumptionFilter from './SupplierConsumptionFilter.vue'; import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue'; -import { dateRange, toDate } from 'src/filters'; -import { dashIfEmpty } from 'src/filters'; +import { dateRange, toCurrency, toDate } from 'src/filters'; + +import EntryDescriptorProxy from 'src/pages/Entry/Card/EntryDescriptorProxy.vue'; import { usePrintService } from 'composables/usePrintService'; import useNotify from 'src/composables/useNotify.js'; import axios from 'axios'; @@ -31,7 +32,81 @@ const arrayData = useArrayData('SupplierConsumption', { order: ['itemTypeFk', 'itemName', 'itemSize'], userFilter: { where: { supplierFk: route.params.id } }, }); +const headerColumns = computed(() => [ + { + name: 'id', + label: t('globals.entry'), + align: 'left', + field: 'id', + sortable: true, + }, + { + name: 'invoiceNumber', + label: t('globals.subItem'), + align: 'left', + field: 'invoiceNumber', + sortable: true, + }, + { + name: 'quantity', + label: t('globals.quantity'), + align: 'left', + field: 'quantity', + sortable: true, + }, + { + name: 'total', + label: t('globals.quantity'), + align: 'left', + field: 'total', + sortable: true, + }, + { + name: 'shipped', + label: t('globals.quantity'), + align: 'left', + field: 'shipped', + sortable: true, + }, +]); +const columns = computed(() => [ + { + name: 'itemName', + label: t('globals.item'), + align: 'left', + field: 'itemName', + sortable: true, + }, + { + name: 'subName', + label: t('globals.subItem'), + align: 'left', + field: 'subName', + sortable: true, + }, + { + name: 'quantity', + label: t('globals.quantity'), + align: 'left', + field: 'quantity', + sortable: true, + }, + { + name: 'price', + label: t('globals.price'), + align: 'left', + field: 'price', + sortable: true, + }, + { + name: 'total', + label: t('globals.total'), + align: 'left', + field: 'total', + sortable: true, + }, +]); const store = arrayData.store; onUnmounted(() => state.unset('SupplierConsumption')); @@ -122,13 +197,17 @@ const totalEntryPrice = (rows) => { totalQuantity = totalQuantity + quantity; } totalRows.value = { totalPrice, totalQuantity }; + // expanded.value = rows.map((r) => r.id); return rows; }; - +const tableRef = ref(null); onMounted(async () => { stateStore.rightDrawer = true; await getSupplierConsumptionData(); }); + +const expanded = ref([]); +// const initialExpanded = rows.filter((r, i) => i % 3 === 0).map((r) => r.index); - - + diff --git a/src/pages/Zone/ZoneUpcoming.vue b/src/pages/Zone/ZoneUpcoming.vue index c74ae6078..1b5ed87cf 100644 --- a/src/pages/Zone/ZoneUpcoming.vue +++ b/src/pages/Zone/ZoneUpcoming.vue @@ -61,11 +61,27 @@ onMounted(() => weekdayStore.initStore()); v-for="(detail, index) in details" :key="index" class="full-width flex q-mb-lg" + style="flex-direction: column" > - - {{ getHeaderTitle(detail.shipped) }} - - +
+
+ + {{ getHeaderTitle(detail.shipped) }} + + + {{ getHeaderTitle(detail.shipped) }} + + + {{ getHeaderTitle(detail.shipped) }} + +
+ +
@@ -73,7 +89,7 @@ onMounted(() => weekdayStore.initStore()); From 36102aff0021dbf35f3936d03e1918a2e4a70bec Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Fri, 25 Apr 2025 13:52:05 +0200 Subject: [PATCH 03/22] style: adjust column alignment and add class for improved layout --- src/pages/Ticket/TicketAdvance.vue | 23 +++++++++++++++-------- src/pages/Ticket/TicketFuture.vue | 21 ++++++++++++++++++--- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/pages/Ticket/TicketAdvance.vue b/src/pages/Ticket/TicketAdvance.vue index bf3593acd..c0b6c2bb4 100644 --- a/src/pages/Ticket/TicketAdvance.vue +++ b/src/pages/Ticket/TicketAdvance.vue @@ -101,7 +101,7 @@ const ticketColumns = computed(() => [ format: (row, dashIfEmpty) => dashIfEmpty(row.lines), }, { - align: 'left', + align: 'right', label: t('advanceTickets.import'), name: 'totalWithVat', hidden: true, @@ -169,15 +169,17 @@ const ticketColumns = computed(() => [ label: t('advanceTickets.notMovableLines'), headerClass: 'horizontal-separator', name: 'notMovableLines', + class: 'shrink', }, { align: 'left', label: t('advanceTickets.futureLines'), headerClass: 'horizontal-separator', name: 'futureLines', + class: 'shrink', }, { - align: 'left', + align: 'right', label: t('advanceTickets.futureImport'), name: 'futureTotalWithVat', hidden: true, @@ -332,7 +334,12 @@ watch( if (!$el) return; const head = $el.querySelector('thead'); const firstRow = $el.querySelector('thead > tr'); - + const headSelectionCol = $el.querySelector( + 'thead tr.bg-header th.q-table--col-auto-width', + ); + if (headSelectionCol) { + headSelectionCol.classList.add('horizontal-separator'); + } const newRow = document.createElement('tr'); destinationElRef.value = document.createElement('th'); originElRef.value = document.createElement('th'); @@ -341,8 +348,10 @@ watch( destinationElRef.value.classList.add('text-uppercase', 'color-vn-label'); originElRef.value.classList.add('text-uppercase', 'color-vn-label'); - destinationElRef.value.setAttribute('colspan', '7'); - originElRef.value.setAttribute('colspan', '9'); + originElRef.value.classList.add('advance-icon'); + + destinationElRef.value.setAttribute('colspan', '9'); + originElRef.value.setAttribute('colspan', '11'); destinationElRef.value.textContent = `${t( 'advanceTickets.destination', @@ -453,10 +462,8 @@ watch( selection: 'multiple', }" v-model:selected="selectedTickets" - :pagination="{ rowsPerPage: 0 }" - :no-data-label="t('globals.noResults')" :right-search="false" - :order="['futureTotalWithVat ASC']" + :order="['futureTotalWithVat ASC']" auto-load :disable-option="{ card: true }" > diff --git a/src/pages/Ticket/TicketFuture.vue b/src/pages/Ticket/TicketFuture.vue index 6ed3afcc6..0939708c1 100644 --- a/src/pages/Ticket/TicketFuture.vue +++ b/src/pages/Ticket/TicketFuture.vue @@ -85,6 +85,7 @@ const ticketColumns = computed(() => [ label: t('advanceTickets.liters'), name: 'liters', align: 'left', + class: 'shrink', headerClass: 'horizontal-separator', }, { @@ -177,7 +178,12 @@ watch( if (!$el) return; const head = $el.querySelector('thead'); const firstRow = $el.querySelector('thead > tr'); - + const headSelectionCol = $el.querySelector( + 'thead tr.bg-header th.q-table--col-auto-width', + ); + if (headSelectionCol) { + headSelectionCol.classList.add('horizontal-separator'); + } const newRow = document.createElement('tr'); destinationElRef.value = document.createElement('th'); originElRef.value = document.createElement('th'); @@ -185,9 +191,10 @@ watch( newRow.classList.add('bg-header'); destinationElRef.value.classList.add('text-uppercase', 'color-vn-label'); originElRef.value.classList.add('text-uppercase', 'color-vn-label'); + originElRef.value.classList.add('advance-icon'); - destinationElRef.value.setAttribute('colspan', '7'); - originElRef.value.setAttribute('colspan', '9'); + destinationElRef.value.setAttribute('colspan', '9'); + originElRef.value.setAttribute('colspan', '7'); originElRef.value.textContent = `${t('advanceTickets.origin')}`; destinationElRef.value.textContent = `${t('advanceTickets.destination')}`; @@ -371,4 +378,12 @@ watch( :deep(.horizontal-bottom-separator) { border-bottom: 4px solid white !important; } +:deep(th.advance-icon::after) { + content: '>>'; + font-size: larger; + position: absolute; + text-align: center; + float: 0; + left: 0; +} From 797a48b04cb16131b32611550c4d1ee942ad9a95 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Fri, 25 Apr 2025 15:40:06 +0200 Subject: [PATCH 04/22] feat(TicketAdvance): add futurePreparation column to ticket table --- src/pages/Ticket/TicketAdvance.vue | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/pages/Ticket/TicketAdvance.vue b/src/pages/Ticket/TicketAdvance.vue index c0b6c2bb4..aa78fe7f0 100644 --- a/src/pages/Ticket/TicketAdvance.vue +++ b/src/pages/Ticket/TicketAdvance.vue @@ -145,6 +145,15 @@ const ticketColumns = computed(() => [ headerClass: 'horizontal-separator', name: 'futureLiters', }, + { + label: t('advanceTickets.preparation'), + name: 'futurePreparation', + field: 'futurePreparation', + align: 'left', + sortable: true, + headerClass: 'horizontal-separator', + columnFilter: false, + }, { align: 'left', label: t('advanceTickets.futureZone'), From 5e27f56796602f85109ffdb27bfac71b27decf30 Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 28 Apr 2025 11:28:13 +0200 Subject: [PATCH 05/22] fix(useArrayData): ensure options are set correctly on mount --- src/composables/useArrayData.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/composables/useArrayData.js b/src/composables/useArrayData.js index 9f95d639c..b046dfada 100644 --- a/src/composables/useArrayData.js +++ b/src/composables/useArrayData.js @@ -19,7 +19,7 @@ export function useArrayData(key, userOptions) { let canceller = null; onMounted(() => { - setOptions(); + setOptions(userOptions ?? {}); reset(['skip']); const query = route.query; @@ -39,9 +39,8 @@ export function useArrayData(key, userOptions) { setCurrentFilter(); }); - if (key && userOptions) setOptions(); - - function setOptions(params = userOptions) { + function setOptions(params) { + if (!params) return; const allowedOptions = [ 'url', 'filter', From b90c2bc2a33faa092d7a416792f9ce534244a9d8 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 28 Apr 2025 13:55:35 +0200 Subject: [PATCH 06/22] fix: remove unused searchFn after each filter change --- .../Ticket/Negative/TicketLackFilter.vue | 5 ---- src/pages/Ticket/TicketAdvanceFilter.vue | 18 +++--------- src/pages/Ticket/TicketFilter.vue | 17 +---------- src/pages/Ticket/TicketFutureFilter.vue | 29 ++++--------------- 4 files changed, 11 insertions(+), 58 deletions(-) diff --git a/src/pages/Ticket/Negative/TicketLackFilter.vue b/src/pages/Ticket/Negative/TicketLackFilter.vue index 78c030476..780c7e4b9 100644 --- a/src/pages/Ticket/Negative/TicketLackFilter.vue +++ b/src/pages/Ticket/Negative/TicketLackFilter.vue @@ -130,8 +130,6 @@ const setUserParams = (params) => { ($event) => onCategoryChange($event, searchFn) " :options="categoriesOptions" - option-value="id" - option-label="name" hide-selected dense filled @@ -145,10 +143,7 @@ const setUserParams = (params) => { await getItemPackingTypes()); {{ formatFn(tag.value) }} -