From 8124a341a08f65dda51d70ca279e4ed208c9d6de Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Tue, 24 Sep 2024 07:25:17 +0200
Subject: [PATCH 1/8] feat: refs #7129 route extended list and simplify route
 list

---
 src/components/VnTable/VnTable.vue    |   6 +-
 src/filters/toHour.js                 |   3 +-
 src/i18n/locale/en.yml                |   1 +
 src/i18n/locale/es.yml                |   1 +
 src/pages/Route/Agency/AgencyList.vue |  41 ++-
 src/pages/Route/RouteExtendedList.vue | 411 ++++++++++++++++++++++++++
 src/pages/Route/RouteList.vue         | 297 ++-----------------
 src/router/modules/route.js           |  23 +-
 8 files changed, 485 insertions(+), 298 deletions(-)
 create mode 100644 src/pages/Route/RouteExtendedList.vue

diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue
index a3b64d264..b6023203e 100644
--- a/src/components/VnTable/VnTable.vue
+++ b/src/components/VnTable/VnTable.vue
@@ -10,7 +10,7 @@ import FormModelPopup from 'components/FormModelPopup.vue';
 
 import VnFilterPanel from 'components/ui/VnFilterPanel.vue';
 import VnTableColumn from 'components/VnTable/VnColumn.vue';
-import VnTableFilter from 'components/VnTable/VnFilter.vue';
+import VnFilter from 'components/VnTable/VnFilter.vue';
 import VnTableChip from 'components/VnTable/VnChip.vue';
 import VnVisibleColumn from 'src/components/VnTable/VnVisibleColumn.vue';
 import VnLv from 'components/ui/VnLv.vue';
@@ -335,7 +335,7 @@ function handleOnDataSaved(_) {
                         )"
                         :key="col.id"
                     >
-                        <VnTableFilter
+                        <VnFilter
                             :column="col"
                             :data-key="$attrs['data-key']"
                             v-model="params[columnName(col)]"
