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 01/18] 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 8be1833f9e7bbf6b9d6bc8163b84eb090ecbb1b8 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Fri, 13 Sep 2024 08:49:36 +0200
Subject: [PATCH 02/18] 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 03/18] 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 56f8cbe615de8996b100cab085716c45a62629fd Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Tue, 17 Sep 2024 11:37:44 +0200
Subject: [PATCH 04/18] 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 05/18] 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 06/18] 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 07/18] 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 08/18] 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 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 09/18] 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 10/18] 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 11/18] 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 12/18] 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 13/18] 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 d76250f56f8d3ab70dff47ac9c2b1ff5b05e1e98 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Wed, 18 Sep 2024 12:27:48 +0000
Subject: [PATCH 14/18] fix: reset VnTable scroll properties

---
 src/components/VnTable/VnTable.vue | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue
index 689be76ee..9b4341da1 100644
--- a/src/components/VnTable/VnTable.vue
+++ b/src/components/VnTable/VnTable.vue
@@ -69,10 +69,7 @@ const $props = defineProps({
         type: Boolean,
         default: false,
     },
-    disableInfiniteScroll: {
-        type: Boolean,
-        default: false,
-    },
+    
     hasSubToolbar: {
         type: Boolean,
         default: null,
@@ -368,9 +365,7 @@ function handleOnDataSaved(_) {
         ref="CrudModelRef"
         @on-fetch="(...args) => emit('onFetch', ...args)"
         :search-url="searchUrl"
-        :disable-infinite-scroll="
-            $attrs['disableInfiniteScroll'] ? isTableMode : !disableInfiniteScroll
-        "
+        :disable-infinite-scroll="isTableMode"
         @save-changes="reload"
         :has-sub-toolbar="$props.hasSubToolbar ?? isEditable"
         :auto-load="hasParams || $attrs['auto-load']"
@@ -390,7 +385,7 @@ function handleOnDataSaved(_) {
                 card-container-class="grid-three"
                 flat
                 :style="isTableMode && `max-height: ${tableHeight}`"
-                virtual-scroll
+                :virtual-scroll="isTableMode"
                 @virtual-scroll="
                     (event) =>
                         event.index > rows.length - 2 &&

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 15/18] 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>

From 1cb2981f97e42d4d678d26800e1a9a28fbefb0ad Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Wed, 18 Sep 2024 16:26:56 +0000
Subject: [PATCH 16/18] feat: apply color when today

---
 src/css/app.scss | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/css/app.scss b/src/css/app.scss
index 3c51dc8af..905934d4c 100644
--- a/src/css/app.scss
+++ b/src/css/app.scss
@@ -268,6 +268,7 @@ input::-webkit-inner-spin-button {
         max-width: 400px;
     }
 }
+
 .edit-photo-btn {
     position: absolute;
     right: 12px;
@@ -280,3 +281,10 @@ input::-webkit-inner-spin-button {
     color: var(--vn-label-color);
     text-transform: uppercase;
 }
+
+.q-date {
+    &__today {
+        border: 2px solid $info;
+        color: $info;
+    }
+}

From 08bec59a37cc97ac321924569f03f56d27a2f492 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Thu, 19 Sep 2024 00:02:45 +0200
Subject: [PATCH 17/18] add_circle

---
 src/components/ItemsFilterPanel.vue         |  7 +++---
 src/pages/Item/Card/ItemBarcode.vue         |  9 ++++----
 src/pages/Order/Card/OrderCatalogFilter.vue |  6 +++--
 src/pages/Ticket/Card/TicketNotes.vue       |  9 ++++----
 src/pages/Ticket/Card/TicketPackage.vue     | 25 ++++++++++++---------
 src/pages/Worker/Card/WorkerTimeControl.vue |  9 ++++----
 6 files changed, 37 insertions(+), 28 deletions(-)

diff --git a/src/components/ItemsFilterPanel.vue b/src/components/ItemsFilterPanel.vue
index 8449f9354..e89d32da4 100644
--- a/src/components/ItemsFilterPanel.vue
+++ b/src/components/ItemsFilterPanel.vue
@@ -297,11 +297,12 @@ const removeTag = (index, params, search) => {
                 />
             </QItem>
             <QItem class="q-mt-lg">
-                <QIcon
-                    name="add_circle"
+                <QBtn
+                    icon="add_circle"
+                    shortcut="+"
+                    flat
                     class="fill-icon-on-hover q-px-xs"
                     color="primary"
-                    size="sm"
                     @click="tagValues.push({})"
                 />
             </QItem>
diff --git a/src/pages/Item/Card/ItemBarcode.vue b/src/pages/Item/Card/ItemBarcode.vue
index b353d67c7..197e9142f 100644
--- a/src/pages/Item/Card/ItemBarcode.vue
+++ b/src/pages/Item/Card/ItemBarcode.vue
@@ -65,17 +65,18 @@ const focusLastInput = () => {
                                 </QTooltip>
                             </QIcon>
                         </div>
-                        <QIcon
+                        <QBtn
                             @click="insertRow()"
                             class="cursor-pointer fill-icon-on-hover"
                             color="primary"
-                            name="add_circle"
-                            size="sm"
+                            icon="add_circle"
+                            shortcut="+"
+                            flat
                         >
                             <QTooltip>
                                 {{ t('Add barcode') }}
                             </QTooltip>
-                        </QIcon>
+                        </QBtn>
                     </QCard>
                 </template>
             </CrudModel>
diff --git a/src/pages/Order/Card/OrderCatalogFilter.vue b/src/pages/Order/Card/OrderCatalogFilter.vue
index 938cc4fe2..354c44747 100644
--- a/src/pages/Order/Card/OrderCatalogFilter.vue
+++ b/src/pages/Order/Card/OrderCatalogFilter.vue
@@ -374,8 +374,10 @@ function addOrder(value, field, params) {
                 />
             </QItem>
             <QItem class="q-mt-lg">
-                <QIcon
-                    name="add_circle"
+                <QBtn
+                    icon="add_circle"
+                    shortcut="+"
+                    flat
                     class="filter-icon"
                     @click="tagValues.push({})"
                 />
diff --git a/src/pages/Ticket/Card/TicketNotes.vue b/src/pages/Ticket/Card/TicketNotes.vue
index cfc0c2431..1b9d98a8b 100644
--- a/src/pages/Ticket/Card/TicketNotes.vue
+++ b/src/pages/Ticket/Card/TicketNotes.vue
@@ -87,17 +87,18 @@ watch(
                         </QIcon>
                     </div>
                     <VnRow v-if="observationTypes.length > rows.length">
-                        <QIcon
-                            name="add_circle"
+                        <QBtn
+                            icon="add_circle"
+                            shortcut="+"
+                            flat
                             class="fill-icon-on-hover q-ml-md"
-                            size="sm"
                             color="primary"
                             @click="ticketNotesCrudRef.insert()"
                         >
                             <QTooltip>
                                 {{ t('ticketNotes.addNote') }}
                             </QTooltip>
-                        </QIcon>
+                        </QBtn>
                     </VnRow>
                 </QCard>
             </template>
diff --git a/src/pages/Ticket/Card/TicketPackage.vue b/src/pages/Ticket/Card/TicketPackage.vue
index a76fce2b6..c071d4f7f 100644
--- a/src/pages/Ticket/Card/TicketPackage.vue
+++ b/src/pages/Ticket/Card/TicketPackage.vue
@@ -114,17 +114,20 @@ watch(
                             </QTooltip>
                         </QIcon>
                     </div>
-                    <QIcon
-                        name="add_circle"
-                        class="fill-icon-on-hover q-ml-md"
-                        size="sm"
-                        color="primary"
-                        @click="ticketPackagingsCrudRef.insert()"
-                    >
-                        <QTooltip>
-                            {{ t('package.addPackage') }}
-                        </QTooltip>
-                    </QIcon>
+                    <VnRow>
+                        <QBtn
+                            icon="add_circle"
+                            shortcut="+"
+                            flat
+                            class="fill-icon-on-hover q-ml-md"
+                            color="primary"
+                            @click="ticketPackagingsCrudRef.insert()"
+                        >
+                            <QTooltip>
+                                {{ t('package.addPackage') }}
+                            </QTooltip>
+                        </QBtn>
+                    </VnRow>
                 </QCard>
             </template>
         </CrudModel>
diff --git a/src/pages/Worker/Card/WorkerTimeControl.vue b/src/pages/Worker/Card/WorkerTimeControl.vue
index 9ae91f8ce..fbfd4b28d 100644
--- a/src/pages/Worker/Card/WorkerTimeControl.vue
+++ b/src/pages/Worker/Card/WorkerTimeControl.vue
@@ -561,15 +561,16 @@ onMounted(async () => {
                             <span class="q-mb-md text-sm text-body1">
                                 {{ secondsToHoursMinutes(day.dayData?.workedHours) }}
                             </span>
-                            <QIcon
-                                name="add_circle"
+                            <QBtn
+                                icon="add_circle"
+                                shortcut="+"
+                                flat
                                 color="primary"
                                 class="fill-icon cursor-pointer"
-                                size="sm"
                                 @click="showWorkerTimeForm(day.dayData?.dated, 'create')"
                             >
                                 <QTooltip>{{ t('Add time') }}</QTooltip>
-                            </QIcon>
+                            </QBtn>
                         </div>
                     </QTd>
                 </QTr>

From 1550d79160421e7faeb177a9897be7a98a506cb6 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Thu, 19 Sep 2024 00:10:28 +0200
Subject: [PATCH 18/18] feat: add shortcut more buttons

---
 src/components/common/VnDmsList.vue                | 9 ++++++++-
 src/pages/Account/Role/Card/SubRoles.vue           | 8 +++++++-
 src/pages/Claim/Card/ClaimLines.vue                | 2 +-
 src/pages/Claim/Card/ClaimPhoto.vue                | 8 +++++++-
 src/pages/Customer/Card/CustomerFileManagement.vue | 1 +
 src/pages/Customer/Card/CustomerSamples.vue        | 8 +++++++-
 src/pages/Entry/Card/EntryNotes.vue                | 8 +++++++-
 src/pages/InvoiceIn/Card/InvoiceInBasicData.vue    | 1 +
 src/pages/InvoiceIn/Card/InvoiceInDueDay.vue       | 2 +-
 src/pages/InvoiceIn/Card/InvoiceInIntrastat.vue    | 1 +
 src/pages/InvoiceIn/Card/InvoiceInVat.vue          | 1 +
 src/pages/Item/ItemRequestFilter.vue               | 1 +
 src/pages/Route/Agency/Card/AgencyWorkcenter.vue   | 2 +-
 src/pages/Route/RouteTickets.vue                   | 2 +-
 src/pages/Ticket/Card/TicketSale.vue               | 3 ++-
 src/pages/Ticket/Card/TicketService.vue            | 8 +++++++-
 src/pages/Travel/ExtraCommunityFilter.vue          | 1 +
 src/pages/Zone/Delivery/ZoneDeliveryList.vue       | 2 +-
 src/pages/Zone/Upcoming/ZoneUpcomingList.vue       | 2 +-
 19 files changed, 57 insertions(+), 13 deletions(-)

diff --git a/src/components/common/VnDmsList.vue b/src/components/common/VnDmsList.vue
index 16e3c641f..52dd6ef79 100644
--- a/src/components/common/VnDmsList.vue
+++ b/src/components/common/VnDmsList.vue
@@ -400,7 +400,14 @@ defineExpose({
         />
     </QDialog>
     <QPageSticky position="bottom-right" :offset="[25, 25]">
-        <QBtn fab color="primary" icon="add" @click="showFormDialog()" class="fill-icon">
+        <QBtn
+            fab
+            color="primary"
+            icon="add"
+            shortcut="+"
+            @click="showFormDialog()"
+            class="fill-icon"
+        >
             <QTooltip>
                 {{ t('Upload file') }}
             </QTooltip>
diff --git a/src/pages/Account/Role/Card/SubRoles.vue b/src/pages/Account/Role/Card/SubRoles.vue
index 7a0088bac..d17f96dd8 100644
--- a/src/pages/Account/Role/Card/SubRoles.vue
+++ b/src/pages/Account/Role/Card/SubRoles.vue
@@ -142,7 +142,13 @@ const redirectToRoleSummary = (id) =>
             <SubRoleCreateForm @on-submit-create-subrole="createSubRole" />
         </QDialog>
         <QPageSticky position="bottom-right" :offset="[18, 18]">
-            <QBtn fab icon="add" color="primary" @click="openCreateSubRoleForm()">
+            <QBtn
+                fab
+                icon="add"
+                shortcut="+"
+                color="primary"
+                @click="openCreateSubRoleForm()"
+            >
                 <QTooltip>{{ t('warehouses.add') }}</QTooltip>
             </QBtn>
         </QPageSticky>
diff --git a/src/pages/Claim/Card/ClaimLines.vue b/src/pages/Claim/Card/ClaimLines.vue
index 77c7dacf1..60c470d22 100644
--- a/src/pages/Claim/Card/ClaimLines.vue
+++ b/src/pages/Claim/Card/ClaimLines.vue
@@ -317,7 +317,7 @@ async function saveWhenHasChanges() {
     </div>
 
     <QPageSticky position="bottom-right" :offset="[25, 25]">
-        <QBtn fab color="primary" icon="add" @click="showImportDialog()" />
+        <QBtn fab color="primary" shortcut="+" icon="add" @click="showImportDialog()" />
     </QPageSticky>
 </template>
 
diff --git a/src/pages/Claim/Card/ClaimPhoto.vue b/src/pages/Claim/Card/ClaimPhoto.vue
index 21f1be6ed..ec619cc7d 100644
--- a/src/pages/Claim/Card/ClaimPhoto.vue
+++ b/src/pages/Claim/Card/ClaimPhoto.vue
@@ -246,7 +246,13 @@ function onDrag() {
     </QDialog>
     <QPageSticky position="bottom-right" :offset="[25, 25]">
         <label for="fileInput">
-            <QBtn fab @click="inputFile.nativeEl.click()" icon="add" color="primary">
+            <QBtn
+                fab
+                @click="inputFile.nativeEl.click()"
+                shortcut="+"
+                icon="add"
+                color="primary"
+            >
                 <QInput
                     ref="inputFile"
                     type="file"
diff --git a/src/pages/Customer/Card/CustomerFileManagement.vue b/src/pages/Customer/Card/CustomerFileManagement.vue
index 43aacf6a0..134d8dbd6 100644
--- a/src/pages/Customer/Card/CustomerFileManagement.vue
+++ b/src/pages/Customer/Card/CustomerFileManagement.vue
@@ -236,6 +236,7 @@ const toCustomerFileManagementCreate = () => {
             @click.stop="toCustomerFileManagementCreate()"
             color="primary"
             fab
+            shortcut="+"
             icon="add"
         />
         <QTooltip>
diff --git a/src/pages/Customer/Card/CustomerSamples.vue b/src/pages/Customer/Card/CustomerSamples.vue
index 8e2ab92a0..f12691112 100644
--- a/src/pages/Customer/Card/CustomerSamples.vue
+++ b/src/pages/Customer/Card/CustomerSamples.vue
@@ -99,7 +99,13 @@ const tableRef = ref();
     </VnTable>
 
     <QPageSticky :offset="[18, 18]">
-        <QBtn @click.stop="toCustomerSamplesCreate()" color="primary" fab icon="add" />
+        <QBtn
+            @click.stop="toCustomerSamplesCreate()"
+            color="primary"
+            fab
+            icon="add"
+            shortcut="+"
+        />
         <QTooltip>
             {{ t('Send sample') }}
         </QTooltip>
diff --git a/src/pages/Entry/Card/EntryNotes.vue b/src/pages/Entry/Card/EntryNotes.vue
index f07d0b233..55cac0437 100644
--- a/src/pages/Entry/Card/EntryNotes.vue
+++ b/src/pages/Entry/Card/EntryNotes.vue
@@ -138,7 +138,13 @@ const columns = computed(() => [
         </template>
     </CrudModel>
     <QPageSticky position="bottom-right" :offset="[25, 25]">
-        <QBtn fab color="primary" icon="add" @click="entryObservationsRef.insert()" />
+        <QBtn
+            fab
+            color="primary"
+            icon="add"
+            shortcut="+"
+            @click="entryObservationsRef.insert()"
+        />
     </QPageSticky>
 </template>
 <i18n>
diff --git a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
index 045517a3f..c9468557f 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
@@ -281,6 +281,7 @@ async function onSubmit() {
                             v-else
                             icon="add_circle"
                             round
+                            shortcut="+"
                             padding="xs"
                             @click="setCreateDms()"
                         >
diff --git a/src/pages/InvoiceIn/Card/InvoiceInDueDay.vue b/src/pages/InvoiceIn/Card/InvoiceInDueDay.vue
index 1593ea1be..e8f73848b 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInDueDay.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInDueDay.vue
@@ -230,7 +230,7 @@ async function insert() {
         </template>
     </CrudModel>
     <QPageSticky position="bottom-right" :offset="[25, 25]">
-        <QBtn color="primary" icon="add" size="lg" round @click="insert" />
+        <QBtn color="primary" icon="add" shortcut="+" size="lg" round @click="insert" />
     </QPageSticky>
 </template>
 <style lang="scss" scoped>
diff --git a/src/pages/InvoiceIn/Card/InvoiceInIntrastat.vue b/src/pages/InvoiceIn/Card/InvoiceInIntrastat.vue
index 717f30b7f..bee50a07d 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInIntrastat.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInIntrastat.vue
@@ -224,6 +224,7 @@ const formatOpt = (row, { model, options }, prop) => {
         <QBtn
             color="primary"
             icon="add"
+            shortcut="+"
             size="lg"
             round
             @click="invoiceInFormRef.insert()"
diff --git a/src/pages/InvoiceIn/Card/InvoiceInVat.vue b/src/pages/InvoiceIn/Card/InvoiceInVat.vue
index d44880937..08834ecb8 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInVat.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInVat.vue
@@ -405,6 +405,7 @@ const formatOpt = (row, { model, options }, prop) => {
             color="primary"
             icon="add"
             size="lg"
+            shortcut="+"
             round
             @click="invoiceInFormRef.insert()"
         >
diff --git a/src/pages/Item/ItemRequestFilter.vue b/src/pages/Item/ItemRequestFilter.vue
index aa07b8d50..0e81ff5a5 100644
--- a/src/pages/Item/ItemRequestFilter.vue
+++ b/src/pages/Item/ItemRequestFilter.vue
@@ -212,6 +212,7 @@ const decrement = (paramsObj, key) => {
                                     flat
                                     dense
                                     size="12px"
+                                    shortcut="+"
                                     @click="add(params, 'scopeDays')"
                                 />
                                 <QBtn
diff --git a/src/pages/Route/Agency/Card/AgencyWorkcenter.vue b/src/pages/Route/Agency/Card/AgencyWorkcenter.vue
index 3531ad288..1f3cab5d0 100644
--- a/src/pages/Route/Agency/Card/AgencyWorkcenter.vue
+++ b/src/pages/Route/Agency/Card/AgencyWorkcenter.vue
@@ -88,7 +88,7 @@ async function deleteWorCenter(id) {
         </VnPaginate>
     </div>
     <QPageSticky :offset="[18, 18]">
-        <QBtn @click.stop="dialog.show()" color="primary" fab icon="add">
+        <QBtn @click.stop="dialog.show()" color="primary" fab shortcut="+" icon="add">
             <QDialog ref="dialog">
                 <FormModelPopup
                     :title="t('Add work center')"
diff --git a/src/pages/Route/RouteTickets.vue b/src/pages/Route/RouteTickets.vue
index 9356f7590..5960636b0 100644
--- a/src/pages/Route/RouteTickets.vue
+++ b/src/pages/Route/RouteTickets.vue
@@ -396,7 +396,7 @@ const openSmsDialog = async () => {
             </VnPaginate>
         </div>
         <QPageSticky :offset="[20, 20]">
-            <QBtn fab icon="add" color="primary" @click="openTicketsDialog">
+            <QBtn fab icon="add" shortcut="+" color="primary" @click="openTicketsDialog">
                 <QTooltip>
                     {{ t('Add ticket') }}
                 </QTooltip>
diff --git a/src/pages/Ticket/Card/TicketSale.vue b/src/pages/Ticket/Card/TicketSale.vue
index 2ea12bb05..f86863f05 100644
--- a/src/pages/Ticket/Card/TicketSale.vue
+++ b/src/pages/Ticket/Card/TicketSale.vue
@@ -735,6 +735,7 @@ onUnmounted(() => (stateStore.rightDrawer = false));
                 size="md"
                 round
                 flat
+                shortcut="+"
                 :disable="!isTicketEditable"
                 @click="insertRow()"
             >
@@ -746,7 +747,7 @@ onUnmounted(() => (stateStore.rightDrawer = false));
     </QTable>
 
     <QPageSticky :offset="[20, 20]">
-        <QBtn @click="newOrderFromTicket()" color="primary" fab icon="add" />
+        <QBtn @click="newOrderFromTicket()" color="primary" fab icon="add" shortcut="+" />
         <QTooltip class="text-no-wrap">
             {{ t('Add item to basket') }}
         </QTooltip>
diff --git a/src/pages/Ticket/Card/TicketService.vue b/src/pages/Ticket/Card/TicketService.vue
index 63dd454ba..873051676 100644
--- a/src/pages/Ticket/Card/TicketService.vue
+++ b/src/pages/Ticket/Card/TicketService.vue
@@ -184,6 +184,12 @@ const columns = computed(() => [
         </template>
     </CrudModel>
     <QPageSticky position="bottom-right" :offset="[25, 25]">
-        <QBtn fab color="primary" icon="add" @click="ticketServiceCrudRef.insert()" />
+        <QBtn
+            fab
+            color="primary"
+            icon="add"
+            @click="ticketServiceCrudRef.insert()"
+            shortcut="+"
+        />
     </QPageSticky>
 </template>
diff --git a/src/pages/Travel/ExtraCommunityFilter.vue b/src/pages/Travel/ExtraCommunityFilter.vue
index a8bbde75b..75b744168 100644
--- a/src/pages/Travel/ExtraCommunityFilter.vue
+++ b/src/pages/Travel/ExtraCommunityFilter.vue
@@ -112,6 +112,7 @@ warehouses();
                         <template #append>
                             <QBtn
                                 icon="add"
+                                shortcut="+"
                                 flat
                                 dense
                                 size="12px"
diff --git a/src/pages/Zone/Delivery/ZoneDeliveryList.vue b/src/pages/Zone/Delivery/ZoneDeliveryList.vue
index ca87dbd84..975cbdb67 100644
--- a/src/pages/Zone/Delivery/ZoneDeliveryList.vue
+++ b/src/pages/Zone/Delivery/ZoneDeliveryList.vue
@@ -74,7 +74,7 @@ async function remove(row) {
             </VnPaginate>
         </div>
         <QPageSticky position="bottom-right" :offset="[18, 18]">
-            <QBtn @click="create" fab icon="add" color="primary" />
+            <QBtn @click="create" fab icon="add" shortcut="+" color="primary" />
         </QPageSticky>
     </QPage>
 </template>
diff --git a/src/pages/Zone/Upcoming/ZoneUpcomingList.vue b/src/pages/Zone/Upcoming/ZoneUpcomingList.vue
index 89e53132e..5a7f0bb4c 100644
--- a/src/pages/Zone/Upcoming/ZoneUpcomingList.vue
+++ b/src/pages/Zone/Upcoming/ZoneUpcomingList.vue
@@ -74,7 +74,7 @@ async function remove(row) {
             </VnPaginate>
         </div>
         <QPageSticky position="bottom-right" :offset="[18, 18]">
-            <QBtn @click="create" fab icon="add" color="primary" />
+            <QBtn @click="create" fab icon="add" shortcut="+" color="primary" />
         </QPageSticky>
     </QPage>
 </template>