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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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';
|
||||
|
||||
Reference in New Issue
Block a user