#5186 create parking section #197

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

View File

@ -11,25 +11,30 @@ const props = defineProps({
},
});
const item = computed(() => {
const itemComputed = computed(() => {
const item = JSON.parse(JSON.stringify(props.item));
Review

Es necesario hacerlo así para que no sea una referencia al mismo objeto.

Es necesario hacerlo así para que no sea una referencia al mismo objeto.
const [, , section] = item.title.split('.');
if (!te(item.title)) item.title = t(`globals.pageTitles.${section}`);
Review

Si no encuentra la traducción, coge la global.

Si no encuentra la traducción, coge la global.
return item;
}); // eslint-disable-line vue/no-dupe-keys
});
jorgep marked this conversation as resolved Outdated
Outdated
Review

Si gastes una variable distinta a "item" ja no cal ficar esta linea.

Si gastes una variable distinta a "item" ja no cal ficar esta linea.
</script>
<template>
<QItem active-class="text-primary" :to="{ name: item.name }" clickable v-ripple>
<QItemSection avatar v-if="item.icon">
<QIcon :name="item.icon" />
<QItem
active-class="text-primary"
:to="{ name: itemComputed.name }"
clickable
v-ripple
>
<QItemSection avatar v-if="itemComputed.icon">
<QIcon :name="itemComputed.icon" />
</QItemSection>
<QItemSection avatar v-if="!item.icon">
<QItemSection avatar v-if="!itemComputed.icon">
<QIcon name="disabled_by_default" />
</QItemSection>
<QItemSection>{{ t(item.title) }}</QItemSection>
<QItemSection>{{ t(itemComputed.title) }}</QItemSection>
<QItemSection side>
<slot name="side" :item="item" />
<slot name="side" :item="itemComputed" />
</QItemSection>
</QItem>
</template>

View File

@ -34,6 +34,7 @@ function getBreadcrumb(param) {
icon: param.meta.icon,
path: param.path,
root: root.value,
locale: t(`globals.pageTitles.${param.meta.title}`),
};
if (screen.gt.sm) {
@ -42,9 +43,7 @@ function getBreadcrumb(param) {
}
jorgep marked this conversation as resolved Outdated

Si existe la traducción específica , pone esta, si no la global

Si existe la traducción específica , pone esta, si no la global

La clave i18n de las lineas 44 y 45 son iguales no?
Podemos reducir a 1 ocurrencia?

La clave i18n de las lineas 44 y 45 son iguales no? Podemos reducir a 1 ocurrencia?

No, "te" devuelve un booleano, "t" traduce

No, "te" devuelve un booleano, "t" traduce

No, "te" devuelve un booleano, "t" traduce

Tras hablar con Javier, guardo el valor en una variable.

> No, "te" devuelve un booleano, "t" traduce Tras hablar con Javier, guardo el valor en una variable.

Bien, pero quizás para evitarte un ternario, te diría de usar un if con la operacion "te" y dentro le asignas el valor que quieras. Fuera del if resuelves la traducción asignandola a breadcumb.locale

Bien, pero quizás para evitarte un ternario, te diría de usar un if con la operacion "te" y dentro le asignas el valor que quieras. Fuera del if resuelves la traducción asignandola a breadcumb.locale
const moduleLocale = `${breadcrumb.root}.pageTitles.${breadcrumb.title}`;
breadcrumb.locale = te(moduleLocale)
? t(moduleLocale)
: t(`globals.pageTitles.${breadcrumb.title}`);
if (te(moduleLocale)) breadcrumb.locale = t(moduleLocale);
return breadcrumb;
}

View File

@ -1,5 +1,5 @@
<script setup>
import { onMounted, useSlots, watch, computed, ref } from 'vue';
import { onBeforeMount, useSlots, watch, computed, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import SkeletonDescriptor from 'components/ui/SkeletonDescriptor.vue';
import { useArrayData } from 'composables/useArrayData';
@ -41,21 +41,24 @@ const state = useState();
const slots = useSlots();
const { t } = useI18n();
const { viewSummary } = useSummaryDialog();
const entity = computed(() => useArrayData($props.dataKey).store.data);
const { store } = useArrayData($props.dataKey);
const entity = computed(() => store.data);
const isLoading = ref(false);
defineExpose({
getData,
});
onMounted(async () => {
await getData();
watch(
() => $props.url,
async (newUrl, lastUrl) => {
if (newUrl == lastUrl) return;

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.
await getData();
}
);
onBeforeMount(async () => {
if ($props.url) {
await getData();
watch(
() => $props.url,
async (newUrl, lastUrl) => {
if (newUrl == lastUrl) return;
await getData();
}
);
}
});
async function getData() {

View File

@ -8,26 +8,28 @@ import LeftMenu from 'components/LeftMenu.vue';
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
import ParkingDescriptor from 'pages/Parking/Card/ParkingDescriptor.vue';
const stateStore = useStateStore();
const { t } = useI18n();
const route = useRoute();
const stateStore = useStateStore();
const filter = {
fields: ['sectorFk', 'code', 'pickingOrder'],
fields: ['id', 'sectorFk', 'code', 'pickingOrder'],
include: [{ relation: 'sector', scope: { fields: ['id', 'description'] } }],
};
const route = useRoute();
const arrayData = useArrayData('Parking', {
url: `Parkings/${route.params.id}`,
filter,
});
const { store } = arrayData;
onMounted(async () => await arrayData.fetch({ append: false }));
watch(
() => route.params.id,
async (newId) => {
if (newId) {
arrayData.store.url = `Parkings/${newId}`;
store.url = `Parkings/${newId}`;
store.filter = filter;
await arrayData.fetch({ append: false });
}
}

View File

@ -1,12 +1,11 @@
<script setup>
import { ref, computed } from 'vue';
import { useRoute } from 'vue-router';
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import { useArrayData } from 'src/composables/useArrayData';
import CardDescriptor from 'components/ui/CardDescriptor.vue';
import VnLv from 'components/ui/VnLv.vue';
import useCardDescription from 'composables/useCardDescription';
const props = defineProps({
defineProps({
id: {
type: Number,
required: false,
@ -14,28 +13,17 @@ const props = defineProps({
},
});
const route = useRoute();
const { t } = useI18n();
const entityId = computed(() => props.id || route.params.id);
const filter = {
fields: ['id', 'sectorFk', 'code', 'pickingOrder'],
include: [{ relation: 'sector', scope: { fields: ['id', 'description'] } }],
};
const header = ref(useCardDescription());
const setHeader = (entity) => (header.value = useCardDescription(entity.code, entity.id));
const { store } = useArrayData('Parking');
const card = computed(() => store.data);
</script>
<template>
<CardDescriptor
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.
module="Parking"
:url="`Parkings/${entityId}`"
:filter="filter"
:title="header.title"
:subtitle="header.subtitle"
data-key="ParkingData"
@on-fetch="setHeader"
data-key="Parking"
:title="card?.code"
:subtitle="card?.id"
>
<template #body="{ entity: parking }">
<VnLv :label="t('globals.code')" :value="parking.code" />