feat: user certificate and document upload galleries

Add FilePond temp upload with form commit, PhotoSwipe zoom/swipe galleries, and user detail route for files.
This commit is contained in:
2026-08-15 02:53:59 +03:30
parent b8e206caab
commit 370d2fdad6
8 changed files with 392 additions and 97 deletions
+4 -7
View File
@@ -15,7 +15,7 @@
<Tab value="1">{{ $t('users.tabCourses') }}</Tab>
<Tab value="2">{{ $t('users.tabSessions') }}</Tab>
<Tab value="3">{{ $t('users.tabPayments') }}</Tab>
<Tab value="4">{{ $t('users.tabCertificates') }}</Tab>
<Tab value="4">گواهینامهها و اسناد</Tab>
</TabList>
<TabPanels>
<!-- Tab 1: User Info -->
@@ -180,11 +180,10 @@
</div>
</TabPanel>
<!-- Tab 5: Certificates -->
<!-- Tab 5: Certificates & Documents -->
<TabPanel value="4">
<div class="p-3">
<h3 class="text-lg font-bold mb-3">گواهینامههای صادر شده دانشجو</h3>
<CertificateUploader v-model="userCertificates" />
<UserFilesSection :user-id="String(userId)" />
</div>
</TabPanel>
</TabPanels>
@@ -221,7 +220,7 @@ import { useToast } from '@/composables/useToast';
import PageHeader from '@/components/common/PageHeader.vue';
import PermissionGate from '@/components/common/PermissionGate.vue';
import StatusTag from '@/components/common/StatusTag.vue';
import CertificateUploader from '@/components/uploader/CertificateUploader.vue';
import UserFilesSection from '@/components/uploader/UserFilesSection.vue';
import Tabs from 'primevue/tabs';
import TabList from 'primevue/tablist';
import Tab from 'primevue/tab';
@@ -243,7 +242,6 @@ const user = ref(null);
const enrolledCourses = ref([]);
const attendances = ref([]);
const payments = ref([]);
const userCertificates = ref([]);
const showEnrollModal = ref(false);
const allCourses = ref([]);
@@ -263,7 +261,6 @@ const fetchUserDetail = async () => {
user.value = res.data || res;
enrolledCourses.value = user.value.enrolledCourses || user.value.courses || [];
payments.value = user.value.payments || [];
userCertificates.value = user.value.certificates || [];
} catch (err) {
showError(err);
}
+5
View File
@@ -108,6 +108,10 @@
<AdminNotesField v-model="form.adminNotes" />
</div>
<div v-if="isEditMode" class="col-12 mt-2">
<UserFilesSection :user-id="String(userId)" />
</div>
<div class="col-12 md:col-6 flex flex-column gap-2" v-if="isEditMode">
<label class="font-semibold text-sm">{{ $t('auth.username') }}</label>
<InputText
@@ -171,6 +175,7 @@ import { roleApi } from '@/api/roleApi';
import { useToast } from '@/composables/useToast';
import PageHeader from '@/components/common/PageHeader.vue';
import AdminNotesField from '@/components/common/AdminNotesField.vue';
import UserFilesSection from '@/components/uploader/UserFilesSection.vue';
import InputText from 'primevue/inputtext';
import Dropdown from 'primevue/select';
import MultiSelect from 'primevue/multiselect';