From 5caa1238d79cd7c1c5cd3cf7003116ddb68a3cd7 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 30 Jul 2026 09:58:53 -0400 Subject: [PATCH] =?UTF-8?q?MSIN-4526=20=E2=80=94=20Refactor=20bib=20assign?= =?UTF-8?q?ment=20logic=20to=20eliminate=20unnecessary=20AJAX=20calls=20fo?= =?UTF-8?q?r=20checkbox=20visibility,=20enhancing=20performance.=20Update?= =?UTF-8?q?=20version=20code=20to=204.72.913.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/v2/bib-assignments.js | 218 +++++++++++++-------------------------- php/inc_fx_promoteur.php | 41 ++------ php/inc_settings.php | 2 +- 3 files changed, 83 insertions(+), 178 deletions(-) diff --git a/js/v2/bib-assignments.js b/js/v2/bib-assignments.js index a36c15a..aec8047 100644 --- a/js/v2/bib-assignments.js +++ b/js/v2/bib-assignments.js @@ -2997,7 +2997,11 @@ } function bibCountSelectedRanges(row) { - return row.querySelectorAll('.batch-select-range:checked').length; + // MSIN-4526 — Ignorer les cases masquées (autre mode). + return Array.from(row.querySelectorAll('.batch-select-range:checked')).filter(function (cb) { + let wrap = cb.closest('.batch-checkbox'); + return wrap && !wrap.classList.contains('bib-ui-hidden'); + }).length; } /** MSIN-4436 — Développe un bloc repliable #module-bib. */ @@ -3667,7 +3671,7 @@ } } - /** MSIN-4379 — Quitte le mode édition auto sans sauver ; recharge les plages (mode assign). */ + /** MSIN-4379 — Quitte le mode édition auto sans sauver. MSIN-4526 — local, sans refresh_ranges. */ function exitAutoMode(row) { if (!row) return; @@ -3683,27 +3687,14 @@ input.removeAttribute('readonly'); }); - bibFetch('/ajax_bib_range.php', { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - }, - body: - 'action=refresh_ranges' - + '&epr_id=' + encodeURIComponent(row.dataset.eprId) - + '&mode=assign' - + bibAjaxLangSuffix() - }) - .then(res => res.json()) - .then(data => { + row.querySelectorAll('.batch-select-range').forEach(function (cb) { + cb.checked = false; + }); - if (!data.success) return; - - let bibContainer = setBibContainerFromAjax(row, data); - }); + syncBibUiState(row); } - /** MSIN-4379 — Ouvre le mode édition : checkboxes, bloc Accepter/Annuler, refresh mode=auto. */ + /** MSIN-4379 — Ouvre le mode édition auto. MSIN-4526 — local, sans refresh_ranges. */ function enterAutoMode(row) { if (!row) return; @@ -3727,36 +3718,9 @@ input.setAttribute('readonly', true); }); + bibSyncModeRangeCheckboxes(row, { precheckAuto: true }); + updateAutoSelectionInfo(row); syncBibUiState(row); - - bibFetch('/ajax_bib_range.php', { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - }, - body: - 'action=refresh_ranges' - + '&epr_id=' + encodeURIComponent(row.dataset.eprId) - + '&mode=auto' - + bibAjaxLangSuffix() - }) - .then(res => res.json()) - .then(data => { - - if (!data.success) return; - - let bibContainer = setBibContainerFromAjax(row, data); - if (!bibContainer) return; - - bibContainer.classList.add('batch-mode'); - - row.querySelectorAll('.bib-start, .bib-qty, .bib-end').forEach(input => { - input.setAttribute('readonly', true); - }); - - updateAutoSelectionInfo(row); - syncBibUiState(row); - }); } function bibSyncResetAllEprButton(row) { @@ -3786,6 +3750,52 @@ btn.disabled = hasLock; } + /** + * MSIN-4526 — Affiche/masque les cases séquence selon le mode, sans AJAX. + * Assign/auto : dispo > 0. Reset : utilisés > 0. + * @param {HTMLElement} row + * @param {{precheckAuto?: boolean}} [opts] + */ + function bibSyncModeRangeCheckboxes(row, opts) { + opts = opts || {}; + if (!row) { + return; + } + + let modes = bibRowModes(row); + let inPickFlow = modes.batch || modes.reset || modes.auto; + + row.querySelectorAll('.bib-range.epr-line').forEach(function (line) { + let wrap = line.querySelector('.batch-checkbox'); + let cb = line.querySelector('.batch-select-range'); + if (!wrap || !cb) { + return; + } + + if (!inPickFlow || line.dataset.locked === '1') { + wrap.classList.add('bib-ui-hidden'); + cb.checked = false; + return; + } + + let used = parseInt((line.querySelector('.bib-used')?.textContent || '0'), 10) || 0; + let dispo = parseInt((line.querySelector('.bib-dispo')?.textContent || '0'), 10) || 0; + let show = modes.reset ? (used > 0) : (dispo > 0); + + if (!show) { + wrap.classList.add('bib-ui-hidden'); + cb.checked = false; + return; + } + + wrap.classList.remove('bib-ui-hidden'); + + if (opts.precheckAuto && modes.auto && line.dataset.bibAuto === '1') { + cb.checked = true; + } + }); + } + function syncBibUiState(row) { if (!row) return; @@ -3820,6 +3830,10 @@ bibSetVisible('.batch-config-container', inBatchFlow, row); bibSetVisible('.auto-config-container', inAutoFlow, row); + bibSyncModeRangeCheckboxes(row); + + hasSelection = bibCountSelectedRanges(row) > 0; + let showPick = inPickFlow && !hasSelection; let showBatchReady = inBatchFlow && hasSelection; let showAutoReady = inAutoFlow && hasSelection; @@ -3988,75 +4002,13 @@ return; } - if (row.dataset.loading === '1') return; + // MSIN-4526 — Plus de refresh_ranges à chaque coche (CTE trous + rebuild HTML). let existing = document.querySelector('.epr-row-view'); - if (existing) existing.remove(); - row.dataset.loading = '1'; - - // 1. garder sélection - let selected = []; - row.querySelectorAll('.batch-select-range:checked').forEach(el => { - selected.push(el.dataset.rangeId); - }); - - // 2. analyse gauche/droite + if (existing) { + existing.remove(); + } updateBatchAnalysis(row); - - // 3. sortir du cycle du change - setTimeout(() => { - - bibFetch('/ajax_bib_range.php', { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - }, - body: - 'action=refresh_ranges' - + '&epr_id=' + encodeURIComponent(row.dataset.eprId) - + '&mode=' + encodeURIComponent(row.dataset.mode || 'assign') - + bibAjaxLangSuffix() - }, { loader: false }) - .then(res => res.json()) - .then(data => { - - if (!data.success) { - row.dataset.loading = '0'; - return; - } - - setBibContainerFromAjax(row, data); - let container = getBibContainer(row); - if (!container) { - row.dataset.loading = '0'; - return; - } - - // 4. refresh complet serveur - // Re-sync après refresh serveur - - container.classList.add('batch-mode'); - - // 5. remettre readonly - container.querySelectorAll('.bib-start, .bib-qty, .bib-end').forEach(input => { - input.setAttribute('readonly', true); - }); - - // 6. restaurer checkbox - container.querySelectorAll('.batch-select-range').forEach(el => { - if (selected.includes(el.dataset.rangeId)) { - el.checked = true; - } - }); - updateBatchAnalysis(row); - - row.dataset.loading = '0'; - - }) - .catch(() => { - row.dataset.loading = '0'; - }); - - }, 0); + syncBibUiState(row); }); moduleBib.querySelectorAll('.epr-row').forEach(syncBibUiState); @@ -4654,7 +4606,7 @@ } // ===================== - // ON + // ON — MSIN-4526 : mode local, pas de refresh_ranges (CTE trous). // ===================== row.classList.add('reset-mode'); btnReset.textContent = row.dataset.resetCancelLabel || btnReset.textContent; @@ -4665,40 +4617,16 @@ input.setAttribute('readonly', true); }); - syncBibUiState(row); + row.querySelectorAll('.batch-select-range').forEach(function (cb) { + cb.checked = false; + }); let goBtn = row.querySelector('.btn-go-batch'); if (goBtn) { goBtn.textContent = row.dataset.resetLabel || goBtn.textContent; } - bibFetch('/ajax_bib_range.php', { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - }, - body: - 'action=refresh_ranges' - + '&epr_id=' + encodeURIComponent(row.dataset.eprId) - + '&mode=reset' - + bibAjaxLangSuffix() - }) - .then(res => res.json()) - .then(data => { - - if (!data.success) return; - - let container = setBibContainerFromAjax(row, data); - if (!container) return; - - container.classList.add('batch-mode'); - - row.querySelectorAll('.bib-start, .bib-qty, .bib-end').forEach(input => { - input.setAttribute('readonly', true); - }); - - syncBibUiState(row); - }); + syncBibUiState(row); return; } diff --git a/php/inc_fx_promoteur.php b/php/inc_fx_promoteur.php index dbb5c8b..bbba0e2 100644 --- a/php/inc_fx_promoteur.php +++ b/php/inc_fx_promoteur.php @@ -8173,7 +8173,8 @@ $tabSpec = fxBibRangeSpecValues($range); data-locked="" data-user-locked="" data-production-locked="" - data-has-values=""> + data-has-values="" + data-bib-auto=""> @@ -8240,42 +8241,18 @@ $tabSpec = fxBibRangeSpecValues($range);
0 - && (int)$range['epr_bib_id'] > 0 -)) { - $showCheckbox = true; -} - -if (!$blnRangeLocked && ( - $mode === 'reset' - && (int)$range['nb_utilises'] > 0 - && (int)$range['epr_bib_id'] > 0 -)) { - $showCheckbox = true; -} - -// MSIN-4379 — Étape 2 : mode « auto » — séquences avec dossards disponibles seulement. -if (!$blnRangeLocked && ( - $mode === 'auto' - && $mem_dispo > 0 - && (int)$range['epr_bib_id'] > 0 -)) { - $showCheckbox = true; -} - +// MSIN-4526 — Toujours émettre la case (si séquence sauvée non verrouillée). +// Visibilité selon le mode = JS (bibSyncModeRangeCheckboxes) : plus de refresh_ranges +// juste pour obtenir les checkboxes reset/auto. +$blnShowCheckbox = !$blnRangeLocked && (int)$range['epr_bib_id'] > 0; +$blnPrecheckAuto = ($mode === 'auto' && (int)($range['epr_bib_auto'] ?? 0) === 1); ?> - + - checked> + checked>
diff --git a/php/inc_settings.php b/php/inc_settings.php index 2c9ed19..9e04a5b 100644 --- a/php/inc_settings.php +++ b/php/inc_settings.php @@ -7,7 +7,7 @@ * Constantes * * **************/ -define('_VERSION_CODE', '4.72.912'); // MSIN-4379 — 1 équipe = 1 dossard : regroupement sur nom d'équipe +define('_VERSION_CODE', '4.72.913'); // MSIN-4526 — entrée Réinit/Assign/Auto sans refresh_ranges lourd define('_DATE_CODE', '2026-07-30'); //MSIN-4290 define('QR_SECRET_KEY', 'ms1_qr_2026_cle_secrete_longue_et_fixe');