diff --git a/src/components/common/SendEmailDialog.vue b/src/components/common/SendEmailDialog.vue index 254eb9cf9..a8209bdf7 100644 --- a/src/components/common/SendEmailDialog.vue +++ b/src/components/common/SendEmailDialog.vue @@ -60,7 +60,7 @@ async function confirm() { v-model="address" is-outlined autofocus - data-cy="SendEmailNotifiactionDialogInput" + data-cy="SendEmailNotificationDialogInput" /> </QCardSection> <QCardActions align="right"> diff --git a/src/components/ui/CardSummary.vue b/src/components/ui/CardSummary.vue index 927e3d666..a6c23be2e 100644 --- a/src/components/ui/CardSummary.vue +++ b/src/components/ui/CardSummary.vue @@ -159,6 +159,7 @@ async function fetch() { display: flex; flex-direction: row; margin-top: 2px; + align-items: start; .label { color: var(--vn-label-color); width: 9em; @@ -169,6 +170,10 @@ async function fetch() { flex-grow: 0; flex-shrink: 0; } + &.ellipsis > .value { + text-overflow: ellipsis; + white-space: pre; + } .value { color: var(--vn-text-color); overflow: hidden; diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue index 878adcadc..994233eb0 100644 --- a/src/components/ui/VnDescriptor.vue +++ b/src/components/ui/VnDescriptor.vue @@ -252,6 +252,10 @@ const toModule = computed(() => { content: ':'; } } + &.ellipsis > .value { + text-overflow: ellipsis; + white-space: pre; + } .value { color: var(--vn-text-color); font-size: 14px; diff --git a/src/components/ui/VnLinkMail.vue b/src/components/ui/VnLinkMail.vue index a54f463f5..6c5129a9b 100644 --- a/src/components/ui/VnLinkMail.vue +++ b/src/components/ui/VnLinkMail.vue @@ -1,8 +1,11 @@ <script setup> +import { dashIfEmpty } from 'src/filters'; + defineProps({ email: { type: [String], default: null } }); </script> <template> <QBtn + class="q-pr-xs" v-if="email" flat round @@ -13,4 +16,5 @@ defineProps({ email: { type: [String], default: null } }); :href="`mailto:${email}`" @click.stop /> + <span>{{ dashIfEmpty(email) }}</span> </template> diff --git a/src/components/ui/VnLinkPhone.vue b/src/components/ui/VnLinkPhone.vue index 4174e4ae6..e34a70011 100644 --- a/src/components/ui/VnLinkPhone.vue +++ b/src/components/ui/VnLinkPhone.vue @@ -1,7 +1,7 @@ <script setup> import { ref, reactive, useAttrs, onBeforeMount, capitalize } from 'vue'; import axios from 'axios'; -import { parsePhone } from 'src/filters'; +import { dashIfEmpty, parsePhone } from 'src/filters'; import useOpenURL from 'src/composables/useOpenURL'; const props = defineProps({ @@ -12,50 +12,65 @@ const props = defineProps({ const phone = ref(props.phoneNumber); const config = reactive({ - sip: { icon: 'phone', href: `sip:${props.phoneNumber}` }, 'say-simple': { icon: 'vn:saysimple', url: null, 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 () => { if (!phone.value) return; - let { channel } = config[type]; - if (type === 'say-simple') { - const { url, defaultChannel } = (await axios.get('SaySimpleConfigs/findOne')) - .data; - if (!channel) channel = defaultChannel; + for (const type of activeTypes) { + if (type === 'say-simple') { + let { channel } = config[type]; + const { url, defaultChannel } = (await axios.get('SaySimpleConfigs/findOne')) + .data; + if (!channel) channel = defaultChannel; - phone.value = await parsePhone(props.phoneNumber, props.country?.toLowerCase()); - config[ - type - ].url = `${url}?customerIdentity=%2B${phone.value}&channelId=${channel}`; + phone.value = await parsePhone( + props.phoneNumber, + props.country?.toLowerCase(), + ); + config[type].url = + `${url}?customerIdentity=%2B${phone.value}&channelId=${channel}`; + } } }); -function handleClick() { +function handleClick(type) { if (config[type].url) useOpenURL(config[type].url); else if (config[type].href) window.location.href = config[type].href; } </script> + <template> - <QBtn - v-if="phone" - flat - round - :icon="config[type].icon" - size="sm" - color="primary" - padding="none" - @click.stop="handleClick" - > - <QTooltip> - {{ capitalize(type).replace('-', '') }} - </QTooltip> - </QBtn> - {{ phoneNumber }} + <div class="flex items-center gap-2"> + <template v-for="type in activeTypes"> + <QBtn + :key="type" + v-if="phone" + flat + round + :icon="config[type].icon" + size="sm" + color="primary" + padding="none" + @click.stop="() => handleClick(type)" + > + <QTooltip> + {{ capitalize(type).replace('-', '') }} + </QTooltip> + </QBtn></template + > + <span>{{ dashIfEmpty(phone) }}</span> + </div> </template> diff --git a/src/composables/useRole.js b/src/composables/useRole.js index e700b1f2e..e4e4f52c7 100644 --- a/src/composables/useRole.js +++ b/src/composables/useRole.js @@ -13,7 +13,7 @@ export function useRole() { name: data.user.name, nickname: data.user.nickname, lang: data.user.lang || 'es', - departmentFk: data.user.worker.department.departmentFk, + departmentFk: data.user?.worker?.department?.departmentFk, }; state.setUser(userData); state.setRoles(roles); diff --git a/src/pages/Customer/Card/CustomerSummary.vue b/src/pages/Customer/Card/CustomerSummary.vue index 7d5d691a3..167926698 100644 --- a/src/pages/Customer/Card/CustomerSummary.vue +++ b/src/pages/Customer/Card/CustomerSummary.vue @@ -84,29 +84,31 @@ const sumRisk = ({ clientRisks }) => { <VnLv :label="t('customer.summary.customerId')" :value="entity.id" /> <VnLv :label="t('globals.name')" :value="entity.name" /> <VnLv :label="t('customer.summary.contact')" :value="entity.contact" /> - <VnLv :value="entity.phone"> - <template #label> - {{ t('customer.extendedList.tableVisibleColumns.phone') }} + <VnLv :label="t('customer.extendedList.tableVisibleColumns.phone')"> + <template #value> <VnLinkPhone :phone-number="entity.phone" /> </template> </VnLv> - <VnLv :value="entity.mobile"> - <template #label> - {{ t('customer.summary.mobile') }} - <VnLinkPhone :phone-number="entity.mobile" /> + <VnLv :label="t('customer.summary.mobile')"> + <template #value> <VnLinkPhone + sip say-simple :phone-number="entity.mobile" :channel="entity.country?.saySimpleCountry?.channel" - class="q-ml-xs" /> </template> </VnLv> - <VnLv :value="entity.email" copy - ><template #label> - {{ t('globals.params.email') }} - <VnLinkMail email="entity.email"></VnLinkMail> </template - ></VnLv> + <VnLv + :label="t('globals.params.email')" + :value="entity.email" + class="ellipsis" + copy + > + <template #value> + <VnLinkMail :email="entity.email" /> + </template> + </VnLv> <VnLv :label="t('globals.department')"> <template #value> <span class="link" v-text="entity.department?.name" /> diff --git a/src/pages/Route/Roadmap/RoadmapSummary.vue b/src/pages/Route/Roadmap/RoadmapSummary.vue index 0c1c2b903..dcd02d98e 100644 --- a/src/pages/Route/Roadmap/RoadmapSummary.vue +++ b/src/pages/Route/Roadmap/RoadmapSummary.vue @@ -112,12 +112,9 @@ const filter = { :label="t('Trailer Plate')" :value="dashIfEmpty(entity?.trailerPlate)" /> - <VnLv :label="t('Phone')" :value="dashIfEmpty(entity?.phone)"> + <VnLv :label="t('Phone')"> <template #value> - <span> - {{ dashIfEmpty(entity?.phone) }} - <VnLinkPhone :phone-number="entity?.phone" /> - </span> + <VnLinkPhone :phone-number="entity?.phone" /> </template> </VnLv> <VnLv diff --git a/src/pages/Ticket/TicketList.vue b/src/pages/Ticket/TicketList.vue index 039d3ca9e..634b8e50a 100644 --- a/src/pages/Ticket/TicketList.vue +++ b/src/pages/Ticket/TicketList.vue @@ -113,7 +113,7 @@ const columns = computed(() => [ }, { align: 'left', - name: 'shipped', + name: 'shippedDate', cardVisible: true, label: t('ticketList.shipped'), columnFilter: { @@ -123,7 +123,7 @@ const columns = computed(() => [ }, { align: 'left', - name: 'shipped', + name: 'shippedHour', component: 'time', columnFilter: false, label: t('ticketList.hour'), diff --git a/src/pages/Ticket/locale/en.yml b/src/pages/Ticket/locale/en.yml index 9eb8ce8cb..2e44df7aa 100644 --- a/src/pages/Ticket/locale/en.yml +++ b/src/pages/Ticket/locale/en.yml @@ -205,6 +205,7 @@ ticketList: toLines: Go to lines addressNickname: Address nickname ref: Reference + hour: Hour rounding: Rounding noVerifiedData: No verified data purchaseRequest: Purchase request diff --git a/src/pages/Worker/Card/WorkerDescriptor.vue b/src/pages/Worker/Card/WorkerDescriptor.vue index 060520e84..9576e7e84 100644 --- a/src/pages/Worker/Card/WorkerDescriptor.vue +++ b/src/pages/Worker/Card/WorkerDescriptor.vue @@ -116,7 +116,7 @@ const handlePhotoUpdated = (evt = false) => { <template #body="{ entity }"> <VnLv :label="t('globals.user')" :value="entity.user?.name" /> <VnLv - class="ellipsis-text" + class="ellipsis" :label="t('globals.params.email')" :value="entity.user?.emailUser?.email" copy @@ -128,15 +128,13 @@ const handlePhotoUpdated = (evt = false) => { </template> </VnLv> - <VnLv :value="entity.phone"> - <template #label> - {{ t('globals.phone') }} + <VnLv :label="t('globals.phone')"> + <template #value> <VnLinkPhone :phone-number="entity.phone" /> </template> </VnLv> - <VnLv :value="entity?.sip?.extension"> - <template #label> - {{ t('worker.summary.sipExtension') }} + <VnLv :label="t('worker.summary.sipExtension')"> + <template #value> <VnLinkPhone :phone-number="entity?.sip?.extension" /> </template> </VnLv> diff --git a/src/pages/Worker/Card/WorkerSummary.vue b/src/pages/Worker/Card/WorkerSummary.vue index 1da2b7d11..96d5220f5 100644 --- a/src/pages/Worker/Card/WorkerSummary.vue +++ b/src/pages/Worker/Card/WorkerSummary.vue @@ -73,21 +73,18 @@ onBeforeMount(async () => { /> </template> </VnLv> - <VnLv :value="worker.mobileExtension"> - <template #label> - {{ t('worker.summary.phoneExtension') }} + <VnLv :label="t('worker.summary.phoneExtension')"> + <template #value> <VnLinkPhone :phone-number="worker.mobileExtension" /> </template> </VnLv> - <VnLv :value="worker.phone"> - <template #label> - {{ t('worker.summary.entPhone') }} + <VnLv :label="t('worker.summary.entPhone')"> + <template #value> <VnLinkPhone :phone-number="worker.phone" /> </template> </VnLv> - <VnLv :value="advancedSummary?.client?.phone"> - <template #label> - {{ t('worker.summary.personalPhone') }} + <VnLv :label="t('worker.summary.personalPhone')"> + <template #value> <VnLinkPhone :phone-number="advancedSummary?.client?.phone" /> @@ -135,6 +132,7 @@ onBeforeMount(async () => { <VnTitle :text="t('worker.summary.userData')" /> <VnLv :label="t('globals.name')" :value="worker?.user?.nickname" /> <VnLv + class="ellipsis" :label="t('globals.params.email')" :value="worker.user?.emailUser?.email" copy @@ -147,9 +145,8 @@ onBeforeMount(async () => { </span> </template> </VnLv> - <VnLv :value="worker?.sip?.extension"> - <template #label> - {{ t('worker.summary.sipExtension') }} + <VnLv :label="t('worker.summary.sipExtension')"> + <template #value> <VnLinkPhone :phone-number="worker?.sip?.extension" /> </template> </VnLv> diff --git a/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js b/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js index 7058e154c..9744486e0 100644 --- a/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js +++ b/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js @@ -40,7 +40,7 @@ describe('InvoiceInDescriptor', () => { cy.visit('/#/invoice-in/6/summary'); cy.selectDescriptorOption(5); - cy.dataCy('SendEmailNotifiactionDialogInput_input').type( + cy.dataCy('SendEmailNotificationDialogInput_input').type( '{selectall}jorgito@gmail.mx', ); cy.clickConfirm(); diff --git a/test/cypress/integration/invoiceOut/invoiceOutSummary.spec.js b/test/cypress/integration/invoiceOut/invoiceOutSummary.spec.js index 58307be05..49eed32c7 100644 --- a/test/cypress/integration/invoiceOut/invoiceOutSummary.spec.js +++ b/test/cypress/integration/invoiceOut/invoiceOutSummary.spec.js @@ -50,7 +50,7 @@ describe('InvoiceOut summary', () => { cy.dataCy('descriptor-more-opts').click(); cy.get(selectMenuOption(3)).click(); cy.dataCy('InvoiceOutDescriptorMenuSendPdfOption').click(); - cy.dataCy('SendEmailNotifiactionDialogInput').should('be.visible'); + cy.dataCy('SendEmailNotificationDialogInput').should('be.visible'); cy.get(confirmSend).click(); cy.checkNotification('Notification sent'); }); @@ -59,7 +59,7 @@ describe('InvoiceOut summary', () => { cy.dataCy('descriptor-more-opts').click(); cy.get(selectMenuOption(3)).click(); cy.dataCy('InvoiceOutDescriptorMenuSendCsvOption').click(); - cy.dataCy('SendEmailNotifiactionDialogInput').should('be.visible'); + cy.dataCy('SendEmailNotificationDialogInput').should('be.visible'); cy.get(confirmSend).click(); cy.checkNotification('Notification sent'); });