var examEditQuestionsData = @json($questionsData);
function escapeAttr(str){
return String(str == null ? '' : str)
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(//g, '>');
}
function examEditOptionLetter(idx){
return String.fromCharCode(65 + idx);
}
function markExamEditOptionCorrect(radio){
var row = radio.closest('.opt-row');
var wrap = row.parentElement;
wrap.querySelectorAll('.opt-row').forEach(function(r){ r.classList.remove('is-correct'); });
row.classList.add('is-correct');
}
function examEditOptionRowHtml(qId, idx, value, checked, canRemove){
return '
' +
'' +
'' + examEditOptionLetter(idx) + '' +
'' +
'' +
'
';
}
function examEditTfRowHtml(qId, idx, label, checked){
return '' +
'' +
'' + label + '' +
'' +
'
';
}
function renderExamEditOptions(qId, type, options, correctIndex){
var wrap = document.getElementById('opts-e' + qId);
var addBtn = document.getElementById('addOptBtn-e' + qId);
if (!wrap) return;
if (type === 'true_false') {
wrap.innerHTML = examEditTfRowHtml(qId, 0, "{{ trans('admin.True') }}", correctIndex !== 1) +
examEditTfRowHtml(qId, 1, "{{ trans('admin.False') }}", correctIndex === 1);
if (addBtn) addBtn.style.display = 'none';
} else {
var opts = (options && options.length >= 2) ? options : ['', '', '', ''];
var html = '';
for (var i = 0; i < opts.length; i++) {
html += examEditOptionRowHtml(qId, i, opts[i], i === correctIndex, opts.length > 2);
}
wrap.innerHTML = html;
if (addBtn) addBtn.style.display = '';
}
}
function reindexExamEditOptions(qId){
var wrap = document.getElementById('opts-e' + qId);
if (!wrap) return;
var rows = wrap.querySelectorAll('.opt-row');
var hasChecked = false;
rows.forEach(function(row, i){
var radio = row.querySelector('input[type=radio]');
radio.value = i;
if (radio.checked) hasChecked = true;
var letter = row.querySelector('.opt-letter');
if (letter) letter.textContent = examEditOptionLetter(i);
var removeBtn = row.querySelector('.opt-remove');
if (removeBtn) removeBtn.disabled = rows.length <= 2;
});
if (!hasChecked && rows.length) {
rows[0].querySelector('input[type=radio]').checked = true;
}
rows.forEach(function(row){
row.classList.toggle('is-correct', row.querySelector('input[type=radio]').checked);
});
}
function addExamEditOption(qId){
var wrap = document.getElementById('opts-e' + qId);
if (!wrap) return;
var idx = wrap.querySelectorAll('.opt-row').length;
wrap.insertAdjacentHTML('beforeend', examEditOptionRowHtml(qId, idx, '', false, true));
reindexExamEditOptions(qId);
}
function removeExamEditOption(qId, btn){
var wrap = document.getElementById('opts-e' + qId);
if (!wrap || wrap.querySelectorAll('.opt-row').length <= 2) return;
btn.closest('.opt-row').remove();
reindexExamEditOptions(qId);
}
function changeExamEditQuestionType(qId, select){
renderExamEditOptions(qId, select.value);
}
var EXAM_ATTACHMENT_ACCEPT = 'image/*,.pdf,.doc,.docx,.xls,.xlsx';
function examEditAttachmentBoxHtml(qId, attachment){
var labelHtml = attachment
? '' + escapeAttr(attachment.name) + ''
: "{{ trans('admin.Click to upload or drag and drop') }}";
return '' +
'
' +
'
' +
'
' +
'
' +
'
' +
'' + labelHtml + '' +
'{{ trans('admin.Attachment types hint') }}' +
'
' +
'
' +
'
' +
'
' +
'
' +
'
' +
'
';
}
function examEditAttachmentChanged(qId){
var input = document.getElementById('attachFile-e' + qId);
if (!input.files.length) return;
document.getElementById('attachLabel-e' + qId).textContent = input.files[0].name;
document.getElementById('removeAttach-e' + qId).value = '0';
var removeBtn = document.getElementById('attachRemoveBtn-e' + qId);
if (removeBtn) removeBtn.style.display = '';
}
function removeExamEditAttachment(qId){
var input = document.getElementById('attachFile-e' + qId);
if (input) input.value = '';
document.getElementById('attachLabel-e' + qId).textContent = "{{ trans('admin.Click to upload or drag and drop') }}";
document.getElementById('removeAttach-e' + qId).value = '1';
var removeBtn = document.getElementById('attachRemoveBtn-e' + qId);
if (removeBtn) removeBtn.style.display = 'none';
}
var examEditQCount = 0;
function addExamEditQuestion(prefill){
examEditQCount++;
var n = examEditQCount;
var id = 'eq' + n;
var wrap = document.getElementById('examEditQuestions');
var div = document.createElement('div');
div.className = 'q-card'; div.id = id;
var type = (prefill && prefill.type) ? prefill.type : 'multiple_choice';
div.innerHTML =
'{{ trans('admin.Question') }} ' + n + '
' +
'' +
'' +
'' +
'' +
'' +
'{{ trans('admin.Select the correct answer hint') }}
' +
examEditAttachmentBoxHtml(n, prefill ? prefill.attachment : null);
wrap.appendChild(div);
renderExamEditOptions(n, type, prefill ? prefill.options : null, prefill ? prefill.correct : 0);
}
function openExamEditModal(){
$('#examEditErrors').html('');
$('#examEditQuestions').html('');
examEditQCount = 0;
if (examEditQuestionsData.length) {
examEditQuestionsData.forEach(function(q){ addExamEditQuestion(q); });
} else {
addExamEditQuestion();
}
openModal('examEditModal');
}
$('#examEditForm').on('submit', function(e){
e.preventDefault();
var $btn = $('#examEditSubmitBtn');
$('#examEditErrors').html('');
$btn.prop('disabled', true);
$.ajax({
url: "{{ url('dashboard/exams') }}/{{ $exam->id }}/edit",
method: 'POST',
data: new FormData(this),
processData: false,
contentType: false,
success: function(){
dashToast('✓', "{{ trans('admin.success') }}");
setTimeout(function(){ location.reload(); }, 400);
},
error: function(xhr){
if (xhr.status === 422) {
var errors = xhr.responseJSON.errors;
var html = '';
$.each(errors, function(key, val){ html += val[0] + '
'; });
$('#examEditErrors').html(html);
} else {
var msg = (xhr.responseJSON && xhr.responseJSON.message) || "{{ trans('admin.faild') }}";
dashToast('✕', msg);
}
},
complete: function(){
$btn.prop('disabled', false);
}
});
});