diff --git a/css/style.css b/css/style.css index f2a88f4..d62608e 100644 --- a/css/style.css +++ b/css/style.css @@ -4078,92 +4078,112 @@ a.ms1-trad-link.btn-aide-trad{ padding-top:12px; } -/* MSIN-4515 — Champs Excel imprimeur (Face bleu / Endos rouge / Info blanc) */ +/* MSIN-4515 — Champs Excel imprimeur : titre épreuve, ligne Face, + liste */ #module-bib .bib-production-fields{ margin-top:16px; } #module-bib .bib-production-fields-intro{ - margin-bottom:10px; + margin-bottom:14px; } -#module-bib .bib-production-fields-legend{ - display:flex; - flex-wrap:wrap; - gap:8px 18px; - margin:0 0 16px; - padding:10px 12px; - background:#f5f9ff; - border:1px solid #c5d9f5; - border-left:4px solid #2f5fd0; - border-radius:6px; - font-size:13px; -} -#module-bib .bib-production-fields-legend li{ - display:inline-flex; - align-items:center; - gap:8px; - margin:0; -} -#module-bib .bib-prod-swatch{ - width:16px; - height:16px; - border-radius:3px; - border:1px solid rgba(0,0,0,.2); - flex:0 0 auto; -} -#module-bib .bib-prod-swatch--face{ background:#5B9BD5; } -#module-bib .bib-prod-swatch--endos{ background:#C00000; } -#module-bib .bib-prod-swatch--info{ background:#fff; } -#module-bib .bib-prod-swatch--none{ - background:repeating-linear-gradient( - -45deg, - #f1f1f1, - #f1f1f1 3px, - #ddd 3px, - #ddd 6px - ); -} -#module-bib .bib-prod-fields-group{ - border:0; - margin:0 0 12px; +#module-bib .bib-prod-fields-epr{ + margin:0 0 20px; padding:0; } +#module-bib .bib-prod-fields-epr-title{ + margin:0 0 10px; + padding:0; + font-size:16px; + font-weight:700; + color:#1a3a6b; +} #module-bib .bib-prod-builder-list{ display:flex; flex-direction:column; - gap:10px; + gap:8px; + margin-bottom:8px; } #module-bib .bib-prod-builder-row{ display:flex; flex-wrap:wrap; align-items:center; gap:8px 12px; - padding:10px 12px; + padding:8px 10px; background:#fff; border:1px solid #e9ecef; border-radius:6px; } -#module-bib .bib-prod-builder-field{ - flex:1 1 220px; - min-width:180px; - max-width:360px; +#module-bib .bib-prod-builder-label{ + flex:1 1 auto; + min-width:120px; + font-size:14px; + font-weight:600; + color:#212529; +} +#module-bib .bib-prod-builder-side-pill{ + flex:0 0 auto; + cursor:default; } #module-bib .bib-prod-builder-add{ - margin-top:4px; + margin-top:2px; + min-width:36px; } #module-bib .bib-prod-builder-remove{ margin-left:auto; } -#module-bib .bib-prod-field-sides{ - display:inline-flex; +#module-bib .bib-prod-add-panel{ + margin-top:10px; + padding:12px; + background:#f5f9ff; + border:1px solid #c5d9f5; + border-radius:6px; +} +#module-bib .bib-prod-add-panel__title{ + margin:0 0 8px; + font-size:13px; + font-weight:600; + color:#1a3a6b; +} +#module-bib .bib-prod-add-choices{ + display:flex; + flex-direction:column; + gap:4px; + margin:0 0 10px; + max-height:220px; + overflow:auto; +} +#module-bib .bib-prod-add-choice{ + display:block; + width:100%; + text-align:left; + padding:8px 10px; + border:1px solid #dee2e6; + border-radius:4px; + background:#fff; + font-size:13px; + color:#212529; + cursor:pointer; +} +#module-bib .bib-prod-add-choice:hover, +#module-bib .bib-prod-add-choice:focus{ + border-color:#5B9BD5; + outline:none; +} +#module-bib .bib-prod-add-choice.is-selected{ + border-color:#2f5fd0; + background:#e8f0fe; + font-weight:600; +} +#module-bib .bib-prod-add-sides{ + display:flex; flex-wrap:wrap; - gap:6px; + gap:8px; } #module-bib .bib-prod-field-side{ display:inline-flex; align-items:center; gap:4px; margin:0; - padding:4px 10px; + padding:6px 12px; border:1px solid #ced4da; border-radius:4px; font-size:12px; @@ -4173,21 +4193,22 @@ a.ms1-trad-link.btn-aide-trad{ color:#495057; user-select:none; } -#module-bib .bib-prod-field-side-input{ - position:absolute; - opacity:0; - pointer-events:none; -} +#module-bib .bib-prod-add-side.bib-prod-field-side--face, +#module-bib .bib-prod-builder-side-pill.bib-prod-field-side--face, #module-bib .bib-prod-field-side--face.is-selected{ background:#5B9BD5; border-color:#3d7eae; color:#fff; } +#module-bib .bib-prod-add-side.bib-prod-field-side--endos, +#module-bib .bib-prod-builder-side-pill.bib-prod-field-side--endos, #module-bib .bib-prod-field-side--endos.is-selected{ background:#C00000; border-color:#8a0000; color:#fff; } +#module-bib .bib-prod-add-side.bib-prod-field-side--info, +#module-bib .bib-prod-builder-side-pill.bib-prod-field-side--info, #module-bib .bib-prod-field-side--info.is-selected{ background:#fff; border-color:#6c757d; diff --git a/js/v2/bib-assignments.js b/js/v2/bib-assignments.js index 561848f..ceeb161 100644 --- a/js/v2/bib-assignments.js +++ b/js/v2/bib-assignments.js @@ -2037,6 +2037,25 @@ // MSIN-4469 — Le téléchargement part dans un nouvel onglet; // l’écran principal revient aussitôt à Quantités et assignation. + // MSIN-4515 — Serialize data-field-key / data-field-side (pas de select). + function bibProdFieldsPanel() { + return moduleBib.querySelector('.bib-production-fields'); + } + + function bibProdFieldsLabel(attr, fallback) { + var panel = bibProdFieldsPanel(); + var val = panel ? panel.getAttribute(attr) : ''; + return val || fallback; + } + + function bibProdEscapeHtml(str) { + return String(str == null ? '' : str) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); + } + function bibProdFieldsSerializeBody() { var body = ''; var fieldsForm = moduleBib.querySelector('#bib-production-fields-form'); @@ -2045,10 +2064,8 @@ } fieldsForm.querySelectorAll('.bib-prod-builder-row').forEach(function (row) { var eprId = row.getAttribute('data-epr-id') || ''; - var sel = row.querySelector('.bib-prod-builder-field'); - var sideInput = row.querySelector('.bib-prod-field-side-input:checked'); - var key = sel ? String(sel.value || '') : ''; - var side = sideInput ? String(sideInput.value || '') : ''; + var key = String(row.getAttribute('data-field-key') || ''); + var side = String(row.getAttribute('data-field-side') || ''); if (!eprId || !key || !side) { return; } @@ -2061,37 +2078,60 @@ if (!eprId) { return; } - if (!section.querySelector('.bib-prod-builder-row .bib-prod-builder-field')) { + if (!section.querySelector('.bib-prod-builder-row[data-field-key]')) { body += '&' + encodeURIComponent('prod_fields[' + eprId + '][_empty]') + '='; } }); return body; } - function bibProdBuilderRefreshOptionDisabled(section) { + function bibProdBuilderUsedKeys(section) { + var used = {}; + if (!section) { + return used; + } + section.querySelectorAll('.bib-prod-builder-row').forEach(function (row) { + var key = row.getAttribute('data-field-key'); + if (key) { + used[key] = true; + } + }); + return used; + } + + function bibProdBuilderClosePanel(section) { if (!section) { return; } - var used = {}; - section.querySelectorAll('.bib-prod-builder-field').forEach(function (sel) { - if (sel.value) { - used[sel.value] = true; - } - }); - section.querySelectorAll('.bib-prod-builder-field').forEach(function (sel) { - Array.prototype.forEach.call(sel.options, function (opt) { - if (!opt.value) { - opt.disabled = false; - return; - } - opt.disabled = !!(used[opt.value] && opt.value !== sel.value); - }); - }); + var panel = section.querySelector('.bib-prod-add-panel'); + var addBtn = section.querySelector('.bib-prod-builder-add'); + var sides = section.querySelector('.bib-prod-add-sides'); + var choices = section.querySelector('.bib-prod-add-choices'); + if (panel) { + panel.hidden = true; + panel.removeAttribute('data-pending-key'); + panel.removeAttribute('data-pending-label'); + } + if (sides) { + sides.hidden = true; + } + if (choices) { + choices.innerHTML = ''; + } + if (addBtn) { + addBtn.setAttribute('aria-expanded', 'false'); + } } - function bibProdBuilderAddRow(section) { - var list = section.querySelector('.bib-prod-builder-list'); - if (!list) { + function bibProdBuilderOpenPanel(section) { + if (!section) { + return; + } + var panel = section.querySelector('.bib-prod-add-panel'); + var choices = section.querySelector('.bib-prod-add-choices'); + var sides = section.querySelector('.bib-prod-add-sides'); + var addBtn = section.querySelector('.bib-prod-builder-add'); + if (!panel || !choices) { return; } var options = []; @@ -2100,62 +2140,56 @@ } catch (err) { options = []; } - if (!options.length) { + var used = bibProdBuilderUsedKeys(section); + choices.innerHTML = ''; + options.forEach(function (opt) { + if (!opt || !opt.key || used[opt.key]) { + return; + } + var li = document.createElement('li'); + var btn = document.createElement('button'); + btn.type = 'button'; + btn.className = 'bib-prod-add-choice'; + btn.setAttribute('data-key', String(opt.key)); + btn.setAttribute('data-label', String(opt.label || opt.key)); + btn.textContent = String(opt.label || opt.key); + li.appendChild(btn); + choices.appendChild(li); + }); + if (sides) { + sides.hidden = true; + } + panel.removeAttribute('data-pending-key'); + panel.removeAttribute('data-pending-label'); + panel.hidden = false; + if (addBtn) { + addBtn.setAttribute('aria-expanded', 'true'); + } + } + + function bibProdBuilderAppendRow(section, key, label, side) { + var list = section.querySelector('.bib-prod-builder-list'); + if (!list || !key || !side) { return; } var eprId = section.getAttribute('data-epr-id') || ''; - var idx = list.querySelectorAll('.bib-prod-builder-row').length; - var rowId = 'prod_row_' + eprId + '_' + Date.now() + '_' + idx; - var pickLabel = (list.querySelector('.bib-prod-builder-field option[value=""]') - || {}).textContent || '…'; - var faceLabel = 'Face'; - var endosLabel = 'Endos'; - var infoLabel = 'Info'; - var firstSide = section.querySelector('.bib-prod-field-side--face span'); - var secondSide = section.querySelector('.bib-prod-field-side--endos span'); - var thirdSide = section.querySelector('.bib-prod-field-side--info span'); - if (firstSide) { - faceLabel = firstSide.textContent || faceLabel; - } - if (secondSide) { - endosLabel = secondSide.textContent || endosLabel; - } - if (thirdSide) { - infoLabel = thirdSide.textContent || infoLabel; - } - var removeTitle = (section.querySelector('.bib-prod-builder-remove') - || {}).getAttribute('aria-label') || '×'; - - var optHtml = ''; - options.forEach(function (opt) { - if (!opt || !opt.key) { - return; - } - optHtml += '