|
380 | 380 | } |
381 | 381 | }); |
382 | 382 |
|
| 383 | + const removeValidationErrors = (input) => { |
| 384 | + input?.classList.remove('is-invalid'); |
| 385 | + input.setCustomValidity(''); |
| 386 | + }; |
| 387 | + |
| 388 | + const validateInput = (e, input, isInvalid, defaultMessage, report) => { |
| 389 | + if (isInvalid) { |
| 390 | + e.preventDefault(); |
| 391 | + input.classList.add('is-invalid'); |
| 392 | + input.setCustomValidity(input.dataset.errorMessage ?? defaultMessage); |
| 393 | + if (report) input.reportValidity(); |
| 394 | + return false; |
| 395 | + } |
| 396 | + removeValidationErrors(input); |
| 397 | + return true; |
| 398 | + }; |
| 399 | + |
| 400 | + // Validation of the target file for the save as tab. |
| 401 | + const saveAsTargetFile = document.getElementsByName('action.save_as.target_file')?.[0]; |
| 402 | + saveAsTargetFile.addEventListener('keyup', () => { |
| 403 | + if (saveAsTargetFile.value) removeValidationErrors(saveAsTargetFile); |
| 404 | + }); |
| 405 | + |
383 | 406 | // Validation of the target set for the save as tab. |
384 | 407 | const saveAsSaveModeRadios = document.getElementsByName('action.save_as.saveMode'); |
385 | 408 | const saveToTargetSetRadio = Array.from(saveAsSaveModeRadios).find( |
386 | 409 | (r) => r.id === 'action_save_as_saveMode_new_problem_id' || r.id === 'action_save_as_saveMode_set_header_id' |
387 | 410 | ); |
388 | 411 | const targetSetSelect = document.getElementsByName('action.save_as.targetSet')?.[0]; |
389 | 412 | const actionSaveAs = document.getElementById('save_as'); |
390 | | - const removeSetSelectErrors = () => { |
391 | | - targetSetSelect?.classList.remove('is-invalid'); |
392 | | - targetSetSelect?.setCustomValidity(''); |
393 | | - }; |
394 | 413 | for (const radio of saveAsSaveModeRadios) { |
395 | | - radio.addEventListener('change', removeSetSelectErrors); |
| 414 | + radio.addEventListener('change', () => removeValidationErrors(targetSetSelect)); |
396 | 415 | } |
397 | 416 | const saveToTargetSetSelected = () => { |
398 | 417 | saveToTargetSetRadio.checked = true; |
399 | | - if (targetSetSelect?.value) removeSetSelectErrors(); |
| 418 | + if (targetSetSelect?.value) removeValidationErrors(targetSetSelect); |
400 | 419 | }; |
401 | 420 | targetSetSelect?.addEventListener('change', saveToTargetSetSelected); |
402 | 421 | targetSetSelect?.addEventListener('focusin', saveToTargetSetSelected); |
403 | 422 |
|
404 | 423 | document.forms.editor?.addEventListener('submit', (e) => { |
405 | 424 | if (actionSaveAs && actionSaveAs.classList.contains('active')) { |
406 | | - if (saveToTargetSetRadio?.checked && !targetSetSelect?.value) { |
407 | | - e.preventDefault(); |
408 | | - targetSetSelect.classList.add('is-invalid'); |
409 | | - targetSetSelect.setCustomValidity(targetSetSelect.dataset.errorMessage ?? 'Please select a set.'); |
410 | | - targetSetSelect.reportValidity(); |
411 | | - return; |
| 425 | + let report = true; |
| 426 | + for (const validationData of [ |
| 427 | + [saveAsTargetFile, saveAsTargetFile?.value === '', 'Please enter a filename.'], |
| 428 | + [targetSetSelect, saveToTargetSetRadio?.checked && !targetSetSelect?.value, 'Please select a set.'] |
| 429 | + ]) { |
| 430 | + if (!validateInput(e, ...validationData, report)) report = false; |
412 | 431 | } |
413 | | - removeSetSelectErrors(); |
414 | 432 | } |
415 | 433 | }); |
416 | 434 |
|
|
0 commit comments