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:
2026-08-16 08:11:42 +03:30
parent 9496587128
commit 2aa99119e2
5 changed files with 147 additions and 28 deletions
+36 -4
View File
@@ -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>