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.
This commit is contained in:
2026-07-07 15:04:27 -04:00
parent 20c1f898a1
commit d90df7c46f
4 changed files with 45 additions and 65 deletions

View File

@ -2091,14 +2091,6 @@ a.ms1-trad-link.btn-aide-trad{
padding-top:2px; 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-start,
.epr-line .bib-qty, .epr-line .bib-qty,
.epr-line .bib-end{ .epr-line .bib-end{
@ -2145,9 +2137,8 @@ a.ms1-trad-link.btn-aide-trad{
color:inherit; color:inherit;
} }
.bib-range-preview--error{ .bib-range-validate-msg{
color:#dc3545; margin-bottom:4px;
font-weight:600;
} }
.bib-field--pick:focus, .bib-field--pick:focus,

View File

@ -2631,11 +2631,32 @@ if ($strLangue == 'fr') {
return { return {
start: row.querySelector('.bib-start'), start: row.querySelector('.bib-start'),
qty: row.querySelector('.bib-qty'), qty: row.querySelector('.bib-qty'),
end: row.querySelector('.bib-end'), end: row.querySelector('.bib-end')
preview: row.querySelector('.bib-range-preview')
}; };
} }
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) { function bibRangeClearFieldClasses(row) {
var fields = bibRangeGetFields(row); var fields = bibRangeGetFields(row);
if (!fields) return; if (!fields) return;
@ -2655,9 +2676,7 @@ if ($strLangue == 'fr') {
} }
}); });
if (fields.preview) { bibRangeClearRangeError(row);
fields.preview.classList.remove('bib-range-preview--error');
}
} }
/** MSIN-4429 — Validation différée (blur / OK), pas pendant la frappe. */ /** MSIN-4429 — Validation différée (blur / OK), pas pendant la frappe. */
@ -2721,26 +2740,34 @@ if ($strLangue == 'fr') {
function bibRangeShowValidation(row, validation) { function bibRangeShowValidation(row, validation) {
var fields = bibRangeGetFields(row); var fields = bibRangeGetFields(row);
if (!fields || !fields.preview) { if (!fields) {
return; return;
} }
bibRangeClearValidationUi(row); bibRangeClearValidationUi(row);
if (!validation) { if (!validation) {
bibRangeUpdatePreview(row);
return; return;
} }
var msg = bibRangeValidationMessage(validation);
var target = validation.field === 'qty' ? fields.qty : fields.end; var target = validation.field === 'qty' ? fields.qty : fields.end;
if (target) { if (target) {
target.classList.add('bib-field--invalid'); target.classList.add('bib-field--invalid');
} }
fields.preview.textContent = msg; var errEl = bibRangeGetErrorEl(row);
fields.preview.classList.remove('bib-ui-hidden'); if (!errEl) {
fields.preview.classList.add('bib-range-preview--error'); 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) { function bibRangeValidateOnBlur(row) {
@ -2748,45 +2775,12 @@ if ($strLangue == 'fr') {
bibRangeShowValidation(row, bibRangeValidate(row)); 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) { function applyBibRangeFieldState(row) {
var fields = bibRangeGetFields(row); var fields = bibRangeGetFields(row);
if (!fields || !fields.start || !fields.qty || !fields.end) return; if (!fields || !fields.start || !fields.qty || !fields.end) return;
if (row.dataset.locked === '1') { if (row.dataset.locked === '1') {
bibRangeClearFieldClasses(row); bibRangeClearFieldClasses(row);
bibRangeUpdatePreview(row);
return; return;
} }
@ -2803,7 +2797,6 @@ if ($strLangue == 'fr') {
fields.qty.value = ''; fields.qty.value = '';
fields.end.value = ''; fields.end.value = '';
row.dataset.rangePilot = ''; row.dataset.rangePilot = '';
bibRangeUpdatePreview(row);
return; return;
} }
@ -2812,7 +2805,6 @@ if ($strLangue == 'fr') {
fields.end.classList.add('bib-field--pick'); fields.end.classList.add('bib-field--pick');
fields.qty.readOnly = true; fields.qty.readOnly = true;
fields.end.readOnly = true; fields.end.readOnly = true;
bibRangeUpdatePreview(row);
return; return;
} }
@ -2839,8 +2831,6 @@ if ($strLangue == 'fr') {
fields.qty.value = ''; fields.qty.value = '';
} }
} }
bibRangeUpdatePreview(row);
} }
function onBibRangeFieldPick(row, pilot) { function onBibRangeFieldPick(row, pilot) {
@ -3548,7 +3538,10 @@ if ($strLangue == 'fr') {
if (validation) { if (validation) {
bibRangeShowValidation(row, validation); bibRangeShowValidation(row, validation);
if (errorDiv) { if (errorDiv) {
var msgEl = errorDiv.querySelector('.bib-range-validate-msg');
if (!msgEl) {
errorDiv.innerText = bibRangeValidationMessage(validation); errorDiv.innerText = bibRangeValidationMessage(validation);
}
errorDiv.style.display = 'block'; errorDiv.style.display = 'block';
} }
var invalidField = validation.field === 'qty' var invalidField = validation.field === 'qty'

View File

@ -3104,8 +3104,6 @@ function fxBibModuleJsDataAttrs() {
'auto-pending-bibs' => 'bib_v4_js_auto_pending_bibs', 'auto-pending-bibs' => 'bib_v4_js_auto_pending_bibs',
'range-incomplete' => 'bib_v4_js_range_incomplete', 'range-incomplete' => 'bib_v4_js_range_incomplete',
'range-invalid' => 'bib_v4_js_range_invalid', '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-end' => 'bib_v4_js_range_invalid_end',
'range-invalid-qty' => 'bib_v4_js_range_invalid_qty', 'range-invalid-qty' => 'bib_v4_js_range_invalid_qty',
]; ];
@ -5301,8 +5299,6 @@ if (!$blnRangeLocked && (
</div> </div>
</div> </div>
<div class="bib-range-preview text-muted small bib-ui-hidden" aria-live="polite"></div>
</div> </div>
<div class="bib-error text-danger small mb-2" style="<?php echo (!empty($range['liste_trous']) || !empty($range['liste_doublons'])) ? 'display:block;' : 'display:none;'; ?>"> <div class="bib-error text-danger small mb-2" style="<?php echo (!empty($range['liste_trous']) || !empty($range['liste_doublons'])) ? 'display:block;' : 'display:none;'; ?>">

View File

@ -7,7 +7,7 @@
* Constantes * * Constantes *
* *
**************/ **************/
define('_VERSION_CODE', '4.72.731'); define('_VERSION_CODE', '4.72.732');
define('_DATE_CODE', '2026-07-07'); define('_DATE_CODE', '2026-07-07');
//MSIN-4290 //MSIN-4290
define('QR_SECRET_KEY', 'ms1_qr_2026_cle_secrete_longue_et_fixe'); define('QR_SECRET_KEY', 'ms1_qr_2026_cle_secrete_longue_et_fixe');