Merge branch 'Fix-SummaryCardsFlex' of https://gitea.verdnatura.es/verdnatura/salix-front into Fix-SummaryCardsFlex
gitea/salix-front/pipeline/pr-test This commit looks good Details

This commit is contained in:
Jon Elias 2025-04-04 10:45:36 +02:00
commit 624eac7094
14 changed files with 95 additions and 72 deletions

View File

@ -60,7 +60,7 @@ async function confirm() {
v-model="address" v-model="address"
is-outlined is-outlined
autofocus autofocus
data-cy="SendEmailNotifiactionDialogInput" data-cy="SendEmailNotificationDialogInput"
/> />
</QCardSection> </QCardSection>
<QCardActions align="right"> <QCardActions align="right">

View File

@ -159,6 +159,7 @@ async function fetch() {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
margin-top: 2px; margin-top: 2px;
align-items: start;
.label { .label {
color: var(--vn-label-color); color: var(--vn-label-color);
width: 9em; width: 9em;
@ -169,6 +170,10 @@ async function fetch() {
flex-grow: 0; flex-grow: 0;
flex-shrink: 0; flex-shrink: 0;
} }
&.ellipsis > .value {
text-overflow: ellipsis;
white-space: pre;
}
.value { .value {
color: var(--vn-text-color); color: var(--vn-text-color);
overflow: hidden; overflow: hidden;

View File

@ -252,6 +252,10 @@ const toModule = computed(() => {
content: ':'; content: ':';
} }
} }
&.ellipsis > .value {
text-overflow: ellipsis;
white-space: pre;
}
.value { .value {
color: var(--vn-text-color); color: var(--vn-text-color);
font-size: 14px; font-size: 14px;

View File

@ -1,8 +1,11 @@
<script setup> <script setup>
import { dashIfEmpty } from 'src/filters';
defineProps({ email: { type: [String], default: null } }); defineProps({ email: { type: [String], default: null } });
</script> </script>
<template> <template>
<QBtn <QBtn
class="q-pr-xs"
v-if="email" v-if="email"
flat flat
round round
@ -13,4 +16,5 @@ defineProps({ email: { type: [String], default: null } });
:href="`mailto:${email}`" :href="`mailto:${email}`"
@click.stop @click.stop
/> />
<span>{{ dashIfEmpty(email) }}</span>
</template> </template>

View File

@ -1,7 +1,7 @@
<script setup> <script setup>
import { ref, reactive, useAttrs, onBeforeMount, capitalize } from 'vue'; import { ref, reactive, useAttrs, onBeforeMount, capitalize } from 'vue';
import axios from 'axios'; import axios from 'axios';
import { parsePhone } from 'src/filters'; import { dashIfEmpty, parsePhone } from 'src/filters';
import useOpenURL from 'src/composables/useOpenURL'; import useOpenURL from 'src/composables/useOpenURL';
const props = defineProps({ const props = defineProps({
@ -12,50 +12,65 @@ const props = defineProps({
const phone = ref(props.phoneNumber); const phone = ref(props.phoneNumber);
const config = reactive({ const config = reactive({
sip: { icon: 'phone', href: `sip:${props.phoneNumber}` },
'say-simple': { 'say-simple': {
icon: 'vn:saysimple', icon: 'vn:saysimple',
url: null, url: null,
channel: props.channel, channel: props.channel,
}, },
sip: { icon: 'phone', href: `sip:${props.phoneNumber}` },
}); });
const type = Object.keys(config).find((key) => key in useAttrs()) || 'sip';
const attrs = useAttrs();
const types = Object.keys(config)
.filter((key) => key in attrs)
.sort();
const activeTypes = types.length ? types : ['sip'];
onBeforeMount(async () => { onBeforeMount(async () => {
if (!phone.value) return; if (!phone.value) return;
let { channel } = config[type];
if (type === 'say-simple') { for (const type of activeTypes) {
const { url, defaultChannel } = (await axios.get('SaySimpleConfigs/findOne')) if (type === 'say-simple') {
.data; let { channel } = config[type];
if (!channel) channel = defaultChannel; const { url, defaultChannel } = (await axios.get('SaySimpleConfigs/findOne'))
.data;
if (!channel) channel = defaultChannel;
phone.value = await parsePhone(props.phoneNumber, props.country?.toLowerCase()); phone.value = await parsePhone(
config[ props.phoneNumber,
type props.country?.toLowerCase(),
].url = `${url}?customerIdentity=%2B${phone.value}&channelId=${channel}`; );
config[type].url =
`${url}?customerIdentity=%2B${phone.value}&channelId=${channel}`;
}
} }
}); });
function handleClick() { function handleClick(type) {
if (config[type].url) useOpenURL(config[type].url); if (config[type].url) useOpenURL(config[type].url);
else if (config[type].href) window.location.href = config[type].href; else if (config[type].href) window.location.href = config[type].href;
} }
</script> </script>
<template> <template>
<QBtn <div class="flex items-center gap-2">
v-if="phone" <template v-for="type in activeTypes">
flat <QBtn
round :key="type"
:icon="config[type].icon" v-if="phone"
size="sm" flat
color="primary" round
padding="none" :icon="config[type].icon"
@click.stop="handleClick" size="sm"
> color="primary"
<QTooltip> padding="none"
{{ capitalize(type).replace('-', '') }} @click.stop="() => handleClick(type)"
</QTooltip> >
</QBtn> <QTooltip>
{{ phoneNumber }} {{ capitalize(type).replace('-', '') }}
</QTooltip>
</QBtn></template
>
<span>{{ dashIfEmpty(phone) }}</span>
</div>
</template> </template>

View File

@ -13,7 +13,7 @@ export function useRole() {
name: data.user.name, name: data.user.name,
nickname: data.user.nickname, nickname: data.user.nickname,
lang: data.user.lang || 'es', lang: data.user.lang || 'es',
departmentFk: data.user.worker.department.departmentFk, departmentFk: data.user?.worker?.department?.departmentFk,
}; };
state.setUser(userData); state.setUser(userData);
state.setRoles(roles); state.setRoles(roles);

View File

@ -84,29 +84,31 @@ const sumRisk = ({ clientRisks }) => {
<VnLv :label="t('customer.summary.customerId')" :value="entity.id" /> <VnLv :label="t('customer.summary.customerId')" :value="entity.id" />
<VnLv :label="t('globals.name')" :value="entity.name" /> <VnLv :label="t('globals.name')" :value="entity.name" />
<VnLv :label="t('customer.summary.contact')" :value="entity.contact" /> <VnLv :label="t('customer.summary.contact')" :value="entity.contact" />
<VnLv :value="entity.phone"> <VnLv :label="t('customer.extendedList.tableVisibleColumns.phone')">
<template #label> <template #value>
{{ t('customer.extendedList.tableVisibleColumns.phone') }}
<VnLinkPhone :phone-number="entity.phone" /> <VnLinkPhone :phone-number="entity.phone" />
</template> </template>
</VnLv> </VnLv>
<VnLv :value="entity.mobile"> <VnLv :label="t('customer.summary.mobile')">
<template #label> <template #value>
{{ t('customer.summary.mobile') }}
<VnLinkPhone :phone-number="entity.mobile" />
<VnLinkPhone <VnLinkPhone
sip
say-simple say-simple
:phone-number="entity.mobile" :phone-number="entity.mobile"
:channel="entity.country?.saySimpleCountry?.channel" :channel="entity.country?.saySimpleCountry?.channel"
class="q-ml-xs"
/> />
</template> </template>
</VnLv> </VnLv>
<VnLv :value="entity.email" copy <VnLv
><template #label> :label="t('globals.params.email')"
{{ t('globals.params.email') }} :value="entity.email"
<VnLinkMail email="entity.email"></VnLinkMail> </template class="ellipsis"
></VnLv> copy
>
<template #value>
<VnLinkMail :email="entity.email" />
</template>
</VnLv>
<VnLv :label="t('globals.department')"> <VnLv :label="t('globals.department')">
<template #value> <template #value>
<span class="link" v-text="entity.department?.name" /> <span class="link" v-text="entity.department?.name" />

View File

@ -112,12 +112,9 @@ const filter = {
:label="t('Trailer Plate')" :label="t('Trailer Plate')"
:value="dashIfEmpty(entity?.trailerPlate)" :value="dashIfEmpty(entity?.trailerPlate)"
/> />
<VnLv :label="t('Phone')" :value="dashIfEmpty(entity?.phone)"> <VnLv :label="t('Phone')">
<template #value> <template #value>
<span> <VnLinkPhone :phone-number="entity?.phone" />
{{ dashIfEmpty(entity?.phone) }}
<VnLinkPhone :phone-number="entity?.phone" />
</span>
</template> </template>
</VnLv> </VnLv>
<VnLv <VnLv

View File

@ -113,7 +113,7 @@ const columns = computed(() => [
}, },
{ {
align: 'left', align: 'left',
name: 'shipped', name: 'shippedDate',
cardVisible: true, cardVisible: true,
label: t('ticketList.shipped'), label: t('ticketList.shipped'),
columnFilter: { columnFilter: {
@ -123,7 +123,7 @@ const columns = computed(() => [
}, },
{ {
align: 'left', align: 'left',
name: 'shipped', name: 'shippedHour',
component: 'time', component: 'time',
columnFilter: false, columnFilter: false,
label: t('ticketList.hour'), label: t('ticketList.hour'),

View File

@ -205,6 +205,7 @@ ticketList:
toLines: Go to lines toLines: Go to lines
addressNickname: Address nickname addressNickname: Address nickname
ref: Reference ref: Reference
hour: Hour
rounding: Rounding rounding: Rounding
noVerifiedData: No verified data noVerifiedData: No verified data
purchaseRequest: Purchase request purchaseRequest: Purchase request

View File

@ -116,7 +116,7 @@ const handlePhotoUpdated = (evt = false) => {
<template #body="{ entity }"> <template #body="{ entity }">
<VnLv :label="t('globals.user')" :value="entity.user?.name" /> <VnLv :label="t('globals.user')" :value="entity.user?.name" />
<VnLv <VnLv
class="ellipsis-text" class="ellipsis"
:label="t('globals.params.email')" :label="t('globals.params.email')"
:value="entity.user?.emailUser?.email" :value="entity.user?.emailUser?.email"
copy copy
@ -128,15 +128,13 @@ const handlePhotoUpdated = (evt = false) => {
</template> </template>
</VnLv> </VnLv>
<VnLv :value="entity.phone"> <VnLv :label="t('globals.phone')">
<template #label> <template #value>
{{ t('globals.phone') }}
<VnLinkPhone :phone-number="entity.phone" /> <VnLinkPhone :phone-number="entity.phone" />
</template> </template>
</VnLv> </VnLv>
<VnLv :value="entity?.sip?.extension"> <VnLv :label="t('worker.summary.sipExtension')">
<template #label> <template #value>
{{ t('worker.summary.sipExtension') }}
<VnLinkPhone :phone-number="entity?.sip?.extension" /> <VnLinkPhone :phone-number="entity?.sip?.extension" />
</template> </template>
</VnLv> </VnLv>

View File

@ -73,21 +73,18 @@ onBeforeMount(async () => {
/> />
</template> </template>
</VnLv> </VnLv>
<VnLv :value="worker.mobileExtension"> <VnLv :label="t('worker.summary.phoneExtension')">
<template #label> <template #value>
{{ t('worker.summary.phoneExtension') }}
<VnLinkPhone :phone-number="worker.mobileExtension" /> <VnLinkPhone :phone-number="worker.mobileExtension" />
</template> </template>
</VnLv> </VnLv>
<VnLv :value="worker.phone"> <VnLv :label="t('worker.summary.entPhone')">
<template #label> <template #value>
{{ t('worker.summary.entPhone') }}
<VnLinkPhone :phone-number="worker.phone" /> <VnLinkPhone :phone-number="worker.phone" />
</template> </template>
</VnLv> </VnLv>
<VnLv :value="advancedSummary?.client?.phone"> <VnLv :label="t('worker.summary.personalPhone')">
<template #label> <template #value>
{{ t('worker.summary.personalPhone') }}
<VnLinkPhone <VnLinkPhone
:phone-number="advancedSummary?.client?.phone" :phone-number="advancedSummary?.client?.phone"
/> />
@ -135,6 +132,7 @@ onBeforeMount(async () => {
<VnTitle :text="t('worker.summary.userData')" /> <VnTitle :text="t('worker.summary.userData')" />
<VnLv :label="t('globals.name')" :value="worker?.user?.nickname" /> <VnLv :label="t('globals.name')" :value="worker?.user?.nickname" />
<VnLv <VnLv
class="ellipsis"
:label="t('globals.params.email')" :label="t('globals.params.email')"
:value="worker.user?.emailUser?.email" :value="worker.user?.emailUser?.email"
copy copy
@ -147,9 +145,8 @@ onBeforeMount(async () => {
</span> </span>
</template> </template>
</VnLv> </VnLv>
<VnLv :value="worker?.sip?.extension"> <VnLv :label="t('worker.summary.sipExtension')">
<template #label> <template #value>
{{ t('worker.summary.sipExtension') }}
<VnLinkPhone :phone-number="worker?.sip?.extension" /> <VnLinkPhone :phone-number="worker?.sip?.extension" />
</template> </template>
</VnLv> </VnLv>

View File

@ -40,7 +40,7 @@ describe('InvoiceInDescriptor', () => {
cy.visit('/#/invoice-in/6/summary'); cy.visit('/#/invoice-in/6/summary');
cy.selectDescriptorOption(5); cy.selectDescriptorOption(5);
cy.dataCy('SendEmailNotifiactionDialogInput_input').type( cy.dataCy('SendEmailNotificationDialogInput_input').type(
'{selectall}jorgito@gmail.mx', '{selectall}jorgito@gmail.mx',
); );
cy.clickConfirm(); cy.clickConfirm();

View File

@ -50,7 +50,7 @@ describe('InvoiceOut summary', () => {
cy.dataCy('descriptor-more-opts').click(); cy.dataCy('descriptor-more-opts').click();
cy.get(selectMenuOption(3)).click(); cy.get(selectMenuOption(3)).click();
cy.dataCy('InvoiceOutDescriptorMenuSendPdfOption').click(); cy.dataCy('InvoiceOutDescriptorMenuSendPdfOption').click();
cy.dataCy('SendEmailNotifiactionDialogInput').should('be.visible'); cy.dataCy('SendEmailNotificationDialogInput').should('be.visible');
cy.get(confirmSend).click(); cy.get(confirmSend).click();
cy.checkNotification('Notification sent'); cy.checkNotification('Notification sent');
}); });
@ -59,7 +59,7 @@ describe('InvoiceOut summary', () => {
cy.dataCy('descriptor-more-opts').click(); cy.dataCy('descriptor-more-opts').click();
cy.get(selectMenuOption(3)).click(); cy.get(selectMenuOption(3)).click();
cy.dataCy('InvoiceOutDescriptorMenuSendCsvOption').click(); cy.dataCy('InvoiceOutDescriptorMenuSendCsvOption').click();
cy.dataCy('SendEmailNotifiactionDialogInput').should('be.visible'); cy.dataCy('SendEmailNotificationDialogInput').should('be.visible');
cy.get(confirmSend).click(); cy.get(confirmSend).click();
cy.checkNotification('Notification sent'); cy.checkNotification('Notification sent');
}); });