@@ -4,8 +4,8 @@
|
||||
<p class="student-session-item__title">{{ session.title || '—' }}</p>
|
||||
<div class="student-session-item__hours">
|
||||
<SvgIcon name="calendar" :size="9" color="#007074" />
|
||||
<span class="student-session-item__hours-label">زمان جلسه :</span>
|
||||
<span class="student-session-item__hours-value">{{ durationText }}</span>
|
||||
<span class="student-session-item__hours-label">مهلت :</span>
|
||||
<span class="student-session-item__hours-value">{{ deadlineText }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
<Badge v-if="isComplete" variant="success">تکمیل شده</Badge>
|
||||
<Badge v-if="session.isSeen" variant="success">دیده شده</Badge>
|
||||
<Badge v-if="session.grade != null" variant="primary" label="نمره" :value="session.grade" />
|
||||
<Badge v-if="session.needsAssignment" icon="paper-plane">دارای تکلیف</Badge>
|
||||
<Badge v-if="session.hasQuiz" icon="file">دارای آزمون</Badge>
|
||||
<Badge v-if="session.homeworksCount > 0" icon="paper-plane">دارای تکلیف</Badge>
|
||||
<Badge v-if="session.examsCount > 0" icon="file">دارای آزمون</Badge>
|
||||
<Badge v-if="isOnline" icon="users-three">جلسه آنلاین</Badge>
|
||||
</div>
|
||||
|
||||
@@ -37,6 +37,7 @@ import { computed } from 'vue'
|
||||
import Badge from '@/components/Badge.vue'
|
||||
import BaseButton from '@/components/BaseButton.vue'
|
||||
import SvgIcon from '@/components/icons/SvgIcon.vue'
|
||||
import { formatJalaaliDate } from '@/utils/date-utils'
|
||||
|
||||
const props = defineProps({
|
||||
session: { type: Object, required: true },
|
||||
@@ -44,8 +45,8 @@ const props = defineProps({
|
||||
|
||||
const emit = defineEmits(['start'])
|
||||
|
||||
const durationText = computed(() =>
|
||||
props.session.durationHours == null ? '—' : `${props.session.durationHours} ساعت`
|
||||
const deadlineText = computed(
|
||||
() => formatJalaaliDate(props.session.deadline || props.session.endDate) || '—'
|
||||
)
|
||||
|
||||
const isOnline = computed(() => props.session.type === 'online')
|
||||
|
||||
@@ -119,8 +119,6 @@ const { data: session, isLoading } = useStudentSessionQuery(sessionId, {
|
||||
enabled: () => !!sessionId.value,
|
||||
})
|
||||
|
||||
// The homework for this session comes from the dedicated endpoint (the session
|
||||
// payload itself doesn't embed homeworks).
|
||||
const homeworkFilters = computed(() => ({ sessionId: sessionId.value }))
|
||||
const homeworkPagination = ref({ page: 1, perPage: 20 })
|
||||
const { data: homeworksData } = useStudentHomeworksListQuery(homeworkFilters, homeworkPagination, {
|
||||
@@ -152,7 +150,14 @@ const homeworkId = computed(
|
||||
)
|
||||
|
||||
const uploadHomeworkFile = async (file) => {
|
||||
const fd = objectToFormData({ file, purpose: 'homework_file', context: 'homework' })
|
||||
// The backend validates allowed extensions per `purpose`: `homework_file`
|
||||
// accepts documents/images only, so a recorded voice must go up as `voice`.
|
||||
const isAudio = (file?.type || '').startsWith('audio/')
|
||||
const fd = objectToFormData({
|
||||
file,
|
||||
purpose: isAudio ? 'voice' : 'homework_file',
|
||||
context: 'homework',
|
||||
})
|
||||
const response = await uploadMediaMutation.mutateAsync(fd)
|
||||
const payload = response?.data ?? response
|
||||
return payload?.id ?? null
|
||||
|
||||
Reference in New Issue
Block a user