forked from verdnatura/salix-front
Merge pull request 'refactor(ticketsms): refs #6259 add vnSms create customerSms' (!137) from 6259-ticketSmsToClientSms into dev
Reviewed-on: verdnatura/salix-front#137 Reviewed-by: Alex Moreno <alexm@verdnatura.es>
This commit is contained in:
commit
b670f6b3ee
|
@ -1,8 +1,10 @@
|
|||
<script setup>
|
||||
import { useSession } from 'src/composables/useSession';
|
||||
import WorkerDescriptorProxy from 'pages/Worker/Card/WorkerDescriptorProxy.vue';
|
||||
const $props = defineProps({
|
||||
worker: { type: Number, required: true },
|
||||
description: { type: String, default: null },
|
||||
clickable: { type: Boolean, default: false },
|
||||
});
|
||||
const session = useSession();
|
||||
const token = session.getToken();
|
||||
|
@ -22,5 +24,6 @@ const token = session.getToken();
|
|||
</p>
|
||||
</slot>
|
||||
</div>
|
||||
<WorkerDescriptorProxy :v-if="$props.clickable" :id="$props.worker" />
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -0,0 +1,110 @@
|
|||
<script setup>
|
||||
import { onBeforeMount } from 'vue';
|
||||
import { date } from 'quasar';
|
||||
import VnPaginate from 'src/components/ui/VnPaginate.vue';
|
||||
import VnAvatar from '../ui/VnAvatar.vue';
|
||||
|
||||
const $props = defineProps({
|
||||
url: { type: String, default: null },
|
||||
where: { type: Object, default: () => {} },
|
||||
});
|
||||
|
||||
const filter = {
|
||||
fields: ['smsFk'],
|
||||
include: {
|
||||
relation: 'sms',
|
||||
scope: {
|
||||
fields: [
|
||||
'senderFk',
|
||||
'sender',
|
||||
'destination',
|
||||
'message',
|
||||
'statusCode',
|
||||
'status',
|
||||
'created',
|
||||
],
|
||||
include: {
|
||||
relation: 'sender',
|
||||
scope: {
|
||||
fields: ['name'],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
onBeforeMount(() => (filter.where = $props.where));
|
||||
|
||||
function formatNumber(number) {
|
||||
if (number.length <= 10) return number;
|
||||
return number.slice(0, 4) + ' ' + number.slice(4);
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="column items-center">
|
||||
<div class="list">
|
||||
<VnPaginate
|
||||
:data-key="$props.url"
|
||||
:url="$props.url"
|
||||
:filter="filter"
|
||||
order="smsFk DESC"
|
||||
:offset="100"
|
||||
:limit="5"
|
||||
auto-load
|
||||
>
|
||||
<template #body="{ rows }">
|
||||
<QCard
|
||||
flat
|
||||
bordered
|
||||
class="card q-pa-md q-mb-sm smsCard"
|
||||
v-for="row of rows"
|
||||
:key="row.smsFk"
|
||||
>
|
||||
<QItem>
|
||||
<QItemSection side top>
|
||||
<VnAvatar
|
||||
class="cursor-pointer"
|
||||
:worker="row.sms.senderFk"
|
||||
:title="row.sms.sender.name"
|
||||
:clickable="true"
|
||||
/>
|
||||
</QItemSection>
|
||||
<QSeparator />
|
||||
<QItemSection>
|
||||
<QItemLabel caption>{{
|
||||
formatNumber(row.sms.destination)
|
||||
}}</QItemLabel>
|
||||
<QItemLabel>{{ row.sms.message }}</QItemLabel>
|
||||
</QItemSection>
|
||||
<QItemSection side>
|
||||
<QItemLabel caption>{{
|
||||
date.formatDate(
|
||||
row.sms.created,
|
||||
'YYYY-MM-DD HH:mm:ss'
|
||||
)
|
||||
}}</QItemLabel>
|
||||
<QItemLabel class="row center">
|
||||
<QChip
|
||||
:color="
|
||||
row.sms.status == 'OK'
|
||||
? 'positive'
|
||||
: 'negative'
|
||||
"
|
||||
>
|
||||
{{ row.sms.status }}
|
||||
</QChip>
|
||||
</QItemLabel>
|
||||
</QItemSection>
|
||||
</QItem>
|
||||
</QCard>
|
||||
</template>
|
||||
</VnPaginate>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style lang="scss" scoped>
|
||||
.q-item__section--side {
|
||||
align-items: center;
|
||||
}
|
||||
</style>
|
|
@ -155,7 +155,9 @@ export function useArrayData(key, userOptions) {
|
|||
delete store.userParams[param];
|
||||
delete params[param];
|
||||
if (store.filter?.where) {
|
||||
delete store.filter.where[Object.keys(exprBuilder ? exprBuilder(param) : param)[0]];
|
||||
delete store.filter.where[
|
||||
Object.keys(exprBuilder ? exprBuilder(param) : param)[0]
|
||||
];
|
||||
if (Object.keys(store.filter.where).length === 0) {
|
||||
delete store.filter.where;
|
||||
}
|
||||
|
|
|
@ -114,6 +114,7 @@ export default {
|
|||
createCustomer: 'Create customer',
|
||||
summary: 'Summary',
|
||||
basicData: 'Basic Data',
|
||||
sms: 'Sms',
|
||||
},
|
||||
list: {
|
||||
phone: 'Phone',
|
||||
|
|
|
@ -113,6 +113,7 @@ export default {
|
|||
createCustomer: 'Crear cliente',
|
||||
basicData: 'Datos básicos',
|
||||
summary: 'Resumen',
|
||||
sms: 'Sms',
|
||||
},
|
||||
list: {
|
||||
phone: 'Teléfono',
|
||||
|
|
|
@ -38,15 +38,6 @@ function viewSummary(id) {
|
|||
},
|
||||
});
|
||||
}
|
||||
|
||||
function viewDescriptor(id) {
|
||||
quasar.dialog({
|
||||
component: CustomerDescriptorProxy,
|
||||
componentProps: {
|
||||
id,
|
||||
},
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
<script setup>
|
||||
import { useRoute } from 'vue-router';
|
||||
import VnSms from 'src/components/ui/VnSms.vue';
|
||||
|
||||
const route = useRoute();
|
||||
const id = route.params.id;
|
||||
|
||||
const where = {
|
||||
clientFk: id,
|
||||
ticketFk: null,
|
||||
};
|
||||
</script>
|
||||
<template>
|
||||
<div class="column items-center">
|
||||
<VnSms url="clientSms" :where="where" />
|
||||
</div>
|
||||
</template>
|
|
@ -1,118 +1,16 @@
|
|||
<script setup>
|
||||
import { date } from 'quasar';
|
||||
import { computed } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import { useRoute } from 'vue-router';
|
||||
import VnSms from 'src/components/ui/VnSms.vue';
|
||||
|
||||
import { useSession } from 'src/composables/useSession';
|
||||
import VnPaginate from 'src/components/ui/VnPaginate.vue';
|
||||
import WorkerDescriptorProxy from 'pages/Worker/Card/WorkerDescriptorProxy.vue';
|
||||
const route = useRoute();
|
||||
const id = route.params.id;
|
||||
|
||||
const router = useRouter();
|
||||
const session = useSession();
|
||||
const token = session.getToken();
|
||||
|
||||
const entityId = computed(function () {
|
||||
return router.currentRoute.value.params.id;
|
||||
});
|
||||
|
||||
const filter = {
|
||||
fields: ['ticketFk', 'smsFk'],
|
||||
include: {
|
||||
relation: 'sms',
|
||||
scope: {
|
||||
fields: [
|
||||
'senderFk',
|
||||
'sender',
|
||||
'destination',
|
||||
'message',
|
||||
'statusCode',
|
||||
'status',
|
||||
'created',
|
||||
],
|
||||
include: {
|
||||
relation: 'sender',
|
||||
scope: {
|
||||
fields: ['name'],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
where: {
|
||||
ticketFk: entityId,
|
||||
},
|
||||
const where = {
|
||||
ticketFk: id,
|
||||
};
|
||||
|
||||
function formatNumer(number) {
|
||||
if (number.length <= 10) return number;
|
||||
return number.slice(0, 4) + ' ' + number.slice(4);
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="column items-center">
|
||||
<div class="list">
|
||||
<VnPaginate
|
||||
data-key="TicketSms"
|
||||
url="TicketSms"
|
||||
:filter="filter"
|
||||
order="smsFk DESC"
|
||||
:offset="100"
|
||||
:limit="5"
|
||||
auto-load
|
||||
>
|
||||
<template #body="{ rows }">
|
||||
<QCard
|
||||
flat
|
||||
bordered
|
||||
class="card q-pa-md"
|
||||
v-for="row of rows"
|
||||
:key="row.smsFk"
|
||||
>
|
||||
<QItem>
|
||||
<QItmSection top avatar>
|
||||
<QItemLabel class="column items-center">
|
||||
<QAvatar>
|
||||
<QImg
|
||||
:src="`/api/Images/user/160x160/${row.sms.senderFk}/download?access_token=${token}`"
|
||||
spinner-color="white"
|
||||
/>
|
||||
</QAvatar>
|
||||
<span class="link">
|
||||
{{ row.sms.sender.name }}
|
||||
<WorkerDescriptorProxy :id="row.sms.senderFk" />
|
||||
</span>
|
||||
</QItemLabel>
|
||||
</QItmSection>
|
||||
<QSeparator spaced inset="item" />
|
||||
<QItemSection>
|
||||
<QItemLabel caption>{{
|
||||
formatNumer(row.sms.destination)
|
||||
}}</QItemLabel>
|
||||
<QItemLabel>{{ row.sms.message }}</QItemLabel>
|
||||
</QItemSection>
|
||||
<QItemSection side top>
|
||||
<QItemLabel caption>{{
|
||||
date.formatDate(
|
||||
row.sms.created,
|
||||
'YYYY-MM-DD HH:mm:ss'
|
||||
)
|
||||
}}</QItemLabel>
|
||||
<QItemLabel>
|
||||
<QChip
|
||||
:color="
|
||||
row.sms.status == 'OK'
|
||||
? 'positive'
|
||||
: 'negative'
|
||||
"
|
||||
>
|
||||
{{ row.sms.status }}
|
||||
</QChip>
|
||||
</QItemLabel>
|
||||
</QItemSection>
|
||||
</QItem>
|
||||
</QCard>
|
||||
</template>
|
||||
</VnPaginate>
|
||||
</div>
|
||||
<VnSms url="clientSms" :where="where" />
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -11,7 +11,7 @@ export default {
|
|||
redirect: { name: 'CustomerMain' },
|
||||
menus: {
|
||||
main: ['CustomerList', 'CustomerPayments'],
|
||||
card: ['CustomerBasicData'],
|
||||
card: ['CustomerBasicData', 'CustomerSms'],
|
||||
},
|
||||
children: [
|
||||
{
|
||||
|
@ -66,6 +66,15 @@ export default {
|
|||
component: () =>
|
||||
import('src/pages/Customer/Card/CustomerBasicData.vue'),
|
||||
},
|
||||
{
|
||||
path: 'sms',
|
||||
name: 'CustomerSms',
|
||||
meta: {
|
||||
title: 'sms',
|
||||
icon: 'sms',
|
||||
},
|
||||
component: () => import('src/pages/Customer/Card/CustomerSms.vue'),
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
import { vi, describe, expect, it, beforeAll, afterEach } from 'vitest';
|
||||
import { createWrapper, axios } from 'app/test/vitest/helper';
|
||||
import VnSms from 'src/components/ui/VnSms.vue';
|
||||
|
||||
describe('VnSms', () => {
|
||||
let vm;
|
||||
|
||||
beforeAll(() => {
|
||||
vm = createWrapper(VnSms, {
|
||||
global: {
|
||||
stubs: ['VnPaginate'],
|
||||
mocks: {},
|
||||
},
|
||||
}).vm;
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vi.clearAllMocks();
|
||||
});
|
||||
|
||||
it('should format number correctly', () => {
|
||||
const formattedNumber = vm.formatNumber('123456789012');
|
||||
expect(formattedNumber).toBe('1234 56789012');
|
||||
});
|
||||
});
|
Loading…
Reference in New Issue