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