feat: refs #6564 implement getValueFromPath utility
gitea/salix-front/pipeline/pr-dev This commit looks good Details

This commit is contained in:
Jorge Penadés 2025-03-28 16:38:37 +01:00
parent bbf4234351
commit 530dc62e00
5 changed files with 70 additions and 33 deletions

View File

@ -1,12 +1,22 @@
<script setup> <script setup>
import { toCurrency } from 'src/filters'; import { toCurrency } from 'src/filters';
import { getValueFromPath } from 'src/composables/getValueFromPath';
defineProps({ row: { type: Object, required: true } }); const { row, visibleProblems = null } = defineProps({
row: { type: Object, required: true },
visibleProblems: { type: Array },
});
function showProblem(problem) {
const val = getValueFromPath(row, problem);
if (!visibleProblems) return val;
return !!(visibleProblems?.includes(problem) && val);
}
</script> </script>
<template> <template>
<span class="q-gutter-x-xs"> <span class="q-gutter-x-xs">
<router-link <router-link
v-if="row.claim?.claimFk" v-if="showProblem('claim.claimFk')"
:to="{ name: 'ClaimBasicData', params: { id: row.claim?.claimFk } }" :to="{ name: 'ClaimBasicData', params: { id: row.claim?.claimFk } }"
class="link" class="link"
> >
@ -18,7 +28,7 @@ defineProps({ row: { type: Object, required: true } });
</QIcon> </QIcon>
</router-link> </router-link>
<QIcon <QIcon
v-if="row?.reserved" v-if="showProblem('reserved')"
color="primary" color="primary"
name="vn:reserva" name="vn:reserva"
size="xs" size="xs"
@ -29,7 +39,7 @@ defineProps({ row: { type: Object, required: true } });
</QTooltip> </QTooltip>
</QIcon> </QIcon>
<QIcon <QIcon
v-if="row?.isDeleted" v-if="showProblem('isDeleted')"
color="primary" color="primary"
name="vn:deletedTicket" name="vn:deletedTicket"
size="xs" size="xs"
@ -40,7 +50,7 @@ defineProps({ row: { type: Object, required: true } });
</QTooltip> </QTooltip>
</QIcon> </QIcon>
<QIcon <QIcon
v-if="row?.hasRisk" v-if="showProblem('hasRisk')"
name="vn:risk" name="vn:risk"
:color="row.hasHighRisk ? 'negative' : 'primary'" :color="row.hasHighRisk ? 'negative' : 'primary'"
size="xs" size="xs"
@ -51,51 +61,76 @@ defineProps({ row: { type: Object, required: true } });
</QTooltip> </QTooltip>
</QIcon> </QIcon>
<QIcon <QIcon
v-if="row?.hasComponentLack" v-if="showProblem('hasComponentLack')"
name="vn:components" name="vn:components"
color="primary" color="primary"
size="xs" size="xs"
> >
<QTooltip>{{ $t('salesTicketsTable.componentLack') }}</QTooltip> <QTooltip>{{ $t('salesTicketsTable.componentLack') }}</QTooltip>
</QIcon> </QIcon>
<QIcon v-if="row?.hasItemDelay" color="primary" size="xs" name="vn:hasItemDelay"> <QIcon
v-if="showProblem('hasItemDelay')"
color="primary"
size="xs"
name="vn:hasItemDelay"
>
<QTooltip> <QTooltip>
{{ $t('ticket.summary.hasItemDelay') }} {{ $t('ticket.summary.hasItemDelay') }}
</QTooltip> </QTooltip>
</QIcon> </QIcon>
<QIcon v-if="row?.hasItemLost" color="primary" size="xs" name="vn:hasItemLost"> <QIcon
v-if="showProblem('hasItemLost')"
color="primary"
size="xs"
name="vn:hasItemLost"
>
<QTooltip> <QTooltip>
{{ $t('salesTicketsTable.hasItemLost') }} {{ $t('salesTicketsTable.hasItemLost') }}
</QTooltip> </QTooltip>
</QIcon> </QIcon>
<QIcon <QIcon
v-if="row?.hasItemShortage" v-if="showProblem('hasItemShortage')"
name="vn:unavailable" name="vn:unavailable"
color="primary" color="primary"
size="xs" size="xs"
> >
<QTooltip>{{ $t('salesTicketsTable.notVisible') }}</QTooltip> <QTooltip>{{ $t('salesTicketsTable.notVisible') }}</QTooltip>
</QIcon> </QIcon>
<QIcon v-if="row?.hasRounding" color="primary" name="sync_problem" size="xs"> <QIcon
v-if="showProblem('hasRounding')"
color="primary"
name="sync_problem"
size="xs"
>
<QTooltip> <QTooltip>
{{ $t('ticketList.rounding') }} {{ $t('ticketList.rounding') }}
</QTooltip> </QTooltip>
</QIcon> </QIcon>
<QIcon <QIcon
v-if="row?.hasTicketRequest" v-if="showProblem('hasTicketRequest')"
name="vn:buyrequest" name="vn:buyrequest"
color="primary" color="primary"
size="xs" size="xs"
> >
<QTooltip>{{ $t('salesTicketsTable.purchaseRequest') }}</QTooltip> <QTooltip>{{ $t('salesTicketsTable.purchaseRequest') }}</QTooltip>
</QIcon> </QIcon>
<QIcon v-if="row?.isTaxDataChecked" name="vn:no036" color="primary" size="xs"> <QIcon
v-if="showProblem('isTaxDataChecked')"
name="vn:no036"
color="primary"
size="xs"
>
<QTooltip>{{ $t('salesTicketsTable.noVerifiedData') }}</QTooltip> <QTooltip>{{ $t('salesTicketsTable.noVerifiedData') }}</QTooltip>
</QIcon> </QIcon>
<QIcon v-if="row?.isFreezed" name="vn:frozen" color="primary" size="xs"> <QIcon v-if="showProblem('isFreezed')" name="vn:frozen" color="primary" size="xs">
<QTooltip>{{ $t('salesTicketsTable.clientFrozen') }}</QTooltip> <QTooltip>{{ $t('salesTicketsTable.clientFrozen') }}</QTooltip>
</QIcon> </QIcon>
<QIcon v-if="row?.isTooLittle" name="vn:isTooLittle" color="primary" size="xs"> <QIcon
v-if="showProblem('isTooLittle')"
name="vn:isTooLittle"
color="primary"
size="xs"
>
<QTooltip>{{ $t('salesTicketsTable.tooLittle') }}</QTooltip> <QTooltip>{{ $t('salesTicketsTable.tooLittle') }}</QTooltip>
</QIcon> </QIcon>
</span> </span>

