import { type Ref, defineComponent, inject, onMounted, ref, watch } from 'vue'; import { useI18n } from 'vue-i18n'; import { useAlertService } from '@/shared/alert/alert.service'; import { type IQuestion } from '@/shared/model/question.model'; import QuestionService from './question.service'; export default defineComponent({ name: 'Question', setup() { const { t: t$ } = useI18n(); const questionService = inject('questionService', () => new QuestionService()); 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 questions: 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 retrieveQuestions = async () => { isFetching.value = true; try { const paginationQuery = { page: page.value - 1, size: itemsPerPage.value, sort: sort(), }; const res = await questionService().retrieve(paginationQuery); totalItems.value = Number(res.headers['x-total-count']); queryCount.value = totalItems.value; questions.value = res.data; } catch (err) { alertService.showHttpError(err.response); } finally { isFetching.value = false; } }; const handleSyncList = () => { retrieveQuestions(); }; onMounted(async () => { await retrieveQuestions(); }); const removeId: Ref = ref(null); const removeEntity = ref(null); const prepareRemove = (instance: IQuestion) => { removeId.value = instance.id; removeEntity.value.show(); }; const closeDialog = () => { removeEntity.value.hide(); }; const removeQuestion = async () => { try { await questionService().delete(removeId.value); const message = t$('questionBankApp.question.deleted', { param: removeId.value }).toString(); alertService.showInfo(message, { variant: 'danger' }); removeId.value = null; retrieveQuestions(); 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 retrieveQuestions(); } else { // reset the pagination clear(); } }); // Whenever page changes, switch to the new page. watch(page, async () => { await retrieveQuestions(); }); return { questions, handleSyncList, isFetching, retrieveQuestions, clear, removeId, removeEntity, prepareRemove, closeDialog, removeQuestion, itemsPerPage, queryCount, page, propOrder, reverse, totalItems, changeOrder, t$, }; }, });