salix-front/src/pages/Account/AccountList.vue

151 lines
3.8 KiB
Vue

<script setup>
import { useI18n } from 'vue-i18n';
import { ref, computed, onBeforeMount } from 'vue';
import VnTable from 'components/VnTable/VnTable.vue';
import VnSearchbar from 'components/ui/VnSearchbar.vue';
import AccountSummary from './Card/AccountSummary.vue';
import { useSummaryDialog } from 'src/composables/useSummaryDialog';
import VnCardMain from 'src/components/common/VnCardMain.vue';
import VnTableFilter from 'src/components/VnTable/VnTableFilter.vue';
import { useArrayData } from 'src/composables/useArrayData';
const { t } = useI18n();
const { viewSummary } = useSummaryDialog();
const tableRef = ref();
const filter = {
include: { relation: 'role', scope: { fields: ['id', 'name'] } },
};
const dataKey = 'AccountList';
const url = 'VnUsers/preview';
const columns = computed(() => [
{
align: 'left',
name: 'id',
label: t('Id'),
isId: true,
field: 'id',
cardVisible: true,
},
{
align: 'left',
name: 'roleFk',
label: t('role'),
columnFilter: {
component: 'select',
name: 'roleFk',
attrs: {
url: 'VnRoles',
optionValue: 'id',
optionLabel: 'name',
},
},
format: ({ role }, dashIfEmpty) => dashIfEmpty(role?.name),
},
{
align: 'left',
name: 'nickname',
label: t('Nickname'),
isTitle: true,
component: 'input',
columnField: {
component: null,
},
cardVisible: true,
create: true,
},
{
align: 'left',
name: 'name',
label: t('Name'),
component: 'input',
columnField: {
component: null,
},
cardVisible: true,
create: true,
},
{
align: 'left',
name: 'email',
label: t('email'),
component: 'input',
create: true,
visible: false,
},
{
align: 'right',
label: '',
name: 'tableActions',
actions: [
{
title: t('components.smartCard.viewSummary'),
icon: 'preview',
action: (row) => viewSummary(row.id, AccountSummary),
isPrimary: true,
},
],
},
]);
onBeforeMount(() => {
useArrayData(dataKey, {
url,
userFilter: filter,
order: 'id DESC',
exprBuilder,
searchUrl: 'table',
});
});
function exprBuilder(param, value) {
switch (param) {
case 'search':
return /^\d+$/.test(value)
? { id: value }
: {
or: [
{ name: { like: `%${value}%` } },
{ nickname: { like: `%${value}%` } },
],
};
case 'name':
case 'nickname':
return { [param]: { like: `%${value}%` } };
case 'roleFk':
return { [param]: value };
}
}
</script>
<template>
<VnCardMain :section="dataKey">
<template #searchbar>
<VnSearchbar
:data-key="dataKey"
:label="t('account.search')"
:info="t('account.searchInfo')"
/>
</template>
<template #body>
<VnTable
ref="tableRef"
:data-key="dataKey"
:columns="columns"
default-mode="table"
redirect="account"
:use-model="true"
:right-search="false"
/>
</template>
<template #rightPanel>
<VnTableFilter :data-key="dataKey" :columns="columns" />
</template>
</VnCardMain>
</template>
<i18n>
es:
Id: Id
Nickname: Nickname
Name: Nombre
</i18n>