From f2be2b430010d647f2547a8a6d8a2b7604b894dd Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Mon, 5 Aug 2024 15:42:57 +0200 Subject: [PATCH 01/29] fea: stockBought add form and formDetail --- src/components/VnTable/VnTable.vue | 14 +- src/components/common/VnInputDate.vue | 2 +- src/components/common/VnInputTime.vue | 2 +- src/i18n/locale/en.yml | 1 + src/pages/Entry/EntryStockBought.vue | 142 ++++++++++++++++++ src/pages/Entry/EntryStockBoughtDetail.vue | 102 +++++++++++++ src/pages/Route/RouteList.vue | 3 +- src/router/modules/entry.js | 11 +- .../integration/entry/stockBought.spec.js | 36 +++++ 9 files changed, 302 insertions(+), 11 deletions(-) create mode 100644 src/pages/Entry/EntryStockBought.vue create mode 100644 src/pages/Entry/EntryStockBoughtDetail.vue create mode 100644 test/cypress/integration/entry/stockBought.spec.js diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index 4e40c0ba6..8a20023f2 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -107,7 +107,7 @@ const orders = ref(parseOrder(routeQuery.filter?.order)); const CrudModelRef = ref({}); const showForm = ref(false); const splittedColumns = ref({ columns: [] }); -const columnsVisibilitySkiped = ref(); +const columnsVisibilitySkipped = ref(); const tableModes = [ { icon: 'view_column', @@ -133,7 +133,7 @@ onMounted(() => { ? CARD_MODE : $props.defaultMode; stateStore.rightDrawer = true; - columnsVisibilitySkiped.value = [ + columnsVisibilitySkipped.value = [ ...splittedColumns.value.columns .filter((c) => c.visible == false) .map((c) => c.name), @@ -325,11 +325,11 @@ defineExpose({ <div class="q-px-md"> <CrudModel v-bind="$attrs" - :limit="20" + :limit="$attrs.limit ?? 20" ref="CrudModelRef" @on-fetch="(...args) => emit('onFetch', ...args)" :search-url="searchUrl" - :disable-infinite-scroll="isTableMode" + :disable-infinite-scroll="$attrs['disable-infinite-scroll'] ?? isTableMode" @save-changes="reload" :has-sub-toolbar="$attrs['hasSubToolbar'] ?? isEditable" :auto-load="hasParams || $attrs['auto-load']" @@ -351,9 +351,8 @@ defineExpose({ :grid="!isTableMode" table-header-class="bg-header" card-container-class="grid-three" - flat :style="isTableMode && `max-height: ${tableHeight}`" - virtual-scroll + :virtual-scroll="!isTableMode" @virtual-scroll=" (event) => event.index > rows.length - 2 && @@ -361,6 +360,7 @@ defineExpose({ " @row-click="(_, row) => rowClickFunction && rowClickFunction(row)" @update:selected="emit('update:selected', $event)" + flat > <template #top-left v-if="!$props.withoutHeader"> <slot name="top-left"></slot> @@ -370,7 +370,7 @@ defineExpose({ v-if="isTableMode" v-model="splittedColumns.columns" :table-code="tableCode ?? route.name" - :skip="columnsVisibilitySkiped" + :skip="columnsVisibilitySkipped" /> <QBtnToggle v-model="mode" diff --git a/src/components/common/VnInputDate.vue b/src/components/common/VnInputDate.vue index 6e57a8a53..76eee86fc 100644 --- a/src/components/common/VnInputDate.vue +++ b/src/components/common/VnInputDate.vue @@ -45,7 +45,7 @@ const formattedDate = computed({ if (value) { // parse input if (value.includes('/')) { - if (value.length == 6) value = value + new Date().getFullYear(); + if (value.length == 6) value = value + Date.vnNew().getFullYear(); if (value.length >= 10) { if (value.at(2) == '/') value = value.split('/').reverse().join('/'); value = date.formatDate( diff --git a/src/components/common/VnInputTime.vue b/src/components/common/VnInputTime.vue index a59f0e9e8..2c387bf0b 100644 --- a/src/components/common/VnInputTime.vue +++ b/src/components/common/VnInputTime.vue @@ -62,7 +62,7 @@ const formattedTime = computed({ function dateToTime(newDate) { return date.formatDate(new Date(newDate), dateFormat); } -const timeField = ref(); + watch( () => model.value, (val) => (formattedTime.value = val), diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index 78c1fa18d..867f338e4 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -142,6 +142,7 @@ globals: dms: File management entryCreate: New entry latestBuys: Latest buys + reserves: Reserves tickets: Tickets ticketCreate: New Tickets boxing: Boxing diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue new file mode 100644 index 000000000..5277cc5e1 --- /dev/null +++ b/src/pages/Entry/EntryStockBought.vue @@ -0,0 +1,142 @@ +<script setup> +import { ref } from 'vue'; +import { useI18n } from 'vue-i18n'; +import { useState } from 'src/composables/useState'; +import { useQuasar } from 'quasar'; + +import VnTable from 'components/VnTable/VnTable.vue'; +import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue'; +import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; +import EntryStockBoughtDetail from 'src/pages/Entry/EntryStockBoughtDetail.vue'; + +const { t } = useI18n(); +const quasar = useQuasar(); +const tableRef = ref(); +const state = useState(); +const user = state.getUser(); +const columns = [ + { + align: 'left', + label: 'Id', + name: 'id', + isTitle: true, + isId: true, + columnFilter: false, + visible: false, + }, + { + align: 'left', + name: 'workerFk', + label: t('Buyer'), + columnFilter: false, + }, + { + align: 'left', + label: t('Reserve'), + name: 'reserve', + columnFilter: false, + create: true, + component: 'number', + }, + { + align: 'left', + name: 'workerFk', + label: t('Buyer'), + component: 'select', + create: true, + visible: false, + columnFilter: false, + attrs: { + url: 'Workers/activeWithInheritedRole', + fields: ['id', 'name'], + where: { role: 'buyer' }, + optionFilter: 'firstName', + optionLabel: 'name', + optionValue: 'id', + useLike: false, + }, + }, + { + align: 'left', + label: t('Bought'), + name: 'bought', + columnFilter: false, + }, + { + align: 'left', + label: t('Date'), + name: 'dated', + component: 'date', + visible: false, + create: true, + }, + { + align: 'left', + name: 'tableActions', + actions: [ + { + title: t('More'), + icon: 'search', + isPrimary: true, + action: (row) => { + console.log('workerFk: ', row.workerFk); + quasar.dialog({ + component: EntryStockBoughtDetail, + componentProps: { + workerFk: row.workerFk, + dated: row.dated, + }, + maximized: true, + }); + }, + }, + ], + }, +]; +</script> +<template> + <VnSubToolbar /> + <VnTable + ref="tableRef" + data-key="StockBoughts" + url="StockBoughts/getStockBought" + save-url="StockBoughts/crud" + order="reserve DESC" + :is-editable="true" + :disable-option="{ card: true }" + :create="{ + urlCreate: 'StockBoughts', + title: t('Reserve some space'), + onDataSaved: () => tableRef.reload(), + formInitialData: { + workerFk: user.id, + dated: Date.now(), + }, + }" + :columns="columns" + > + <template #column-workerFk="{ row }"> + <span class="link" @click.stop> + {{ row?.worker?.user?.name }} + <WorkerDescriptorProxy :id="row?.workerFk" /> + </span> + </template> + </VnTable> +</template> +<i18n> + en: + Buyer: Buyer + Reserve: Reserve + Bought: Bought + More: More + Date: Date + This buyer has already made a reservation for this date: This buyer has already made a reservation for this date + es: + Buyer: Comprador + Reserve: Reservado + Bought: Comprado + More: Más + Date: Fecha + Reserve some space: Reservar espacio + This buyer has already made a reservation for this date: Este comprador ya ha hecho una reserva para esta fecha +</i18n> diff --git a/src/pages/Entry/EntryStockBoughtDetail.vue b/src/pages/Entry/EntryStockBoughtDetail.vue new file mode 100644 index 000000000..908f5dd20 --- /dev/null +++ b/src/pages/Entry/EntryStockBoughtDetail.vue @@ -0,0 +1,102 @@ +<script setup> +import { ref } from 'vue'; +import { useI18n } from 'vue-i18n'; + +import VnTable from 'components/VnTable/VnTable.vue'; +import EntryDescriptorProxy from 'src/pages/Entry/Card/EntryDescriptorProxy.vue'; +import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue'; + +const { t } = useI18n(); +const tableRef = ref(); +const $props = defineProps({ + workerFk: { + type: Number, + required: true, + }, + dated: { + type: String, + required: true, + }, +}); +console.log('$props: ', $props.workerFk, $props.dated); +const customUrl = `StockBoughts/getStockBoughtDetail?workerFk=${$props.workerFk}`; +const columns = [ + { + align: 'left', + label: 'Entry', + name: 'entryFk', + isTitle: true, + isId: true, + columnFilter: false, + }, + { + align: 'left', + name: 'itemFk', + label: t('Item'), + columnFilter: false, + }, + { + align: 'left', + label: t('Name'), + name: 'itemName', + columnFilter: false, + create: true, + columnClass: 'expand', + }, + { + align: 'left', + name: 'volume', + label: t('Volume'), + columnFilter: false, + }, + { + align: 'left', + label: t('Packaging'), + name: 'packagingFk', + columnFilter: false, + }, + { + align: 'left', + label: 'Packing', + name: 'packing', + columnFilter: false, + }, +]; +</script> +<template> + <QDialog> + <VnTable + ref="tableRef" + data-key="StockBoughtsDetail" + :url="customUrl" + order="itemName DESC" + :columns="columns" + :right-search="false" + :disable-infinite-scroll="true" + :disable-option="{ card: true }" + :limit="0" + auto-load + > + <template #column-entryFk="{ row }"> + <span class="link" @click.stop> + {{ row?.entryFk }} + <EntryDescriptorProxy :id="row.entryFk" /> + </span> + </template> + <template #column-itemName="{ row }"> + <span class="link" @click.stop> + {{ row?.itemName }} + <ItemDescriptorProxy :id="row.itemFk" /> + </span> + </template> + </VnTable> + </QDialog> +</template> +<i18n> + es: + Buyer: Comprador + Reserve: Reservado + Bought: Comprado + More: Más + Date: Fecha +</i18n> diff --git a/src/pages/Route/RouteList.vue b/src/pages/Route/RouteList.vue index b13e8cacd..7d5dd5c68 100644 --- a/src/pages/Route/RouteList.vue +++ b/src/pages/Route/RouteList.vue @@ -139,7 +139,7 @@ const columns = computed(() => [ { align: 'center', name: 'm3', - label: 'volume', + label: t('Volume'), cardVisible: true, }, { @@ -379,4 +379,5 @@ es: Route is not served: La ruta no está servida hourStarted: Hora de inicio hourFinished: Hora de fin + Volume: Volumen </i18n> diff --git a/src/router/modules/entry.js b/src/router/modules/entry.js index 0d38ed626..fd5490fbd 100644 --- a/src/router/modules/entry.js +++ b/src/router/modules/entry.js @@ -11,7 +11,7 @@ export default { component: RouterView, redirect: { name: 'EntryMain' }, menus: { - main: ['EntryList', 'MyEntries', 'EntryLatestBuys'], + main: ['EntryList', 'MyEntries', 'EntryLatestBuys', 'EntryStockBought'], card: ['EntryBasicData', 'EntryBuys', 'EntryNotes', 'EntryDms', 'EntryLog'], }, children: [ @@ -57,6 +57,15 @@ export default { }, component: () => import('src/pages/Entry/EntryLatestBuys.vue'), }, + { + path: 'stock-Bought', + name: 'EntryStockBought', + meta: { + title: 'reserves', + icon: 'deployed_code_history', + }, + component: () => import('src/pages/Entry/EntryStockBought.vue'), + }, ], }, { diff --git a/test/cypress/integration/entry/stockBought.spec.js b/test/cypress/integration/entry/stockBought.spec.js new file mode 100644 index 000000000..8e4fe225c --- /dev/null +++ b/test/cypress/integration/entry/stockBought.spec.js @@ -0,0 +1,36 @@ +describe('EntryStockBought', () => { + const reserveField = 'input[name="reserve"]'; + beforeEach(() => { + cy.viewport(1920, 1080); + cy.login('buyer'); + cy.visit( + `/#/entry/stock-Bought?table={"filter":"{}","dated":"2000-12-31T23:00:00.000Z"}` + ); + }); + it('Should edit the reserved space', () => { + cy.get('tBody > tr').its('length').should('eq', 1); + cy.get(reserveField).type('10{enter}'); + cy.get('button[title="Save"]').click(); + cy.get('.q-notification__message').should('have.text', 'Data saved'); + }); + it('Should add a new reserved space for buyerBoss', () => { + cy.get('.q-page-sticky > div > .q-btn > .q-btn__content > .q-icon').click(); + cy.get('input[aria-label="Reserve"]').type('1'); + cy.get('input[aria-label="Date"]').eq(1).clear(); + cy.get('input[aria-label="Date"]').eq(1).type('01-01'); + cy.get('input[aria-label="Buyer"]').type('buyerboss{downarrow}{enter}'); + cy.get('.q-notification__message').should('have.text', 'Data created'); + cy.get('tBody > tr').its('length').should('eq', 2); + }); + it('Should check detail for the buyer', () => { + cy.get(':nth-child(1) > .sticky > .q-btn > .q-btn__content > .q-icon').click(); + cy.get('tBody > tr').eq(1).its('length').should('eq', 1); + }); + it('Should check detail for the buyerBoss and had no content', () => { + cy.get(':nth-child(2) > .sticky > .q-btn > .q-btn__content > .q-icon').click(); + cy.get('.q-table__bottom.row.items-center.q-table__bottom--nodata').should( + 'have.text', + 'warningNo data available' + ); + }); +}); From de94b3629e6470ba0f8ba9f6b3fad807c6ec01ab Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Mon, 5 Aug 2024 15:44:37 +0200 Subject: [PATCH 02/29] fix: remove console.log --- src/pages/Entry/EntryStockBought.vue | 1 - src/pages/Entry/EntryStockBoughtDetail.vue | 1 - 2 files changed, 2 deletions(-) diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue index 5277cc5e1..e0063bb62 100644 --- a/src/pages/Entry/EntryStockBought.vue +++ b/src/pages/Entry/EntryStockBought.vue @@ -79,7 +79,6 @@ const columns = [ icon: 'search', isPrimary: true, action: (row) => { - console.log('workerFk: ', row.workerFk); quasar.dialog({ component: EntryStockBoughtDetail, componentProps: { diff --git a/src/pages/Entry/EntryStockBoughtDetail.vue b/src/pages/Entry/EntryStockBoughtDetail.vue index 908f5dd20..f7e89c691 100644 --- a/src/pages/Entry/EntryStockBoughtDetail.vue +++ b/src/pages/Entry/EntryStockBoughtDetail.vue @@ -18,7 +18,6 @@ const $props = defineProps({ required: true, }, }); -console.log('$props: ', $props.workerFk, $props.dated); const customUrl = `StockBoughts/getStockBoughtDetail?workerFk=${$props.workerFk}`; const columns = [ { From ffd7d98e9cc25cf218b2c577d0c7ef98df7cf59b Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Tue, 13 Aug 2024 17:56:07 +0200 Subject: [PATCH 03/29] feat: travel m3 --- src/components/VnTable/VnTable.vue | 20 +++++++++++ src/pages/Entry/EntryStockBought.vue | 39 +++++++++++++++++++++- src/pages/Entry/EntryStockBoughtDetail.vue | 2 +- src/pages/Travel/Card/TravelBasicData.vue | 3 ++ 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index 8a20023f2..dbe5d1622 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -15,6 +15,7 @@ import VnTableChip from 'components/VnTable/VnChip.vue'; import VnVisibleColumn from 'src/components/VnTable/VnVisibleColumn.vue'; import VnLv from 'components/ui/VnLv.vue'; import VnTableOrder from 'src/components/VnTable/VnOrder.vue'; +import item from 'src/router/modules/item'; const $props = defineProps({ columns: { @@ -609,6 +610,25 @@ defineExpose({ </QCard> </component> </template> + <template #bottom-row="{ cols }"> + <QTr> + <QTh + v-for="col of cols.filter((cols) => cols.visible ?? true)" + :key="col.id" + class="text-center" + > + <span v-if="col.summation"> + {{ + rows.reduce( + (sum, currentRow) => + sum + currentRow[col.name], + 0 + ) + }} + </span> + </QTh> + </QTr> + </template> </QTable> </template> </CrudModel> diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue index e0063bb62..12fc96214 100644 --- a/src/pages/Entry/EntryStockBought.vue +++ b/src/pages/Entry/EntryStockBought.vue @@ -5,6 +5,10 @@ import { useState } from 'src/composables/useState'; import { useQuasar } from 'quasar'; import VnTable from 'components/VnTable/VnTable.vue'; +import VnRow from 'src/components/ui/VnRow.vue'; +import VnInput from 'src/components/common/VnInput.vue'; +import VnLv from 'src/components/ui/VnLv.vue'; +import FetchData from 'src/components/FetchData.vue'; import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue'; import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; import EntryStockBoughtDetail from 'src/pages/Entry/EntryStockBoughtDetail.vue'; @@ -37,6 +41,7 @@ const columns = [ columnFilter: false, create: true, component: 'number', + summation: true, }, { align: 'left', @@ -61,6 +66,7 @@ const columns = [ label: t('Bought'), name: 'bought', columnFilter: false, + summation: true, }, { align: 'left', @@ -92,6 +98,21 @@ const columns = [ ], }, ]; +function getFilter(dated = Date.vnNow()) { + console.log('dated: ', new Date(dated * 1000)); + return { + fields: ['id', 'm3'], + where: { dated }, + include: [ + { + relation: 'warehouseIn', + where: { code: 'vnh' }, + }, + ], + }; +} +const travel = ref(); +const fetchDataRef = ref(); </script> <template> <VnSubToolbar /> @@ -109,11 +130,27 @@ const columns = [ onDataSaved: () => tableRef.reload(), formInitialData: { workerFk: user.id, - dated: Date.now(), + dated: Date.vnNow(), }, }" :columns="columns" + auto-load + @on-fetch="() => fetchDataRef.fetch()" > + <template #moreFilterPanel="{ params }"> + <FetchData + ref="fetchDataRef" + url="Travels" + limit="1" + auto-load + :filter="getFilter(params?.date)" + @on-fetch="(data) => (travel = data)" + /> + <VnRow class="q-pa-md" style="align-items: center" v-if="travel?.length"> + <span>{{ t('Booked trucks: ') + travel[0]?.m3 }}</span> + <QBtn style="max-width: 20%" flat icon="edit" /> + </VnRow> + </template> <template #column-workerFk="{ row }"> <span class="link" @click.stop> {{ row?.worker?.user?.name }} diff --git a/src/pages/Entry/EntryStockBoughtDetail.vue b/src/pages/Entry/EntryStockBoughtDetail.vue index f7e89c691..9212f1115 100644 --- a/src/pages/Entry/EntryStockBoughtDetail.vue +++ b/src/pages/Entry/EntryStockBoughtDetail.vue @@ -38,9 +38,9 @@ const columns = [ align: 'left', label: t('Name'), name: 'itemName', - columnFilter: false, create: true, columnClass: 'expand', + columnFilter: false, }, { align: 'left', diff --git a/src/pages/Travel/Card/TravelBasicData.vue b/src/pages/Travel/Card/TravelBasicData.vue index 8a369a0dd..a3620a6ba 100644 --- a/src/pages/Travel/Card/TravelBasicData.vue +++ b/src/pages/Travel/Card/TravelBasicData.vue @@ -70,6 +70,9 @@ const agenciesOptions = ref([]); hide-selected /> </VnRow> + <VnRow> + <VnInput v-model="data.m3" label="m3" /> + </VnRow> <VnRow> <QCheckbox :label="t('travel.basicData.delivered')" From 3dc720e2d0db55c61b7b28df6087d997af241b54 Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Wed, 4 Sep 2024 14:40:36 +0200 Subject: [PATCH 04/29] feat: refs #7404 add m3 and fix detail --- src/components/VnTable/VnTable.vue | 36 ++++- src/pages/Entry/EntryList.vue | 3 - src/pages/Entry/EntryStockBought.vue | 136 +++++++++++------- src/pages/Entry/EntryStockBoughtDetail.vue | 2 +- .../integration/entry/stockBought.spec.js | 2 +- 5 files changed, 118 insertions(+), 61 deletions(-) diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index 26b5c424a..0fd6d1dd1 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -90,6 +90,10 @@ const $props = defineProps({ type: String, default: '90vh', }, + footer: { + type: Boolean, + default: false, + }, }); const { t } = useI18n(); const stateStore = useStateStore(); @@ -108,7 +112,7 @@ const orders = ref(parseOrder(routeQuery.filter?.order)); const CrudModelRef = ref({}); const showForm = ref(false); const splittedColumns = ref({ columns: [] }); -const columnsVisibilitySkippped = ref(); +const columnsVisibilitySkipped = ref(); const createForm = ref(); const tableModes = [ @@ -347,11 +351,11 @@ defineExpose({ <CrudModel v-bind="$attrs" :class="$attrs['class'] ?? 'q-px-md'" - :limit="20" + :limit="$attrs.limit ?? 20" ref="CrudModelRef" @on-fetch="(...args) => emit('onFetch', ...args)" :search-url="searchUrl" - :disable-infinite-scroll="isTableMode" + :disable-infinite-scroll="$attrs['disable-infinite-scroll'] ?? isTableMode" @save-changes="reload" :has-sub-toolbar="$attrs['hasSubToolbar'] ?? isEditable" :auto-load="hasParams || $attrs['auto-load']" @@ -371,7 +375,7 @@ defineExpose({ card-container-class="grid-three" flat :style="isTableMode && `max-height: ${tableHeight}`" - virtual-scroll + :virtual-scroll="!isTableMode" @virtual-scroll=" (event) => event.index > rows.length - 2 && @@ -614,6 +618,28 @@ defineExpose({ </QCard> </component> </template> + <template #bottom-row="{ cols }" v-if="footer"> + <QTr v-if="rows.length" class="bg-header" style="height: 30px"> + <QTh + v-for="col of cols.filter((cols) => cols.visible ?? true)" + :key="col?.id" + class="text-center" + > + <div + v-if="col?.summation" + :class="`text-${col?.align ?? 'left'}`" + class="text-bold q-pa-sm" + > + {{ + rows.reduce( + (sum, currentRow) => sum + currentRow[col.name], + 0 + ) + }} + </div> + </QTh> + </QTr> + </template> </QTable> </template> </CrudModel> @@ -672,7 +698,7 @@ es: } .bg-header { - background-color: var(--vn-header-color); + background-color: var(--vn-accent-color); color: var(--vn-text-color); } diff --git a/src/pages/Entry/EntryList.vue b/src/pages/Entry/EntryList.vue index c03c67edb..6f7ff1935 100644 --- a/src/pages/Entry/EntryList.vue +++ b/src/pages/Entry/EntryList.vue @@ -9,9 +9,6 @@ import RightMenu from 'src/components/common/RightMenu.vue'; import { toDate } from 'src/filters'; import { useSummaryDialog } from 'src/composables/useSummaryDialog'; import EntrySummary from './Card/EntrySummary.vue'; -import VnUserLink from 'components/ui/VnUserLink.vue'; -import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; -import CustomerDescriptorProxy from '../Customer/Card/CustomerDescriptorProxy.vue'; import SupplierDescriptorProxy from 'src/pages/Supplier/Card/SupplierDescriptorProxy.vue'; import TravelDescriptorProxy from 'src/pages/Travel/Card/TravelDescriptorProxy.vue'; diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue index 12fc96214..75d356bd2 100644 --- a/src/pages/Entry/EntryStockBought.vue +++ b/src/pages/Entry/EntryStockBought.vue @@ -6,24 +6,23 @@ import { useQuasar } from 'quasar'; import VnTable from 'components/VnTable/VnTable.vue'; import VnRow from 'src/components/ui/VnRow.vue'; -import VnInput from 'src/components/common/VnInput.vue'; -import VnLv from 'src/components/ui/VnLv.vue'; import FetchData from 'src/components/FetchData.vue'; import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue'; import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; import EntryStockBoughtDetail from 'src/pages/Entry/EntryStockBoughtDetail.vue'; +import { useRouter } from 'vue-router'; const { t } = useI18n(); const quasar = useQuasar(); const tableRef = ref(); const state = useState(); const user = state.getUser(); +const router = useRouter(); const columns = [ { align: 'left', label: 'Id', name: 'id', - isTitle: true, isId: true, columnFilter: false, visible: false, @@ -32,6 +31,7 @@ const columns = [ align: 'left', name: 'workerFk', label: t('Buyer'), + isTitle: true, columnFilter: false, }, { @@ -42,6 +42,7 @@ const columns = [ create: true, component: 'number', summation: true, + cardVisible: true, }, { align: 'left', @@ -67,6 +68,7 @@ const columns = [ name: 'bought', columnFilter: false, summation: true, + cardVisible: true, }, { align: 'left', @@ -89,7 +91,6 @@ const columns = [ component: EntryStockBoughtDetail, componentProps: { workerFk: row.workerFk, - dated: row.dated, }, maximized: true, }); @@ -98,15 +99,22 @@ const columns = [ ], }, ]; -function getFilter(dated = Date.vnNow()) { - console.log('dated: ', new Date(dated * 1000)); + +function navigate(id) { + router.push({ path: `/travel/${id}/basic-data` }); +} + +function getFilter(dated) { + const shipped = dated ? new Date(dated) : Date.vnNew(); + shipped.setHours(0, 0, 0, 0); return { - fields: ['id', 'm3'], - where: { dated }, + where: { + shipped, + m3: { neq: null }, + }, include: [ { relation: 'warehouseIn', - where: { code: 'vnh' }, }, ], }; @@ -116,49 +124,74 @@ const fetchDataRef = ref(); </script> <template> <VnSubToolbar /> - <VnTable - ref="tableRef" - data-key="StockBoughts" - url="StockBoughts/getStockBought" - save-url="StockBoughts/crud" - order="reserve DESC" - :is-editable="true" - :disable-option="{ card: true }" - :create="{ - urlCreate: 'StockBoughts', - title: t('Reserve some space'), - onDataSaved: () => tableRef.reload(), - formInitialData: { - workerFk: user.id, - dated: Date.vnNow(), - }, - }" - :columns="columns" - auto-load - @on-fetch="() => fetchDataRef.fetch()" - > - <template #moreFilterPanel="{ params }"> - <FetchData - ref="fetchDataRef" - url="Travels" - limit="1" - auto-load - :filter="getFilter(params?.date)" - @on-fetch="(data) => (travel = data)" - /> - <VnRow class="q-pa-md" style="align-items: center" v-if="travel?.length"> - <span>{{ t('Booked trucks: ') + travel[0]?.m3 }}</span> - <QBtn style="max-width: 20%" flat icon="edit" /> - </VnRow> - </template> - <template #column-workerFk="{ row }"> - <span class="link" @click.stop> - {{ row?.worker?.user?.name }} - <WorkerDescriptorProxy :id="row?.workerFk" /> - </span> - </template> - </VnTable> + <QPage class="column items-center q-pa-md"> + <VnTable + ref="tableRef" + data-key="StockBoughts" + url="StockBoughts/getStockBought" + save-url="StockBoughts/crud" + order="reserve DESC" + :is-editable="true" + :create="{ + urlCreate: 'StockBoughts', + title: t('Reserve some space'), + onDataSaved: () => tableRef.reload(), + formInitialData: { + workerFk: user.id, + dated: Date.vnNow(), + }, + }" + :columns="columns" + auto-load + @on-fetch="() => console.log('fetching...', fetchDataRef.fetch())" + style="max-width: 40%" + :footer="true" + > + <template #moreFilterPanel="{ params }"> + <FetchData + ref="fetchDataRef" + url="Travels" + limit="1" + auto-load + :filter="getFilter(params?.dated)" + @on-fetch="(data) => (travel = data)" + /> + <div class="trucks"> + <div> + <span style="color: var(--vn-label-color)"> + {{ t('Booked trucks') + ': ' }} + </span> + </div> + <div v-if="travel"> + <span> + {{ travel[0]?.m3 }} + </span> + <QBtn + style="max-width: 20%" + flat + icon="edit" + @click="navigate(travel[0]?.id)" + /> + </div> + </div> + </template> + <template #column-workerFk="{ row }"> + <span class="link" @click.stop> + {{ row?.worker?.user?.name }} + <WorkerDescriptorProxy :id="row?.workerFk" /> + </span> + </template> + </VnTable> + </QPage> </template> +<style lang="scss"> +.trucks { + text-align: center; + margin: 3%; + border: 3px solid var(--vn-header-color); + padding: 1%; +} +</style> <i18n> en: Buyer: Buyer @@ -168,6 +201,7 @@ const fetchDataRef = ref(); Date: Date This buyer has already made a reservation for this date: This buyer has already made a reservation for this date es: + Booked trucks: Camiones reservados Buyer: Comprador Reserve: Reservado Bought: Comprado diff --git a/src/pages/Entry/EntryStockBoughtDetail.vue b/src/pages/Entry/EntryStockBoughtDetail.vue index 9212f1115..b9420af71 100644 --- a/src/pages/Entry/EntryStockBoughtDetail.vue +++ b/src/pages/Entry/EntryStockBoughtDetail.vue @@ -18,7 +18,7 @@ const $props = defineProps({ required: true, }, }); -const customUrl = `StockBoughts/getStockBoughtDetail?workerFk=${$props.workerFk}`; +const customUrl = `StockBoughts/getStockBoughtDetail?workerFk=${$props.workerFk}&date=${$props.dated}`; const columns = [ { align: 'left', diff --git a/test/cypress/integration/entry/stockBought.spec.js b/test/cypress/integration/entry/stockBought.spec.js index 8e4fe225c..10af3ef42 100644 --- a/test/cypress/integration/entry/stockBought.spec.js +++ b/test/cypress/integration/entry/stockBought.spec.js @@ -8,7 +8,7 @@ describe('EntryStockBought', () => { ); }); it('Should edit the reserved space', () => { - cy.get('tBody > tr').its('length').should('eq', 1); + cy.get('tBody > tr').its('length').should('eq', 2); cy.get(reserveField).type('10{enter}'); cy.get('button[title="Save"]').click(); cy.get('.q-notification__message').should('have.text', 'Data saved'); From cd12343302c9fea5bc5419ac04731d43b75baf2d Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Fri, 6 Sep 2024 07:26:04 +0200 Subject: [PATCH 05/29] feat: refs #7404 add some style to the form and reorganize fields --- src/components/VnTable/VnColumn.vue | 3 + src/components/VnTable/VnTable.vue | 8 +- src/components/common/VnComponent.vue | 6 +- src/pages/Entry/EntryStockBought.vue | 119 ++++++++++----------- src/pages/Entry/EntryStockBoughtFilter.vue | 57 ++++++++++ src/pages/Route/Card/RouteSearchbar.vue | 1 - src/pages/Route/RouteList.vue | 1 - 7 files changed, 120 insertions(+), 75 deletions(-) create mode 100644 src/pages/Entry/EntryStockBoughtFilter.vue diff --git a/src/components/VnTable/VnColumn.vue b/src/components/VnTable/VnColumn.vue index ed34e9eee..ad120f02e 100644 --- a/src/components/VnTable/VnColumn.vue +++ b/src/components/VnTable/VnColumn.vue @@ -171,6 +171,8 @@ const components = computed(() => $props.components ?? defaultComponents); :value="{ row, model }" v-model="model" /> + + {{ console.log('model: ', col) }} <VnComponent v-if="col.component" :prop="col" @@ -178,6 +180,7 @@ const components = computed(() => $props.components ?? defaultComponents); :value="{ row, model }" v-model="model" /> + <span :title="value" v-else>{{ value }}</span> <VnComponent v-if="col.after" diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index 0fd6d1dd1..b5d6e8d10 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -15,7 +15,6 @@ import VnTableChip from 'components/VnTable/VnChip.vue'; import VnVisibleColumn from 'src/components/VnTable/VnVisibleColumn.vue'; import VnLv from 'components/ui/VnLv.vue'; import VnTableOrder from 'src/components/VnTable/VnOrder.vue'; -import item from 'src/router/modules/item'; const $props = defineProps({ columns: { @@ -410,7 +409,7 @@ defineExpose({ /> </template> <template #header-cell="{ col }"> - <QTh v-if="col.visible ?? true"> + <QTh table-header-style="max-width:50%" v-if="col.visible ?? true"> <div class="column self-start q-ml-xs ellipsis" :class="`text-${col?.align ?? 'left'}`" @@ -665,6 +664,7 @@ defineExpose({ :column-name="column.name" :label="column.label" > + {{ console.log('data: ', data) }} <VnTableColumn :column="column" :row="{}" @@ -708,9 +708,7 @@ es: .q-table--dark .q-table__bottom, .q-table--dark thead, -.q-table--dark tr, -.q-table--dark th, -.q-table--dark td { +.q-table--dark tr { border-color: var(--vn-section-color); } diff --git a/src/components/common/VnComponent.vue b/src/components/common/VnComponent.vue index fa99f9892..1ba1506d5 100644 --- a/src/components/common/VnComponent.vue +++ b/src/components/common/VnComponent.vue @@ -17,17 +17,16 @@ const $props = defineProps({ }, }); -let mixed; const componentArray = computed(() => { if (typeof $props.prop === 'object') return [$props.prop]; return $props.prop; }); function mix(toComponent) { - if (mixed) return mixed; const { component, attrs, event } = toComponent; + console.log('attrs: ', attrs); const customComponent = $props.components[component]; - mixed = { + return { component: customComponent?.component ?? component, attrs: { ...toValueAttrs(attrs), @@ -37,7 +36,6 @@ function mix(toComponent) { }, event: { ...customComponent?.event, ...event }, }; - return mixed; } function toValueAttrs(attrs) { diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue index 75d356bd2..8f197be92 100644 --- a/src/pages/Entry/EntryStockBought.vue +++ b/src/pages/Entry/EntryStockBought.vue @@ -4,20 +4,18 @@ import { useI18n } from 'vue-i18n'; import { useState } from 'src/composables/useState'; import { useQuasar } from 'quasar'; -import VnTable from 'components/VnTable/VnTable.vue'; -import VnRow from 'src/components/ui/VnRow.vue'; -import FetchData from 'src/components/FetchData.vue'; import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue'; +import RightMenu from 'src/components/common/RightMenu.vue'; +import EntryStockBoughtFilter from './EntryStockBoughtFilter.vue'; +import VnTable from 'components/VnTable/VnTable.vue'; import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; import EntryStockBoughtDetail from 'src/pages/Entry/EntryStockBoughtDetail.vue'; -import { useRouter } from 'vue-router'; const { t } = useI18n(); const quasar = useQuasar(); const tableRef = ref(); const state = useState(); const user = state.getUser(); -const router = useRouter(); const columns = [ { align: 'left', @@ -31,8 +29,17 @@ const columns = [ align: 'left', name: 'workerFk', label: t('Buyer'), - isTitle: true, - columnFilter: false, + component: 'select', + create: true, + attrs: { + url: 'Workers/activeWithInheritedRole', + fields: ['id', 'name'], + where: { role: 'buyer' }, + optionFilter: 'firstName', + optionLabel: 'name', + optionValue: 'id', + useLike: false, + }, }, { align: 'left', @@ -44,31 +51,13 @@ const columns = [ summation: true, cardVisible: true, }, - { - align: 'left', - name: 'workerFk', - label: t('Buyer'), - component: 'select', - create: true, - visible: false, - columnFilter: false, - attrs: { - url: 'Workers/activeWithInheritedRole', - fields: ['id', 'name'], - where: { role: 'buyer' }, - optionFilter: 'firstName', - optionLabel: 'name', - optionValue: 'id', - useLike: false, - }, - }, { align: 'left', label: t('Bought'), name: 'bought', - columnFilter: false, summation: true, cardVisible: true, + columnFilter: false, }, { align: 'left', @@ -92,7 +81,6 @@ const columns = [ componentProps: { workerFk: row.workerFk, }, - maximized: true, }); }, }, @@ -100,10 +88,6 @@ const columns = [ }, ]; -function navigate(id) { - router.push({ path: `/travel/${id}/basic-data` }); -} - function getFilter(dated) { const shipped = dated ? new Date(dated) : Date.vnNew(); shipped.setHours(0, 0, 0, 0); @@ -119,11 +103,46 @@ function getFilter(dated) { ], }; } -const travel = ref(); -const fetchDataRef = ref(); +const userParams = ref({ + dated: Date.vnNew(), +}); </script> <template> - <VnSubToolbar /> + <VnSubToolbar> + <template #st-data="{ params }"> + <FetchData + ref="fetchDataRef" + url="Travels" + limit="1" + auto-load + :filter="getFilter(params?.dated)" + @on-fetch="(data) => (travel = data)" + /> + <div> + <div> + <span style="color: var(--vn-label-color)"> + {{ t('Booked trucks') + ': ' }} + </span> + </div> + <div v-if="travel"> + <span> + {{ travel[0]?.m3 }} + </span> + <QBtn + style="max-width: 20%" + flat + icon="edit" + @click="navigate(travel[0]?.id)" + /> + </div> + </div> + </template> + </VnSubToolbar> + <RightMenu> + <template #right-panel> + <EntryStockBoughtFilter data-key="StockBoughts" /> + </template> + </RightMenu> <QPage class="column items-center q-pa-md"> <VnTable ref="tableRef" @@ -131,6 +150,7 @@ const fetchDataRef = ref(); url="StockBoughts/getStockBought" save-url="StockBoughts/crud" order="reserve DESC" + :right-search="false" :is-editable="true" :create="{ urlCreate: 'StockBoughts', @@ -142,39 +162,10 @@ const fetchDataRef = ref(); }, }" :columns="columns" + :user-params="userParams" auto-load - @on-fetch="() => console.log('fetching...', fetchDataRef.fetch())" - style="max-width: 40%" :footer="true" > - <template #moreFilterPanel="{ params }"> - <FetchData - ref="fetchDataRef" - url="Travels" - limit="1" - auto-load - :filter="getFilter(params?.dated)" - @on-fetch="(data) => (travel = data)" - /> - <div class="trucks"> - <div> - <span style="color: var(--vn-label-color)"> - {{ t('Booked trucks') + ': ' }} - </span> - </div> - <div v-if="travel"> - <span> - {{ travel[0]?.m3 }} - </span> - <QBtn - style="max-width: 20%" - flat - icon="edit" - @click="navigate(travel[0]?.id)" - /> - </div> - </div> - </template> <template #column-workerFk="{ row }"> <span class="link" @click.stop> {{ row?.worker?.user?.name }} diff --git a/src/pages/Entry/EntryStockBoughtFilter.vue b/src/pages/Entry/EntryStockBoughtFilter.vue new file mode 100644 index 000000000..3393113f2 --- /dev/null +++ b/src/pages/Entry/EntryStockBoughtFilter.vue @@ -0,0 +1,57 @@ +<script setup> +import { ref } from 'vue'; +import { useI18n } from 'vue-i18n'; +import { onMounted } from 'vue'; +import { useStateStore } from 'stores/useStateStore'; + +import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue'; +import FetchData from 'components/FetchData.vue'; +import VnInputDate from 'src/components/common/VnInputDate.vue'; + +const { t } = useI18n(); +const props = defineProps({ + dataKey: { + type: String, + required: true, + }, +}); + +const companiesOptions = ref([]); +const stateStore = useStateStore(); +onMounted(async () => { + stateStore.rightDrawer = true; +}); +</script> + +<template> + <FetchData + ref="buyer" + url="Workers/activeWithInheritedRole" + :filter="{ + fields: ['id', 'name'], + where: { role: 'buyer' }, + }" + order="name" + @on-fetch="(data) => (companiesOptions = data)" + auto-load + /> + <VnFilterPanel :data-key="props.dataKey" :search-button="true"> + <template #tags="{ tag, formatFn }"> + <div class="q-gutter-x-xs"> + <strong>{{ t(`params.${tag.label}`) }}: </strong> + <span>{{ formatFn(tag.value) }}</span> + </div> + </template> + <template #body="{ params }"> + <QItem class="q-my-sm"> + <QItemSection> + <VnInputDate v-model="params.dated" :label="t('Date')" is-outlined /> + </QItemSection> + </QItem> + </template> + </VnFilterPanel> +</template> +<i18n> + es: + Date: Fecha +</i18n> diff --git a/src/pages/Route/Card/RouteSearchbar.vue b/src/pages/Route/Card/RouteSearchbar.vue index 48ad09151..a8e11cef6 100644 --- a/src/pages/Route/Card/RouteSearchbar.vue +++ b/src/pages/Route/Card/RouteSearchbar.vue @@ -3,7 +3,6 @@ import VnSearchbar from 'components/ui/VnSearchbar.vue'; import { useI18n } from 'vue-i18n'; const { t } = useI18n(); </script> - <template> <VnSearchbar data-key="RouteList" diff --git a/src/pages/Route/RouteList.vue b/src/pages/Route/RouteList.vue index ef544a68d..7e2358236 100644 --- a/src/pages/Route/RouteList.vue +++ b/src/pages/Route/RouteList.vue @@ -409,5 +409,4 @@ es: Route is not served: La ruta no está servida hourStarted: Hora de inicio hourFinished: Hora de fin - Volume: Volumen </i18n> From 684215fc4613eb9e24f98775bc713eef916529d5 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Mon, 9 Sep 2024 09:59:22 +0200 Subject: [PATCH 06/29] feat(AccountBasicData): add twoFactorFk --- src/pages/Account/Card/AccountBasicData.vue | 9 ++++++++- src/pages/Account/locale/en.yml | 1 + src/pages/Account/locale/es.yml | 1 + test/cypress/integration/outLogin/twoFactor.spec.js | 2 +- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/pages/Account/Card/AccountBasicData.vue b/src/pages/Account/Card/AccountBasicData.vue index f38299f9e..b223c4bc0 100644 --- a/src/pages/Account/Card/AccountBasicData.vue +++ b/src/pages/Account/Card/AccountBasicData.vue @@ -24,7 +24,7 @@ watch( <template> <FormModel ref="formModelRef" - :url="`VnUsers/preview`" + url="VnUsers/preview" :url-update="`VnUsers/${route.params.id}/update-user`" :filter="accountFilter" model="Accounts" @@ -43,6 +43,13 @@ watch( option-value="code" option-label="code" /> + <VnSelect + url="TwoFactorTypes" + v-model="data.twoFactorFk" + :label="t('account.card.twoFactor')" + option-value="code" + option-label="code" + /> </div> </template> </FormModel> diff --git a/src/pages/Account/locale/en.yml b/src/pages/Account/locale/en.yml index 3cf861fb2..fe8707eb8 100644 --- a/src/pages/Account/locale/en.yml +++ b/src/pages/Account/locale/en.yml @@ -35,6 +35,7 @@ account: willDeactivated: User will be deactivated activated: User activated! deactivated: User deactivated! + twoFactor: Two factor actions: setPassword: Set password disableAccount: diff --git a/src/pages/Account/locale/es.yml b/src/pages/Account/locale/es.yml index b53a0153c..112ffe9cc 100644 --- a/src/pages/Account/locale/es.yml +++ b/src/pages/Account/locale/es.yml @@ -32,6 +32,7 @@ account: activated: ¡Usuario activado! deactivated: ¡Usuario desactivado! newUser: Nuevo usuario + twoFactor: Doble factor privileges: delegate: Puede delegar privilegios actions: diff --git a/test/cypress/integration/outLogin/twoFactor.spec.js b/test/cypress/integration/outLogin/twoFactor.spec.js index 4d8561f0f..259ddfc0f 100755 --- a/test/cypress/integration/outLogin/twoFactor.spec.js +++ b/test/cypress/integration/outLogin/twoFactor.spec.js @@ -12,7 +12,7 @@ describe('Two Factor', () => { cy.request( 'PATCH', `http://localhost:3000/api/VnUsers/${userId}/update-user?access_token=DEFAULT_TOKEN`, - { twoFactor: 'email' } + { twoFactorFk: 'email' } ); }); From c7e717c61108c59e29d35a2f65796aa5492f05bf Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Wed, 11 Sep 2024 07:55:12 +0200 Subject: [PATCH 07/29] feat: refs #7404 add travel m3 to reserves form --- src/components/VnTable/VnColumn.vue | 3 - src/components/common/VnComponent.vue | 1 - src/components/ui/VnFilterPanel.vue | 1 + src/pages/Entry/EntryStockBought.vue | 84 ++++++++++++++----- src/pages/Entry/EntryStockBoughtFilter.vue | 11 ++- .../integration/entry/stockBought.spec.js | 2 +- 6 files changed, 76 insertions(+), 26 deletions(-) diff --git a/src/components/VnTable/VnColumn.vue b/src/components/VnTable/VnColumn.vue index ad120f02e..ed34e9eee 100644 --- a/src/components/VnTable/VnColumn.vue +++ b/src/components/VnTable/VnColumn.vue @@ -171,8 +171,6 @@ const components = computed(() => $props.components ?? defaultComponents); :value="{ row, model }" v-model="model" /> - - {{ console.log('model: ', col) }} <VnComponent v-if="col.component" :prop="col" @@ -180,7 +178,6 @@ const components = computed(() => $props.components ?? defaultComponents); :value="{ row, model }" v-model="model" /> - <span :title="value" v-else>{{ value }}</span> <VnComponent v-if="col.after" diff --git a/src/components/common/VnComponent.vue b/src/components/common/VnComponent.vue index 1ba1506d5..bd25c787c 100644 --- a/src/components/common/VnComponent.vue +++ b/src/components/common/VnComponent.vue @@ -24,7 +24,6 @@ const componentArray = computed(() => { function mix(toComponent) { const { component, attrs, event } = toComponent; - console.log('attrs: ', attrs); const customComponent = $props.components[component]; return { component: customComponent?.component ?? component, diff --git a/src/components/ui/VnFilterPanel.vue b/src/components/ui/VnFilterPanel.vue index cebdc4bbf..b3bdec0a5 100644 --- a/src/components/ui/VnFilterPanel.vue +++ b/src/components/ui/VnFilterPanel.vue @@ -58,6 +58,7 @@ const $props = defineProps({ }); defineExpose({ search, sanitizer }); + const emit = defineEmits([ 'update:modelValue', 'refresh', diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue index 8f197be92..ad338acb1 100644 --- a/src/pages/Entry/EntryStockBought.vue +++ b/src/pages/Entry/EntryStockBought.vue @@ -1,10 +1,13 @@ <script setup> -import { ref } from 'vue'; +import { onMounted, ref, watch } from 'vue'; import { useI18n } from 'vue-i18n'; import { useState } from 'src/composables/useState'; import { useQuasar } from 'quasar'; import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue'; +import axios from 'axios'; +import FetchData from 'components/FetchData.vue'; +import VnRow from 'components/ui/VnRow.vue'; import RightMenu from 'src/components/common/RightMenu.vue'; import EntryStockBoughtFilter from './EntryStockBoughtFilter.vue'; import VnTable from 'components/VnTable/VnTable.vue'; @@ -13,7 +16,6 @@ import EntryStockBoughtDetail from 'src/pages/Entry/EntryStockBoughtDetail.vue'; const { t } = useI18n(); const quasar = useQuasar(); -const tableRef = ref(); const state = useState(); const user = state.getUser(); const columns = [ @@ -88,7 +90,32 @@ const columns = [ }, ]; +const fetchDataRef = ref(); +const tableRef = ref(); +const travel = ref(null); +const userParams = ref({ + dated: Date.vnNew(), +}); +const filter = ref({ + where: { + shipped: (userParams.value.dated + ? new Date(userParams.value.dated) + : Date.vnNew() + ).setHours(0, 0, 0, 0), + m3: { neq: null }, + }, + include: [ + { + relation: 'warehouseIn', + scope: { + where: { code: 'vnh' }, + }, + }, + ], +}); + function getFilter(dated) { + console.log('dated: ', dated); const shipped = dated ? new Date(dated) : Date.vnNew(); shipped.setHours(0, 0, 0, 0); return { @@ -99,48 +126,62 @@ function getFilter(dated) { include: [ { relation: 'warehouseIn', + scope: { + where: { code: 'vnh' }, + }, }, ], }; } -const userParams = ref({ - dated: Date.vnNew(), -}); + +const setUserParams = async ({ dated }) => { + const shipped = (dated ? new Date(dated) : Date.vnNew()).setHours(0, 0, 0, 0); + + filter.value.where.shipped = shipped; + fetchDataRef.value?.fetch(); +}; </script> <template> <VnSubToolbar> - <template #st-data="{ params }"> + <template #st-data> <FetchData ref="fetchDataRef" url="Travels" limit="1" auto-load - :filter="getFilter(params?.dated)" + :filter="filter" @on-fetch="(data) => (travel = data)" /> - <div> - <div> - <span style="color: var(--vn-label-color)"> - {{ t('Booked trucks') + ': ' }} - </span> - </div> - <div v-if="travel"> + + <VnRow> + <div v-if="travel" class="q-pa-md"> + <QIcon + name="local_airport" + class="fill-icon q-mr-sm" + size="md" + :title="t('Travel')" + color="primary" + /> <span> - {{ travel[0]?.m3 }} + {{ t('Booked trucks') + ': ' + travel[0]?.m3 }} </span> <QBtn style="max-width: 20%" flat icon="edit" @click="navigate(travel[0]?.id)" + :title="t('Edit travel')" /> </div> - </div> + </VnRow> </template> </VnSubToolbar> <RightMenu> <template #right-panel> - <EntryStockBoughtFilter data-key="StockBoughts" /> + <EntryStockBoughtFilter + data-key="StockBoughts" + @set-user-params="setUserParams" + /> </template> </RightMenu> <QPage class="column items-center q-pa-md"> @@ -155,7 +196,10 @@ const userParams = ref({ :create="{ urlCreate: 'StockBoughts', title: t('Reserve some space'), - onDataSaved: () => tableRef.reload(), + onDataSaved: () => { + tableRef.reload(); + fetchDataRef.reload(); + }, formInitialData: { workerFk: user.id, dated: Date.vnNow(), @@ -163,8 +207,8 @@ const userParams = ref({ }" :columns="columns" :user-params="userParams" - auto-load :footer="true" + auto-load > <template #column-workerFk="{ row }"> <span class="link" @click.stop> @@ -192,6 +236,8 @@ const userParams = ref({ Date: Date This buyer has already made a reservation for this date: This buyer has already made a reservation for this date es: + Edit travel: Editar envío + Travel: Envíos Booked trucks: Camiones reservados Buyer: Comprador Reserve: Reservado diff --git a/src/pages/Entry/EntryStockBoughtFilter.vue b/src/pages/Entry/EntryStockBoughtFilter.vue index 3393113f2..aaf9e7a5b 100644 --- a/src/pages/Entry/EntryStockBoughtFilter.vue +++ b/src/pages/Entry/EntryStockBoughtFilter.vue @@ -15,9 +15,12 @@ const props = defineProps({ required: true, }, }); - const companiesOptions = ref([]); const stateStore = useStateStore(); +const emit = defineEmits(['set-user-params']); +const setUserParams = (params) => { + emit('set-user-params', params); +}; onMounted(async () => { stateStore.rightDrawer = true; }); @@ -35,7 +38,11 @@ onMounted(async () => { @on-fetch="(data) => (companiesOptions = data)" auto-load /> - <VnFilterPanel :data-key="props.dataKey" :search-button="true"> + <VnFilterPanel + :data-key="props.dataKey" + :search-button="true" + @set-user-params="setUserParams" + > <template #tags="{ tag, formatFn }"> <div class="q-gutter-x-xs"> <strong>{{ t(`params.${tag.label}`) }}: </strong> diff --git a/test/cypress/integration/entry/stockBought.spec.js b/test/cypress/integration/entry/stockBought.spec.js index 10af3ef42..a18e2bd2e 100644 --- a/test/cypress/integration/entry/stockBought.spec.js +++ b/test/cypress/integration/entry/stockBought.spec.js @@ -20,7 +20,7 @@ describe('EntryStockBought', () => { cy.get('input[aria-label="Date"]').eq(1).type('01-01'); cy.get('input[aria-label="Buyer"]').type('buyerboss{downarrow}{enter}'); cy.get('.q-notification__message').should('have.text', 'Data created'); - cy.get('tBody > tr').its('length').should('eq', 2); + cy.get('tBody > tr').its('length').should('eq', 3); }); it('Should check detail for the buyer', () => { cy.get(':nth-child(1) > .sticky > .q-btn > .q-btn__content > .q-icon').click(); From 8be1833f9e7bbf6b9d6bc8163b84eb090ecbb1b8 Mon Sep 17 00:00:00 2001 From: carlossa <carlossa@verdnatura.es> Date: Fri, 13 Sep 2024 08:49:36 +0200 Subject: [PATCH 08/29] refs #7155 scopeDays --- src/pages/Travel/TravelList.vue | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/pages/Travel/TravelList.vue b/src/pages/Travel/TravelList.vue index c7ad908f9..0fba3a8d3 100644 --- a/src/pages/Travel/TravelList.vue +++ b/src/pages/Travel/TravelList.vue @@ -11,6 +11,7 @@ import TravelSummary from './Card/TravelSummary.vue'; import VnSearchbar from 'components/ui/VnSearchbar.vue'; import { toDate } from 'src/filters'; import { getDateQBadgeColor } from 'src/composables/getDateQBadgeColor.js'; +import { dateRange } from 'src/filters'; const { viewSummary } = useSummaryDialog(); const router = useRouter(); const { t } = useI18n(); @@ -29,6 +30,18 @@ const cloneTravel = (travelData) => { redirectToCreateView(stringifiedTravelData); }; +const handleScopeDays = (params, days, callback) => { + const [from, to] = dateRange(Date.vnNew()); + if (!days) { + Object.assign(params, { from, to, scopeDays: 1 }); + } else { + params.from = from; + to.setDate(to.getDate() + days); + params.to = to; + } + if (callback) callback(); +}; + const redirectToCreateView = (queryParams) => { router.push({ name: 'TravelCreate', query: { travelData: queryParams } }); }; From 842fb9de5fb1773738cca1d4f236a29171320287 Mon Sep 17 00:00:00 2001 From: carlossa <carlossa@verdnatura.es> Date: Fri, 13 Sep 2024 12:52:25 +0200 Subject: [PATCH 09/29] refs #7155 scopeDays fix --- src/components/VnTable/VnTable.vue | 1 + src/pages/Travel/TravelList.vue | 43 +++++++++++++++++++----------- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index 0ed3de261..798213c08 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -301,6 +301,7 @@ defineExpose({ redirect: redirectFn, selected, CrudModelRef, + params, }); function handleOnDataSaved(_) { diff --git a/src/pages/Travel/TravelList.vue b/src/pages/Travel/TravelList.vue index 0fba3a8d3..a0976e92c 100644 --- a/src/pages/Travel/TravelList.vue +++ b/src/pages/Travel/TravelList.vue @@ -12,6 +12,8 @@ import VnSearchbar from 'components/ui/VnSearchbar.vue'; import { toDate } from 'src/filters'; import { getDateQBadgeColor } from 'src/composables/getDateQBadgeColor.js'; import { dateRange } from 'src/filters'; +import VnInputNumber from 'src/components/common/VnInputNumber.vue'; + const { viewSummary } = useSummaryDialog(); const router = useRouter(); const { t } = useI18n(); @@ -25,22 +27,26 @@ const $props = defineProps({ }, }); const entityId = computed(() => $props.id || route.params.id); + +onMounted(async () => { + stateStore.rightDrawer = true; + handleScopeDays(); +}); + const cloneTravel = (travelData) => { const stringifiedTravelData = JSON.stringify(travelData); redirectToCreateView(stringifiedTravelData); }; -const handleScopeDays = (params, days, callback) => { - const [from, to] = dateRange(Date.vnNew()); - if (!days) { - Object.assign(params, { from, to, scopeDays: 1 }); - } else { - params.from = from; - to.setDate(to.getDate() + days); - params.to = to; - } - if (callback) callback(); -}; +function handleScopeDays(days = 7) { + days = +days; + tableRef.value.params.scopeDays = days; + const [landedFrom, landedTo] = dateRange(Date.vnNew()); + landedTo.setDate(landedTo.getDate() + days); + + tableRef.value.params.landedFrom = landedFrom; + tableRef.value.params.landedTo = landedTo; +} const redirectToCreateView = (queryParams) => { router.push({ name: 'TravelCreate', query: { travelData: queryParams } }); @@ -50,10 +56,6 @@ const redirectCreateEntryView = (travelData) => { router.push({ name: 'EntryCreate', query: { travelFk: travelData.id } }); }; -onMounted(async () => { - stateStore.rightDrawer = true; -}); - const columns = computed(() => [ { align: 'left', @@ -254,6 +256,17 @@ const columns = computed(() => [ :class="{ 'is-active': row.isReceived }" /> </template> + <template #moreFilterPanel="{ params }"> + <VnInputNumber + :label="t('params.scopeDays')" + v-model.number="params.scopeDays" + @keyup.enter="(evt) => handleScopeDays(evt.target.value)" + @remove="handleScopeDays()" + class="q-px-xs q-pr-lg" + filled + dense + /> + </template> </VnTable> </template> From deb30ee9551cab217665947ec1fd1df37362536a Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Mon, 16 Sep 2024 08:59:36 +0200 Subject: [PATCH 10/29] feat: refs #7404 travel m3 form --- src/components/VnTable/VnOrder.vue | 2 +- src/pages/Entry/EntryStockBought.vue | 102 +++++++++--------- src/pages/Entry/EntryStockBoughtDetail.vue | 66 +++++++----- src/pages/Entry/EntryStockBoughtFilter.vue | 29 +++-- .../integration/entry/stockBought.spec.js | 15 ++- 5 files changed, 116 insertions(+), 98 deletions(-) diff --git a/src/components/VnTable/VnOrder.vue b/src/components/VnTable/VnOrder.vue index 98c7ab392..7fdd23b78 100644 --- a/src/components/VnTable/VnOrder.vue +++ b/src/components/VnTable/VnOrder.vue @@ -4,7 +4,7 @@ import { useArrayData } from 'composables/useArrayData'; const model = defineModel({ type: Object }); const $props = defineProps({ name: { - type: String, + type: [String, Boolean], default: '', }, label: { diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue index ad338acb1..c8f147b1f 100644 --- a/src/pages/Entry/EntryStockBought.vue +++ b/src/pages/Entry/EntryStockBought.vue @@ -1,12 +1,13 @@ <script setup> -import { onMounted, ref, watch } from 'vue'; +import { ref } from 'vue'; import { useI18n } from 'vue-i18n'; import { useState } from 'src/composables/useState'; import { useQuasar } from 'quasar'; import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue'; -import axios from 'axios'; import FetchData from 'components/FetchData.vue'; +import FormModelPopup from 'components/FormModelPopup.vue'; +import VnInput from 'src/components/common/VnInput.vue'; import VnRow from 'components/ui/VnRow.vue'; import RightMenu from 'src/components/common/RightMenu.vue'; import EntryStockBoughtFilter from './EntryStockBoughtFilter.vue'; @@ -31,7 +32,9 @@ const columns = [ align: 'left', name: 'workerFk', label: t('Buyer'), + isTitle: true, component: 'select', + cardVisible: true, create: true, attrs: { url: 'Workers/activeWithInheritedRole', @@ -82,6 +85,7 @@ const columns = [ component: EntryStockBoughtDetail, componentProps: { workerFk: row.workerFk, + dated: userParams.value.dated, }, }); }, @@ -91,6 +95,7 @@ const columns = [ ]; const fetchDataRef = ref(); +const travelDialogRef = ref(false); const tableRef = ref(); const travel = ref(null); const userParams = ref({ @@ -108,38 +113,21 @@ const filter = ref({ { relation: 'warehouseIn', scope: { - where: { code: 'vnh' }, + fields: ['code'], }, }, ], }); -function getFilter(dated) { - console.log('dated: ', dated); - const shipped = dated ? new Date(dated) : Date.vnNew(); - shipped.setHours(0, 0, 0, 0); - return { - where: { - shipped, - m3: { neq: null }, - }, - include: [ - { - relation: 'warehouseIn', - scope: { - where: { code: 'vnh' }, - }, - }, - ], - }; -} - const setUserParams = async ({ dated }) => { const shipped = (dated ? new Date(dated) : Date.vnNew()).setHours(0, 0, 0, 0); - filter.value.where.shipped = shipped; fetchDataRef.value?.fetch(); }; + +function openDialog() { + travelDialogRef.value = true; +} </script> <template> <VnSubToolbar> @@ -147,35 +135,55 @@ const setUserParams = async ({ dated }) => { <FetchData ref="fetchDataRef" url="Travels" - limit="1" auto-load :filter="filter" - @on-fetch="(data) => (travel = data)" + @on-fetch=" + (data) => { + travel = data.filter((data) => data.warehouseIn.code === 'VNH'); + } + " /> - - <VnRow> - <div v-if="travel" class="q-pa-md"> - <QIcon - name="local_airport" - class="fill-icon q-mr-sm" - size="md" - :title="t('Travel')" - color="primary" - /> + <VnRow class="travel"> + <div v-if="travel"> + <span style="color: var(--vn-label-color)"> + {{ t('Booked trucks') }}: + </span> <span> - {{ t('Booked trucks') + ': ' + travel[0]?.m3 }} + {{ travel[0]?.m3 }} </span> <QBtn + v-if="travel[0]?.m3" style="max-width: 20%" flat icon="edit" - @click="navigate(travel[0]?.id)" + @click="openDialog()" :title="t('Edit travel')" + color="primary" /> </div> </VnRow> </template> </VnSubToolbar> + <QDialog v-model="travelDialogRef" :maximized="true" :class="['vn-row', 'wrap']"> + <FormModelPopup + :url-update="`Travels/${travel[0].id}`" + model="travel" + :title="t('Travel m3')" + :form-initial-data="{ id: travel[0].id, m3: travel[0].m3 }" + @on-data-saved="fetchDataRef.fetch()" + > + <template #form-inputs="{ data }"> + <VnInput + v-model="data.id" + :label="t('id')" + type="number" + disable + readonly + /> + <VnInput v-model="data.m3" :label="t('m3')" type="number" /> + </template> + </FormModelPopup> + </QDialog> <RightMenu> <template #right-panel> <EntryStockBoughtFilter @@ -196,10 +204,7 @@ const setUserParams = async ({ dated }) => { :create="{ urlCreate: 'StockBoughts', title: t('Reserve some space'), - onDataSaved: () => { - tableRef.reload(); - fetchDataRef.reload(); - }, + onDataSaved: () => tableRef.reload(), formInitialData: { workerFk: user.id, dated: Date.vnNow(), @@ -214,17 +219,14 @@ const setUserParams = async ({ dated }) => { <span class="link" @click.stop> {{ row?.worker?.user?.name }} <WorkerDescriptorProxy :id="row?.workerFk" /> - </span> - </template> + </span> </template + >0 </VnTable> </QPage> </template> -<style lang="scss"> -.trucks { - text-align: center; - margin: 3%; - border: 3px solid var(--vn-header-color); - padding: 1%; +<style lang="css" scoped> +.travel { + margin-bottom: 0px; } </style> <i18n> diff --git a/src/pages/Entry/EntryStockBoughtDetail.vue b/src/pages/Entry/EntryStockBoughtDetail.vue index b9420af71..6d9227ad2 100644 --- a/src/pages/Entry/EntryStockBoughtDetail.vue +++ b/src/pages/Entry/EntryStockBoughtDetail.vue @@ -14,7 +14,7 @@ const $props = defineProps({ required: true, }, dated: { - type: String, + type: Date, required: true, }, }); @@ -63,34 +63,46 @@ const columns = [ ]; </script> <template> - <QDialog> - <VnTable - ref="tableRef" - data-key="StockBoughtsDetail" - :url="customUrl" - order="itemName DESC" - :columns="columns" - :right-search="false" - :disable-infinite-scroll="true" - :disable-option="{ card: true }" - :limit="0" - auto-load - > - <template #column-entryFk="{ row }"> - <span class="link" @click.stop> - {{ row?.entryFk }} - <EntryDescriptorProxy :id="row.entryFk" /> - </span> - </template> - <template #column-itemName="{ row }"> - <span class="link" @click.stop> - {{ row?.itemName }} - <ItemDescriptorProxy :id="row.itemFk" /> - </span> - </template> - </VnTable> + <QDialog position="bottom" :maximized="true"> + <div class="container"> + <VnTable + ref="tableRef" + data-key="StockBoughtsDetail" + :url="customUrl" + order="itemName DESC" + :columns="columns" + :right-search="false" + :disable-infinite-scroll="true" + :disable-option="{ card: true }" + :limit="0" + auto-load + > + <template #column-entryFk="{ row }"> + <span class="link" @click.stop> + {{ row?.entryFk }} + <EntryDescriptorProxy :id="row.entryFk" /> + </span> + </template> + <template #column-itemName="{ row }"> + <span class="link" @click.stop> + {{ row?.itemName }} + <ItemDescriptorProxy :id="row.itemFk" /> + </span> + </template> + </VnTable> + </div> </QDialog> </template> +<style lang="css"> +.q-dialog__inner { + max-width: 50vw; + overflow: auto; + display: flex; + justify-content: center; + align-items: center; + margin: auto; +} +</style> <i18n> es: Buyer: Comprador diff --git a/src/pages/Entry/EntryStockBoughtFilter.vue b/src/pages/Entry/EntryStockBoughtFilter.vue index aaf9e7a5b..7694cfe6c 100644 --- a/src/pages/Entry/EntryStockBoughtFilter.vue +++ b/src/pages/Entry/EntryStockBoughtFilter.vue @@ -1,11 +1,9 @@ <script setup> -import { ref } from 'vue'; import { useI18n } from 'vue-i18n'; import { onMounted } from 'vue'; import { useStateStore } from 'stores/useStateStore'; import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue'; -import FetchData from 'components/FetchData.vue'; import VnInputDate from 'src/components/common/VnInputDate.vue'; const { t } = useI18n(); @@ -15,7 +13,6 @@ const props = defineProps({ required: true, }, }); -const companiesOptions = ref([]); const stateStore = useStateStore(); const emit = defineEmits(['set-user-params']); const setUserParams = (params) => { @@ -27,20 +24,10 @@ onMounted(async () => { </script> <template> - <FetchData - ref="buyer" - url="Workers/activeWithInheritedRole" - :filter="{ - fields: ['id', 'name'], - where: { role: 'buyer' }, - }" - order="name" - @on-fetch="(data) => (companiesOptions = data)" - auto-load - /> <VnFilterPanel :data-key="props.dataKey" :search-button="true" + search-url="table" @set-user-params="setUserParams" > <template #tags="{ tag, formatFn }"> @@ -52,13 +39,25 @@ onMounted(async () => { <template #body="{ params }"> <QItem class="q-my-sm"> <QItemSection> - <VnInputDate v-model="params.dated" :label="t('Date')" is-outlined /> + <VnInputDate + id="date" + v-model="params.dated" + :label="t('Date')" + is-outlined + /> </QItemSection> </QItem> </template> </VnFilterPanel> </template> <i18n> + en: + params: + dated: Date + workerFk: Worker es: Date: Fecha + params: + dated: Date + workerFk: Trabajador </i18n> diff --git a/test/cypress/integration/entry/stockBought.spec.js b/test/cypress/integration/entry/stockBought.spec.js index a18e2bd2e..b93afa520 100644 --- a/test/cypress/integration/entry/stockBought.spec.js +++ b/test/cypress/integration/entry/stockBought.spec.js @@ -1,15 +1,13 @@ describe('EntryStockBought', () => { - const reserveField = 'input[name="reserve"]'; beforeEach(() => { cy.viewport(1920, 1080); cy.login('buyer'); - cy.visit( - `/#/entry/stock-Bought?table={"filter":"{}","dated":"2000-12-31T23:00:00.000Z"}` - ); + cy.visit(`/#/entry/stock-Bought`); }); it('Should edit the reserved space', () => { + cy.get('.q-field__native.q-placeholder').should('have.value', '01/01/2001'); cy.get('tBody > tr').its('length').should('eq', 2); - cy.get(reserveField).type('10{enter}'); + cy.get('input[name="reserve"]').type('10{enter}'); cy.get('button[title="Save"]').click(); cy.get('.q-notification__message').should('have.text', 'Data saved'); }); @@ -33,4 +31,11 @@ describe('EntryStockBought', () => { 'warningNo data available' ); }); + it('Should edit travel m3 and refresh', () => { + cy.get('.vn-row > div > .q-btn > .q-btn__content > .q-icon').click(); + cy.get('input[aria-label="m3"]').clear(); + cy.get('input[aria-label="m3"]').type('60'); + cy.get('.q-mt-lg > .q-btn--standard > .q-btn__content > .block').click(); + cy.get('.vn-row > div > :nth-child(2)').should('have.text', '60'); + }); }); From 263dc29d7a4d4ba22d89fb7715a8f69d968bdfed Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Mon, 16 Sep 2024 12:19:03 +0200 Subject: [PATCH 11/29] fix: refs #7404 remove console.log --- src/components/VnTable/VnTable.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index a6a8aec11..b7321fe16 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -692,7 +692,6 @@ function handleOnDataSaved(_) { :column-name="column.name" :label="column.label" > - {{ console.log('data: ', data) }} <VnTableColumn :column="column" :row="{}" From 09cdd2f7e795ec28913cacfa21f0e0f381ade840 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Mon, 16 Sep 2024 15:17:05 +0200 Subject: [PATCH 12/29] chore: changelog --- CHANGELOG.md | 181 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e1d4c433..666d3f4dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,184 @@ +# Version XX.XX - XXXX-XX-XX + +### Added 🆕 + +- chore: refs #6772 fix e2e (origin/6772-warmfix-fixE2e) by:jorgep +- chore: refs #7323 worker changes by:jorgep +- chore: refs #7353 fix warnings by:jorgep +- chore: refs #7353 use Vue component nomenclature by:jorgep +- chore: refs #7356 fix type by:jorgep +- feat(AccountConnections): use VnToken by:alexm +- feat: add key to routerView by:Javier Segarra +- feat: add plus shortcut in VnTable by:Javier Segarra +- feat: add row by:Javier Segarra +- feat: addRow withour dialog by:Javier Segarra +- feat: apply mixin by:Javier Segarra +- feat by:Javier Segarra +- feat: change navBar buttons by:Javier Segarra +- feat: dense rows by:Javier Segarra +- feat: fields with wrong name by:jgallego +- feat: fix bugs and filters by:Javier Segarra +- feat: fix refund parameters by:jgallego +- feat: handle create row by:Javier Segarra +- feat: handle dates by:Javier Segarra +- feat: handle qCheckbox 3rd state by:Javier Segarra +- feat: imrpove VnInputTime to set cursor at start by:Javier Segarra +- feat: keyShortcut directive by:Javier Segarra +- feat: minor fixes by:jgallego +- feat: only filter by isDestiny by:Javier Segarra +- feat: refs #211153 businessDataLinkGrafana by:robert +- feat: refs #7129 add km start and end on create form by:pablone +- feat: refs #7353 add filter & fix customTags by:jorgep +- feat: refs #7353 add locale by:jorgep +- feat: refs #7353 add no one opt by:jorgep +- feat: refs #7353 add right icons by:jorgep +- feat: refs #7353 imporve toDateFormat by:jorgep +- feat: refs #7353 salesPerson nickname & id by:jorgep +- feat: refs #7353 split sections by:jorgep +- feat: refs #7847 remove reload btn by:jorgep +- feat: refs #7847 remove reload fn by:jorgep +- feat: refs #7889 added shortcuts to modules by:Jon +- feat: refs #7911 added shortcut to modules by:Jon +- feat: refuncInvoiceForm component by:jgallego +- feat: remove duplicity by:Javier Segarra +- feat: remove future itemFixedPrices by:Javier Segarra +- feat: replace stickyButtons by subtoolbar by:Javier Segarra +- feat: required validation by:Javier Segarra +- feat: show bad dates by:Javier Segarra +- feat: showdate icons by:Javier Segarra +- feat: solve ItemFixedFilterPanel by:Javier Segarra +- feat: transfer an invoice by:jgallego +- feat: try to fix ItemFixedFilterPanel by:Javier Segarra +- feat: unnecessary changes by:Javier Segarra +- feat: update changelog (origin/7896_down_devToTest_2436) by:Javier Segarra +- feat: updates by:Javier Segarra +- feat: update version and changelog by:Javier Segarra +- feat: vnInput* by:Javier Segarra +- feat: with VnTable by:Javier Segarra +- refs #6772 feat: fix approach by:Javier Segarra +- refs #6772 feat: refresh shelving.basic-data by:Javier Segarra +- style: show subName value by:Javier Segarra + +### Changed 📦 + +- perf: add v-shortcut in VnCard by:Javier Segarra +- perf: approach by:Javier Segarra +- perf: change directive location by:Javier Segarra +- perf: change slots order by:Javier Segarra +- perf: examples by:Javier Segarra +- perf: hide icon for VnInputDate by:Javier Segarra +- perf: improve ItemFixedPricefilterPanel by:Javier Segarra +- perf: improve mainShrotcutMixin by:Javier Segarra +- perf: minor clean code by:Javier Segarra +- perf: onRowchange by:Javier Segarra +- perf: order by by:Javier Segarra +- perf: order components by:Javier Segarra +- perf: refs #7889 perf shortcut test by:Jon +- perf: remove console.log by:Javier Segarra +- perf: remove icons in header slot by:Javier Segarra +- perf: remove print variables by:Javier Segarra +- perf: restore CustomerBasicData by:Javier Segarra +- refactor: deleted useless prop by:Jon +- refactor: deleted useless prop in FetchedTags by:Jon +- refactor: refs #7323 drop useless code by:jorgep +- refactor: refs #7353 clients correction by:jorgep +- refactor: refs #7353 clients correction wip by:jorgep +- refactor: refs #7353 ease logic by:jorgep +- refactor: refs #7353 order correction by:jorgep +- refactor: refs #7353 simplify code by:jorgep +- refactor: refs #7353 tickets correction by:jorgep +- refactor: refs #7353 use global locales by:jorgep +- refactor: refs #7354 changed descriptor menu options by:Jon +- refactor: refs #7354 changed icon color in table and notification when deleting a zone by:Jon +- refactor: refs #7354 fix tableFilters by:Jon +- refactor: refs #7354 modified VnInputTime by:Jon +- refactor: refs #7354 refactor deliveryPanel by:Jon +- refactor: refs #7354 refactor zones section and fixed e2e tests by:Jon +- refactor: refs #7354 requested changes by:Jon +- refactor: refs #7354 reverse deliveryPanel changes by:Jon +- refactor: refs #7354 Zone migration changes by:Jon +- refactor: refs #7889 deleted subtitle attr and use keyBinding instead by:Jon +- refactor: refs #7889 modified shortcut and dashboard, and added tootlip in LeftMenu by:Jon +- refs #6722 perf: not fetch when id not exists by:Javier Segarra +- refs #6772 perf: change variable name by:JAVIER SEGARRA MARTINEZ +- refs #6772 perf: use ArrayData (6772_reload_sections) by:Javier Segarra +- refs #7283 refactor fix ItemDescriptor by:carlossa +- refs #7283 refactor ItexDescriptor by:carlossa + +### Fixed 🛠️ + +- chore: refs #6772 fix e2e (origin/6772-warmfix-fixE2e) by:jorgep +- chore: refs #7353 fix warnings by:jorgep +- chore: refs #7356 fix type by:jorgep +- feat: fix bugs and filters by:Javier Segarra +- feat: fix refund parameters by:jgallego +- feat: minor fixes by:jgallego +- feat: refs #7353 add filter & fix customTags by:jorgep +- feat: try to fix ItemFixedFilterPanel by:Javier Segarra +- fix: add border-top by:Javier Segarra +- fix: added missing descriptors and small details by:Jon +- fix branch by:carlossa +- fix: call upsert when crudModel haschanges by:Javier Segarra +- fix(ClaimList): fix summary by:alexm +- fix: cli warnings by:Javier Segarra +- fix: editTableOptions by:Javier Segarra +- fix events and descriptor menu by:Jon +- fix: InvoiceIn sections (origin/6772_reload_sections) by:Javier Segarra +- fix: minor changes by:Javier Segarra +- fix: minor error whit dates by:Javier Segarra +- fix: module icon by:Javier Segarra +- fix: options QDate by:Javier Segarra +- fix: refs #6900 e2e error by:jorgep +- fix: refs #6900 rollback by:jorgep +- fix: refs #7353 css by:jorgep +- fix: refs #7353 hide search param (origin/7353-warmfix-fixSearchbar) by:jorgep +- fix: refs #7353 iron out filter by:jorgep +- fix: refs #7353 iron out ticket table by:jorgep +- fix: refs #7353 padding by:jorgep +- fix: refs #7353 salesClientTable by:jorgep +- fix: refs #7353 salesorderTable by:jorgep +- fix: refs #7353 saleTicketMonitors by:jorgep +- fix: refs #7353 use same datakey by:jorgep +- fix: refs #7353 vnTable colors by:jorgep +- fix: refs #7354 e2e tests by:Jon +- fix: refs #7354 fix delivery days by:Jon +- fix: refs #7354 fix list searchbar and filters by:Jon +- fix: refs #7354 fix VnSearchbar search for zone section & finished basic tests by:Jon +- fix: refs #7354 fix VnTable filters and agency field by:Jon +- fix: refs #7354 fix zoneSearchbar by:Jon +- fix: refs #7354 requested changes by:Jon +- fix: refs #7356 colors by:jorgep +- fix: refs #7356 create claim dialog by:jorgep +- fix: refs #7889 fixed shortcut test by:Jon +- fix: refs #7903 fixed ticket's search bar and keybinding tooltip by:Jon +- fix: refs #7911 fixed shortcut and related files by:Jon +- fix: remove condition duplicated by:Javier Segarra +- fix: remove property by:Javier Segarra +- fix tootltip by:carlossa +- fix traduction by:carlossa +- fix(VnSectionMain): add QPage by:alexm +- fix(zone): zoneLocation and the others searchbar by:alexm +- refactor: refs #7354 fix tableFilters by:Jon +- refactor: refs #7354 refactor zones section and fixed e2e tests by:Jon +- refs #6772 feat: fix approach by:Javier Segarra +- refs #6772 fix: claimPhoto reload by:Javier Segarra +- refs #6896 fix searchbar by:carlossa +- refs #6897 fix entry by:carlossa +- refs #6899 fix invoiceFix by:carlossa +- refs #6899 fix order by:carlossa +- refs #7283 fix by:carlossa +- refs #7283 fix ItemDescriptor warehouse by:carlossa +- refs #7283 refactor fix ItemDescriptor by:carlossa +- refs #7355 #7366 fix account, summary, list, travelList, tooltip by:carlossa +- refs #7355 fix accountPrivileges by:carlossa +- refs #7355 fix accounts, vnTable by:carlossa +- refs #7355 fix privileges by:carlossa +- refs #7355 fix roles filters by:carlossa +- refs #7355 fix total by:carlossa +- refs #7355 fix views summarys, entryList, travelList refact by:carlossa +- refs #7366 fix travel hours by:carlossa +- test: fix e2e by:Javier Segarra + # Version 24.36 - 2024-08-27 ### Added 🆕 From dc047435f5c7bed72a3d035690b66d5d30de5baa Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Mon, 16 Sep 2024 15:17:31 +0200 Subject: [PATCH 13/29] chore: changelog --- CHANGELOG.md | 342 +++++++++++++++++++++++++-------------------------- package.json | 2 +- 2 files changed, 172 insertions(+), 172 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 666d3f4dd..f1d10b26e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,183 +1,183 @@ -# Version XX.XX - XXXX-XX-XX +# Version 24.38 - 2024-09-17 ### Added 🆕 -- chore: refs #6772 fix e2e (origin/6772-warmfix-fixE2e) by:jorgep -- chore: refs #7323 worker changes by:jorgep -- chore: refs #7353 fix warnings by:jorgep -- chore: refs #7353 use Vue component nomenclature by:jorgep -- chore: refs #7356 fix type by:jorgep -- feat(AccountConnections): use VnToken by:alexm -- feat: add key to routerView by:Javier Segarra -- feat: add plus shortcut in VnTable by:Javier Segarra -- feat: add row by:Javier Segarra -- feat: addRow withour dialog by:Javier Segarra -- feat: apply mixin by:Javier Segarra -- feat by:Javier Segarra -- feat: change navBar buttons by:Javier Segarra -- feat: dense rows by:Javier Segarra -- feat: fields with wrong name by:jgallego -- feat: fix bugs and filters by:Javier Segarra -- feat: fix refund parameters by:jgallego -- feat: handle create row by:Javier Segarra -- feat: handle dates by:Javier Segarra -- feat: handle qCheckbox 3rd state by:Javier Segarra -- feat: imrpove VnInputTime to set cursor at start by:Javier Segarra -- feat: keyShortcut directive by:Javier Segarra -- feat: minor fixes by:jgallego -- feat: only filter by isDestiny by:Javier Segarra -- feat: refs #211153 businessDataLinkGrafana by:robert -- feat: refs #7129 add km start and end on create form by:pablone -- feat: refs #7353 add filter & fix customTags by:jorgep -- feat: refs #7353 add locale by:jorgep -- feat: refs #7353 add no one opt by:jorgep -- feat: refs #7353 add right icons by:jorgep -- feat: refs #7353 imporve toDateFormat by:jorgep -- feat: refs #7353 salesPerson nickname & id by:jorgep -- feat: refs #7353 split sections by:jorgep -- feat: refs #7847 remove reload btn by:jorgep -- feat: refs #7847 remove reload fn by:jorgep -- feat: refs #7889 added shortcuts to modules by:Jon -- feat: refs #7911 added shortcut to modules by:Jon -- feat: refuncInvoiceForm component by:jgallego -- feat: remove duplicity by:Javier Segarra -- feat: remove future itemFixedPrices by:Javier Segarra -- feat: replace stickyButtons by subtoolbar by:Javier Segarra -- feat: required validation by:Javier Segarra -- feat: show bad dates by:Javier Segarra -- feat: showdate icons by:Javier Segarra -- feat: solve ItemFixedFilterPanel by:Javier Segarra -- feat: transfer an invoice by:jgallego -- feat: try to fix ItemFixedFilterPanel by:Javier Segarra -- feat: unnecessary changes by:Javier Segarra -- feat: update changelog (origin/7896_down_devToTest_2436) by:Javier Segarra -- feat: updates by:Javier Segarra -- feat: update version and changelog by:Javier Segarra -- feat: vnInput* by:Javier Segarra -- feat: with VnTable by:Javier Segarra -- refs #6772 feat: fix approach by:Javier Segarra -- refs #6772 feat: refresh shelving.basic-data by:Javier Segarra -- style: show subName value by:Javier Segarra +- chore: refs #6772 fix e2e (origin/6772-warmfix-fixE2e) by:jorgep +- chore: refs #7323 worker changes by:jorgep +- chore: refs #7353 fix warnings by:jorgep +- chore: refs #7353 use Vue component nomenclature by:jorgep +- chore: refs #7356 fix type by:jorgep +- feat(AccountConnections): use VnToken by:alexm +- feat: add key to routerView by:Javier Segarra +- feat: add plus shortcut in VnTable by:Javier Segarra +- feat: add row by:Javier Segarra +- feat: addRow withour dialog by:Javier Segarra +- feat: apply mixin by:Javier Segarra +- feat by:Javier Segarra +- feat: change navBar buttons by:Javier Segarra +- feat: dense rows by:Javier Segarra +- feat: fields with wrong name by:jgallego +- feat: fix bugs and filters by:Javier Segarra +- feat: fix refund parameters by:jgallego +- feat: handle create row by:Javier Segarra +- feat: handle dates by:Javier Segarra +- feat: handle qCheckbox 3rd state by:Javier Segarra +- feat: imrpove VnInputTime to set cursor at start by:Javier Segarra +- feat: keyShortcut directive by:Javier Segarra +- feat: minor fixes by:jgallego +- feat: only filter by isDestiny by:Javier Segarra +- feat: refs #211153 businessDataLinkGrafana by:robert +- feat: refs #7129 add km start and end on create form by:pablone +- feat: refs #7353 add filter & fix customTags by:jorgep +- feat: refs #7353 add locale by:jorgep +- feat: refs #7353 add no one opt by:jorgep +- feat: refs #7353 add right icons by:jorgep +- feat: refs #7353 imporve toDateFormat by:jorgep +- feat: refs #7353 salesPerson nickname & id by:jorgep +- feat: refs #7353 split sections by:jorgep +- feat: refs #7847 remove reload btn by:jorgep +- feat: refs #7847 remove reload fn by:jorgep +- feat: refs #7889 added shortcuts to modules by:Jon +- feat: refs #7911 added shortcut to modules by:Jon +- feat: refuncInvoiceForm component by:jgallego +- feat: remove duplicity by:Javier Segarra +- feat: remove future itemFixedPrices by:Javier Segarra +- feat: replace stickyButtons by subtoolbar by:Javier Segarra +- feat: required validation by:Javier Segarra +- feat: show bad dates by:Javier Segarra +- feat: showdate icons by:Javier Segarra +- feat: solve ItemFixedFilterPanel by:Javier Segarra +- feat: transfer an invoice by:jgallego +- feat: try to fix ItemFixedFilterPanel by:Javier Segarra +- feat: unnecessary changes by:Javier Segarra +- feat: update changelog (origin/7896_down_devToTest_2436) by:Javier Segarra +- feat: updates by:Javier Segarra +- feat: update version and changelog by:Javier Segarra +- feat: vnInput\* by:Javier Segarra +- feat: with VnTable by:Javier Segarra +- refs #6772 feat: fix approach by:Javier Segarra +- refs #6772 feat: refresh shelving.basic-data by:Javier Segarra +- style: show subName value by:Javier Segarra ### Changed 📦 -- perf: add v-shortcut in VnCard by:Javier Segarra -- perf: approach by:Javier Segarra -- perf: change directive location by:Javier Segarra -- perf: change slots order by:Javier Segarra -- perf: examples by:Javier Segarra -- perf: hide icon for VnInputDate by:Javier Segarra -- perf: improve ItemFixedPricefilterPanel by:Javier Segarra -- perf: improve mainShrotcutMixin by:Javier Segarra -- perf: minor clean code by:Javier Segarra -- perf: onRowchange by:Javier Segarra -- perf: order by by:Javier Segarra -- perf: order components by:Javier Segarra -- perf: refs #7889 perf shortcut test by:Jon -- perf: remove console.log by:Javier Segarra -- perf: remove icons in header slot by:Javier Segarra -- perf: remove print variables by:Javier Segarra -- perf: restore CustomerBasicData by:Javier Segarra -- refactor: deleted useless prop by:Jon -- refactor: deleted useless prop in FetchedTags by:Jon -- refactor: refs #7323 drop useless code by:jorgep -- refactor: refs #7353 clients correction by:jorgep -- refactor: refs #7353 clients correction wip by:jorgep -- refactor: refs #7353 ease logic by:jorgep -- refactor: refs #7353 order correction by:jorgep -- refactor: refs #7353 simplify code by:jorgep -- refactor: refs #7353 tickets correction by:jorgep -- refactor: refs #7353 use global locales by:jorgep -- refactor: refs #7354 changed descriptor menu options by:Jon -- refactor: refs #7354 changed icon color in table and notification when deleting a zone by:Jon -- refactor: refs #7354 fix tableFilters by:Jon -- refactor: refs #7354 modified VnInputTime by:Jon -- refactor: refs #7354 refactor deliveryPanel by:Jon -- refactor: refs #7354 refactor zones section and fixed e2e tests by:Jon -- refactor: refs #7354 requested changes by:Jon -- refactor: refs #7354 reverse deliveryPanel changes by:Jon -- refactor: refs #7354 Zone migration changes by:Jon -- refactor: refs #7889 deleted subtitle attr and use keyBinding instead by:Jon -- refactor: refs #7889 modified shortcut and dashboard, and added tootlip in LeftMenu by:Jon -- refs #6722 perf: not fetch when id not exists by:Javier Segarra -- refs #6772 perf: change variable name by:JAVIER SEGARRA MARTINEZ -- refs #6772 perf: use ArrayData (6772_reload_sections) by:Javier Segarra -- refs #7283 refactor fix ItemDescriptor by:carlossa -- refs #7283 refactor ItexDescriptor by:carlossa +- perf: add v-shortcut in VnCard by:Javier Segarra +- perf: approach by:Javier Segarra +- perf: change directive location by:Javier Segarra +- perf: change slots order by:Javier Segarra +- perf: examples by:Javier Segarra +- perf: hide icon for VnInputDate by:Javier Segarra +- perf: improve ItemFixedPricefilterPanel by:Javier Segarra +- perf: improve mainShrotcutMixin by:Javier Segarra +- perf: minor clean code by:Javier Segarra +- perf: onRowchange by:Javier Segarra +- perf: order by by:Javier Segarra +- perf: order components by:Javier Segarra +- perf: refs #7889 perf shortcut test by:Jon +- perf: remove console.log by:Javier Segarra +- perf: remove icons in header slot by:Javier Segarra +- perf: remove print variables by:Javier Segarra +- perf: restore CustomerBasicData by:Javier Segarra +- refactor: deleted useless prop by:Jon +- refactor: deleted useless prop in FetchedTags by:Jon +- refactor: refs #7323 drop useless code by:jorgep +- refactor: refs #7353 clients correction by:jorgep +- refactor: refs #7353 clients correction wip by:jorgep +- refactor: refs #7353 ease logic by:jorgep +- refactor: refs #7353 order correction by:jorgep +- refactor: refs #7353 simplify code by:jorgep +- refactor: refs #7353 tickets correction by:jorgep +- refactor: refs #7353 use global locales by:jorgep +- refactor: refs #7354 changed descriptor menu options by:Jon +- refactor: refs #7354 changed icon color in table and notification when deleting a zone by:Jon +- refactor: refs #7354 fix tableFilters by:Jon +- refactor: refs #7354 modified VnInputTime by:Jon +- refactor: refs #7354 refactor deliveryPanel by:Jon +- refactor: refs #7354 refactor zones section and fixed e2e tests by:Jon +- refactor: refs #7354 requested changes by:Jon +- refactor: refs #7354 reverse deliveryPanel changes by:Jon +- refactor: refs #7354 Zone migration changes by:Jon +- refactor: refs #7889 deleted subtitle attr and use keyBinding instead by:Jon +- refactor: refs #7889 modified shortcut and dashboard, and added tootlip in LeftMenu by:Jon +- refs #6722 perf: not fetch when id not exists by:Javier Segarra +- refs #6772 perf: change variable name by:JAVIER SEGARRA MARTINEZ +- refs #6772 perf: use ArrayData (6772_reload_sections) by:Javier Segarra +- refs #7283 refactor fix ItemDescriptor by:carlossa +- refs #7283 refactor ItexDescriptor by:carlossa ### Fixed 🛠️ -- chore: refs #6772 fix e2e (origin/6772-warmfix-fixE2e) by:jorgep -- chore: refs #7353 fix warnings by:jorgep -- chore: refs #7356 fix type by:jorgep -- feat: fix bugs and filters by:Javier Segarra -- feat: fix refund parameters by:jgallego -- feat: minor fixes by:jgallego -- feat: refs #7353 add filter & fix customTags by:jorgep -- feat: try to fix ItemFixedFilterPanel by:Javier Segarra -- fix: add border-top by:Javier Segarra -- fix: added missing descriptors and small details by:Jon -- fix branch by:carlossa -- fix: call upsert when crudModel haschanges by:Javier Segarra -- fix(ClaimList): fix summary by:alexm -- fix: cli warnings by:Javier Segarra -- fix: editTableOptions by:Javier Segarra -- fix events and descriptor menu by:Jon -- fix: InvoiceIn sections (origin/6772_reload_sections) by:Javier Segarra -- fix: minor changes by:Javier Segarra -- fix: minor error whit dates by:Javier Segarra -- fix: module icon by:Javier Segarra -- fix: options QDate by:Javier Segarra -- fix: refs #6900 e2e error by:jorgep -- fix: refs #6900 rollback by:jorgep -- fix: refs #7353 css by:jorgep -- fix: refs #7353 hide search param (origin/7353-warmfix-fixSearchbar) by:jorgep -- fix: refs #7353 iron out filter by:jorgep -- fix: refs #7353 iron out ticket table by:jorgep -- fix: refs #7353 padding by:jorgep -- fix: refs #7353 salesClientTable by:jorgep -- fix: refs #7353 salesorderTable by:jorgep -- fix: refs #7353 saleTicketMonitors by:jorgep -- fix: refs #7353 use same datakey by:jorgep -- fix: refs #7353 vnTable colors by:jorgep -- fix: refs #7354 e2e tests by:Jon -- fix: refs #7354 fix delivery days by:Jon -- fix: refs #7354 fix list searchbar and filters by:Jon -- fix: refs #7354 fix VnSearchbar search for zone section & finished basic tests by:Jon -- fix: refs #7354 fix VnTable filters and agency field by:Jon -- fix: refs #7354 fix zoneSearchbar by:Jon -- fix: refs #7354 requested changes by:Jon -- fix: refs #7356 colors by:jorgep -- fix: refs #7356 create claim dialog by:jorgep -- fix: refs #7889 fixed shortcut test by:Jon -- fix: refs #7903 fixed ticket's search bar and keybinding tooltip by:Jon -- fix: refs #7911 fixed shortcut and related files by:Jon -- fix: remove condition duplicated by:Javier Segarra -- fix: remove property by:Javier Segarra -- fix tootltip by:carlossa -- fix traduction by:carlossa -- fix(VnSectionMain): add QPage by:alexm -- fix(zone): zoneLocation and the others searchbar by:alexm -- refactor: refs #7354 fix tableFilters by:Jon -- refactor: refs #7354 refactor zones section and fixed e2e tests by:Jon -- refs #6772 feat: fix approach by:Javier Segarra -- refs #6772 fix: claimPhoto reload by:Javier Segarra -- refs #6896 fix searchbar by:carlossa -- refs #6897 fix entry by:carlossa -- refs #6899 fix invoiceFix by:carlossa -- refs #6899 fix order by:carlossa -- refs #7283 fix by:carlossa -- refs #7283 fix ItemDescriptor warehouse by:carlossa -- refs #7283 refactor fix ItemDescriptor by:carlossa -- refs #7355 #7366 fix account, summary, list, travelList, tooltip by:carlossa -- refs #7355 fix accountPrivileges by:carlossa -- refs #7355 fix accounts, vnTable by:carlossa -- refs #7355 fix privileges by:carlossa -- refs #7355 fix roles filters by:carlossa -- refs #7355 fix total by:carlossa -- refs #7355 fix views summarys, entryList, travelList refact by:carlossa -- refs #7366 fix travel hours by:carlossa -- test: fix e2e by:Javier Segarra +- chore: refs #6772 fix e2e (origin/6772-warmfix-fixE2e) by:jorgep +- chore: refs #7353 fix warnings by:jorgep +- chore: refs #7356 fix type by:jorgep +- feat: fix bugs and filters by:Javier Segarra +- feat: fix refund parameters by:jgallego +- feat: minor fixes by:jgallego +- feat: refs #7353 add filter & fix customTags by:jorgep +- feat: try to fix ItemFixedFilterPanel by:Javier Segarra +- fix: add border-top by:Javier Segarra +- fix: added missing descriptors and small details by:Jon +- fix branch by:carlossa +- fix: call upsert when crudModel haschanges by:Javier Segarra +- fix(ClaimList): fix summary by:alexm +- fix: cli warnings by:Javier Segarra +- fix: editTableOptions by:Javier Segarra +- fix events and descriptor menu by:Jon +- fix: InvoiceIn sections (origin/6772_reload_sections) by:Javier Segarra +- fix: minor changes by:Javier Segarra +- fix: minor error whit dates by:Javier Segarra +- fix: module icon by:Javier Segarra +- fix: options QDate by:Javier Segarra +- fix: refs #6900 e2e error by:jorgep +- fix: refs #6900 rollback by:jorgep +- fix: refs #7353 css by:jorgep +- fix: refs #7353 hide search param (origin/7353-warmfix-fixSearchbar) by:jorgep +- fix: refs #7353 iron out filter by:jorgep +- fix: refs #7353 iron out ticket table by:jorgep +- fix: refs #7353 padding by:jorgep +- fix: refs #7353 salesClientTable by:jorgep +- fix: refs #7353 salesorderTable by:jorgep +- fix: refs #7353 saleTicketMonitors by:jorgep +- fix: refs #7353 use same datakey by:jorgep +- fix: refs #7353 vnTable colors by:jorgep +- fix: refs #7354 e2e tests by:Jon +- fix: refs #7354 fix delivery days by:Jon +- fix: refs #7354 fix list searchbar and filters by:Jon +- fix: refs #7354 fix VnSearchbar search for zone section & finished basic tests by:Jon +- fix: refs #7354 fix VnTable filters and agency field by:Jon +- fix: refs #7354 fix zoneSearchbar by:Jon +- fix: refs #7354 requested changes by:Jon +- fix: refs #7356 colors by:jorgep +- fix: refs #7356 create claim dialog by:jorgep +- fix: refs #7889 fixed shortcut test by:Jon +- fix: refs #7903 fixed ticket's search bar and keybinding tooltip by:Jon +- fix: refs #7911 fixed shortcut and related files by:Jon +- fix: remove condition duplicated by:Javier Segarra +- fix: remove property by:Javier Segarra +- fix tootltip by:carlossa +- fix traduction by:carlossa +- fix(VnSectionMain): add QPage by:alexm +- fix(zone): zoneLocation and the others searchbar by:alexm +- refactor: refs #7354 fix tableFilters by:Jon +- refactor: refs #7354 refactor zones section and fixed e2e tests by:Jon +- refs #6772 feat: fix approach by:Javier Segarra +- refs #6772 fix: claimPhoto reload by:Javier Segarra +- refs #6896 fix searchbar by:carlossa +- refs #6897 fix entry by:carlossa +- refs #6899 fix invoiceFix by:carlossa +- refs #6899 fix order by:carlossa +- refs #7283 fix by:carlossa +- refs #7283 fix ItemDescriptor warehouse by:carlossa +- refs #7283 refactor fix ItemDescriptor by:carlossa +- refs #7355 #7366 fix account, summary, list, travelList, tooltip by:carlossa +- refs #7355 fix accountPrivileges by:carlossa +- refs #7355 fix accounts, vnTable by:carlossa +- refs #7355 fix privileges by:carlossa +- refs #7355 fix roles filters by:carlossa +- refs #7355 fix total by:carlossa +- refs #7355 fix views summarys, entryList, travelList refact by:carlossa +- refs #7366 fix travel hours by:carlossa +- test: fix e2e by:Javier Segarra # Version 24.36 - 2024-08-27 diff --git a/package.json b/package.json index f25e570a3..6a7c1ed55 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "salix-front", - "version": "24.36.0", + "version": "24.38.0", "description": "Salix frontend", "productName": "Salix", "author": "Verdnatura", From 37b6a032888abba2695fa6549d327b41bf93dec1 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Tue, 17 Sep 2024 09:25:53 +0200 Subject: [PATCH 14/29] fix(itemDescriptor): fix redirection to itemDiary --- src/pages/Item/Card/ItemDescriptor.vue | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/src/pages/Item/Card/ItemDescriptor.vue b/src/pages/Item/Card/ItemDescriptor.vue index baac0c608..da6859d30 100644 --- a/src/pages/Item/Card/ItemDescriptor.vue +++ b/src/pages/Item/Card/ItemDescriptor.vue @@ -11,7 +11,6 @@ import VnConfirm from 'components/ui/VnConfirm.vue'; import RegularizeStockForm from 'components/RegularizeStockForm.vue'; import ItemDescriptorImage from 'src/pages/Item/Card/ItemDescriptorImage.vue'; import useCardDescription from 'src/composables/useCardDescription'; -import { getUrl } from 'src/composables/getUrl'; import axios from 'axios'; import { dashIfEmpty } from 'src/filters'; @@ -51,10 +50,8 @@ const entityId = computed(() => { const regularizeStockFormDialog = ref(null); const available = ref(null); const visible = ref(null); -const salixUrl = ref(); onMounted(async () => { - salixUrl.value = await getUrl(''); await getItemConfigs(); await updateStock(); }); @@ -200,16 +197,10 @@ const openCloneDialog = async () => { <template #actions="{}"> <QCardActions class="row justify-center"> <QBtn - :href=" - salixUrl + - 'item/' + - entityId + - '/diary?' + - 'warehouseFk=' + - warehouseFk + - '&lineFk=' + - $props.saleFk - " + :to="{ + name: 'ItemDiary', + query: { warehouseFk, lineFk: $props.saleFk }, + }" size="md" icon="vn:transaction" color="primary" From 3d1bb0c67a035e770f6aa02cf84e51307d9a9c8b Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Tue, 17 Sep 2024 10:20:44 +0200 Subject: [PATCH 15/29] fix(itemDescriptor): fix redirection to itemDiary --- src/components/common/VnCard.vue | 10 +++++++--- src/pages/Item/Card/ItemCard.vue | 2 +- src/pages/Item/Card/ItemDescriptor.vue | 1 + src/pages/Login/ResetPassword.vue | 1 - 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/components/common/VnCard.vue b/src/components/common/VnCard.vue index 7d29da232..0d80f43ce 100644 --- a/src/components/common/VnCard.vue +++ b/src/components/common/VnCard.vue @@ -24,7 +24,9 @@ const stateStore = useStateStore(); const route = useRoute(); const router = useRouter(); const url = computed(() => { - if (props.baseUrl) return `${props.baseUrl}/${route.params.id}`; + if (props.baseUrl) { + return `${props.baseUrl}/${route.params.id}`; + } return props.customUrl; }); const searchRightDataKey = computed(() => { @@ -40,8 +42,10 @@ onBeforeMount(async () => { try { if (!props.baseUrl) arrayData.store.filter.where = { id: route.params.id }; await arrayData.fetch({ append: false, updateRouter: false }); - } catch (e) { - router.push({ name: 'WorkerList' }); + } catch { + const { matched: matches } = router.currentRoute.value; + const { path } = matches.at(-1); + router.push({ path: path.replace(/:id.*/, '') }); } }); diff --git a/src/pages/Item/Card/ItemCard.vue b/src/pages/Item/Card/ItemCard.vue index 1162327c1..2412f2bf9 100644 --- a/src/pages/Item/Card/ItemCard.vue +++ b/src/pages/Item/Card/ItemCard.vue @@ -12,7 +12,7 @@ import ItemListFilter from '../ItemListFilter.vue'; search-data-key="ItemList" :searchbar-props="{ url: 'Items/filter', - label: 'searchbar.labelr', + label: 'searchbar.label', info: 'searchbar.info', }" /> diff --git a/src/pages/Item/Card/ItemDescriptor.vue b/src/pages/Item/Card/ItemDescriptor.vue index da6859d30..ef844824f 100644 --- a/src/pages/Item/Card/ItemDescriptor.vue +++ b/src/pages/Item/Card/ItemDescriptor.vue @@ -199,6 +199,7 @@ const openCloneDialog = async () => { <QBtn :to="{ name: 'ItemDiary', + params: { id: entityId }, query: { warehouseFk, lineFk: $props.saleFk }, }" size="md" diff --git a/src/pages/Login/ResetPassword.vue b/src/pages/Login/ResetPassword.vue index eff718e97..2751f1ceb 100644 --- a/src/pages/Login/ResetPassword.vue +++ b/src/pages/Login/ResetPassword.vue @@ -33,7 +33,6 @@ async function onSubmit() { }; try { - console.log('newPassword: ', newPassword); await axios.post( 'VnUsers/reset-password', { newPassword: newPassword.value }, From 044156356c559eb8660d851bb641f57a4909dd68 Mon Sep 17 00:00:00 2001 From: carlossa <carlossa@verdnatura.es> Date: Tue, 17 Sep 2024 10:37:22 +0200 Subject: [PATCH 16/29] hotfix searchbar --- src/pages/InvoiceOut/InvoiceOutList.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/InvoiceOut/InvoiceOutList.vue b/src/pages/InvoiceOut/InvoiceOutList.vue index 915b58b15..5157d957b 100644 --- a/src/pages/InvoiceOut/InvoiceOutList.vue +++ b/src/pages/InvoiceOut/InvoiceOutList.vue @@ -177,7 +177,7 @@ watchEffect(selectedRows); <VnSearchbar :info="t('youCanSearchByInvoiceReference')" :label="t('searchInvoice')" - data-key="InvoiceOutList" + data-key="invoiceOut" /> <VnSubToolbar> <template #st-actions> From 56f8cbe615de8996b100cab085716c45a62629fd Mon Sep 17 00:00:00 2001 From: jorgep <jorgep@verdnatura.es> Date: Tue, 17 Sep 2024 11:37:44 +0200 Subject: [PATCH 17/29] fix: refs #7353 sales person filter and locale --- src/components/ui/VnFilterPanel.vue | 15 +++++++++++++-- src/pages/Monitor/Ticket/MonitorTicketFilter.vue | 11 ++++++++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/components/ui/VnFilterPanel.vue b/src/components/ui/VnFilterPanel.vue index cebdc4bbf..12525c7cc 100644 --- a/src/components/ui/VnFilterPanel.vue +++ b/src/components/ui/VnFilterPanel.vue @@ -6,7 +6,7 @@ import { useRoute } from 'vue-router'; import toDate from 'filters/toDate'; import VnFilterPanelChip from 'components/ui/VnFilterPanelChip.vue'; -const { t } = useI18n(); +const { t, te } = useI18n(); const $props = defineProps({ modelValue: { type: Object, @@ -200,6 +200,11 @@ function sanitizer(params) { } return params; } + +function getLocale(label) { + const globalLocale = `globals.params.${label}`; + return te(globalLocale) ? t(globalLocale) : t(`params.${label}`); +} </script> <template> @@ -248,7 +253,12 @@ function sanitizer(params) { :removable="!unremovableParams?.includes(chip.label)" @remove="remove(chip.label)" > - <slot name="tags" :tag="chip" :format-fn="formatValue"> + <slot + name="tags" + :tag="chip" + :format-fn="formatValue" + :locale-fn="getLocale" + > <div class="q-gutter-x-xs"> <strong>{{ chip.label }}:</strong> <span>"{{ formatValue(chip.value) }}"</span> @@ -262,6 +272,7 @@ function sanitizer(params) { :tags="customTags" :format-fn="formatValue" :search-fn="search" + :locale-fn="getLocale" /> </div> </QItem> diff --git a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue index 3c95f5cdd..01e9d65ec 100644 --- a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue +++ b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue @@ -11,7 +11,7 @@ import FetchData from 'src/components/FetchData.vue'; import { dateRange } from 'src/filters'; defineProps({ dataKey: { type: String, required: true } }); -const { t } = useI18n(); +const { t, te } = useI18n(); const warehouses = ref(); const groupedStates = ref(); @@ -26,6 +26,11 @@ const handleScopeDays = (params, days, callback) => { } if (callback) callback(); }; + +const getLocale = (label) => { + const globalLocale = `globals.params.${label}`; + return te(globalLocale) ? t(globalLocale) : t(`params.${label}`); +}; </script> <template> <FetchData url="Warehouses" auto-load @on-fetch="(data) => (warehouses = data)" /> @@ -46,7 +51,7 @@ const handleScopeDays = (params, days, callback) => { > <template #tags="{ tag, formatFn }"> <div class="q-gutter-x-xs"> - <strong v-text="`${t(`params.${tag.label}`)}:`" /> + <strong v-text="`${getLocale(tag.label)}:`" /> <span v-text="formatFn(tag.value)" /> </div> </template> @@ -110,7 +115,7 @@ const handleScopeDays = (params, days, callback) => { url="Workers/search" :params="{ departmentCodes: ['VT'] }" is-outlined - option-value="code" + option-value="id" option-label="name" :no-one="true" > From 3f03f0d4e91e6cf40b51ccd264a206937a634782 Mon Sep 17 00:00:00 2001 From: jorgep <jorgep@verdnatura.es> Date: Tue, 17 Sep 2024 12:41:57 +0200 Subject: [PATCH 18/29] fix: refs #7353 show unremovable params --- src/pages/Monitor/Ticket/MonitorTicketFilter.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue index 01e9d65ec..2d48bd44e 100644 --- a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue +++ b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue @@ -48,6 +48,7 @@ const getLocale = (label) => { :hidden-tags="['from', 'to', 'search']" :custom-tags="['scopeDays']" :unremovable-params="['from', 'to', 'scopeDays']" + search-url="saleMonitorTickets" > <template #tags="{ tag, formatFn }"> <div class="q-gutter-x-xs"> From 2cb2ce16efacf8919e000026995a446b03b12820 Mon Sep 17 00:00:00 2001 From: jorgep <jorgep@verdnatura.es> Date: Tue, 17 Sep 2024 12:56:50 +0200 Subject: [PATCH 19/29] fix: refs #7353 locale --- src/pages/Monitor/Ticket/MonitorTicketFilter.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue index 2d48bd44e..57248d580 100644 --- a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue +++ b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue @@ -28,8 +28,9 @@ const handleScopeDays = (params, days, callback) => { }; const getLocale = (label) => { - const globalLocale = `globals.params.${label}`; - return te(globalLocale) ? t(globalLocale) : t(`params.${label}`); + const param = label.split('.').at(-1); + const globalLocale = `globals.params.${param}`; + return te(globalLocale) ? t(globalLocale) : t(`params.${param}`); }; </script> <template> From ed4a4e1e59ab55b6698c7d50ab85e8036bd0f2bf Mon Sep 17 00:00:00 2001 From: jorgep <jorgep@verdnatura.es> Date: Tue, 17 Sep 2024 12:57:43 +0200 Subject: [PATCH 20/29] fix: refs #7353 rollback --- src/components/ui/VnFilterPanel.vue | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/components/ui/VnFilterPanel.vue b/src/components/ui/VnFilterPanel.vue index 12525c7cc..03b01b0ab 100644 --- a/src/components/ui/VnFilterPanel.vue +++ b/src/components/ui/VnFilterPanel.vue @@ -200,11 +200,6 @@ function sanitizer(params) { } return params; } - -function getLocale(label) { - const globalLocale = `globals.params.${label}`; - return te(globalLocale) ? t(globalLocale) : t(`params.${label}`); -} </script> <template> @@ -253,12 +248,7 @@ function getLocale(label) { :removable="!unremovableParams?.includes(chip.label)" @remove="remove(chip.label)" > - <slot - name="tags" - :tag="chip" - :format-fn="formatValue" - :locale-fn="getLocale" - > + <slot name="tags" :tag="chip" :format-fn="formatValue"> <div class="q-gutter-x-xs"> <strong>{{ chip.label }}:</strong> <span>"{{ formatValue(chip.value) }}"</span> @@ -272,7 +262,6 @@ function getLocale(label) { :tags="customTags" :format-fn="formatValue" :search-fn="search" - :locale-fn="getLocale" /> </div> </QItem> From eb6f12ae3b28229372d16a87a4f46b7155da0ca5 Mon Sep 17 00:00:00 2001 From: jorgep <jorgep@verdnatura.es> Date: Tue, 17 Sep 2024 12:58:06 +0200 Subject: [PATCH 21/29] fix: refs #7353 rollback --- src/components/ui/VnFilterPanel.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ui/VnFilterPanel.vue b/src/components/ui/VnFilterPanel.vue index 03b01b0ab..cebdc4bbf 100644 --- a/src/components/ui/VnFilterPanel.vue +++ b/src/components/ui/VnFilterPanel.vue @@ -6,7 +6,7 @@ import { useRoute } from 'vue-router'; import toDate from 'filters/toDate'; import VnFilterPanelChip from 'components/ui/VnFilterPanelChip.vue'; -const { t, te } = useI18n(); +const { t } = useI18n(); const $props = defineProps({ modelValue: { type: Object, From e559ab43d7bbbfb19ad5917255ed271290052cac Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Tue, 17 Sep 2024 13:40:27 +0200 Subject: [PATCH 22/29] fix: refs #7404 remove some style --- src/components/VnTable/VnTable.vue | 2 +- src/pages/Entry/EntryStockBought.vue | 4 ++-- src/pages/Entry/EntryStockBoughtDetail.vue | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index b7321fe16..648b1fb3b 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -430,7 +430,7 @@ function handleOnDataSaved(_) { /> </template> <template #header-cell="{ col }"> - <QTh table-header-style="max-width:50%" v-if="col.visible ?? true"> + <QTh v-if="col.visible ?? true"> <div class="column self-start q-ml-xs ellipsis" :class="`text-${col?.align ?? 'left'}`" diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue index c8f147b1f..5b4d43e06 100644 --- a/src/pages/Entry/EntryStockBought.vue +++ b/src/pages/Entry/EntryStockBought.vue @@ -219,8 +219,8 @@ function openDialog() { <span class="link" @click.stop> {{ row?.worker?.user?.name }} <WorkerDescriptorProxy :id="row?.workerFk" /> - </span> </template - >0 + </span> + </template> </VnTable> </QPage> </template> diff --git a/src/pages/Entry/EntryStockBoughtDetail.vue b/src/pages/Entry/EntryStockBoughtDetail.vue index 6d9227ad2..744b9d3fe 100644 --- a/src/pages/Entry/EntryStockBoughtDetail.vue +++ b/src/pages/Entry/EntryStockBoughtDetail.vue @@ -63,7 +63,7 @@ const columns = [ ]; </script> <template> - <QDialog position="bottom" :maximized="true"> + <QDialog :maximized="true"> <div class="container"> <VnTable ref="tableRef" From 4f662375cd34e6e08bfe376b409a6d636611f65b Mon Sep 17 00:00:00 2001 From: carlossa <carlossa@verdnatura.es> Date: Tue, 17 Sep 2024 15:04:58 +0200 Subject: [PATCH 23/29] fix(VnTable): sanitizer value is defined --- src/components/VnTable/VnTable.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index 648b1fb3b..55028080c 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -200,7 +200,7 @@ function setUserParams(watchedParams, watchedOrder) { function sanitizer(params) { for (const [key, value] of Object.entries(params)) { - if (typeof value == 'object') { + if (value && typeof value == 'object') { const param = Object.values(value)[0]; if (typeof param == 'string') params[key] = param.replaceAll('%', ''); } From aa6dac39449cc1db11c8130edc488717fc8a487a Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 18 Sep 2024 07:28:10 +0000 Subject: [PATCH 24/29] fix: SupplierFiscalData VnLocation --- src/pages/Supplier/Card/SupplierFiscalData.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/Supplier/Card/SupplierFiscalData.vue b/src/pages/Supplier/Card/SupplierFiscalData.vue index 60cd6770b..553fc0f94 100644 --- a/src/pages/Supplier/Card/SupplierFiscalData.vue +++ b/src/pages/Supplier/Card/SupplierFiscalData.vue @@ -19,8 +19,8 @@ const sageTransactionTypesOptions = ref([]); const supplierActivitiesOptions = ref([]); function handleLocation(data, location) { - const { town, label, provinceFk, countryFk } = location ?? {}; - data.postCode = label; + const { town, code, provinceFk, countryFk } = location ?? {}; + data.postCode = code; data.city = town; data.provinceFk = provinceFk; data.countryFk = countryFk; From 21a7fafba5c63a3238b248a5b1b6832ba32b5bb3 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Wed, 18 Sep 2024 09:57:21 +0200 Subject: [PATCH 25/29] feat: create VnSelectEnum and add in AccountBasicData and ClaimBasicData --- src/components/common/VnSelectEnum.vue | 52 ++++++++++++++ src/pages/Account/Card/AccountBasicData.vue | 9 ++- src/pages/Claim/Card/ClaimBasicData.vue | 72 ++++--------------- .../integration/outLogin/twoFactor.spec.js | 2 +- 4 files changed, 71 insertions(+), 64 deletions(-) create mode 100644 src/components/common/VnSelectEnum.vue diff --git a/src/components/common/VnSelectEnum.vue b/src/components/common/VnSelectEnum.vue new file mode 100644 index 000000000..b9db67c37 --- /dev/null +++ b/src/components/common/VnSelectEnum.vue @@ -0,0 +1,52 @@ +<script setup> +import { onBeforeMount, ref, useAttrs } from 'vue'; +import axios from 'axios'; +import VnSelect from 'components/common/VnSelect.vue'; + +const { schema, table, column, translation, defaultOptions } = defineProps({ + schema: { + type: String, + default: 'vn', + }, + table: { + type: String, + required: true, + }, + column: { + type: String, + required: true, + }, + translation: { + type: Function, + default: null, + }, + defaultOptions: { + type: Array, + default: () => [], + }, +}); + +const $attrs = useAttrs(); +const options = ref([]); +onBeforeMount(async () => { + options.value = [].concat(defaultOptions); + const { data } = await axios.get(`Applications/get-enum-values`, { + params: { schema, table, column }, + }); + + for (const value of data) + options.value.push({ + [$attrs['option-value'] ?? 'id']: value, + [$attrs['option-label'] ?? 'name']: translation ? translation(value) : value, + }); +}); +</script> + +<template> + <VnSelect + v-bind="$attrs" + :options="options" + :key="options.length" + :input-debounce="0" + /> +</template> diff --git a/src/pages/Account/Card/AccountBasicData.vue b/src/pages/Account/Card/AccountBasicData.vue index b223c4bc0..f1cdaf9df 100644 --- a/src/pages/Account/Card/AccountBasicData.vue +++ b/src/pages/Account/Card/AccountBasicData.vue @@ -2,6 +2,7 @@ import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; import VnSelect from 'src/components/common/VnSelect.vue'; +import VnSelectEnum from 'src/components/common/VnSelectEnum.vue'; import FormModel from 'components/FormModel.vue'; import VnInput from 'src/components/common/VnInput.vue'; import { ref, watch } from 'vue'; @@ -43,9 +44,11 @@ watch( option-value="code" option-label="code" /> - <VnSelect - url="TwoFactorTypes" - v-model="data.twoFactorFk" + <VnSelectEnum + schema="account" + table="user" + column="twoFactor" + v-model="data.twoFactor" :label="t('account.card.twoFactor')" option-value="code" option-label="code" diff --git a/src/pages/Claim/Card/ClaimBasicData.vue b/src/pages/Claim/Card/ClaimBasicData.vue index b1d3e24cd..63b0b7c0d 100644 --- a/src/pages/Claim/Card/ClaimBasicData.vue +++ b/src/pages/Claim/Card/ClaimBasicData.vue @@ -3,58 +3,18 @@ import { ref } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; import VnSelect from 'src/components/common/VnSelect.vue'; +import VnSelectEnum from 'src/components/common/VnSelectEnum.vue'; import FetchData from 'components/FetchData.vue'; import FormModel from 'components/FormModel.vue'; import VnRow from 'components/ui/VnRow.vue'; import VnInput from 'src/components/common/VnInput.vue'; import VnInputDate from 'components/common/VnInputDate.vue'; -import axios from 'axios'; import VnAvatar from 'src/components/ui/VnAvatar.vue'; const route = useRoute(); const { t } = useI18n(); - -const claimStates = ref([]); -const claimStatesCopy = ref([]); -const optionsList = ref([]); - const workersOptions = ref([]); - -function setClaimStates(data) { - claimStates.value = data; - claimStatesCopy.value = data; -} - -async function getEnumValues() { - optionsList.value = [{ id: null, description: t('claim.null') }]; - const { data } = await axios.get(`Applications/get-enum-values`, { - params: { - schema: 'vn', - table: 'claim', - column: 'pickup', - }, - }); - for (let value of data) - optionsList.value.push({ id: value, description: t(`claim.${value}`) }); -} - -getEnumValues(); - -const statesFilter = { - options: claimStates, - filterFn: (options, value) => { - const search = value.toLowerCase(); - - if (value === '') return claimStatesCopy.value; - - return options.value.filter((row) => { - const description = row.description.toLowerCase(); - - return description.indexOf(search) > -1; - }); - }, -}; </script> <template> <FetchData @@ -70,7 +30,7 @@ const statesFilter = { auto-load :reload="true" > - <template #form="{ data, validate, filter }"> + <template #form="{ data, validate }"> <VnRow> <VnInput v-model="data.client.name" @@ -101,20 +61,14 @@ const statesFilter = { /> </template> </VnSelect> - <QSelect + <VnSelect v-model="data.claimStateFk" - :options="claimStates" - option-value="id" - option-label="description" - emit-value + url="ClaimStates" :label="t('claim.state')" - map-options - use-input - @filter="(value, update) => filter(value, update, statesFilter)" + option-label="description" :rules="validate('claim.claimStateFk')" :input-debounce="0" - > - </QSelect> + /> </VnRow> <VnRow> <QInput @@ -123,16 +77,14 @@ const statesFilter = { :rules="validate('claim.packages')" type="number" /> - <QSelect + <VnSelectEnum v-model="data.pickup" - :options="optionsList" - option-value="id" - option-label="description" - emit-value :label="t('claim.pickup')" - map-options - use-input - :input-debounce="0" + table="claim" + column="pickup" + option-label="description" + :translation="(value) => t(`claim.${value}`)" + :default-options="[{ id: null, description: t('claim.null') }]" /> </VnRow> </template> diff --git a/test/cypress/integration/outLogin/twoFactor.spec.js b/test/cypress/integration/outLogin/twoFactor.spec.js index 259ddfc0f..4d8561f0f 100755 --- a/test/cypress/integration/outLogin/twoFactor.spec.js +++ b/test/cypress/integration/outLogin/twoFactor.spec.js @@ -12,7 +12,7 @@ describe('Two Factor', () => { cy.request( 'PATCH', `http://localhost:3000/api/VnUsers/${userId}/update-user?access_token=DEFAULT_TOKEN`, - { twoFactorFk: 'email' } + { twoFactor: 'email' } ); }); From 3906fc386f6b99528a9973299b22b0a7c974147d Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Wed, 18 Sep 2024 12:49:45 +0200 Subject: [PATCH 26/29] hotFix: supplierDescriptor not use same data-key --- src/pages/Supplier/Card/SupplierDescriptor.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Supplier/Card/SupplierDescriptor.vue b/src/pages/Supplier/Card/SupplierDescriptor.vue index 6e60a336c..5754031b3 100644 --- a/src/pages/Supplier/Card/SupplierDescriptor.vue +++ b/src/pages/Supplier/Card/SupplierDescriptor.vue @@ -109,7 +109,7 @@ const getEntryQueryParams = (supplier) => { :subtitle="data.subtitle" :filter="filter" @on-fetch="setData" - data-key="supplier" + data-key="supplierDescriptor" :summary="$props.summary" > <template #body="{ entity }"> From f86525e31dcf0bc79a5b04dc01ab8456efae34ef Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Wed, 18 Sep 2024 13:24:21 +0200 Subject: [PATCH 27/29] fix: not null variable --- src/components/VnTable/VnTable.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index 6f678d5c1..5b39265fb 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -192,7 +192,7 @@ function setUserParams(watchedParams, watchedOrder) { function sanitizer(params) { for (const [key, value] of Object.entries(params)) { - if (typeof value == 'object') { + if (value && typeof value == 'object') { const param = Object.values(value)[0]; if (typeof param == 'string') params[key] = param.replaceAll('%', ''); } From 37329a73914ef10f355c9fe7698e9dd58a9a063a Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 18 Sep 2024 13:30:51 +0200 Subject: [PATCH 28/29] feat: add shortcut add event in some subSections --- src/pages/Customer/Card/CustomerContacts.vue | 9 +++++---- .../Customer/components/CustomerAddressEdit.vue | 9 +++++---- src/pages/Item/Card/ItemTags.vue | 9 +++++---- src/pages/Route/Roadmap/RoadmapStops.vue | 9 +++++---- src/pages/Supplier/Card/SupplierAccounts.vue | 13 ++++++------- src/pages/Supplier/Card/SupplierContacts.vue | 9 +++++---- src/pages/Worker/WorkerDepartmentTree.vue | 9 +++++---- 7 files changed, 36 insertions(+), 31 deletions(-) diff --git a/src/pages/Customer/Card/CustomerContacts.vue b/src/pages/Customer/Card/CustomerContacts.vue index cd4d553df..c420f650e 100644 --- a/src/pages/Customer/Card/CustomerContacts.vue +++ b/src/pages/Customer/Card/CustomerContacts.vue @@ -56,17 +56,18 @@ const customerContactsRef = ref(null); </div> </VnRow> <VnRow> - <QIcon + <QBtn @click="customerContactsRef.insert()" class="cursor-pointer" color="primary" - name="add" - size="sm" + flat + icon="add" + shortcut="+" > <QTooltip> {{ t('Add contact') }} </QTooltip> - </QIcon> + </QBtn> </VnRow> </QCard> </template> diff --git a/src/pages/Customer/components/CustomerAddressEdit.vue b/src/pages/Customer/components/CustomerAddressEdit.vue index 2252a96dc..82a190ae1 100644 --- a/src/pages/Customer/components/CustomerAddressEdit.vue +++ b/src/pages/Customer/components/CustomerAddressEdit.vue @@ -272,16 +272,17 @@ function handleLocation(data, location) { </div> </VnRow> - <QIcon + <QBtn @click.stop="addNote()" class="cursor-pointer add-icon q-mt-md" - name="add" - size="sm" + flat + icon="add" + shortcut="+" > <QTooltip> {{ t('Add note') }} </QTooltip> - </QIcon> + </QBtn> </template> </FormModel> </template> diff --git a/src/pages/Item/Card/ItemTags.vue b/src/pages/Item/Card/ItemTags.vue index 39723ae65..1b5eb28f0 100644 --- a/src/pages/Item/Card/ItemTags.vue +++ b/src/pages/Item/Card/ItemTags.vue @@ -168,19 +168,20 @@ const insertTag = (rows) => { </div> </VnRow> <VnRow class="justify-center items-center"> - <QIcon + <QBtn @click="insertTag(rows)" class="cursor-pointer" :disable="!validRow" color="primary" - name="add" - size="sm" + flat + icon="add" + shortcut="+" style="flex: 0" > <QTooltip> {{ t('itemTags.addTag') }} </QTooltip> - </QIcon> + </QBtn> </VnRow> </QCard> </template> diff --git a/src/pages/Route/Roadmap/RoadmapStops.vue b/src/pages/Route/Roadmap/RoadmapStops.vue index 8ff044d2d..d8215ea49 100644 --- a/src/pages/Route/Roadmap/RoadmapStops.vue +++ b/src/pages/Route/Roadmap/RoadmapStops.vue @@ -65,9 +65,10 @@ const updateDefaultStop = (data) => { </div> </QCardSection> <QCardSection> - <QIcon - name="add" - size="sm" + <QBtn + flat + icon="add" + shortcut="+" class="cursor-pointer" color="primary" @click="roadmapStopsCrudRef.insert()" @@ -75,7 +76,7 @@ const updateDefaultStop = (data) => { <QTooltip> {{ t('Add stop') }} </QTooltip> - </QIcon> + </QBtn> </QCardSection> </QCard> </template> diff --git a/src/pages/Supplier/Card/SupplierAccounts.vue b/src/pages/Supplier/Card/SupplierAccounts.vue index b0e8b06e8..f8fbba0e4 100644 --- a/src/pages/Supplier/Card/SupplierAccounts.vue +++ b/src/pages/Supplier/Card/SupplierAccounts.vue @@ -102,9 +102,7 @@ const setWireTransfer = async () => { <VnInput :label="t('supplier.accounts.iban')" v-model="row.iban"> <template #append> <QIcon name="info" class="cursor-info"> - <QTooltip>{{ - t('components.iban_tooltip') - }}</QTooltip> + <QTooltip>{{ t('components.iban_tooltip') }}</QTooltip> </QIcon> </template> </VnInput> @@ -165,9 +163,10 @@ const setWireTransfer = async () => { </div> </VnRow> <VnRow> - <QIcon - name="add" - size="sm" + <QBtn + flat + icon="add" + shortcut="+" class="cursor-pointer" color="primary" @click="supplierAccountRef.insert()" @@ -175,7 +174,7 @@ const setWireTransfer = async () => { <QTooltip> {{ t('Add account') }} </QTooltip> - </QIcon> + </QBtn> </VnRow> </QCard> </template> diff --git a/src/pages/Supplier/Card/SupplierContacts.vue b/src/pages/Supplier/Card/SupplierContacts.vue index 35e8b98fc..3f2063784 100644 --- a/src/pages/Supplier/Card/SupplierContacts.vue +++ b/src/pages/Supplier/Card/SupplierContacts.vue @@ -84,9 +84,10 @@ const insertRow = () => { </VnRow> </QCardSection> <VnRow> - <QIcon - name="add" - size="sm" + <QBtn + flat + icon="add" + shortcut="+" class="cursor-pointer" color="primary" @click="insertRow()" @@ -94,7 +95,7 @@ const insertRow = () => { <QTooltip> {{ t('Add contact') }} </QTooltip> - </QIcon> + </QBtn> </VnRow> </QCard> </template> diff --git a/src/pages/Worker/WorkerDepartmentTree.vue b/src/pages/Worker/WorkerDepartmentTree.vue index 392539c86..c73cb59b9 100644 --- a/src/pages/Worker/WorkerDepartmentTree.vue +++ b/src/pages/Worker/WorkerDepartmentTree.vue @@ -180,17 +180,18 @@ function handleEvent(type, event, node) { {{ t('Remove') }} </QTooltip> </QIcon> - <QIcon - name="add" + <QBtn color="primary" - size="sm" + flat + icon="add" + shortcut="+" class="cursor-pointer" @click.stop="showCreateNodeForm(node.id)" > <QTooltip> {{ t('Create') }} </QTooltip> - </QIcon> + </QBtn> </div> </div> </template> From b3f27d9a84970050963f2b7598ae9fc1ad751087 Mon Sep 17 00:00:00 2001 From: jgallego <jgallego@verdnatura.es> Date: Wed, 18 Sep 2024 17:51:49 +0200 Subject: [PATCH 29/29] feat: translations fixed --- src/pages/Route/Roadmap/RoadmapBasicData.vue | 4 ++-- src/pages/Route/Roadmap/RoadmapFilter.vue | 8 ++++---- src/pages/Route/Roadmap/RoadmapSummary.vue | 4 ++-- src/pages/Route/RouteRoadmap.vue | 1 + 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/pages/Route/Roadmap/RoadmapBasicData.vue b/src/pages/Route/Roadmap/RoadmapBasicData.vue index e1611ed61..eeefaca2c 100644 --- a/src/pages/Route/Roadmap/RoadmapBasicData.vue +++ b/src/pages/Route/Roadmap/RoadmapBasicData.vue @@ -103,8 +103,8 @@ es: Roadmap: Troncal ETD date: Fecha ETD ETD hour: Hora ETD - Tractor plate: Matrícula tractor - Trailer plate: Matrícula trailer + Tractor plate: Matrícula tractora + Trailer plate: Matrícula remolque Carrier: Transportista Price: Precio Driver name: Nombre del conductor diff --git a/src/pages/Route/Roadmap/RoadmapFilter.vue b/src/pages/Route/Roadmap/RoadmapFilter.vue index 04c5c9696..ecf8d39fc 100644 --- a/src/pages/Route/Roadmap/RoadmapFilter.vue +++ b/src/pages/Route/Roadmap/RoadmapFilter.vue @@ -164,8 +164,8 @@ en: to: To es: params: - tractorPlate: Matrícula del tractor - trailerPlate: Matrícula del trailer + tractorPlate: Matrícula tractora + trailerPlate: Matrícula remolque supplierFk: Transportista price: Precio driverName: Nombre del conductor @@ -174,8 +174,8 @@ es: to: Hasta From: Desde To: Hasta - Tractor Plate: Matrícula del tractor - Trailer Plate: Matrícula del trailer + Tractor Plate: Matrícula tractora + Trailer Plate: Matrícula remolque Carrier: Transportista Price: Precio Driver name: Nombre del conductor diff --git a/src/pages/Route/Roadmap/RoadmapSummary.vue b/src/pages/Route/Roadmap/RoadmapSummary.vue index 7f8b7107b..3fb36b4f7 100644 --- a/src/pages/Route/Roadmap/RoadmapSummary.vue +++ b/src/pages/Route/Roadmap/RoadmapSummary.vue @@ -149,8 +149,8 @@ const filter = { <i18n> es: Carrier: Transportista - Tractor Plate: Matrícula tractor - Trailer Plate: Matrícula trailer + Tractor Plate: Matrícula tractora + Trailer Plate: Matrícula remolque Phone: Teléfono Worker: Trabajador Observations: Observaciones diff --git a/src/pages/Route/RouteRoadmap.vue b/src/pages/Route/RouteRoadmap.vue index 306387cbe..d921dab1f 100644 --- a/src/pages/Route/RouteRoadmap.vue +++ b/src/pages/Route/RouteRoadmap.vue @@ -237,4 +237,5 @@ es: Price: Precio Observations: Observaciones Preview: Vista previa + Select the estimated date of departure (ETD): Selecciona la fecha estimada de salida </i18n>