#5186 create parking section #197

Merged
jorgep merged 29 commits from 5186-CreateParkingSection into dev 2024-03-27 08:42:33 +00:00
11 changed files with 61 additions and 56 deletions
Showing only changes of commit d2efbb204f - Show all commits

View File

@ -41,7 +41,12 @@ const state = useState();
const slots = useSlots();
const { t } = useI18n();
const { viewSummary } = useSummaryDialog();
const { store } = useArrayData($props.dataKey);
const arrayData = useArrayData($props.dataKey || $props.module, {
url: $props.url,
filter: $props.filter,
skip: 0,
});
const { store } = arrayData;
const entity = computed(() => store.data);
const isLoading = ref(false);
@ -49,24 +54,15 @@ defineExpose({
getData,
});
onBeforeMount(async () => {
if ($props.url) {
await getData();
watch(
() => $props.url,

De momento, para que sea retrocompatible con el resto de secciones a la hora de abrir los descriptors, se hace la llamada siempre , pero si se hace refactor se puede evitar hacer la llamada. Pero ya usa los datos desde arrayData.

De momento, para que sea retrocompatible con el resto de secciones a la hora de abrir los descriptors, se hace la llamada siempre , pero si se hace refactor se puede evitar hacer la llamada. Pero ya usa los datos desde arrayData.
async (newUrl, lastUrl) => {
if (newUrl == lastUrl) return;
await getData();
}
);
}
await getData();
watch(
() => $props.url,
async () => await getData()
);
});
async function getData() {
const arrayData = useArrayData($props.dataKey, {
url: $props.url,
filter: $props.filter,
skip: 0,
});
store.url = $props.url;
isLoading.value = true;
try {
const { data } = await arrayData.fetch({ append: false, updateRouter: false });

View File

@ -1,11 +1,10 @@
<script setup>
import { onMounted, ref, watch } from 'vue';
import { ref, computed, watch, onBeforeMount } from 'vue';
import { useRoute } from 'vue-router';
import axios from 'axios';
import SkeletonSummary from 'components/ui/SkeletonSummary.vue';
import VnLv from 'src/components/ui/VnLv.vue';
import { useArrayData } from 'src/composables/useArrayData';
const entity = ref();
const props = defineProps({
url: {
type: String,
@ -19,43 +18,48 @@ const props = defineProps({
type: Number,
default: null,
},
dataKey: {
type: String,
default: '',
},
});
const emit = defineEmits(['onFetch']);
const route = useRoute();
const isSummary = ref();
const arrayData = useArrayData(props.dataKey || route.meta.moduleName, {
url: props.url,
filter: props.filter,
skip: 0,
});
const { store } = arrayData;
const entity = computed(() => store.data);
const isLoading = ref(false);
defineExpose({
entity,
fetch,
});
onMounted(() => {
onBeforeMount(async () => {
isSummary.value = String(route.path).endsWith('/summary');
fetch();
await fetch();
watch(props, async () => await fetch());
Review

De momento, para que sea retrocompatible con el resto de secciones a la hora de abrir los summaryPopup, se hace la llamada siempre , pero si se hace refactor se puede evitar hacer la llamada. Pero ya usa los datos desde arrayData.

De momento, para que sea retrocompatible con el resto de secciones a la hora de abrir los summaryPopup, se hace la llamada siempre , pero si se hace refactor se puede evitar hacer la llamada. Pero ya usa los datos desde arrayData.
});
async function fetch() {
const params = {};
if (props.filter) params.filter = JSON.stringify(props.filter);
const { data } = await axios.get(props.url, { params });
entity.value = data;
store.url = props.url;
isLoading.value = true;
const { data } = await arrayData.fetch({ append: false, updateRouter: false });
emit('onFetch', data);
isLoading.value = false;
}
watch(props, async () => {
entity.value = null;
fetch();
});
</script>
<template>
<div class="summary container">
<QCard class="cardSummary">
<SkeletonSummary v-if="!entity" />
<template v-if="entity">
<SkeletonSummary v-if="!entity || isLoading" />
<template v-if="entity && !isLoading">
<div class="summaryHeader bg-primary q-pa-sm text-weight-bolder">
<slot name="header-left">
<router-link

View File

@ -90,6 +90,7 @@ export default {
summary: 'Summary',
Review

Se usa 17 veces, deberia estar global o crear tarea

Se usa 17 veces, deberia estar global o crear tarea
Review
https://redmine.verdnatura.es/issues/7132
basicData: 'Basic data',
jorgep marked this conversation as resolved
Review

Se usa 19 veces, debería estar global o crear tarea

Se usa 19 veces, debería estar global o crear tarea
log: 'Logs',
jorgep marked this conversation as resolved
Review

Se usa 2 veces, debería estar global

Se usa 2 veces, debería estar global
parkingList: 'Parkings list',
},
},
errors: {
@ -672,7 +673,6 @@ export default {
summary: 'Summary',
basicData: 'Basic Data',
jorgep marked this conversation as resolved Outdated
Outdated
Review

Tu mismo la estas usando 2 veces. Poner global o como hablamos global para el modulo Parking

Tu mismo la estas usando 2 veces. Poner global o como hablamos global para el modulo Parking
log: 'Logs',
parkingList: 'Parking list',
},
list: {
parking: 'Parking',
@ -700,7 +700,6 @@ export default {
column: 'Column',
pageTitles: {
parking: 'Parking',
parkingList: 'Parkings list',
},
searchBar: {
info: 'You can search by parking code',
@ -976,7 +975,7 @@ export default {
roadmap: 'Roadmap',
summary: 'Summary',
basicData: 'Basic Data',
stops: 'Stops'
stops: 'Stops',
},
},
roadmap: {
@ -984,7 +983,7 @@ export default {
roadmap: 'Roadmap',
summary: 'Summary',
basicData: 'Basic Data',
stops: 'Stops'
stops: 'Stops',
},
},
route: {

View File

@ -90,6 +90,7 @@ export default {
summary: 'Resumen',
basicData: 'Datos básicos',
log: 'Historial',
parkingList: 'Listado de parkings',
},
},
errors: {
@ -730,7 +731,6 @@ export default {
summary: 'Resumen',
basicData: 'Datos básicos',
log: 'Historial',
parkingList: 'Listado de parkings',
},
list: {
parking: 'Parking',
@ -757,7 +757,6 @@ export default {
column: 'Columna',
pageTitles: {
parking: 'Parking',
parkingList: 'Listado de parkings',
},
searchBar: {
info: 'Puedes buscar por código de parking',
@ -975,7 +974,7 @@ export default {
roadmap: 'Troncales',
summary: 'Resumen',
basicData: 'Datos básicos',
stops: 'Paradas'
stops: 'Paradas',
},
},
roadmap: {
@ -983,7 +982,7 @@ export default {
roadmap: 'Troncales',
summary: 'Resumen',
basicData: 'Datos básicos',
stops: 'Paradas'
stops: 'Paradas',
},
},
route: {

View File

@ -199,7 +199,7 @@ function getLink(param) {
<template>
<CardSummary
ref="summary"
data-key="InvoiceInSummary"
Review

Como se hace uso de arrayData en InvoiceInCard, se le tiene que poner otra clave. Ya que no gasta el mismo origen de datos.

Como se hace uso de arrayData en InvoiceInCard, se le tiene que poner otra clave. Ya que no gasta el mismo origen de datos.
:url="`InvoiceIns/${entityId}/summary`"
@on-fetch="(data) => setData(data)"
>

View File

@ -13,7 +13,7 @@ const route = useRoute();
const stateStore = useStateStore();
const filter = {
fields: ['id', 'sectorFk', 'code', 'pickingOrder'],
fields: ['id', 'sectorFk', 'code', 'pickingOrder', 'row', 'column'],
include: [{ relation: 'sector', scope: { fields: ['id', 'description'] } }],
};
@ -22,7 +22,6 @@ const arrayData = useArrayData('Parking', {
filter,
});
const { store } = arrayData;
onMounted(async () => await arrayData.fetch({ append: false }));
watch(
() => route.params.id,

View File

@ -1,11 +1,12 @@
<script setup>
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import { useRoute } from 'vue-router';
import { useArrayData } from 'src/composables/useArrayData';
import CardDescriptor from 'components/ui/CardDescriptor.vue';
import VnLv from 'components/ui/VnLv.vue';
defineProps({
const props = defineProps({
id: {
type: Number,
required: false,
@ -14,16 +15,23 @@ defineProps({
});
const { t } = useI18n();
const { params } = useRoute();
const entityId = computed(() => props.id || params.id);
const { store } = useArrayData('Parking');
const card = computed(() => store.data);
const filter = {
Review

Yo valoraría crear un archivo general con los filtros de las cards de cada sección, porque si no hay que escribir el filtro. Si entramos en la sección summary no hay problema, se puede recoger el filtro desde la store, pero si abrimos el summaryProxy o popup, este no pasa por card y no tiene acceso al descriptor.

Yo valoraría crear un archivo general con los filtros de las cards de cada sección, porque si no hay que escribir el filtro. Si entramos en la sección summary no hay problema, se puede recoger el filtro desde la store, pero si abrimos el summaryProxy o popup, este no pasa por card y no tiene acceso al descriptor.
fields: ['id', 'sectorFk', 'code', 'pickingOrder', 'row', 'column'],
include: [{ relation: 'sector', scope: { fields: ['id', 'description'] } }],
};
</script>
<template>
<CardDescriptor
module="Parking"
data-key="Parking"
jorgep marked this conversation as resolved Outdated
Outdated
Review

No pot gastar les dades que hi han en la store? les seteges en parkingCard

No pot gastar les dades que hi han en la store? les seteges en parkingCard

Alex tiene razón, sin embargo, deberías comprobar que en parkingCard y este fichero solicitas los mismos

Alex tiene razón, sin embargo, deberías comprobar que en parkingCard y este fichero solicitas los mismos

Es lo mismo, tienen la misma url y filtro.

Es lo mismo, tienen la misma url y filtro.
:url="`Parkings/${entityId}`"
:title="card?.code"
:subtitle="card?.id"
:filter="filter"
>
<template #body="{ entity: parking }">
<VnLv :label="t('globals.code')" :value="parking.code" />

View File

@ -11,20 +11,19 @@ const $props = defineProps({
default: 0,
},
});
const route = useRoute();
const { params } = useRoute();
const { t } = useI18n();
const entityId = computed(() => $props.id || route.params.id);
const entityId = computed(() => $props.id || params.id);
const filter = {
Review

Yo valoraría crear un archivo general con los filtros de las cards de cada sección, porque si no hay que escribir el filtro. Si entramos en la sección summary no hay problema, se puede recoger el filtro desde la store, pero si abrimos el summaryProxy o popup, este no pasa por card y no tiene acceso al descriptor.

Yo valoraría crear un archivo general con los filtros de las cards de cada sección, porque si no hay que escribir el filtro. Si entramos en la sección summary no hay problema, se puede recoger el filtro desde la store, pero si abrimos el summaryProxy o popup, este no pasa por card y no tiene acceso al descriptor.
fields: ['sectorFk', 'code', 'pickingOrder', 'row', 'column'],
fields: ['id', 'sectorFk', 'code', 'pickingOrder', 'row', 'column'],
Outdated
Review

No pot gastar les dades que hi han en la store? les seteges en parkingCard

No pot gastar les dades que hi han en la store? les seteges en parkingCard

Sí pero hay que modificar la lógica de CardSummary, voy a dejarme esto en pendiente. Hoy subiré la rama con los cambios aplicados para que puedas ver como lo he hecho en el descriptor. No altera el funcionamiento del resto de la página.

Sé que te refieres a importar arrayData en parking summary y usarlo en CardSummary pero eso no tiene sentido porque sigues haciendo la llamada en CardSummary para usar los datos. Yo esto lo abordaría en una tarea. Avisame si quieres que lo miremos en llamada mañana.

Sí pero hay que modificar la lógica de CardSummary, voy a dejarme esto en pendiente. Hoy subiré la rama con los cambios aplicados para que puedas ver como lo he hecho en el descriptor. No altera el funcionamiento del resto de la página. Sé que te refieres a importar arrayData en parking summary y usarlo en CardSummary pero eso no tiene sentido porque sigues haciendo la llamada en CardSummary para usar los datos. Yo esto lo abordaría en una tarea. Avisame si quieres que lo miremos en llamada mañana.

Tras hablar con Alex , decidimos hacer un refactor en CardSummary para que use el arrayData e intentarlo con FormModel también.

Tras hablar con Alex , decidimos hacer un refactor en CardSummary para que use el arrayData e intentarlo con FormModel también.

El formModel lo paso a otra tarea https://redmine.verdnatura.es/issues/7135, que se me está alargando la tarea,

El formModel lo paso a otra tarea https://redmine.verdnatura.es/issues/7135, que se me está alargando la tarea,
include: [{ relation: 'sector', scope: { fields: ['id', 'description'] } }],
};
</script>
<template>
<div class="q-pa-md">
<CardSummary ref="summary" :url="`Parkings/${entityId}`" :filter="filter">
<CardSummary :url="`Parkings/${entityId}`" :filter="filter">
<template #header="{ entity: parking }">{{ parking.code }}</template>
<template #body="{ entity: parking }">
<QCard class="vn-one">

View File

@ -12,7 +12,7 @@ import ParkingFilter from './ParkingFilter.vue';
import ParkingSummary from './Card/ParkingSummary.vue';
const stateStore = useStateStore();
const router = useRouter();
const { push } = useRouter();
const { t } = useI18n();
const { viewSummary } = useSummaryDialog();
@ -83,7 +83,7 @@ function exprBuilder(param, value) {
:key="row.id"
:id="row.id"
:title="row.code"
@click="router.push({ path: `/parking/${row.id}` })"
@click="push({ path: `/parking/${row.id}` })"
>
<template #list-items>
<VnLv label="Sector" :value="row.sector?.description" />

View File

@ -6,6 +6,7 @@ export default {
meta: {
title: 'parking',
icon: 'garage_home',
moduleName: 'Parking',
},
component: RouterView,
redirect: { name: 'ParkingCard' },

View File

@ -13,7 +13,7 @@ describe('ParkingList', () => {
cy.closeSideMenu();
});
it('should redirect on clicking a invoice', () => {
it('should redirect on clicking a parking', () => {
cy.get(firstChipId)
.invoke('text')
.then((content) => {