import { type Ref, defineComponent, inject, onMounted, ref, watch } from 'vue'; import { useI18n } from 'vue-i18n'; import { useAlertService } from '@/shared/alert/alert.service'; import { useDateFormat } from '@/shared/composables'; import { type IAuditLog } from '@/shared/model/audit-log.model'; import AuditLogService from './audit-log.service'; export default defineComponent({ name: 'AuditLog', setup() { const { t: t$ } = useI18n(); const dateFormat = useDateFormat(); const auditLogService = inject('auditLogService', () => new AuditLogService()); const alertService = inject('alertService', () => useAlertService(), true); const itemsPerPage = ref(20); const queryCount: Ref = ref(null); const page: Ref = ref(1); const propOrder = ref('id'); const reverse = ref(false); const totalItems = ref(0); const auditLogs: Ref = ref([]); const isFetching = ref(false); const clear = () => { page.value = 1; }; const sort = (): Array => { const result = [`${propOrder.value},${reverse.value ? 'desc' : 'asc'}`]; if (propOrder.value !== 'id') { result.push('id'); } return result; }; const retrieveAuditLogs = async () => { isFetching.value = true; try { const paginationQuery = { page: page.value - 1, size: itemsPerPage.value, sort: sort(), }; const res = await auditLogService().retrieve(paginationQuery); totalItems.value = Number(res.headers['x-total-count']); queryCount.value = totalItems.value; auditLogs.value = res.data; } catch (err) { alertService.showHttpError(err.response); } finally { isFetching.value = false; } }; const handleSyncList = () => { retrieveAuditLogs(); }; onMounted(async () => { await retrieveAuditLogs(); }); const removeId: Ref = ref(null); const removeEntity = ref(null); const prepareRemove = (instance: IAuditLog) => { removeId.value = instance.id; removeEntity.value.show(); }; const closeDialog = () => { removeEntity.value.hide(); }; const removeAuditLog = async () => { try { await auditLogService().delete(removeId.value); const message = t$('smartbookingApp.auditLog.deleted', { param: removeId.value }).toString(); alertService.showInfo(message, { variant: 'danger' }); removeId.value = null; retrieveAuditLogs(); closeDialog(); } catch (error) { alertService.showHttpError(error.response); } }; const changeOrder = (newOrder: string) => { if (propOrder.value === newOrder) { reverse.value = !reverse.value; } else { reverse.value = false; } propOrder.value = newOrder; }; // Whenever order changes, reset the pagination watch([propOrder, reverse], async () => { if (page.value === 1) { // first page, retrieve new data await retrieveAuditLogs(); } else { // reset the pagination clear(); } }); // Whenever page changes, switch to the new page. watch(page, async () => { await retrieveAuditLogs(); }); return { auditLogs, handleSyncList, isFetching, retrieveAuditLogs, clear, ...dateFormat, removeId, removeEntity, prepareRemove, closeDialog, removeAuditLog, itemsPerPage, queryCount, page, propOrder, reverse, totalItems, changeOrder, t$, }; }, });