-
-
![]()
+
+
@@ -11,9 +11,7 @@
{{ userName }}
شماره درخواست :
-
- {{ consultation.requestId || consultation.id || '—' }}
-
+ {{ consultation.id || '—' }}
@@ -26,7 +24,7 @@
@@ -77,13 +77,19 @@ const { data: consultation, isLoading } = useAdminConsultationQuery(consultation
const messages = computed(() => consultation.value?.messages ?? [])
-const consultationDate = computed(
- () => consultation.value?.faCreatedAt || formatJalaaliDate(consultation.value?.createdAt) || '—'
-)
+const consultationDate = computed(() => formatJalaaliDate(consultation.value?.createdAt) || '—')
-const senderClass = (message) => (message.sender === 'admin' ? 'admin' : 'user')
+// Student is "the user"; everyone else (counselor, admin) renders on the
+// opposite side of the thread. Same rule as the admin tickets modal.
+const senderClass = (message) =>
+ message.senderId === consultation.value?.studentId ? 'user' : 'admin'
-const messageTime = (message) => message.time || message.faSentAt || message.sentAt || '—'
+const messageTime = (message) => {
+ if (!message.createdAt) return '—'
+ const d = new Date(message.createdAt)
+ if (Number.isNaN(d.getTime())) return '—'
+ return d.toLocaleTimeString('fa-IR', { hour: '2-digit', minute: '2-digit' })
+}
const text = ref('')
const canSend = computed(() => text.value.trim().length > 0)
@@ -94,7 +100,8 @@ const onSend = async () => {
if (!canSend.value || !consultationId.value) return
const value = text.value.trim()
text.value = ''
- await sendMutation.mutateAsync({ id: consultationId.value, payload: { text: value } })
+ // Backend POST /counselor/tickets/:id/messages — body is { message: string }.
+ await sendMutation.mutateAsync({ id: consultationId.value, payload: { message: value } })
await queryClient.invalidateQueries({ queryKey: adminConsultationsKeys.all })
}
diff --git a/src/features/admin/courses/components/CoursesFilters.vue b/src/features/admin/courses/components/CoursesFilters.vue
index 9fc8707..0cdfd0c 100644
--- a/src/features/admin/courses/components/CoursesFilters.vue
+++ b/src/features/admin/courses/components/CoursesFilters.vue
@@ -37,7 +37,7 @@
@click="onReset"
>
-
+
({ title: termSearch.value }))
-const termPagination = ref({ page: 1, perPage: 30 })
+const termPagination = ref({ page: 1, perPage: 10 })
const { data: termsResponse } = useAdminTermsListQuery(termFilters, termPagination)
const selectedTerm = ref(null)
const termOptions = computed(() => {
@@ -178,7 +178,7 @@ const termOptions = computed(() => {
const templateSearch = ref('')
const templateFilters = computed(() => ({ title: templateSearch.value, termId: 'null' }))
-const templatePagination = ref({ page: 1, perPage: 30 })
+const templatePagination = ref({ page: 1, perPage: 10 })
const { data: templatesResponse } = useAdminCoursesListQuery(templateFilters, templatePagination)
const selectedTemplate = ref(null)
const templateOptions = computed(() => {
diff --git a/src/features/admin/courses/components/modals/CourseDetailsModal.vue b/src/features/admin/courses/components/modals/CourseDetailsModal.vue
index 1564466..5e8fa3b 100644
--- a/src/features/admin/courses/components/modals/CourseDetailsModal.vue
+++ b/src/features/admin/courses/components/modals/CourseDetailsModal.vue
@@ -84,24 +84,25 @@
class="course-details__student-row"
>
-
-
![]()
+
+
-
{{ studentName(student) }}
+
{{ student.name || '—' }}
- {{ student.address?.province?.name || '—' }}
- ،
- {{ student.address?.city?.name || '—' }}
+ {{ student.phone || '—' }}
+
+ ،
+ {{ student.email }}
+
-
@@ -151,7 +142,6 @@
diff --git a/src/features/admin/courses/pages/CourseFormPage.vue b/src/features/admin/courses/pages/CourseFormPage.vue
index b35b3ea..66a2b04 100644
--- a/src/features/admin/courses/pages/CourseFormPage.vue
+++ b/src/features/admin/courses/pages/CourseFormPage.vue
@@ -97,7 +97,6 @@
option-label="label"
option-value="value"
:error="errors.contentType"
- @change="onContentTypeChange"
/>
@@ -109,18 +108,6 @@
:error="errors.description"
/>
-