diff --git a/src/components/TicketProblems.vue b/src/components/TicketProblems.vue index 59be95035..e9196051a 100644 --- a/src/components/TicketProblems.vue +++ b/src/components/TicketProblems.vue @@ -1,12 +1,22 @@ <script setup> 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> <template> <span class="q-gutter-x-xs"> <router-link - v-if="row.claim?.claimFk" + v-if="showProblem('claim.claimFk')" :to="{ name: 'ClaimBasicData', params: { id: row.claim?.claimFk } }" class="link" > @@ -18,7 +28,7 @@ defineProps({ row: { type: Object, required: true } }); </QIcon> </router-link> <QIcon - v-if="row?.reserved" + v-if="showProblem('reserved')" color="primary" name="vn:reserva" size="xs" @@ -29,7 +39,7 @@ defineProps({ row: { type: Object, required: true } }); </QTooltip> </QIcon> <QIcon - v-if="row?.isDeleted" + v-if="showProblem('isDeleted')" color="primary" name="vn:deletedTicket" size="xs" @@ -40,7 +50,7 @@ defineProps({ row: { type: Object, required: true } }); </QTooltip> </QIcon> <QIcon - v-if="row?.hasRisk" + v-if="showProblem('hasRisk')" name="vn:risk" :color="row.hasHighRisk ? 'negative' : 'primary'" size="xs" @@ -51,51 +61,76 @@ defineProps({ row: { type: Object, required: true } }); </QTooltip> </QIcon> <QIcon - v-if="row?.hasComponentLack" + v-if="showProblem('hasComponentLack')" name="vn:components" color="primary" size="xs" > <QTooltip>{{ $t('salesTicketsTable.componentLack') }}</QTooltip> </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> {{ $t('ticket.summary.hasItemDelay') }} </QTooltip> </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> {{ $t('salesTicketsTable.hasItemLost') }} </QTooltip> </QIcon> <QIcon - v-if="row?.hasItemShortage" + v-if="showProblem('hasItemShortage')" name="vn:unavailable" color="primary" size="xs" > <QTooltip>{{ $t('salesTicketsTable.notVisible') }}</QTooltip> </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> {{ $t('ticketList.rounding') }} </QTooltip> </QIcon> <QIcon - v-if="row?.hasTicketRequest" + v-if="showProblem('hasTicketRequest')" name="vn:buyrequest" color="primary" size="xs" > <QTooltip>{{ $t('salesTicketsTable.purchaseRequest') }}</QTooltip> </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> </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> </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> </QIcon> </span> diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue index 47da98d74..2b6b70e6b 100644 --- a/src/components/ui/VnDescriptor.vue +++ b/src/components/ui/VnDescriptor.vue @@ -6,6 +6,7 @@ import { useSummaryDialog } from 'src/composables/useSummaryDialog'; import { useRoute, useRouter } from 'vue-router'; import { useClipboard } from 'src/composables/useClipboard'; import VnMoreOptions from './VnMoreOptions.vue'; +import { getValueFromPath } from 'src/composables/getValueFromPath'; const entity = defineModel({ type: Object, default: null }); const $props = defineProps({ @@ -56,18 +57,6 @@ const routeName = computed(() => { 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) { copyText(id, { component: { @@ -170,10 +159,10 @@ const toModule = computed(() => { <div class="title"> <span v-if="title" - :title="getValueFromPath(title)" + :title="getValueFromPath(entity, title)" :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_title`" > - {{ getValueFromPath(title) ?? title }} + {{ getValueFromPath(entity, title) ?? title }} </span> <slot v-else name="description" :entity="entity"> <span @@ -189,7 +178,7 @@ const toModule = computed(() => { class="subtitle" :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_subtitle`" > - #{{ getValueFromPath(subtitle) ?? entity.id }} + #{{ getValueFromPath(entity, subtitle) ?? entity.id }} </QItemLabel> <QBtn round diff --git a/src/composables/getValueFromPath.js b/src/composables/getValueFromPath.js new file mode 100644 index 000000000..2c94379cc --- /dev/null +++ b/src/composables/getValueFromPath.js @@ -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; +} \ No newline at end of file diff --git a/src/pages/Ticket/TicketAdvance.vue b/src/pages/Ticket/TicketAdvance.vue index 2f8857326..306f2c276 100644 --- a/src/pages/Ticket/TicketAdvance.vue +++ b/src/pages/Ticket/TicketAdvance.vue @@ -559,7 +559,7 @@ watch( </QBadge> </template> <template #column-problems="{ row }"> - <TicketProblems :row="row.problems" /> + <TicketProblems :row="row?.problems" :visible-problems="['hasRisk']" /> </template> <template #column-futureId="{ row }"> <QBtn flat class="link" dense> diff --git a/src/pages/Ticket/TicketAdvanceFilter.vue b/src/pages/Ticket/TicketAdvanceFilter.vue index 6fd3d475b..4e3f72490 100644 --- a/src/pages/Ticket/TicketAdvanceFilter.vue +++ b/src/pages/Ticket/TicketAdvanceFilter.vue @@ -10,7 +10,7 @@ import VnInputDate from 'src/components/common/VnInputDate.vue'; import axios from 'axios'; import { onMounted } from 'vue'; import VnInputNumber from 'src/components/common/VnInputNumber.vue'; - +import VnCheckbox from 'src/components/common/VnCheckbox.vue'; const { t, te } = useI18n(); const props = defineProps({ dataKey: { @@ -130,11 +130,12 @@ onMounted(async () => await getItemPackingTypes()); </QItem> <QItem> <QItemSection> - <QCheckbox + <VnCheckbox :label="t('params.isFullMovable')" v-model="params.isFullMovable" toggle-indeterminate @update:model-value="searchFn()" + dense /> </QItemSection> </QItem> @@ -167,11 +168,12 @@ onMounted(async () => await getItemPackingTypes()); </QItem> <QItem> <QItemSection> - <QCheckbox + <VnCheckbox toggle-indeterminate label="only with destination" v-model="params.onlyWithDestination" @update:model-value="searchFn()" + dense /> </QItemSection> </QItem>