<script setup> import { ref, computed, markRaw } from 'vue'; import { useI18n } from 'vue-i18n'; import { useRouter } from 'vue-router'; import { useSummaryDialog } from 'src/composables/useSummaryDialog'; import { toDate } from 'src/filters'; import CustomerSummary from './Card/CustomerSummary.vue'; import CustomerFilter from './CustomerFilter.vue'; import VnTable from 'components/VnTable/VnTable.vue'; import VnLocation from 'src/components/common/VnLocation.vue'; import VnLinkPhone from 'src/components/ui/VnLinkPhone.vue'; import VnSelectWorker from 'src/components/common/VnSelectWorker.vue'; import VnSection from 'src/components/common/VnSection.vue'; const { t } = useI18n(); const router = useRouter(); const tableRef = ref(); const dataKey = 'CustomerList'; const columns = computed(() => [ { align: 'left', name: 'id', label: t('customer.extendedList.tableVisibleColumns.id'), chip: { condition: () => true, }, isId: true, columnFilter: { component: 'select', name: 'search', attrs: { url: 'Clients', fields: ['id', 'name'], }, }, }, { align: 'left', name: 'name', label: t('globals.name'), isTitle: true, create: true, columnClass: 'expand', }, { align: 'left', name: 'socialName', label: t('customer.extendedList.tableVisibleColumns.socialName'), isTitle: true, create: true, columnClass: 'expand', columnFilter: { component: 'select', attrs: { url: 'Clients', fields: ['socialName'], optionLabel: 'socialName', optionValue: 'socialName', uppercase: false, }, }, attrs: { uppercase: true, }, }, { align: 'left', name: 'fi', label: t('customer.extendedList.tableVisibleColumns.fi'), create: true, }, { align: 'left', name: 'salesPersonFk', label: t('customer.extendedList.tableVisibleColumns.salesPersonFk'), component: 'select', attrs: { url: 'Workers/activeWithInheritedRole', fields: ['id', 'name', 'firstName'], where: { role: 'salesPerson' }, optionFilter: 'firstName', }, columnFilter: { component: 'select', attrs: { url: 'Workers/activeWithInheritedRole', fields: ['id', 'name', 'firstName'], where: { role: 'salesPerson' }, optionLabel: 'firstName', optionValue: 'id', }, }, create: false, columnField: { component: null, }, format: (row, dashIfEmpty) => dashIfEmpty(row.salesPerson), }, { align: 'left', name: 'credit', label: t('customer.summary.credit'), columnFilter: { component: 'number', inWhere: true, }, }, { align: 'left', name: 'creditInsurance', label: t('customer.extendedList.tableVisibleColumns.creditInsurance'), columnFilter: { component: 'number', inWhere: true, }, }, { align: 'left', name: 'phone', label: t('customer.extendedList.tableVisibleColumns.phone'), cardVisible: true, columnFilter: { component: 'number', }, columnField: { component: null, after: { component: markRaw(VnLinkPhone), attrs: ({ model }) => { return { 'phone-number': model, }; }, }, }, }, { align: 'left', name: 'mobile', label: t('customer.summary.mobile'), cardVisible: true, columnFilter: { component: 'number', inWhere: true, }, }, { align: 'left', name: 'street', label: t('customer.extendedList.tableVisibleColumns.street'), create: true, columnFilter: { inWhere: true, }, columnClass: 'expand', }, { align: 'left', name: 'countryFk', label: t('customer.extendedList.tableVisibleColumns.countryFk'), columnFilter: { component: 'select', inWhere: true, alias: 'c', attrs: { url: 'Countries', }, }, format: (row, dashIfEmpty) => dashIfEmpty(row.country), }, { align: 'left', name: 'provinceFk', label: t('customer.extendedList.tableVisibleColumns.provinceFk'), component: 'select', attrs: { url: 'Provinces', }, columnField: { component: null, }, format: (row, dashIfEmpty) => dashIfEmpty(row.province), }, { align: 'left', name: 'city', label: t('customer.summary.city'), }, { align: 'left', name: 'postcode', label: t('customer.summary.postcode'), }, { align: 'left', name: 'email', label: t('globals.params.email'), cardVisible: true, }, { align: 'left', name: 'created', label: t('customer.extendedList.tableVisibleColumns.created'), format: ({ created }) => toDate(created), columnFilter: { component: 'date', alias: 'c', inWhere: true, }, }, { align: 'left', name: 'businessTypeFk', label: t('customer.extendedList.tableVisibleColumns.businessTypeFk'), create: true, component: 'select', columnFilter: { inWhere: true, }, attrs: { url: 'BusinessTypes', fields: ['code', 'description'], sortBy: 'description ASC ', optionLabel: 'description', optionValue: 'code', }, columnField: { component: null, }, format: (row, dashIfEmpty) => dashIfEmpty(row.businessType), }, { align: 'left', name: 'payMethodFk', label: t('customer.summary.payMethodFk'), columnFilter: { component: 'select', attrs: { url: 'PayMethods', }, inWhere: true, }, format: (row, dashIfEmpty) => dashIfEmpty(row.payMethod), }, { align: 'left', label: t('customer.extendedList.tableVisibleColumns.sageTaxTypeFk'), name: 'sageTaxTypeFk', columnFilter: { component: 'select', attrs: { optionLabel: 'vat', url: 'SageTaxTypes', }, }, format: (row, dashIfEmpty) => dashIfEmpty(row.sageTaxType), }, { align: 'left', label: t('customer.extendedList.tableVisibleColumns.sageTransactionTypeFk'), name: 'sageTransactionTypeFk', columnFilter: { component: 'select', attrs: { optionLabel: 'transaction', url: 'SageTransactionTypes', }, }, format: (row, dashIfEmpty) => dashIfEmpty(row.sageTransactionType), }, { align: 'left', name: 'isActive', label: t('customer.summary.isActive'), component: 'checkbox', chip: { color: null, condition: (value) => !value, icon: 'vn:disabled', }, columnFilter: { inWhere: true, }, }, { align: 'left', name: 'isVies', label: t('globals.isVies'), columnFilter: { inWhere: true, }, }, { align: 'left', name: 'isTaxDataChecked', label: t('customer.extendedList.tableVisibleColumns.isTaxDataChecked'), columnFilter: { inWhere: true, }, }, { align: 'left', name: 'isEqualizated', label: t('customer.summary.isEqualizated'), create: true, columnFilter: { inWhere: true, }, }, { align: 'left', name: 'isFreezed', label: t('customer.extendedList.tableVisibleColumns.isFreezed'), component: 'checkbox', chip: { color: null, condition: (value) => value, icon: 'vn:frozen', }, columnFilter: { inWhere: true, }, }, { align: 'left', name: 'hasToInvoice', label: t('customer.extendedList.tableVisibleColumns.hasToInvoice'), columnFilter: { inWhere: true, }, }, { align: 'left', name: 'hasToInvoiceByAddress', label: t('customer.extendedList.tableVisibleColumns.hasToInvoiceByAddress'), columnFilter: { inWhere: true, }, }, { align: 'left', name: 'isToBeMailed', label: t('customer.extendedList.tableVisibleColumns.isToBeMailed'), columnFilter: { inWhere: true, }, }, { align: 'left', name: 'hasLcr', label: t('customer.summary.hasLcr'), columnFilter: { inWhere: true, }, }, { align: 'left', name: 'hasCoreVnl', label: t('customer.summary.hasCoreVnl'), columnFilter: { inWhere: true, }, }, { align: 'left', name: 'hasSepaVnl', label: t('customer.extendedList.tableVisibleColumns.hasSepaVnl'), columnFilter: { inWhere: true, }, }, { align: 'right', label: '', name: 'tableActions', actions: [ { title: t('Client ticket list'), icon: 'vn:ticket', action: redirectToTicketsList, isPrimary: true, }, { title: t('components.smartCard.viewSummary'), icon: 'preview', isPrimary: true, action: (row) => viewSummary(row.id, CustomerSummary), }, ], }, ]); const { viewSummary } = useSummaryDialog(); const redirectToTicketsList = (row) => { router.push({ name: 'TicketList', query: { table: JSON.stringify({ clientFk: row.id, }), }, }); }; function handleLocation(data, location) { const { town, code, provinceFk, countryFk } = location ?? {}; data.postcode = code; data.city = town; data.provinceFk = provinceFk; data.countryFk = countryFk; } </script> <template> <VnSection :data-key="dataKey" :columns="columns" prefix="customer" :array-data-props="{ url: 'Clients/filter', order: ['id DESC'], }" > <template #advanced-menu> <CustomerFilter data-key="CustomerList" /> </template> <template #body> <VnTable ref="tableRef" :data-key="dataKey" url="Clients/extendedListFilter" :create="{ urlCreate: 'Clients/createWithUser', title: t('globals.pageTitles.customerCreate'), onDataSaved: ({ id }) => tableRef.redirect(id), formInitialData: { active: true, isEqualizated: false, }, }" :columns="columns" :right-search="false" redirect="customer" > <template #more-create-dialog="{ data }"> <VnSelectWorker :label="t('customer.summary.salesPerson')" v-model="data.salesPersonFk" :params="{ departmentCodes: ['VT', 'shopping'], }" :has-avatar="true" :id-value="data.salesPersonFk" emit-value auto-load > <template #prepend> <VnAvatar :worker-id="data.salesPersonFk" color="primary" :title="title" /> </template> <template #option="scope"> <QItem v-bind="scope.itemProps"> <QItemSection> <QItemLabel>{{ scope.opt?.name }}</QItemLabel> <QItemLabel caption >{{ scope.opt?.nickname }}, {{ scope.opt?.code }}</QItemLabel > </QItemSection> </QItem> </template> </VnSelectWorker> <VnLocation :acls="[{ model: 'Province', props: '*', accessType: 'WRITE' }]" v-model="data.location" @update:model-value="(location) => handleLocation(data, location)" /> <QInput v-model="data.userName" :label="t('Web user')" /> <QInput :label="t('Email')" clearable type="email" v-model="data.email" > <template #append> <QIcon name="info" class="cursor-info"> <QTooltip max-width="400px">{{ t('customer.basicData.youCanSaveMultipleEmails') }}</QTooltip> </QIcon> </template> </QInput> </template> </VnTable> </template> </VnSection> </template> <i18n> es: Web user: Usuario web </i18n> <style lang="scss" scoped> .col-content { border-radius: 4px; padding: 6px; } </style>