@@ -442,7 +442,7 @@ function handleOnDataSaved(_) {
                                     :search-url="searchUrl"
                                 />
                             </div>
-                            <VnTableFilter
+                            <VnFilter
                                 v-if="$props.columnSearch"
                                 :column="col"
                                 :show-title="true"
diff --git a/src/filters/toHour.js b/src/filters/toHour.js
index 40821e237..b5cc61c81 100644
--- a/src/filters/toHour.js
+++ b/src/filters/toHour.js
@@ -1,10 +1,11 @@
 import isValidDate from 'filters/isValidDate';
 
 export default function toHour(date) {
+    console.log('date: ', date);
     if (!isValidDate(date)) {
         return '--:--';
     }
-    return (new Date(date || '')).toLocaleTimeString([], {
+    return new Date(date || '').toLocaleTimeString([], {
         hour: '2-digit',
         minute: '2-digit',
     });
diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml
index 2e2365f7b..f6c9b15fd 100644
--- a/src/i18n/locale/en.yml
+++ b/src/i18n/locale/en.yml
@@ -872,6 +872,7 @@ route:
         tickets: Tickets
         log: Log
         autonomous: Autonomous
+        RouteExtendedList: Extended list
     cmr:
         list:
             results: results
diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml
index 53b487e9f..201c73d43 100644
--- a/src/i18n/locale/es.yml
+++ b/src/i18n/locale/es.yml
@@ -216,6 +216,7 @@ globals:
         RouteRoadmap: Troncales
         RouteRoadmapCreate: Crear troncal
         autonomous: Autónomos
+        RouteExtendedList: Listado extendido
         suppliers: Proveedores
         supplier: Proveedor
         supplierCreate: Nuevo proveedor
diff --git a/src/pages/Route/Agency/AgencyList.vue b/src/pages/Route/Agency/AgencyList.vue
index 42aede8a0..30ee52f54 100644
--- a/src/pages/Route/Agency/AgencyList.vue
+++ b/src/pages/Route/Agency/AgencyList.vue
@@ -27,12 +27,15 @@ const columns = computed(() => [
             condition: () => true,
         },
         isId: true,
+        columnFilter: false,
     },
     {
         align: 'left',
         label: t('globals.name'),
         name: 'name',
         isTitle: true,
+        columnFilter: false,
+        columnClass: 'expand',
     },
     {
         align: 'left',
@@ -70,18 +73,34 @@ const columns = computed(() => [
         data-key="AgencyList"
         :expr-builder="exprBuilder"
     />
-    <VnTable
-        ref="tableRef"
-        data-key="AgencyList"
-        url="Agencies"
-        order="name"
-        :columns="columns"
-        :right-search="false"
-        :use-model="true"
-        redirect="agency"
-        default-mode="card"
-    />
+    <div class="list-container">
+        <div class="list">
+            <VnTable
+                ref="tableRef"
+                data-key="AgencyList"
+                url="Agencies"
+                order="name"
+                :columns="columns"
+                :right-search="false"
+                :use-model="true"
+                redirect="agency"
+                default-mode="card"
+            />
+        </div>
+    </div>
 </template>
+<style lang="scss" scoped>
+.list {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    width: 55%;
+}
+.list-container {
+    display: flex;
+    justify-content: center;
+}
+</style>
 <i18n>
     es:
         isOwn: Tiene propietario
diff --git a/src/pages/Route/RouteExtendedList.vue b/src/pages/Route/RouteExtendedList.vue
new file mode 100644
index 000000000..1e20df99c
--- /dev/null
+++ b/src/pages/Route/RouteExtendedList.vue
@@ -0,0 +1,411 @@
+<script setup>
+import { computed, ref } from 'vue';
+import { useI18n } from 'vue-i18n';
+import { useSession } from 'composables/useSession';
+import { useSummaryDialog } from 'src/composables/useSummaryDialog';
+import { useQuasar } from 'quasar';
+import { toDate } from 'src/filters';
+import { useRouter } from 'vue-router';
+
+import axios from 'axios';
+import RouteSearchbar from 'pages/Route/Card/RouteSearchbar.vue';
+import RouteListTicketsDialog from 'pages/Route/Card/RouteListTicketsDialog.vue';
+import RouteSummary from 'pages/Route/Card/RouteSummary.vue';
+import RightMenu from 'src/components/common/RightMenu.vue';
+import RouteFilter from 'pages/Route/Card/RouteFilter.vue';
+
+import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
+import VnInputDate from 'components/common/VnInputDate.vue';
+import VnTable from 'components/VnTable/VnTable.vue';
+import { usePrintService } from 'src/composables/usePrintService';
+
+const { openReport } = usePrintService();
+const { t } = useI18n();
+const { viewSummary } = useSummaryDialog();
+const quasar = useQuasar();
+const session = useSession();
+const selectedRows = ref([]);
+const tableRef = ref([]);
+const confirmationDialog = ref(false);
+const startingDate = ref(null);
+const router = useRouter();
+const routeFilter = {
+    include: [
+        {
+            relation: 'workers',
+            scope: {
+                fields: ['id', 'firstName'],
+            },
+        },
+    ],
+};
+const columns = computed(() => [
+    {
+        align: 'left',
+        name: 'id',
+        label: 'Id',
+        chip: {
+            condition: () => true,
+        },
+        isId: true,
+        columnFilter: false,
+    },
+    {
+        align: 'left',
+        name: 'workerFk',
+        label: t('Worker'),
+        create: true,
+        component: 'select',
+        attrs: {
+            url: 'Workers/activeWithInheritedRole',
+            fields: ['id', 'name'],
+            useLike: false,
+            optionFilter: 'firstName',
+            find: {
+                value: 'workerFk',
+                label: 'workerUserName',
+            },
+        },
+        columnFilter: {
+            inWhere: true,
+        },
+        useLike: false,
+        cardVisible: true,
+        format: (row, dashIfEmpty) => dashIfEmpty(row.travelRef),
+    },
+    {
+        align: 'left',
+        name: 'agencyModeFk',
+        label: t('Agency'),
+        isTitle: true,
+        cardVisible: true,
+        create: true,
+        component: 'select',
+        attrs: {
+            url: 'agencyModes',
+            fields: ['id', 'name'],
+            find: {
+                value: 'agencyModeFk',
+                label: 'agencyName',
+            },
+        },
+        columnClass: 'expand',
+    },
+    {
+        align: 'left',
+        name: 'vehicleFk',
+        label: t('Vehicle'),
+        cardVisible: true,
+        create: true,
+        component: 'select',
+        attrs: {
+            url: 'vehicles',
+            fields: ['id', 'numberPlate'],
+            optionLabel: 'numberPlate',
+            optionFilterValue: 'numberPlate',
+            find: {
+                value: 'vehicleFk',
+                label: 'vehiclePlateNumber',
+            },
+        },
+        columnFilter: {
+            inWhere: true,
+        },
+    },
+    {
+        align: 'left',
+        name: 'created',
+        label: t('Date'),
+        columnFilter: false,
+        cardVisible: true,
+        create: true,
+        component: 'date',
+        format: ({ date }) => toDate(date),
+    },
+    {
+        align: 'left',
+        name: 'from',
+        label: t('From'),
+        visible: false,
+        cardVisible: true,
+        create: true,
+        component: 'date',
+        format: ({ date }) => toDate(date),
+    },
+    {
+        align: 'left',
+        name: 'to',
+        label: t('To'),
+        visible: false,
+        cardVisible: true,
+        create: true,
+        component: 'date',
+        format: ({ date }) => toDate(date),
+    },
+    {
+        align: 'center',
+        name: 'm3',
+        label: t('Volume'),
+        cardVisible: true,
+        columnClass: 'shrink',
+    },
+    {
+        align: 'left',
+        name: 'started',
+        label: t('hourStarted'),
+        component: 'time',
+        columnFilter: false,
+    },
+    {
+        align: 'left',
+        name: 'finished',
+        label: t('hourFinished'),
+        component: 'time',
+        columnFilter: false,
+    },
+    {
+        align: 'center',
+        name: 'kmStart',
+        label: t('KmStart'),
+        columnClass: 'shrink',
+        create: true,
+        visible: false,
+    },
+    {
+        align: 'center',
+        name: 'kmEnd',
+        label: t('KmEnd'),
+        columnClass: 'shrink',
+        create: true,
+        visible: false,
+    },
+    {
+        align: 'left',
+        name: 'description',
+        label: t('Description'),
+        isTitle: true,
+        create: true,
+        component: 'input',
+        field: 'description',
+    },
+    {
+        align: 'left',
+        name: 'isOk',
+        label: t('Served'),
+        component: 'checkbox',
+        columnFilter: false,
+        columnClass: 'shrink',
+    },
+    {
+        align: 'right',
+        name: 'tableActions',
+        actions: [
+            {
+                title: t('Add tickets'),
+                icon: 'vn:ticketAdd',
+                action: (row) => openTicketsDialog(row?.id),
+            },
+            {
+                title: t('components.smartCard.viewSummary'),
+                icon: 'preview',
+                action: (row) => viewSummary(row?.id, RouteSummary),
+            },
+            {
+                title: t('Route summary'),
+                icon: 'arrow_forward',
+                isPrimary: true,
+                action: (row) => navigate(row?.id),
+            },
+        ],
+    },
+]);
+
+function navigate(id) {
+    router.push({ path: `/route/${id}` });
+}
+
+const cloneRoutes = () => {
+    if (!selectedRows.value.length || !startingDate.value) return;
+    axios.post('Routes/clone', {
+        created: startingDate.value,
+        ids: selectedRows.value.map((row) => row?.id),
+    });
+    startingDate.value = null;
+    tableRef.value.reload();
+};
+
+const showRouteReport = () => {
+    const ids = selectedRows.value.map((row) => row?.id);
+    const idString = ids.join(',');
+    let url = `Routes/${idString}/driver-route-pdf`;
+    let params = {};
+    if (selectedRows.value.length >= 1) {
+        params = {
+            id: idString,
+        };
+        url = `Routes/downloadZip`;
+    }
+    openReport(url, params, '_blank');
+};
+
+function markAsServed() {
+    selectedRows.value.forEach(async (row) => {
+        await axios.patch(`Routes/${row?.id}`, { isOk: true });
+    });
+    tableRef.value.reload();
+    startingDate.value = null;
+}
+
+const openTicketsDialog = (id) => {
+    quasar
+        .dialog({
+            component: RouteListTicketsDialog,
+            componentProps: {
+                id,
+            },
+        })
+        .onOk(() => tableRef.value.reload());
+};
+</script>
+
+<template>
+    <RouteSearchbar />
+    <QDialog v-model="confirmationDialog">
+        <QCard style="min-width: 350px">
+            <QCardSection>
+                <p class="text-h6 q-ma-none">{{ t('Select the starting date') }}</p>
+            </QCardSection>
+
+            <QCardSection class="q-pt-none">
+                <VnInputDate
+                    :label="t('Stating date')"
+                    v-model="startingDate"
+                    autofocus
+                />
+            </QCardSection>
+            <QCardActions align="right">
+                <QBtn flat :label="t('Cancel')" v-close-popup class="text-primary" />
+                <QBtn color="primary" v-close-popup @click="cloneRoutes">
+                    {{ t('globals.clone') }}
+                </QBtn>
+            </QCardActions>
+        </QCard>
+    </QDialog>
+    <VnSubToolbar />
+    <RightMenu>
+        <template #right-panel>
+            <RouteFilter data-key="RouteList" />
+        </template>
+    </RightMenu>
+    <VnTable
+        class="route-list"
+        ref="tableRef"
+        data-key="RouteList"
+        url="Routes/filter"
+        :columns="columns"
+        :right-search="false"
+        :is-editable="true"
+        :filter="routeFilter"
+        redirect="route"
+        :row-click="false"
+        :create="{
+            urlCreate: 'Routes',
+            title: t('Create route'),
+            onDataSaved: ({ id }) => tableRef.redirect(id),
+            formInitialData: {},
+        }"
+        save-url="Routes/crud"
+        :disable-option="{ card: true }"
+        table-height="85vh"
+        v-model:selected="selectedRows"
+        :table="{
+            'row-key': 'id',
+            selection: 'multiple',
+        }"
+    >
+        <template #moreBeforeActions>
+            <QBtn
+                icon="vn:clone"
+                color="primary"
+                class="q-mr-sm"
+                :disable="!selectedRows?.length"
+                @click="confirmationDialog = true"
+            >
+                <QTooltip>{{ t('Clone Selected Routes') }}</QTooltip>
+            </QBtn>
+            <QBtn
+                icon="cloud_download"
+                color="primary"
+                class="q-mr-sm"
+                :disable="!selectedRows?.length"
+                @click="showRouteReport"
+            >
+                <QTooltip>{{ t('Download selected routes as PDF') }}</QTooltip>
+            </QBtn>
+            <QBtn
+                icon="check"
+                color="primary"
+                class="q-mr-sm"
+                :disable="!selectedRows?.length"
+                @click="markAsServed()"
+            >
+                <QTooltip>{{ t('Mark as served') }}</QTooltip>
+            </QBtn>
+        </template>
+    </VnTable>
+</template>
+
+<style lang="scss" scoped>
+.table-input-cell {
+    max-width: 143px;
+}
+
+.route-list {
+    width: 100%;
+    max-height: 100%;
+}
+
+.table-actions {
+    gap: 12px;
+}
+th:last-child,
+td:last-child {
+    background-color: var(--vn-section-color);
+    position: sticky;
+    right: 0;
+}
+</style>
+<i18n>
+en:
+    newRoute: New Route
+    hourStarted: Started hour
+    hourFinished: Finished hour
+es:
+    From: Desde
+    To: Hasta
+    Worker: Trabajador
+    Agency: Agencia
+    Vehicle: Vehículo
+    Volume: Volumen
+    Date: Fecha
+    Description: Descripción
+    Hour started: Hora inicio
+    Hour finished: Hora fin
+    KmStart: Km inicio
+    KmEnd: Km fin
+    Served: Servida
+    newRoute: Nueva Ruta
+    Clone Selected Routes: Clonar rutas seleccionadas
+    Select the starting date: Seleccione la fecha de inicio
+    Stating date: Fecha de inicio
+    Cancel: Cancelar
+    Mark as served: Marcar como servidas
+    Download selected routes as PDF: Descargar rutas seleccionadas como PDF
+    Add ticket: Añadir tickets
+    Preview: Vista previa
+    Summary: Resumen
+    Route is closed: La ruta está cerrada
+    Route is not served: La ruta no está servida
+    hourStarted: Hora de inicio
+    hourFinished: Hora de fin
+</i18n>
diff --git a/src/pages/Route/RouteList.vue b/src/pages/Route/RouteList.vue
index 1e20df99c..20e5deb1e 100644
--- a/src/pages/Route/RouteList.vue
+++ b/src/pages/Route/RouteList.vue
@@ -1,34 +1,19 @@
 <script setup>
 import { computed, ref } from 'vue';
 import { useI18n } from 'vue-i18n';
-import { useSession } from 'composables/useSession';
 import { useSummaryDialog } from 'src/composables/useSummaryDialog';
-import { useQuasar } from 'quasar';
-import { toDate } from 'src/filters';
-import { useRouter } from 'vue-router';
+import { toHour } from 'src/filters';
 
-import axios from 'axios';
 import RouteSearchbar from 'pages/Route/Card/RouteSearchbar.vue';
-import RouteListTicketsDialog from 'pages/Route/Card/RouteListTicketsDialog.vue';
 import RouteSummary from 'pages/Route/Card/RouteSummary.vue';
 import RightMenu from 'src/components/common/RightMenu.vue';
 import RouteFilter from 'pages/Route/Card/RouteFilter.vue';
-
-import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
-import VnInputDate from 'components/common/VnInputDate.vue';
 import VnTable from 'components/VnTable/VnTable.vue';
-import { usePrintService } from 'src/composables/usePrintService';
+import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
 
-const { openReport } = usePrintService();
 const { t } = useI18n();
 const { viewSummary } = useSummaryDialog();
-const quasar = useQuasar();
-const session = useSession();
-const selectedRows = ref([]);
 const tableRef = ref([]);
-const confirmationDialog = ref(false);
-const startingDate = ref(null);
-const router = useRouter();
 const routeFilter = {
     include: [
         {
@@ -42,12 +27,12 @@ const routeFilter = {
 const columns = computed(() => [
     {
         align: 'left',
+        isId: true,
         name: 'id',
         label: 'Id',
         chip: {
             condition: () => true,
         },
-        isId: true,
         columnFilter: false,
     },
     {
@@ -55,138 +40,52 @@ const columns = computed(() => [
         name: 'workerFk',
         label: t('Worker'),
         create: true,
-        component: 'select',
-        attrs: {
-            url: 'Workers/activeWithInheritedRole',
-            fields: ['id', 'name'],
-            useLike: false,
-            optionFilter: 'firstName',
-            find: {
-                value: 'workerFk',
-                label: 'workerUserName',
-            },
-        },
-        columnFilter: {
-            inWhere: true,
-        },
-        useLike: false,
         cardVisible: true,
         format: (row, dashIfEmpty) => dashIfEmpty(row.travelRef),
+        columnFilter: false,
     },
     {
         align: 'left',
-        name: 'agencyModeFk',
+        name: 'agencyModeName',
         label: t('Agency'),
-        isTitle: true,
         cardVisible: true,
         create: true,
-        component: 'select',
-        attrs: {
-            url: 'agencyModes',
-            fields: ['id', 'name'],
-            find: {
-                value: 'agencyModeFk',
-                label: 'agencyName',
-            },
-        },
         columnClass: 'expand',
+        columnFilter: false,
     },
     {
         align: 'left',
-        name: 'vehicleFk',
+        name: 'vehiclePlateNumber',
         label: t('Vehicle'),
         cardVisible: true,
         create: true,
-        component: 'select',
-        attrs: {
-            url: 'vehicles',
-            fields: ['id', 'numberPlate'],
-            optionLabel: 'numberPlate',
-            optionFilterValue: 'numberPlate',
-            find: {
-                value: 'vehicleFk',
-                label: 'vehiclePlateNumber',
-            },
-        },
-        columnFilter: {
-            inWhere: true,
-        },
-    },
-    {
-        align: 'left',
-        name: 'created',
-        label: t('Date'),
         columnFilter: false,
-        cardVisible: true,
-        create: true,
-        component: 'date',
-        format: ({ date }) => toDate(date),
-    },
-    {
-        align: 'left',
-        name: 'from',
-        label: t('From'),
-        visible: false,
-        cardVisible: true,
-        create: true,
-        component: 'date',
-        format: ({ date }) => toDate(date),
-    },
-    {
-        align: 'left',
-        name: 'to',
-        label: t('To'),
-        visible: false,
-        cardVisible: true,
-        create: true,
-        component: 'date',
-        format: ({ date }) => toDate(date),
-    },
-    {
-        align: 'center',
-        name: 'm3',
-        label: t('Volume'),
-        cardVisible: true,
-        columnClass: 'shrink',
     },
     {
         align: 'left',
         name: 'started',
         label: t('hourStarted'),
-        component: 'time',
+        cardVisible: true,
         columnFilter: false,
+        format: (row) => toHour(row.started),
     },
     {
         align: 'left',
         name: 'finished',
         label: t('hourFinished'),
-        component: 'time',
+        cardVisible: true,
         columnFilter: false,
-    },
-    {
-        align: 'center',
-        name: 'kmStart',
-        label: t('KmStart'),
-        columnClass: 'shrink',
-        create: true,
-        visible: false,
-    },
-    {
-        align: 'center',
-        name: 'kmEnd',
-        label: t('KmEnd'),
-        columnClass: 'shrink',
-        create: true,
-        visible: false,
+        format: (row) => toHour(row.started),
     },
     {
         align: 'left',
         name: 'description',
         label: t('Description'),
+        cardVisible: true,
         isTitle: true,
         create: true,
-        component: 'input',
         field: 'description',
+        columnFilter: false,
     },
     {
         align: 'left',
@@ -200,111 +99,29 @@ const columns = computed(() => [
         align: 'right',
         name: 'tableActions',
         actions: [
-            {
-                title: t('Add tickets'),
-                icon: 'vn:ticketAdd',
-                action: (row) => openTicketsDialog(row?.id),
-            },
             {
                 title: t('components.smartCard.viewSummary'),
                 icon: 'preview',
                 action: (row) => viewSummary(row?.id, RouteSummary),
-            },
-            {
-                title: t('Route summary'),
-                icon: 'arrow_forward',
-                isPrimary: true,
-                action: (row) => navigate(row?.id),
+                color: 'primary',
             },
         ],
     },
 ]);
-
-function navigate(id) {
-    router.push({ path: `/route/${id}` });
-}
-
-const cloneRoutes = () => {
-    if (!selectedRows.value.length || !startingDate.value) return;
-    axios.post('Routes/clone', {
-        created: startingDate.value,
-        ids: selectedRows.value.map((row) => row?.id),
-    });
-    startingDate.value = null;
-    tableRef.value.reload();
-};
-
-const showRouteReport = () => {
-    const ids = selectedRows.value.map((row) => row?.id);
-    const idString = ids.join(',');
-    let url = `Routes/${idString}/driver-route-pdf`;
-    let params = {};
-    if (selectedRows.value.length >= 1) {
-        params = {
-            id: idString,
-        };
-        url = `Routes/downloadZip`;
-    }
-    openReport(url, params, '_blank');
-};
-
-function markAsServed() {
-    selectedRows.value.forEach(async (row) => {
-        await axios.patch(`Routes/${row?.id}`, { isOk: true });
-    });
-    tableRef.value.reload();
-    startingDate.value = null;
-}
-
-const openTicketsDialog = (id) => {
-    quasar
-        .dialog({
-            component: RouteListTicketsDialog,
-            componentProps: {
-                id,
-            },
-        })
-        .onOk(() => tableRef.value.reload());
-};
 </script>
-
 <template>
     <RouteSearchbar />
-    <QDialog v-model="confirmationDialog">
-        <QCard style="min-width: 350px">
-            <QCardSection>
-                <p class="text-h6 q-ma-none">{{ t('Select the starting date') }}</p>
-            </QCardSection>
-
-            <QCardSection class="q-pt-none">
-                <VnInputDate
-                    :label="t('Stating date')"
-                    v-model="startingDate"
-                    autofocus
-                />
-            </QCardSection>
-            <QCardActions align="right">
-                <QBtn flat :label="t('Cancel')" v-close-popup class="text-primary" />
-                <QBtn color="primary" v-close-popup @click="cloneRoutes">
-                    {{ t('globals.clone') }}
-                </QBtn>
-            </QCardActions>
-        </QCard>
-    </QDialog>
-    <VnSubToolbar />
     <RightMenu>
         <template #right-panel>
             <RouteFilter data-key="RouteList" />
         </template>
     </RightMenu>
     <VnTable
-        class="route-list"
         ref="tableRef"
         data-key="RouteList"
         url="Routes/filter"
         :columns="columns"
         :right-search="false"
-        :is-editable="true"
         :filter="routeFilter"
         redirect="route"
         :row-click="false"
@@ -314,98 +131,22 @@ const openTicketsDialog = (id) => {
             onDataSaved: ({ id }) => tableRef.redirect(id),
             formInitialData: {},
         }"
-        save-url="Routes/crud"
-        :disable-option="{ card: true }"
         table-height="85vh"
-        v-model:selected="selectedRows"
-        :table="{
-            'row-key': 'id',
-            selection: 'multiple',
-        }"
     >
-        <template #moreBeforeActions>
-            <QBtn
-                icon="vn:clone"
-                color="primary"
-                class="q-mr-sm"
-                :disable="!selectedRows?.length"
-                @click="confirmationDialog = true"
-            >
-                <QTooltip>{{ t('Clone Selected Routes') }}</QTooltip>
-            </QBtn>
-            <QBtn
-                icon="cloud_download"
-                color="primary"
-                class="q-mr-sm"
-                :disable="!selectedRows?.length"
-                @click="showRouteReport"
-            >
-                <QTooltip>{{ t('Download selected routes as PDF') }}</QTooltip>
-            </QBtn>
-            <QBtn
-                icon="check"
-                color="primary"
-                class="q-mr-sm"
-                :disable="!selectedRows?.length"
-                @click="markAsServed()"
-            >
-                <QTooltip>{{ t('Mark as served') }}</QTooltip>
-            </QBtn>
+        <template #column-workerFk="{ row }">
+            <span class="link" @click.stop>
+                {{ row?.workerUserName }}
+                <WorkerDescriptorProxy :id="row?.workerFk" v-if="row?.workerFk" />
+            </span>
         </template>
     </VnTable>
 </template>
-
-<style lang="scss" scoped>
-.table-input-cell {
-    max-width: 143px;
-}
-
-.route-list {
-    width: 100%;
-    max-height: 100%;
-}
-
-.table-actions {
-    gap: 12px;
-}
-th:last-child,
-td:last-child {
-    background-color: var(--vn-section-color);
-    position: sticky;
-    right: 0;
-}
-</style>
 <i18n>
-en:
-    newRoute: New Route
-    hourStarted: Started hour
-    hourFinished: Finished hour
 es:
-    From: Desde
-    To: Hasta
     Worker: Trabajador
     Agency: Agencia
     Vehicle: Vehículo
-    Volume: Volumen
-    Date: Fecha
     Description: Descripción
     Hour started: Hora inicio
     Hour finished: Hora fin
-    KmStart: Km inicio
-    KmEnd: Km fin
-    Served: Servida
-    newRoute: Nueva Ruta
-    Clone Selected Routes: Clonar rutas seleccionadas
-    Select the starting date: Seleccione la fecha de inicio
-    Stating date: Fecha de inicio
-    Cancel: Cancelar
-    Mark as served: Marcar como servidas
-    Download selected routes as PDF: Descargar rutas seleccionadas como PDF
-    Add ticket: Añadir tickets
-    Preview: Vista previa
-    Summary: Resumen
-    Route is closed: La ruta está cerrada
-    Route is not served: La ruta no está servida
-    hourStarted: Hora de inicio
-    hourFinished: Hora de fin
 </i18n>
diff --git a/src/router/modules/route.js b/src/router/modules/route.js
index 3c5c860cf..9a7b16df3 100644
--- a/src/router/modules/route.js
+++ b/src/router/modules/route.js
@@ -11,7 +11,14 @@ export default {
     component: RouterView,
     redirect: { name: 'RouteMain' },
     menus: {
-        main: ['RouteList', 'RouteAutonomous', 'RouteRoadmap', 'CmrList', 'AgencyList'],
+        main: [
+            'RouteList',
+            'RouteExtendedList',
+            'RouteAutonomous',
+            'RouteRoadmap',
+            'CmrList',
+            'AgencyList',
+        ],
         card: ['RouteBasicData', 'RouteTickets', 'RouteLog'],
     },
     children: [
@@ -19,9 +26,6 @@ export default {
             path: '/route',
             name: 'RouteMain',
             component: () => import('src/components/common/VnSectionMain.vue'),
-            props: {
-                leftDrawer: false,
-            },
             redirect: { name: 'RouteList' },
             children: [
                 {
@@ -33,6 +37,15 @@ export default {
                     },
                     component: () => import('src/pages/Route/RouteList.vue'),
                 },
+                {
+                    path: 'extended-list',
+                    name: 'RouteExtendedList',
+                    meta: {
+                        title: 'RouteExtendedList',
+                        icon: 'format_list_bulleted',
+                    },
+                    component: () => import('src/pages/Route/RouteExtendedList.vue'),
+                },
                 {
                     path: 'create',
                     name: 'RouteCreate',
@@ -78,7 +91,7 @@ export default {
                             name: 'AgencyList',
                             meta: {
                                 title: 'agencyList',
-                                icon: 'view_list',
+                                icon: 'list',
                             },
                             component: () =>
                                 import('src/pages/Route/Agency/AgencyList.vue'),

From c400929c9956587d5cfe9cab8a2a10082ff1cd5b Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Tue, 24 Sep 2024 08:33:16 +0200
Subject: [PATCH 2/8] fix: refs #7129 translate page title

---
 src/i18n/locale/en.yml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml
index f6c9b15fd..11fe8c41c 100644
--- a/src/i18n/locale/en.yml
+++ b/src/i18n/locale/en.yml
@@ -135,7 +135,7 @@ globals:
         fiscalData: Fiscal data
         billingData: Billing data
         consignees: Consignees
-        'address-create': New address
+        address-create: New address
         notes: Notes
         credits: Credits
         greuges: Greuges
@@ -273,6 +273,7 @@ globals:
         clientsActionsMonitor: Clients and actions
         serial: Serial
         medical: Mutual
+        RouteExtendedList: Extended list
     supplier: Supplier
     created: Created
     worker: Worker

From 70d640dc378e9c7df5ddcf2312284021d1a73b9c Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Tue, 24 Sep 2024 12:54:34 +0200
Subject: [PATCH 3/8] fix: refs #7129 some style issues

---
 src/pages/Route/Card/RouteListTicketsDialog.vue | 2 +-
 src/pages/Route/RouteList.vue                   | 3 +--
 src/pages/Route/RouteRoadmap.vue                | 2 +-
 src/pages/Route/RouteTickets.vue                | 9 +++------
 4 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/src/pages/Route/Card/RouteListTicketsDialog.vue b/src/pages/Route/Card/RouteListTicketsDialog.vue
index ba07f859f..b9b2ee36b 100644
--- a/src/pages/Route/Card/RouteListTicketsDialog.vue
+++ b/src/pages/Route/Card/RouteListTicketsDialog.vue
@@ -167,8 +167,8 @@ const setTicketsRoute = async () => {
                         <QTd :props="props">
                             <span class="link">
                                 {{ props.value }}
-                                <TicketDescriptorProxy :id="props?.row?.id" />
                             </span>
+                            <TicketDescriptorProxy :id="props?.row?.id" />
                         </QTd>
                     </template>
                     <template #body-cell-client="props">
diff --git a/src/pages/Route/RouteList.vue b/src/pages/Route/RouteList.vue
index 20e5deb1e..b6c23f8ed 100644
--- a/src/pages/Route/RouteList.vue
+++ b/src/pages/Route/RouteList.vue
@@ -46,7 +46,7 @@ const columns = computed(() => [
     },
     {
         align: 'left',
-        name: 'agencyModeName',
+        name: 'agencyName',
         label: t('Agency'),
         cardVisible: true,
         create: true,
@@ -124,7 +124,6 @@ const columns = computed(() => [
         :right-search="false"
         :filter="routeFilter"
         redirect="route"
-        :row-click="false"
         :create="{
             urlCreate: 'Routes',
             title: t('Create route'),
diff --git a/src/pages/Route/RouteRoadmap.vue b/src/pages/Route/RouteRoadmap.vue
index d921dab1f..3687442f5 100644
--- a/src/pages/Route/RouteRoadmap.vue
+++ b/src/pages/Route/RouteRoadmap.vue
@@ -87,7 +87,7 @@ const columns = computed(() => [
         actions: [
             {
                 title: t('Ver cmr'),
-                icon: 'visibility',
+                icon: 'preview',
                 isPrimary: true,
                 action: (row) => viewSummary(row?.id, RoadmapSummary),
             },
diff --git a/src/pages/Route/RouteTickets.vue b/src/pages/Route/RouteTickets.vue
index 5960636b0..3bdad4fec 100644
--- a/src/pages/Route/RouteTickets.vue
+++ b/src/pages/Route/RouteTickets.vue
@@ -342,10 +342,7 @@ const openSmsDialog = async () => {
                             </template>
                             <template #body-cell-city="{ value, row }">
                                 <QTd auto-width>
-                                    <span
-                                        class="text-primary cursor-pointer"
-                                        @click="goToBuscaman(row)"
-                                    >
+                                    <span class="link" @click="goToBuscaman(row)">
                                         {{ value }}
                                         <QTooltip>{{ t('Open buscaman') }}</QTooltip>
                                     </span>
@@ -353,7 +350,7 @@ const openSmsDialog = async () => {
                             </template>
                             <template #body-cell-client="{ value, row }">
                                 <QTd auto-width>
-                                    <span class="text-primary cursor-pointer">
+                                    <span class="link">
                                         {{ value }}
                                         <CustomerDescriptorProxy :id="row?.clientFk" />
                                     </span>
@@ -361,7 +358,7 @@ const openSmsDialog = async () => {
                             </template>
                             <template #body-cell-ticket="{ value, row }">
                                 <QTd auto-width class="text-center">
-                                    <span class="text-primary cursor-pointer">
+                                    <span class="link">
                                         {{ value }}
                                         <TicketDescriptorProxy :id="row?.id" />
                                     </span>

From f0c2baa60edf2d281c393e69b2df5c097fd61361 Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Tue, 24 Sep 2024 12:56:14 +0200
Subject: [PATCH 4/8] fix: refs #7129  remove consoleLog

---
 src/filters/toHour.js | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/filters/toHour.js b/src/filters/toHour.js
index b5cc61c81..52df9c8cd 100644
--- a/src/filters/toHour.js
+++ b/src/filters/toHour.js
@@ -1,7 +1,6 @@
 import isValidDate from 'filters/isValidDate';
 
 export default function toHour(date) {
-    console.log('date: ', date);
     if (!isValidDate(date)) {
         return '--:--';
     }

From 27b699ebf4f96fcdff05f58a35c1893655824076 Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Wed, 25 Sep 2024 11:16:27 +0200
Subject: [PATCH 5/8] fix: refs #7129 some component styles

---
 src/i18n/locale/en.yml                  |   8 +-
 src/i18n/locale/es.yml                  |   6 +-
 src/pages/Item/ItemFixedPrice.vue       |   2 -
 src/pages/Route/Agency/AgencyList.vue   |   1 -
 src/pages/Route/RouteExtendedList.vue   | 119 +++++++-----------------
 src/pages/Route/RouteList.vue           |  28 ++----
 src/pages/Route/locale/en.yml           |  25 +++++
 src/pages/Route/locale/es.yml           |  25 +++++
 src/pages/Travel/Card/TravelSummary.vue |   2 +-
 9 files changed, 101 insertions(+), 115 deletions(-)
 create mode 100644 src/pages/Route/locale/en.yml
 create mode 100644 src/pages/Route/locale/es.yml

diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml
index 6b9a4a1e1..f1e502998 100644
--- a/src/i18n/locale/en.yml
+++ b/src/i18n/locale/en.yml
@@ -111,7 +111,7 @@ globals:
         basicData: Basic data
         log: Logs
         parkingList: Parkings list
-        agencyList: Agencies list
+        agencyList: Agencies
         agency: Agency
         workCenters: Work centers
         modes: Modes
@@ -207,7 +207,7 @@ globals:
         roadmap: Roadmap
         stops: Stops
         routes: Routes
-        cmrsList: CMRs list
+        cmrsList: CMRs
         RouteList: List
         routeCreate: New route
         RouteRoadmap: Roadmaps
@@ -273,7 +273,7 @@ globals:
         clientsActionsMonitor: Clients and actions
         serial: Serial
         medical: Mutual
-        RouteExtendedList: Extended list
+        RouteExtendedList: Router
     supplier: Supplier
     created: Created
     worker: Worker
@@ -880,7 +880,7 @@ route:
         tickets: Tickets
         log: Log
         autonomous: Autonomous
-        RouteExtendedList: Extended list
+        RouteExtendedList: Router
     cmr:
         list:
             results: results
diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml
index 15eba6706..e62553446 100644
--- a/src/i18n/locale/es.yml
+++ b/src/i18n/locale/es.yml
@@ -113,7 +113,7 @@ globals:
         basicData: Datos básicos
         log: Historial
         parkingList: Listado de parkings
-        agencyList: Listado de agencias
+        agencyList: Agencias
         agency: Agencia
         workCenters: Centros de trabajo
         modes: Modos
@@ -211,13 +211,13 @@ globals:
         roadmap: Troncales
         stops: Paradas
         routes: Rutas
-        cmrsList: Listado de CMRs
+        cmrsList: CMRs
         RouteList: Listado
         routeCreate: Nueva ruta
         RouteRoadmap: Troncales
         RouteRoadmapCreate: Crear troncal
         autonomous: Autónomos
-        RouteExtendedList: Listado extendido
+        RouteExtendedList: Enrutador
         suppliers: Proveedores
         supplier: Proveedor
         supplierCreate: Nuevo proveedor
diff --git a/src/pages/Item/ItemFixedPrice.vue b/src/pages/Item/ItemFixedPrice.vue
index fddf154a2..2158065bd 100644
--- a/src/pages/Item/ItemFixedPrice.vue
+++ b/src/pages/Item/ItemFixedPrice.vue
@@ -600,11 +600,9 @@ function handleOnDataSave({ CrudModelRef }) {
 .q-table th,
 .q-table td {
     padding-inline: 5px !important;
-    // text-align: -webkit-right;
 }
 .q-table tbody td {
     max-width: none;
-
     .q-td.col {
         & .vnInputDate {
             min-width: 90px;
diff --git a/src/pages/Route/Agency/AgencyList.vue b/src/pages/Route/Agency/AgencyList.vue
index 30ee52f54..9d456c1da 100644
--- a/src/pages/Route/Agency/AgencyList.vue
+++ b/src/pages/Route/Agency/AgencyList.vue
@@ -76,7 +76,6 @@ const columns = computed(() => [
     <div class="list-container">
         <div class="list">
             <VnTable
-                ref="tableRef"
                 data-key="AgencyList"
                 url="Agencies"
                 order="name"
diff --git a/src/pages/Route/RouteExtendedList.vue b/src/pages/Route/RouteExtendedList.vue
index 1e20df99c..b90434f4f 100644
--- a/src/pages/Route/RouteExtendedList.vue
+++ b/src/pages/Route/RouteExtendedList.vue
@@ -1,11 +1,11 @@
 <script setup>
 import { computed, ref } from 'vue';
 import { useI18n } from 'vue-i18n';
-import { useSession } from 'composables/useSession';
 import { useSummaryDialog } from 'src/composables/useSummaryDialog';
 import { useQuasar } from 'quasar';
 import { toDate } from 'src/filters';
 import { useRouter } from 'vue-router';
+import { usePrintService } from 'src/composables/usePrintService';
 
 import axios from 'axios';
 import RouteSearchbar from 'pages/Route/Card/RouteSearchbar.vue';
@@ -13,17 +13,14 @@ import RouteListTicketsDialog from 'pages/Route/Card/RouteListTicketsDialog.vue'
 import RouteSummary from 'pages/Route/Card/RouteSummary.vue';
 import RightMenu from 'src/components/common/RightMenu.vue';
 import RouteFilter from 'pages/Route/Card/RouteFilter.vue';
-
 import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
 import VnInputDate from 'components/common/VnInputDate.vue';
 import VnTable from 'components/VnTable/VnTable.vue';
-import { usePrintService } from 'src/composables/usePrintService';
 
 const { openReport } = usePrintService();
 const { t } = useI18n();
 const { viewSummary } = useSummaryDialog();
 const quasar = useQuasar();
-const session = useSession();
 const selectedRows = ref([]);
 const tableRef = ref([]);
 const confirmationDialog = ref(false);
@@ -53,7 +50,7 @@ const columns = computed(() => [
     {
         align: 'left',
         name: 'workerFk',
-        label: t('Worker'),
+        label: t('route.Worker'),
         create: true,
         component: 'select',
         attrs: {
@@ -76,7 +73,7 @@ const columns = computed(() => [
     {
         align: 'left',
         name: 'agencyModeFk',
-        label: t('Agency'),
+        label: t('route.Agency'),
         isTitle: true,
         cardVisible: true,
         create: true,
@@ -94,7 +91,7 @@ const columns = computed(() => [
     {
         align: 'left',
         name: 'vehicleFk',
-        label: t('Vehicle'),
+        label: t('route.Vehicle'),
         cardVisible: true,
         create: true,
         component: 'select',
@@ -115,7 +112,7 @@ const columns = computed(() => [
     {
         align: 'left',
         name: 'created',
-        label: t('Date'),
+        label: t('route.Date'),
         columnFilter: false,
         cardVisible: true,
         create: true,
@@ -125,7 +122,7 @@ const columns = computed(() => [
     {
         align: 'left',
         name: 'from',
-        label: t('From'),
+        label: t('route.From'),
         visible: false,
         cardVisible: true,
         create: true,
@@ -135,7 +132,7 @@ const columns = computed(() => [
     {
         align: 'left',
         name: 'to',
-        label: t('To'),
+        label: t('route.To'),
         visible: false,
         cardVisible: true,
         create: true,
@@ -145,28 +142,28 @@ const columns = computed(() => [
     {
         align: 'center',
         name: 'm3',
-        label: t('Volume'),
+        label: 'm3',
         cardVisible: true,
         columnClass: 'shrink',
     },
     {
         align: 'left',
         name: 'started',
-        label: t('hourStarted'),
+        label: t('route.hourStarted'),
         component: 'time',
         columnFilter: false,
     },
     {
         align: 'left',
         name: 'finished',
-        label: t('hourFinished'),
+        label: t('route.hourFinished'),
         component: 'time',
         columnFilter: false,
     },
     {
         align: 'center',
         name: 'kmStart',
-        label: t('KmStart'),
+        label: t('route.KmStart'),
         columnClass: 'shrink',
         create: true,
         visible: false,
@@ -174,7 +171,7 @@ const columns = computed(() => [
     {
         align: 'center',
         name: 'kmEnd',
-        label: t('KmEnd'),
+        label: t('route.KmEnd'),
         columnClass: 'shrink',
         create: true,
         visible: false,
@@ -182,7 +179,7 @@ const columns = computed(() => [
     {
         align: 'left',
         name: 'description',
-        label: t('Description'),
+        label: t('route.Description'),
         isTitle: true,
         create: true,
         component: 'input',
@@ -191,7 +188,7 @@ const columns = computed(() => [
     {
         align: 'left',
         name: 'isOk',
-        label: t('Served'),
+        label: t('route.Served'),
         component: 'checkbox',
         columnFilter: false,
         columnClass: 'shrink',
@@ -201,20 +198,22 @@ const columns = computed(() => [
         name: 'tableActions',
         actions: [
             {
-                title: t('Add tickets'),
+                title: t('route.Add tickets'),
                 icon: 'vn:ticketAdd',
                 action: (row) => openTicketsDialog(row?.id),
+                isPrimary: true,
             },
             {
-                title: t('components.smartCard.viewSummary'),
+                title: t('route.components.smartCard.viewSummary'),
                 icon: 'preview',
                 action: (row) => viewSummary(row?.id, RouteSummary),
+                isPrimary: true,
             },
             {
-                title: t('Route summary'),
+                title: t('route.Route summary'),
                 icon: 'arrow_forward',
-                isPrimary: true,
                 action: (row) => navigate(row?.id),
+                isPrimary: true,
             },
         ],
     },
@@ -226,7 +225,7 @@ function navigate(id) {
 
 const cloneRoutes = () => {
     if (!selectedRows.value.length || !startingDate.value) return;
-    axios.post('Routes/clone', {
+    axios.post('route.Routes/clone', {
         created: startingDate.value,
         ids: selectedRows.value.map((row) => row?.id),
     });
@@ -273,20 +272,25 @@ const openTicketsDialog = (id) => {
     <QDialog v-model="confirmationDialog">
         <QCard style="min-width: 350px">
             <QCardSection>
-                <p class="text-h6 q-ma-none">{{ t('Select the starting date') }}</p>
+                <p class="text-h6 q-ma-none">{{ t('route.Select the starting date') }}</p>
             </QCardSection>
 
             <QCardSection class="q-pt-none">
                 <VnInputDate
-                    :label="t('Stating date')"
+                    :label="t('route.Stating date')"
                     v-model="startingDate"
                     autofocus
                 />
             </QCardSection>
             <QCardActions align="right">
-                <QBtn flat :label="t('Cancel')" v-close-popup class="text-primary" />
+                <QBtn
+                    flat
+                    :label="t('route.Cancel')"
+                    v-close-popup
+                    class="text-primary"
+                />
                 <QBtn color="primary" v-close-popup @click="cloneRoutes">
-                    {{ t('globals.clone') }}
+                    {{ t('route.globals.clone') }}
                 </QBtn>
             </QCardActions>
         </QCard>
@@ -310,7 +314,7 @@ const openTicketsDialog = (id) => {
         :row-click="false"
         :create="{
             urlCreate: 'Routes',
-            title: t('Create route'),
+            title: t('route.createRoute'),
             onDataSaved: ({ id }) => tableRef.redirect(id),
             formInitialData: {},
         }"
@@ -331,7 +335,7 @@ const openTicketsDialog = (id) => {
                 :disable="!selectedRows?.length"
                 @click="confirmationDialog = true"
             >
-                <QTooltip>{{ t('Clone Selected Routes') }}</QTooltip>
+                <QTooltip>{{ t('route.Clone Selected Routes') }}</QTooltip>
             </QBtn>
             <QBtn
                 icon="cloud_download"
@@ -340,7 +344,7 @@ const openTicketsDialog = (id) => {
                 :disable="!selectedRows?.length"
                 @click="showRouteReport"
             >
-                <QTooltip>{{ t('Download selected routes as PDF') }}</QTooltip>
+                <QTooltip>{{ t('route.Download selected routes as PDF') }}</QTooltip>
             </QBtn>
             <QBtn
                 icon="check"
@@ -349,63 +353,8 @@ const openTicketsDialog = (id) => {
                 :disable="!selectedRows?.length"
                 @click="markAsServed()"
             >
-                <QTooltip>{{ t('Mark as served') }}</QTooltip>
+                <QTooltip>{{ t('route.Mark as served') }}</QTooltip>
             </QBtn>
         </template>
     </VnTable>
 </template>
-
-<style lang="scss" scoped>
-.table-input-cell {
-    max-width: 143px;
-}
-
-.route-list {
-    width: 100%;
-    max-height: 100%;
-}
-
-.table-actions {
-    gap: 12px;
-}
-th:last-child,
-td:last-child {
-    background-color: var(--vn-section-color);
-    position: sticky;
-    right: 0;
-}
-</style>
-<i18n>
-en:
-    newRoute: New Route
-    hourStarted: Started hour
-    hourFinished: Finished hour
-es:
-    From: Desde
-    To: Hasta
-    Worker: Trabajador
-    Agency: Agencia
-    Vehicle: Vehículo
-    Volume: Volumen
-    Date: Fecha
-    Description: Descripción
-    Hour started: Hora inicio
-    Hour finished: Hora fin
-    KmStart: Km inicio
-    KmEnd: Km fin
-    Served: Servida
-    newRoute: Nueva Ruta
-    Clone Selected Routes: Clonar rutas seleccionadas
-    Select the starting date: Seleccione la fecha de inicio
-    Stating date: Fecha de inicio
-    Cancel: Cancelar
-    Mark as served: Marcar como servidas
-    Download selected routes as PDF: Descargar rutas seleccionadas como PDF
-    Add ticket: Añadir tickets
-    Preview: Vista previa
-    Summary: Resumen
-    Route is closed: La ruta está cerrada
-    Route is not served: La ruta no está servida
-    hourStarted: Hora de inicio
-    hourFinished: Hora de fin
-</i18n>
diff --git a/src/pages/Route/RouteList.vue b/src/pages/Route/RouteList.vue
index b6c23f8ed..d0feb9a65 100644
--- a/src/pages/Route/RouteList.vue
+++ b/src/pages/Route/RouteList.vue
@@ -38,7 +38,7 @@ const columns = computed(() => [
     {
         align: 'left',
         name: 'workerFk',
-        label: t('Worker'),
+        label: t('route.Worker'),
         create: true,
         cardVisible: true,
         format: (row, dashIfEmpty) => dashIfEmpty(row.travelRef),
@@ -47,7 +47,7 @@ const columns = computed(() => [
     {
         align: 'left',
         name: 'agencyName',
-        label: t('Agency'),
+        label: t('route.Agency'),
         cardVisible: true,
         create: true,
         columnClass: 'expand',
@@ -56,7 +56,7 @@ const columns = computed(() => [
     {
         align: 'left',
         name: 'vehiclePlateNumber',
-        label: t('Vehicle'),
+        label: t('route.Vehicle'),
         cardVisible: true,
         create: true,
         columnFilter: false,
@@ -64,7 +64,7 @@ const columns = computed(() => [
     {
         align: 'left',
         name: 'started',
-        label: t('hourStarted'),
+        label: t('route.hourStarted'),
         cardVisible: true,
         columnFilter: false,
         format: (row) => toHour(row.started),
@@ -72,7 +72,7 @@ const columns = computed(() => [
     {
         align: 'left',
         name: 'finished',
-        label: t('hourFinished'),
+        label: t('route.hourFinished'),
         cardVisible: true,
         columnFilter: false,
         format: (row) => toHour(row.started),
@@ -80,7 +80,7 @@ const columns = computed(() => [
     {
         align: 'left',
         name: 'description',
-        label: t('Description'),
+        label: t('route.Description'),
         cardVisible: true,
         isTitle: true,
         create: true,
@@ -90,7 +90,7 @@ const columns = computed(() => [
     {
         align: 'left',
         name: 'isOk',
-        label: t('Served'),
+        label: t('route.Served'),
         component: 'checkbox',
         columnFilter: false,
         columnClass: 'shrink',
@@ -103,7 +103,7 @@ const columns = computed(() => [
                 title: t('components.smartCard.viewSummary'),
                 icon: 'preview',
                 action: (row) => viewSummary(row?.id, RouteSummary),
-                color: 'primary',
+                isPrimary: true,
             },
         ],
     },
@@ -117,7 +117,6 @@ const columns = computed(() => [
         </template>
     </RightMenu>
     <VnTable
-        ref="tableRef"
         data-key="RouteList"
         url="Routes/filter"
         :columns="columns"
@@ -126,7 +125,7 @@ const columns = computed(() => [
         redirect="route"
         :create="{
             urlCreate: 'Routes',
-            title: t('Create route'),
+            title: t('route.createRoute'),
             onDataSaved: ({ id }) => tableRef.redirect(id),
             formInitialData: {},
         }"
@@ -140,12 +139,3 @@ const columns = computed(() => [
         </template>
     </VnTable>
 </template>
-<i18n>
-es:
-    Worker: Trabajador
-    Agency: Agencia
-    Vehicle: Vehículo
-    Description: Descripción
-    Hour started: Hora inicio
-    Hour finished: Hora fin
-</i18n>
diff --git a/src/pages/Route/locale/en.yml b/src/pages/Route/locale/en.yml
new file mode 100644
index 000000000..617d704d2
--- /dev/null
+++ b/src/pages/Route/locale/en.yml
@@ -0,0 +1,25 @@
+route:
+    Worker: Worker
+    Agency: Agency
+    Vehicle: Vehicle
+    Description: Description
+    hourStarted: H.Start
+    hourFinished: H.End
+    createRoute: Create route
+    From: From
+    To: To
+    Date: Date
+    KmStart: Km start
+    KmEnd: Km end
+    Served: Served
+    Clone Selected Routes: Clone selected routes
+    Select the starting date: Select the starting date
+    Stating date: Starting date
+    Cancel: Cancel
+    Mark as served: Mark as served
+    Download selected routes as PDF: Download selected routes as PDF
+    Add ticket: Add ticket
+    Preview: Preview
+    Summary: Summary
+    Route is closed: Route is closed
+    Route is not served: Route is not served
diff --git a/src/pages/Route/locale/es.yml b/src/pages/Route/locale/es.yml
new file mode 100644
index 000000000..ed96ad915
--- /dev/null
+++ b/src/pages/Route/locale/es.yml
@@ -0,0 +1,25 @@
+route:
+    Worker: Trabajador
+    Agency: Agencia
+    Vehicle: Vehículo
+    Description: Descripción
+    hourStarted: H.Inicio
+    hourFinished: H.Fin
+    createRoute: Crear ruta
+    From: Desde
+    To: Hasta
+    Date: Fecha
+    KmStart: Km inicio
+    KmEnd: Km fin
+    Served: Servida
+    Clone Selected Routes: Clonar rutas seleccionadas
+    Select the starting date: Seleccione la fecha de inicio
+    Stating date: Fecha de inicio
+    Cancel: Cancelar
+    Mark as served: Marcar como servidas
+    Download selected routes as PDF: Descargar rutas seleccionadas como PDF
+    Add ticket: Añadir tickets
+    Preview: Vista previa
+    Summary: Resumen
+    Route is closed: La ruta está cerrada
+    Route is not served: La ruta no está servida
diff --git a/src/pages/Travel/Card/TravelSummary.vue b/src/pages/Travel/Card/TravelSummary.vue
index d7dce911b..829eb3a17 100644
--- a/src/pages/Travel/Card/TravelSummary.vue
+++ b/src/pages/Travel/Card/TravelSummary.vue
@@ -319,7 +319,7 @@ const getLink = (param) => `#/travel/${entityId.value}/${param}`;
                     </template>
                     <template #body-cell-id="{ col, value }">
                         <QTd>
-                            <QBtn v-if="col.name === 'id'" flat color="blue">
+                            <QBtn v-if="col.name === 'id'" flat class="link">
                                 {{ value }}
                                 <EntryDescriptorProxy :id="value" />
                             </QBtn>

From ca568c31ca5168b9825d2cd529fb955c5532899b Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Wed, 25 Sep 2024 11:51:51 +0200
Subject: [PATCH 6/8] fix: refs #7129 clone post

---
 src/pages/Route/RouteExtendedList.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pages/Route/RouteExtendedList.vue b/src/pages/Route/RouteExtendedList.vue
index b90434f4f..bf5d844f6 100644
--- a/src/pages/Route/RouteExtendedList.vue
+++ b/src/pages/Route/RouteExtendedList.vue
@@ -225,7 +225,7 @@ function navigate(id) {
 
 const cloneRoutes = () => {
     if (!selectedRows.value.length || !startingDate.value) return;
-    axios.post('route.Routes/clone', {
+    axios.post('Routes/clone', {
         created: startingDate.value,
         ids: selectedRows.value.map((row) => row?.id),
     });

From cea5edd506e93e043507b8b94591bfa749d77f1b Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Wed, 25 Sep 2024 12:33:19 +0200
Subject: [PATCH 7/8] fix: refs #7129 translate

---
 src/pages/Route/RouteExtendedList.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pages/Route/RouteExtendedList.vue b/src/pages/Route/RouteExtendedList.vue
index bf5d844f6..51da4ec12 100644
--- a/src/pages/Route/RouteExtendedList.vue
+++ b/src/pages/Route/RouteExtendedList.vue
@@ -290,7 +290,7 @@ const openTicketsDialog = (id) => {
                     class="text-primary"
                 />
                 <QBtn color="primary" v-close-popup @click="cloneRoutes">
-                    {{ t('route.globals.clone') }}
+                    {{ t('globals.clone') }}
                 </QBtn>
             </QCardActions>
         </QCard>

From a2b7e8198202298613ea40ad592112da4af7c019 Mon Sep 17 00:00:00 2001
From: jgallego <jgallego@verdnatura.es>
Date: Thu, 26 Sep 2024 16:23:18 +0200
Subject: [PATCH 8/8] feat: warehouse

---
 src/pages/Travel/Card/TravelThermographsForm.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pages/Travel/Card/TravelThermographsForm.vue b/src/pages/Travel/Card/TravelThermographsForm.vue
index 1d3410903..42acf30b9 100644
--- a/src/pages/Travel/Card/TravelThermographsForm.vue
+++ b/src/pages/Travel/Card/TravelThermographsForm.vue
@@ -101,7 +101,7 @@ const setEditDefaultParams = async () => {
         thermographForm.value.thermographFk = data.thermographFk;
         thermographForm.value.state = data.result;
         thermographForm.value.reference = data.dms?.reference;
-        thermographForm.value.warehouseId = data.dms?.warehouseFk;
+        thermographForm.value.warehouseId = data.warehouseFk;
         thermographForm.value.companyId = data.dms?.companyFk;
         thermographForm.value.dmsTypeId = data.dms?.dmsTypeFk;
         thermographForm.value.description = data.dms?.description || '';