feat(VnLogFilter): refactor and work

This commit is contained in:
Alex Moreno 2024-11-08 16:54:29 +01:00
parent 7487a2706c
commit c25fddd953
2 changed files with 88 additions and 68 deletions

View File

@ -14,6 +14,7 @@ import VnJsonValue from '../common/VnJsonValue.vue';
import VnUserLink from '../ui/VnUserLink.vue'; import VnUserLink from '../ui/VnUserLink.vue';
import VnLogFilter from './VnLogFilter.vue'; import VnLogFilter from './VnLogFilter.vue';
import VnTable from '../VnTable/VnTable.vue'; import VnTable from '../VnTable/VnTable.vue';
import RightMenu from './RightMenu.vue';
const stateStore = useStateStore(); const stateStore = useStateStore();
const validationsStore = useValidator(); const validationsStore = useValidator();
@ -43,7 +44,11 @@ const paginate = ref({});
const searchInput = ref(); const searchInput = ref();
const modelName = computed(() => params.value.model || props.model); const modelName = computed(() => params.value.model || props.model);
const selectedFilters = ref({}); const selectedFilters = ref({});
const params = ref({ originFk: paginate.value?.params?.originFk ?? route.params.id }); const params = ref({
originFk: paginate.value?.params?.originFk ?? route.params.id,
model: props.model,
action: [],
});
let validations = models; let validations = models;
let pointRecord = ref(null); let pointRecord = ref(null);
let byRecord = ref(false); let byRecord = ref(false);
@ -144,7 +149,6 @@ function parseProps(propNames, locale, vals, olds) {
} }
function getLogTree(data) { function getLogTree(data) {
console.log('data: ', data);
if (!data) return; if (!data) return;
const logs = []; const logs = [];
@ -238,14 +242,12 @@ function filterByRecord(modelLog) {
:url="`${modelName}Logs`" :url="`${modelName}Logs`"
:skeleton="false" :skeleton="false"
:user-filter="filter" :user-filter="filter"
:auto-load="!!modelName || route.query.table"
@on-fetch="setLogTree" @on-fetch="setLogTree"
:columns="[]" :columns="[]"
:right-search="false" :right-search="false"
search-url="table" :search-url="false"
> >
<template #body> <template #body>
{{ paginate.params }}
<div <div
class="column items-center logs origin-log q-mt-md" class="column items-center logs origin-log q-mt-md"
v-for="(originLog, originLogIndex) in logTree" v-for="(originLog, originLogIndex) in logTree"

View File

@ -1,5 +1,5 @@
<script setup> <script setup>
import { ref } from 'vue'; import { onMounted, ref } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue'; import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
import VnInput from './VnInput.vue'; import VnInput from './VnInput.vue';
@ -8,6 +8,8 @@ import { useValidator } from 'src/composables/useValidator';
import VnAvatar from '../ui/VnAvatar.vue'; import VnAvatar from '../ui/VnAvatar.vue';
import FetchData from '../FetchData.vue'; import FetchData from '../FetchData.vue';
import VnInputDate from './VnInputDate.vue'; import VnInputDate from './VnInputDate.vue';
import { useCapitalize } from 'src/composables/useCapitalize';
import validations from 'src/boot/validations';
const { t } = useI18n(); const { t } = useI18n();
const validationsStore = useValidator(); const validationsStore = useValidator();
@ -30,59 +32,77 @@ const userTypes = [
{ label: 'User', value: { neq: null } }, { label: 'User', value: { neq: null } },
{ label: 'System', value: null }, { label: 'System', value: null },
]; ];
const actions = ref(); const entities = ref();
const checkboxOptions = ref({ const filterPanelRef = ref({});
insert: { const checkboxOptions = [
{
label: 'Creates', label: 'Creates',
selected: false, value: ['insert'],
}, },
update: { {
label: 'Edits', label: 'Edits',
selected: false, value: ['update'],
}, },
delete: { {
label: 'Deletes', label: 'Deletes',
selected: false, value: ['delete'],
}, },
select: { {
label: 'Accesses', label: 'Accesses',
selected: false, value: ['select'],
}, },
];
onMounted(() => {
if (modelParams.value.model) filterPanelRef.value.search();
}); });
const exprBuilder = (param, value) => { function exprBuilder(param, value) {
if (param == 'originFk') return { originFk: value }; switch (param) {
case 'action':
if (value.length == 0) return;
return { [param]: { inq: value.flat() } };
case 'dateFrom':
return { creationDate: { gte: value } };
case 'dateTo':
return { creationDate: { lte: value } };
case 'changedModelValue':
return { [param]: { like: `%${value}%` } };
default:
return { [param]: value };
}
}
function setEntities(data) {
entities.value = data.map((item) => {
const changedModel = item.changedModel;
return {
locale: useCapitalize(
validations?.[changedModel]?.locale?.name ?? changedModel
),
value: changedModel,
}; };
});
}
</script> </script>
<template> <template>
<FetchData <FetchData
v-if="modelName && id" v-if="modelParams.model && modelParams.originFk"
:url="`${modelName}Logs/${id}/models`" :url="`${modelParams.model}Logs/${modelParams.originFk}/models`"
:filter="{ order: ['changedModel'] }" :filter="{ order: ['changedModel'] }"
@on-fetch=" @on-fetch="(data) => setEntities(data)"
(data) =>
(actions = data.map((item) => {
const changedModel = item.changedModel;
return {
locale: useCapitalize(
validations[changedModel]?.locale?.name ?? changedModel
),
value: changedModel,
};
}))
"
auto-load auto-load
/> />
{{ modelParams }}
<VnFilterPanel <VnFilterPanel
ref="filterPanelRef"
v-model="modelParams" v-model="modelParams"
:data-key="props.dataKey" data-key="vnLog"
:search-button="true" :search-button="true"
:hidden-tags="disableModel && ['modelName', 'id']" :hidden-tags="disableModel && ['model', 'originFk']"
search-url="table"
:redirect="false" :redirect="false"
:expr-builder="exprBuilder" :expr-builder="exprBuilder"
:search-url="false"
> >
<template #tags="{ tag, formatFn }"> <template #tags="{ tag, formatFn }">
<div class="q-gutter-x-xs"> <div class="q-gutter-x-xs">
@ -90,7 +110,7 @@ const exprBuilder = (param, value) => {
<span>{{ formatFn(tag.value) }}</span> <span>{{ formatFn(tag.value) }}</span>
</div> </div>
</template> </template>
<template #body="{ params }"> <template #body>
<div class="q-gutter-y-sm q-px-sm"> <div class="q-gutter-y-sm q-px-sm">
<QCard class="q-pa-xs q-mb-lg q-gutter-y-xs" flat bordered> <QCard class="q-pa-xs q-mb-lg q-gutter-y-xs" flat bordered>
<VnSelect <VnSelect
@ -100,14 +120,14 @@ const exprBuilder = (param, value) => {
?.filter((key) => key.endsWith('Log')) ?.filter((key) => key.endsWith('Log'))
?.map((key) => key.slice(0, -3)) ?.map((key) => key.slice(0, -3))
" "
v-model="params.model" v-model="modelParams.model"
:disable="props.disableModel" :disable="props.disableModel"
filled filled
dense dense
/> />
<VnInput <VnInput
:label="$t('globals.id')" :label="$t('globals.id')"
v-model="params.originFk" v-model="modelParams.originFk"
:disable="props.disableModel" :disable="props.disableModel"
filled filled
dense dense
@ -115,7 +135,7 @@ const exprBuilder = (param, value) => {
</QCard> </QCard>
<VnInput <VnInput
:label="t('globals.search')" :label="t('globals.search')"
v-model="params.searchInput" v-model="modelParams.changedModelValue"
filled filled
dense dense
> >
@ -127,17 +147,17 @@ const exprBuilder = (param, value) => {
</VnInput> </VnInput>
<VnSelect <VnSelect
:label="t('globals.entity')" :label="t('globals.entity')"
v-model="params.changedModel" v-model="modelParams.changedModel"
option-label="locale" option-label="locale"
option-value="value" option-value="value"
:options="actions" :options="entities"
hide-selected hide-selected
filled filled
dense dense
/> />
<QOptionGroup <QOptionGroup
size="sm" size="sm"
v-model="params.userRadio" v-model="modelParams.userFk"
:options="userTypes" :options="userTypes"
color="primary" color="primary"
right-label right-label
@ -148,13 +168,14 @@ const exprBuilder = (param, value) => {
{{ t(`Users.${label}`) }} {{ t(`Users.${label}`) }}
</template> </template>
</QOptionGroup> </QOptionGroup>
<QItemSection v-if="params.userRadio !== null"> <QItemSection v-if="modelParams.userFk !== null">
<VnSelect <VnSelect
:disable="!modelParams.model || !modelParams.originFk"
:label="t('globals.user')" :label="t('globals.user')"
v-model="params.userSelect" v-model="modelParams.userFk"
option-label="name" option-label="name"
option-value="id" option-value="id"
:url="`${params.modelName}Logs/${params.id}/editors`" :url="`${modelParams.model}Logs/${modelParams.originFk}/editors`"
:fields="['id', 'nickname', 'name', 'image']" :fields="['id', 'nickname', 'name', 'image']"
sort-by="nickname" sort-by="nickname"
hide-selected hide-selected
@ -176,7 +197,7 @@ const exprBuilder = (param, value) => {
</QItemSection> </QItemSection>
<VnInput <VnInput
:label="t('globals.changes')" :label="t('globals.changes')"
v-model="params.changeInput" v-model="modelParams.changedModelValue"
filled filled
dense dense
> >
@ -188,31 +209,28 @@ const exprBuilder = (param, value) => {
</QIcon> </QIcon>
</template> </template>
</VnInput> </VnInput>
<div v-for="(checkboxOption, index) in checkboxOptions" :key="index"> <QOptionGroup
<QCheckbox
size="sm" size="sm"
v-model="params.checkboxOption" v-model="modelParams.action"
:label="t(`actions.${checkboxOption.label}`)" :options="checkboxOptions"
color="primary"
right-label
filled filled
dense dense
/> type="checkbox"
</div> >
<template #label="{ label }">
{{ t(`actions.${label}`) }}
</template>
</QOptionGroup>
<VnInputDate <VnInputDate
:label="t('globals.date')" :label="t('globals.date')"
@click="dateFromDialog = true" v-model="modelParams.dateFrom"
@focus="(evt) => evt.target.blur()"
v-model="params.dateFrom"
filled
dense
/>
<VnInputDate
:label="t('to')"
@click="dateToDialog = true"
@focus="(evt) => evt.target.blur()"
v-model="params.dateTo"
filled filled
dense dense
/> />
<VnInputDate :label="t('to')" v-model="modelParams.dateTo" filled dense />
<div style="height: 80px"><!-- space to search button --></div>
</div> </div>
</template> </template>
</VnFilterPanel> </VnFilterPanel>