@@ -32,16 +32,34 @@
|
||||
@blur="validateAt('title', form.title)"
|
||||
/>
|
||||
<TextField
|
||||
v-model="form.passingScore"
|
||||
name="passingScore"
|
||||
v-model="form.minimumScore"
|
||||
name="minimumScore"
|
||||
label="حد نصاب قبولی"
|
||||
inputmode="numeric"
|
||||
:convert-digits="true"
|
||||
:error="errors.passingScore"
|
||||
@blur="validateAt('passingScore', form.passingScore)"
|
||||
:error="errors.minimumScore"
|
||||
@blur="validateAt('minimumScore', form.minimumScore)"
|
||||
/>
|
||||
<TextField
|
||||
v-model="form.score"
|
||||
name="score"
|
||||
label="کل نمره آزمون"
|
||||
inputmode="numeric"
|
||||
:convert-digits="true"
|
||||
:error="errors.score"
|
||||
@blur="validateAt('score', form.score)"
|
||||
/>
|
||||
<TextField
|
||||
v-model="form.durationMinutes"
|
||||
name="durationMinutes"
|
||||
label="مدت زمان (دقیقه)"
|
||||
inputmode="numeric"
|
||||
:convert-digits="true"
|
||||
:error="errors.durationMinutes"
|
||||
@blur="validateAt('durationMinutes', form.durationMinutes)"
|
||||
/>
|
||||
<div class="exam-form__toggle-cell">
|
||||
<ToggleSwitch v-model="form.isActive" label="آزمون فعال باشد" />
|
||||
<ToggleSwitch v-model="form.isRandom" label="به صــــورت رندوم باشد." />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -122,8 +140,10 @@ const isEditMode = computed(() => !!examId.value)
|
||||
const form = ref({
|
||||
title: '',
|
||||
sessionId: '',
|
||||
passingScore: '',
|
||||
isActive: true,
|
||||
minimumScore: '',
|
||||
score: '',
|
||||
durationMinutes: '',
|
||||
isRandom: true,
|
||||
description: '',
|
||||
})
|
||||
|
||||
@@ -145,7 +165,7 @@ const questionError = ref('')
|
||||
const { validate, validateAt, errors } = useYup(examSchema)
|
||||
|
||||
const sessionSearch = ref('')
|
||||
const sessionFilters = computed(() => ({ title: sessionSearch.value }))
|
||||
const sessionFilters = computed(() => ({ search: sessionSearch.value }))
|
||||
const sessionPagination = ref({ page: 1, perPage: 10 })
|
||||
const { data: sessionsResponse } = useAdminSessionsListQuery(sessionFilters, sessionPagination)
|
||||
const selectedSession = ref(null)
|
||||
@@ -183,18 +203,24 @@ const normalizeExistingQuestions = (raw = []) => {
|
||||
})
|
||||
}
|
||||
|
||||
watch(existingExam, (exam) => {
|
||||
if (!exam) return
|
||||
if (exam.session) selectedSession.value = exam.session
|
||||
form.value = {
|
||||
title: exam.title || '',
|
||||
sessionId: exam.session?.id || exam.sessionId || '',
|
||||
passingScore: exam.passScore ?? '',
|
||||
isActive: exam.isActive ?? true,
|
||||
description: exam.description || '',
|
||||
}
|
||||
questions.value = normalizeExistingQuestions(exam.questions)
|
||||
})
|
||||
watch(
|
||||
existingExam,
|
||||
(exam) => {
|
||||
if (!exam) return
|
||||
if (exam.session) selectedSession.value = exam.session
|
||||
form.value = {
|
||||
title: exam.title || '',
|
||||
sessionId: exam.session?.id || exam.sessionId || '',
|
||||
minimumScore: exam.minimumScore ?? exam.passScore ?? '',
|
||||
score: exam.score ?? '',
|
||||
durationMinutes: exam.durationMinutes ?? '',
|
||||
isRandom: exam.isRandom ?? true,
|
||||
description: exam.description || '',
|
||||
}
|
||||
questions.value = normalizeExistingQuestions(exam.questions)
|
||||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
|
||||
const validateLocalQuestions = () => {
|
||||
const localOnes = questions.value.filter((q) => q.__local === true)
|
||||
@@ -235,8 +261,10 @@ const buildExamPayload = (values) => ({
|
||||
sessionId: values.sessionId,
|
||||
title: values.title,
|
||||
description: values.description,
|
||||
passingScore: Number(values.passingScore) || 0,
|
||||
isActive: values.isActive,
|
||||
minimumScore: Number(values.minimumScore) || 0,
|
||||
score: Number(values.score) || 0,
|
||||
durationMinutes: Number(values.durationMinutes) || 0,
|
||||
isRandom: values.isRandom,
|
||||
})
|
||||
|
||||
const addExamMutation = useAddAdminExamMutation()
|
||||
@@ -298,7 +326,6 @@ const onCancel = () => router.push({ name: 'admin-exams' })
|
||||
}
|
||||
|
||||
&__card {
|
||||
background: rgba(255, 255, 255, 60%);
|
||||
border-radius: 1.5rem;
|
||||
padding: 1rem;
|
||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 2.5%);
|
||||
@@ -322,6 +349,14 @@ const onCancel = () => router.push({ name: 'admin-exams' })
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
min-height: 4.25rem;
|
||||
margin-right: 40px;
|
||||
margin-top: 10px;
|
||||
|
||||
> div {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
|
||||
&__error {
|
||||
|
||||
Reference in New Issue
Block a user