From d90df7c46f8ba31b6ad8262ac48d37747844afbe Mon Sep 17 00:00:00 2001 From: stephan Date: Tue, 7 Jul 2026 15:04:27 -0400 Subject: [PATCH] Refactor bib range validation and error handling in management system This commit enhances the JavaScript functions for bib range validation by introducing new error handling mechanisms and improving user feedback. The previous preview functionality has been removed, and error messages are now displayed more effectively. CSS styles are updated to support the new error message display. Additionally, the version code is incremented to reflect these changes, aiming to improve user experience and data integrity in the bib input process. --- css/style.css | 13 +----- inc_footer_scripts.php | 91 +++++++++++++++++++--------------------- php/inc_fx_promoteur.php | 4 -- php/inc_settings.php | 2 +- 4 files changed, 45 insertions(+), 65 deletions(-) diff --git a/css/style.css b/css/style.css index bce08bd..733b5e7 100644 --- a/css/style.css +++ b/css/style.css @@ -2091,14 +2091,6 @@ a.ms1-trad-link.btn-aide-trad{ padding-top:2px; } -.bib-range-preview{ - grid-column:1 / -1; - grid-row:2; - margin:0 0 2px; - font-size:12px; - line-height:1.3; -} - .epr-line .bib-start, .epr-line .bib-qty, .epr-line .bib-end{ @@ -2145,9 +2137,8 @@ a.ms1-trad-link.btn-aide-trad{ color:inherit; } -.bib-range-preview--error{ - color:#dc3545; - font-weight:600; +.bib-range-validate-msg{ + margin-bottom:4px; } .bib-field--pick:focus, diff --git a/inc_footer_scripts.php b/inc_footer_scripts.php index cfa53de..4226943 100644 --- a/inc_footer_scripts.php +++ b/inc_footer_scripts.php @@ -2631,11 +2631,32 @@ if ($strLangue == 'fr') { return { start: row.querySelector('.bib-start'), qty: row.querySelector('.bib-qty'), - end: row.querySelector('.bib-end'), - preview: row.querySelector('.bib-range-preview') + end: row.querySelector('.bib-end') }; } + function bibRangeGetErrorEl(row) { + var el = row && row.nextElementSibling; + if (el && el.classList.contains('bib-error')) { + return el; + } + return null; + } + + function bibRangeClearRangeError(row) { + var errEl = bibRangeGetErrorEl(row); + if (!errEl) return; + + var msg = errEl.querySelector('.bib-range-validate-msg'); + if (msg) { + msg.remove(); + } + + if (!errEl.querySelector('div:not(.bib-range-validate-msg)') && !errEl.textContent.trim()) { + errEl.style.display = 'none'; + } + } + function bibRangeClearFieldClasses(row) { var fields = bibRangeGetFields(row); if (!fields) return; @@ -2655,9 +2676,7 @@ if ($strLangue == 'fr') { } }); - if (fields.preview) { - fields.preview.classList.remove('bib-range-preview--error'); - } + bibRangeClearRangeError(row); } /** MSIN-4429 — Validation différée (blur / OK), pas pendant la frappe. */ @@ -2721,26 +2740,34 @@ if ($strLangue == 'fr') { function bibRangeShowValidation(row, validation) { var fields = bibRangeGetFields(row); - if (!fields || !fields.preview) { + if (!fields) { return; } bibRangeClearValidationUi(row); if (!validation) { - bibRangeUpdatePreview(row); return; } - var msg = bibRangeValidationMessage(validation); var target = validation.field === 'qty' ? fields.qty : fields.end; if (target) { target.classList.add('bib-field--invalid'); } - fields.preview.textContent = msg; - fields.preview.classList.remove('bib-ui-hidden'); - fields.preview.classList.add('bib-range-preview--error'); + var errEl = bibRangeGetErrorEl(row); + if (!errEl) { + return; + } + + var msgEl = errEl.querySelector('.bib-range-validate-msg'); + if (!msgEl) { + msgEl = document.createElement('div'); + msgEl.className = 'bib-range-validate-msg'; + errEl.insertBefore(msgEl, errEl.firstChild); + } + msgEl.textContent = bibRangeValidationMessage(validation); + errEl.style.display = 'block'; } function bibRangeValidateOnBlur(row) { @@ -2748,45 +2775,12 @@ if ($strLangue == 'fr') { bibRangeShowValidation(row, bibRangeValidate(row)); } - function bibRangeUpdatePreview(row) { - var fields = bibRangeGetFields(row); - if (!fields || !fields.preview) return; - - if (fields.preview.classList.contains('bib-range-preview--error')) { - return; - } - - var start = bibRangeParseInt(fields.start && fields.start.value); - var end = bibRangeParseInt(fields.end && fields.end.value); - var qty = bibRangeParseInt(fields.qty && fields.qty.value); - - fields.preview.classList.remove('bib-range-preview--error'); - - if (start > 0 && end >= start && qty > 0) { - fields.preview.textContent = bibJsFmt('jsRangePreview', start, end, qty); - fields.preview.classList.remove('bib-ui-hidden'); - } else if (!row.dataset.rangePilot && bibJs('jsRangePickHint')) { - var startVal = bibRangeParseInt(fields.start && fields.start.value); - if (startVal > 0) { - fields.preview.textContent = bibJs('jsRangePickHint'); - fields.preview.classList.remove('bib-ui-hidden'); - } else { - fields.preview.textContent = ''; - fields.preview.classList.add('bib-ui-hidden'); - } - } else { - fields.preview.textContent = ''; - fields.preview.classList.add('bib-ui-hidden'); - } - } - function applyBibRangeFieldState(row) { var fields = bibRangeGetFields(row); if (!fields || !fields.start || !fields.qty || !fields.end) return; if (row.dataset.locked === '1') { bibRangeClearFieldClasses(row); - bibRangeUpdatePreview(row); return; } @@ -2803,7 +2797,6 @@ if ($strLangue == 'fr') { fields.qty.value = ''; fields.end.value = ''; row.dataset.rangePilot = ''; - bibRangeUpdatePreview(row); return; } @@ -2812,7 +2805,6 @@ if ($strLangue == 'fr') { fields.end.classList.add('bib-field--pick'); fields.qty.readOnly = true; fields.end.readOnly = true; - bibRangeUpdatePreview(row); return; } @@ -2839,8 +2831,6 @@ if ($strLangue == 'fr') { fields.qty.value = ''; } } - - bibRangeUpdatePreview(row); } function onBibRangeFieldPick(row, pilot) { @@ -3548,7 +3538,10 @@ if ($strLangue == 'fr') { if (validation) { bibRangeShowValidation(row, validation); if (errorDiv) { - errorDiv.innerText = bibRangeValidationMessage(validation); + var msgEl = errorDiv.querySelector('.bib-range-validate-msg'); + if (!msgEl) { + errorDiv.innerText = bibRangeValidationMessage(validation); + } errorDiv.style.display = 'block'; } var invalidField = validation.field === 'qty' diff --git a/php/inc_fx_promoteur.php b/php/inc_fx_promoteur.php index 6cc4a90..aa518b9 100644 --- a/php/inc_fx_promoteur.php +++ b/php/inc_fx_promoteur.php @@ -3104,8 +3104,6 @@ function fxBibModuleJsDataAttrs() { 'auto-pending-bibs' => 'bib_v4_js_auto_pending_bibs', 'range-incomplete' => 'bib_v4_js_range_incomplete', 'range-invalid' => 'bib_v4_js_range_invalid', - 'range-preview' => 'bib_v4_js_range_preview', - 'range-pick-hint' => 'bib_v4_js_range_pick_hint', 'range-invalid-end' => 'bib_v4_js_range_invalid_end', 'range-invalid-qty' => 'bib_v4_js_range_invalid_qty', ]; @@ -5301,8 +5299,6 @@ if (!$blnRangeLocked && ( -
-
diff --git a/php/inc_settings.php b/php/inc_settings.php index 257aaa3..11691de 100644 --- a/php/inc_settings.php +++ b/php/inc_settings.php @@ -7,7 +7,7 @@ * Constantes * * **************/ -define('_VERSION_CODE', '4.72.731'); +define('_VERSION_CODE', '4.72.732'); define('_DATE_CODE', '2026-07-07'); //MSIN-4290 define('QR_SECRET_KEY', 'ms1_qr_2026_cle_secrete_longue_et_fixe');