feat: improve filters and class pricing controls in dashboard
Add session class filter, distinct partial payment tag, richer notifications list, class discount/frontend toggles, and remove unused course discount column.
This commit is contained in:
@@ -2,9 +2,22 @@
|
||||
<template>
|
||||
<div class="session-list-view">
|
||||
<PageHeader :title="$t('sessions.title')" :subtitle="$t('sessions.subtitle')">
|
||||
<PermissionGate permission="sessions:create">
|
||||
<Button :label="$t('sessions.addSession')" icon="pi pi-plus" @click="$router.push('/sessions/create')" />
|
||||
</PermissionGate>
|
||||
<div class="flex flex-wrap gap-2 align-items-center">
|
||||
<Dropdown
|
||||
v-model="selectedClassId"
|
||||
:options="classesList"
|
||||
optionLabel="name"
|
||||
optionValue="_id"
|
||||
placeholder="فیلتر کلاس"
|
||||
showClear
|
||||
filter
|
||||
class="w-16rem text-sm"
|
||||
@change="onClassFilter"
|
||||
/>
|
||||
<PermissionGate permission="sessions:create">
|
||||
<Button :label="$t('sessions.addSession')" icon="pi pi-plus" @click="$router.push('/sessions/create')" />
|
||||
</PermissionGate>
|
||||
</div>
|
||||
</PageHeader>
|
||||
|
||||
<DataTableWrapper
|
||||
@@ -146,6 +159,7 @@ import { useDataTable } from '@/composables/useDataTable';
|
||||
import { usePersianDate } from '@/composables/usePersianDate';
|
||||
import { useToast } from '@/composables/useToast';
|
||||
import { sessionApi } from '@/api/sessionApi';
|
||||
import { classApi } from '@/api/classApi';
|
||||
import PageHeader from '@/components/common/PageHeader.vue';
|
||||
import DataTableWrapper from '@/components/common/DataTableWrapper.vue';
|
||||
import ConfirmDeleteDialog from '@/components/common/ConfirmDeleteDialog.vue';
|
||||
@@ -155,10 +169,14 @@ import Button from 'primevue/button';
|
||||
import Column from 'primevue/column';
|
||||
import Tag from 'primevue/tag';
|
||||
import Select from 'primevue/select';
|
||||
import Dropdown from 'primevue/select';
|
||||
|
||||
const { formatJalali, toPersianDigits } = usePersianDate();
|
||||
const { showSuccess, showError } = useToast();
|
||||
|
||||
const classesList = ref([]);
|
||||
const selectedClassId = ref(null);
|
||||
|
||||
const {
|
||||
items,
|
||||
totalCount,
|
||||
@@ -167,7 +185,8 @@ const {
|
||||
loadData,
|
||||
onPageChange,
|
||||
onSort,
|
||||
onSearch
|
||||
onSearch,
|
||||
setFilter
|
||||
} = useDataTable(sessionApi.getAll, {
|
||||
sortBy: 'day',
|
||||
sortOrder: 'asc'
|
||||
@@ -249,7 +268,20 @@ const applyBulkStatus = async () => {
|
||||
}
|
||||
};
|
||||
|
||||
const onClassFilter = () => setFilter('classId', selectedClassId.value || '');
|
||||
|
||||
const fetchClasses = async () => {
|
||||
try {
|
||||
const res = await classApi.getAll({ limit: 200, sortBy: 'name', sortOrder: 'asc' });
|
||||
const data = res.data || res;
|
||||
classesList.value = Array.isArray(data) ? data : (data.data || []);
|
||||
} catch (err) {
|
||||
console.warn('Failed to load classes for filter:', err);
|
||||
}
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
fetchClasses();
|
||||
loadData();
|
||||
});
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user