View File

@ -6,6 +6,7 @@ import { useSummaryDialog } from 'src/composables/useSummaryDialog';
import { useRoute, useRouter } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
import { useClipboard } from 'src/composables/useClipboard'; import { useClipboard } from 'src/composables/useClipboard';
import VnMoreOptions from './VnMoreOptions.vue'; import VnMoreOptions from './VnMoreOptions.vue';
import { getValueFromPath } from 'src/composables/getValueFromPath';
const entity = defineModel({ type: Object, default: null }); const entity = defineModel({ type: Object, default: null });
const $props = defineProps({ const $props = defineProps({
@ -56,18 +57,6 @@ const routeName = computed(() => {
return `${routeName}Summary`; return `${routeName}Summary`;
}); });
function getValueFromPath(path) {
if (!path) return;
const keys = path.toString().split('.');
let current = entity.value;
for (const key of keys) {
if (current[key] === undefined) return undefined;
else current = current[key];
}
return current;
}
function copyIdText(id) { function copyIdText(id) {
copyText(id, { copyText(id, {
component: { component: {
@ -170,10 +159,10 @@ const toModule = computed(() => {
<div class="title"> <div class="title">
<span <span
v-if="title" v-if="title"
:title="getValueFromPath(title)" :title="getValueFromPath(entity, title)"
:data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_title`" :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_title`"
> >
{{ getValueFromPath(title) ?? title }} {{ getValueFromPath(entity, title) ?? title }}
</span> </span>
<slot v-else name="description" :entity="entity"> <slot v-else name="description" :entity="entity">
<span <span
@ -189,7 +178,7 @@ const toModule = computed(() => {
class="subtitle" class="subtitle"
:data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_subtitle`" :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_subtitle`"
> >
#{{ getValueFromPath(subtitle) ?? entity.id }} #{{ getValueFromPath(entity, subtitle) ?? entity.id }}
</QItemLabel> </QItemLabel>
<QBtn <QBtn
round round

View File

@ -0,0 +1,11 @@
export function getValueFromPath(root, path) {
if (!root || !path) return;
const keys = path.toString().split('.');
let current = root;
for (const key of keys) {
if (current[key] === undefined) return undefined;
else current = current[key];
}
return current;
}

View File

@ -559,7 +559,7 @@ watch(
</QBadge> </QBadge>
</template> </template>
<template #column-problems="{ row }"> <template #column-problems="{ row }">
<TicketProblems :row="row.problems" /> <TicketProblems :row="row?.problems" :visible-problems="['hasRisk']" />
</template> </template>
<template #column-futureId="{ row }"> <template #column-futureId="{ row }">
<QBtn flat class="link" dense> <QBtn flat class="link" dense>

View File

@ -10,7 +10,7 @@ import VnInputDate from 'src/components/common/VnInputDate.vue';
import axios from 'axios'; import axios from 'axios';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import VnInputNumber from 'src/components/common/VnInputNumber.vue'; import VnInputNumber from 'src/components/common/VnInputNumber.vue';
import VnCheckbox from 'src/components/common/VnCheckbox.vue';
const { t, te } = useI18n(); const { t, te } = useI18n();
const props = defineProps({ const props = defineProps({
dataKey: { dataKey: {
@ -130,11 +130,12 @@ onMounted(async () => await getItemPackingTypes());
</QItem> </QItem>
<QItem> <QItem>
<QItemSection> <QItemSection>
<QCheckbox <VnCheckbox
:label="t('params.isFullMovable')" :label="t('params.isFullMovable')"
v-model="params.isFullMovable" v-model="params.isFullMovable"
toggle-indeterminate toggle-indeterminate
@update:model-value="searchFn()" @update:model-value="searchFn()"
dense
/> />
</QItemSection> </QItemSection>
</QItem> </QItem>
@ -167,11 +168,12 @@ onMounted(async () => await getItemPackingTypes());
</QItem> </QItem>
<QItem> <QItem>
<QItemSection> <QItemSection>
<QCheckbox <VnCheckbox
toggle-indeterminate toggle-indeterminate
label="only with destination" label="only with destination"
v-model="params.onlyWithDestination" v-model="params.onlyWithDestination"
@update:model-value="searchFn()" @update:model-value="searchFn()"
dense
/> />
</QItemSection> </QItemSection>
</QItem> </QItem>