forked from verdnatura/salix-front
Se crea tabla de notificaciones, tarjeta por identificador y filtros
This commit is contained in:
parent
465b595a92
commit
899b9536b6
|
@ -112,6 +112,7 @@ export default {
|
||||||
list: 'List',
|
list: 'List',
|
||||||
webPayments: 'Web Payments',
|
webPayments: 'Web Payments',
|
||||||
extendedList: 'Extended list',
|
extendedList: 'Extended list',
|
||||||
|
notifications: 'Notifications',
|
||||||
createCustomer: 'Create customer',
|
createCustomer: 'Create customer',
|
||||||
summary: 'Summary',
|
summary: 'Summary',
|
||||||
basicData: 'Basic Data',
|
basicData: 'Basic Data',
|
||||||
|
|
|
@ -112,6 +112,7 @@ export default {
|
||||||
list: 'Listado',
|
list: 'Listado',
|
||||||
webPayments: 'Pagos Web',
|
webPayments: 'Pagos Web',
|
||||||
extendedList: 'Listado extendido',
|
extendedList: 'Listado extendido',
|
||||||
|
notifications: 'Notificaciones',
|
||||||
createCustomer: 'Crear cliente',
|
createCustomer: 'Crear cliente',
|
||||||
basicData: 'Datos básicos',
|
basicData: 'Datos básicos',
|
||||||
summary: 'Resumen',
|
summary: 'Resumen',
|
||||||
|
|
|
@ -80,7 +80,7 @@ const workers = ref();
|
||||||
<QItemSection v-if="workers">
|
<QItemSection v-if="workers">
|
||||||
<VnSelectFilter
|
<VnSelectFilter
|
||||||
:label="t('Salesperson')"
|
:label="t('Salesperson')"
|
||||||
v-model="params.salesPerson"
|
v-model="params.salesPersonFk"
|
||||||
@update:model-value="searchFn()"
|
@update:model-value="searchFn()"
|
||||||
:options="workers"
|
:options="workers"
|
||||||
option-value="id"
|
option-value="id"
|
||||||
|
|
|
@ -0,0 +1,163 @@
|
||||||
|
<script setup>
|
||||||
|
import { ref, computed, onBeforeMount } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import { QBtn } from 'quasar';
|
||||||
|
|
||||||
|
import { useArrayData } from 'composables/useArrayData';
|
||||||
|
import { useStateStore } from 'stores/useStateStore';
|
||||||
|
|
||||||
|
import CustomerNotificationsFilter from './CustomerNotificationsFilter.vue';
|
||||||
|
import CustomerDescriptorProxy from './Card/CustomerDescriptorProxy.vue';
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
const stateStore = useStateStore();
|
||||||
|
|
||||||
|
const arrayData = ref(null);
|
||||||
|
|
||||||
|
onBeforeMount(async () => {
|
||||||
|
arrayData.value = useArrayData('CustomerNotifications', {
|
||||||
|
url: 'Clients',
|
||||||
|
limit: 0,
|
||||||
|
});
|
||||||
|
await arrayData.value.fetch({ append: false });
|
||||||
|
stateStore.rightDrawer = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
const rows = computed(() => arrayData.value.store.data);
|
||||||
|
|
||||||
|
const selected = ref([]);
|
||||||
|
const selectedCustomerId = ref(0);
|
||||||
|
|
||||||
|
const tableColumnComponents = {
|
||||||
|
id: {
|
||||||
|
component: QBtn,
|
||||||
|
props: () => ({ flat: true, color: 'blue' }),
|
||||||
|
event: (prop) => selectCustomerId(prop.row.id),
|
||||||
|
},
|
||||||
|
socialName: {
|
||||||
|
component: 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
|
},
|
||||||
|
city: {
|
||||||
|
component: 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
|
},
|
||||||
|
phone: {
|
||||||
|
component: 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
|
},
|
||||||
|
email: {
|
||||||
|
component: 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = computed(() => {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
align: 'left',
|
||||||
|
field: 'id',
|
||||||
|
label: t('Identifier'),
|
||||||
|
name: 'id',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
align: 'left',
|
||||||
|
field: 'socialName',
|
||||||
|
label: t('Social name'),
|
||||||
|
name: 'socialName',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
align: 'left',
|
||||||
|
field: 'city',
|
||||||
|
label: t('City'),
|
||||||
|
name: 'city',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
align: 'left',
|
||||||
|
field: 'phone',
|
||||||
|
label: t('Phone'),
|
||||||
|
name: 'phone',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
align: 'left',
|
||||||
|
field: 'email',
|
||||||
|
label: t('Email'),
|
||||||
|
name: 'email',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
|
const selectCustomerId = (id) => {
|
||||||
|
selectedCustomerId.value = id;
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<QDrawer v-model="stateStore.rightDrawer" side="right" :width="256" show-if-above>
|
||||||
|
<QScrollArea class="fit text-grey-8">
|
||||||
|
<CustomerNotificationsFilter data-key="CustomerNotifications" />
|
||||||
|
</QScrollArea>
|
||||||
|
</QDrawer>
|
||||||
|
|
||||||
|
<QToolbar class="bg-vn-dark">
|
||||||
|
<div id="st-data"></div>
|
||||||
|
<QSpace />
|
||||||
|
<div id="st-actions"></div>
|
||||||
|
</QToolbar>
|
||||||
|
|
||||||
|
<QPage class="column items-center q-pa-md">
|
||||||
|
<QTable
|
||||||
|
:columns="columns"
|
||||||
|
:pagination="{ rowsPerPage: 0 }"
|
||||||
|
:rows="rows"
|
||||||
|
class="full-width q-mt-md"
|
||||||
|
hide-bottom
|
||||||
|
row-key="id"
|
||||||
|
selection="multiple"
|
||||||
|
v-model:selected="selected"
|
||||||
|
>
|
||||||
|
<template #top>
|
||||||
|
<div v-if="rows" class="full-width flex justify-end">
|
||||||
|
{{ `${rows.length} ${t('route.cmr.list.results')}` }}
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template #body-cell="props">
|
||||||
|
<QTd :props="props">
|
||||||
|
<QTr :props="props" class="cursor-pointer">
|
||||||
|
<component
|
||||||
|
:is="tableColumnComponents[props.col.name].component"
|
||||||
|
class="col-content"
|
||||||
|
v-bind="tableColumnComponents[props.col.name].props(props)"
|
||||||
|
@click="tableColumnComponents[props.col.name].event(props)"
|
||||||
|
>
|
||||||
|
{{ props.value }}
|
||||||
|
<CustomerDescriptorProxy :id="selectedCustomerId" />
|
||||||
|
</component>
|
||||||
|
</QTr>
|
||||||
|
</QTd>
|
||||||
|
</template>
|
||||||
|
</QTable>
|
||||||
|
</QPage>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.col-content {
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 6px 6px 6px 6px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<i18n>
|
||||||
|
es:
|
||||||
|
Identifier: Identificador
|
||||||
|
Social name: Razón social
|
||||||
|
Salesperson: Comercial
|
||||||
|
Phone: Teléfono
|
||||||
|
City: Población
|
||||||
|
Email: Email
|
||||||
|
</i18n>
|
|
@ -0,0 +1,144 @@
|
||||||
|
<script setup>
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import FetchData from 'components/FetchData.vue';
|
||||||
|
import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
|
||||||
|
import VnSelectFilter from 'components/common/VnSelectFilter.vue';
|
||||||
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
const props = defineProps({
|
||||||
|
dataKey: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const clients = ref();
|
||||||
|
const cities = ref();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<FetchData
|
||||||
|
url="Clients"
|
||||||
|
:filter="{ where: { role: 'socialName' } }"
|
||||||
|
@on-fetch="(data) => (clients = data)"
|
||||||
|
auto-load
|
||||||
|
/>
|
||||||
|
<FetchData url="Towns" @on-fetch="(data) => (cities = data)" auto-load />
|
||||||
|
<VnFilterPanel :data-key="props.dataKey" :search-button="true">
|
||||||
|
<template #tags="{ tag, formatFn }">
|
||||||
|
<div class="q-gutter-x-xs">
|
||||||
|
<strong>{{ t(`params.${tag.label}`) }}: </strong>
|
||||||
|
<span>{{ formatFn(tag.value) }}</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #body="{ params, searchFn }">
|
||||||
|
<QList dense class="list">
|
||||||
|
<QItem class="q-mb-sm q-mt-sm">
|
||||||
|
<QItemSection>
|
||||||
|
<VnInput
|
||||||
|
:label="t('Identifier')"
|
||||||
|
v-model="params.identifier"
|
||||||
|
is-outlined
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
|
||||||
|
<QItem class="q-mb-sm">
|
||||||
|
<QItemSection v-if="!clients">
|
||||||
|
<QSkeleton type="QInput" class="full-width" />
|
||||||
|
</QItemSection>
|
||||||
|
<QItemSection v-if="clients">
|
||||||
|
<VnSelectFilter
|
||||||
|
:label="t('Social name')"
|
||||||
|
v-model="params.socialName"
|
||||||
|
@update:model-value="searchFn()"
|
||||||
|
:options="clients"
|
||||||
|
option-value="socialName"
|
||||||
|
option-label="socialName"
|
||||||
|
emit-value
|
||||||
|
map-options
|
||||||
|
use-input
|
||||||
|
hide-selected
|
||||||
|
dense
|
||||||
|
outlined
|
||||||
|
rounded
|
||||||
|
:input-debounce="0"
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
|
||||||
|
<QItem class="q-mb-sm">
|
||||||
|
<QItemSection v-if="!cities">
|
||||||
|
<QSkeleton type="QInput" class="full-width" />
|
||||||
|
</QItemSection>
|
||||||
|
<QItemSection v-if="cities">
|
||||||
|
<VnSelectFilter
|
||||||
|
:label="t('City')"
|
||||||
|
v-model="params.city"
|
||||||
|
@update:model-value="searchFn()"
|
||||||
|
:options="cities"
|
||||||
|
option-value="name"
|
||||||
|
option-label="name"
|
||||||
|
emit-value
|
||||||
|
map-options
|
||||||
|
use-input
|
||||||
|
hide-selected
|
||||||
|
dense
|
||||||
|
outlined
|
||||||
|
rounded
|
||||||
|
:input-debounce="0"
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
|
||||||
|
<QItem class="q-mb-sm">
|
||||||
|
<QItemSection>
|
||||||
|
<VnInput :label="t('Phone')" v-model="params.phone" is-outlined />
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
|
||||||
|
<QItem class="q-mb-sm">
|
||||||
|
<QItemSection>
|
||||||
|
<VnInput :label="t('Email')" v-model="params.email" is-outlined />
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
<QSeparator />
|
||||||
|
</QList>
|
||||||
|
</template>
|
||||||
|
</VnFilterPanel>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.list {
|
||||||
|
width: 256px;
|
||||||
|
}
|
||||||
|
.list * {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<i18n>
|
||||||
|
en:
|
||||||
|
params:
|
||||||
|
identifier: Identifier
|
||||||
|
socialName: Social name
|
||||||
|
city: City
|
||||||
|
phone: Phone
|
||||||
|
email: Email
|
||||||
|
es:
|
||||||
|
params:
|
||||||
|
identifier: Identificador
|
||||||
|
socialName: Razón social
|
||||||
|
city: Población
|
||||||
|
phone: Teléfono
|
||||||
|
email: Email
|
||||||
|
Identifier: Identificador
|
||||||
|
Social name: Razón social
|
||||||
|
City: Población
|
||||||
|
Phone: Teléfono
|
||||||
|
Email: Email
|
||||||
|
</i18n>
|
|
@ -10,7 +10,12 @@ export default {
|
||||||
component: RouterView,
|
component: RouterView,
|
||||||
redirect: { name: 'CustomerMain' },
|
redirect: { name: 'CustomerMain' },
|
||||||
menus: {
|
menus: {
|
||||||
main: ['CustomerList', 'CustomerPayments', 'CustomerExtendedList'],
|
main: [
|
||||||
|
'CustomerList',
|
||||||
|
'CustomerPayments',
|
||||||
|
'CustomerExtendedList',
|
||||||
|
'CustomerNotifications',
|
||||||
|
],
|
||||||
card: ['CustomerBasicData'],
|
card: ['CustomerBasicData'],
|
||||||
},
|
},
|
||||||
children: [
|
children: [
|
||||||
|
@ -56,6 +61,16 @@ export default {
|
||||||
component: () =>
|
component: () =>
|
||||||
import('src/pages/Customer/CustomerExtendedList.vue'),
|
import('src/pages/Customer/CustomerExtendedList.vue'),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: 'notifications',
|
||||||
|
name: 'CustomerNotifications',
|
||||||
|
meta: {
|
||||||
|
title: 'notifications',
|
||||||
|
icon: 'notifications',
|
||||||
|
},
|
||||||
|
component: () =>
|
||||||
|
import('src/pages/Customer/CustomerNotifications.vue'),
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue