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:
@ -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,
|
||||
|
||||
@ -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'
|
||||
|
||||
@ -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 && (
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bib-range-preview text-muted small bib-ui-hidden" aria-live="polite"></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;'; ?>">
|
||||
|
||||
@ -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');
|
||||
|
||||
Reference in New Issue
Block a user