From 597cdf4a525887faa829274d381f4884aaea56e7 Mon Sep 17 00:00:00 2001 From: stephan Date: Tue, 16 Jun 2026 17:09:35 -0400 Subject: [PATCH] Refactor bib management interface to support empty labels in column headers and enhance layout for statistics display. Updated CSS styles for improved responsiveness and adjusted translation handling in Python scripts for better clarity in the bib management system. --- css/style.css | 55 ++++++++++++++++++------ php/inc_fx_promoteur.php | 64 +++++++++++++++++++--------- sql/MSIN-4379-bib_v4-traductions.sql | 15 ++++--- tools/gen_bib_v4_traductions_sql.py | 6 +-- tools/gen_bib_v4_traductions_xlsx.py | 6 +-- 5 files changed, 99 insertions(+), 47 deletions(-) diff --git a/css/style.css b/css/style.css index 9c0bad9..fcd0bf6 100644 --- a/css/style.css +++ b/css/style.css @@ -988,10 +988,16 @@ ul.ms1-menu-compte li a:hover, ul.ms1-menu-compte li a:active { .epr-block-assign .epr-content{ display:flex; flex-direction:column; - gap:10px; + gap:0; min-width:0; } +.epr-assign-divider{ + border-top:1px solid #ced4da; + margin:14px 0 12px; + flex-shrink:0; +} + .epr-block-assign .bib-container{ width:100%; min-width:0; @@ -1019,6 +1025,10 @@ ul.ms1-menu-compte li a:hover, ul.ms1-menu-compte li a:active { line-height:1.2; } +.epr-col-header-label--empty{ + gap:0; +} + .epr-line-header .btn-aide-bib{ width:18px; height:18px; @@ -1064,10 +1074,6 @@ ul.ms1-menu-compte li a:hover, ul.ms1-menu-compte li a:active { gap:8px; } -.epr-add-range-row{ - margin-top:4px; -} - .epr-header-label{ display:inline-flex; align-items:center; @@ -1211,7 +1217,7 @@ ul.ms1-menu-compte li a:hover, ul.ms1-menu-compte li a:active { width:100%; } -/* MSIN-4379 — View en 1re col. ; Début/Fin largeur fixe ; stats en fr. */ +/* MSIN-4379 — View/OK/Suppr icônes ; stats regroupées ; marge droite libre acceptée. */ .epr-line{ display:grid; grid-template-columns: @@ -1220,10 +1226,8 @@ ul.ms1-menu-compte li a:hover, ul.ms1-menu-compte li a:active { 58px 44px 48px - minmax(52px, 1fr) - minmax(52px, 1fr) - minmax(52px, 1fr) - 0fr; + auto + minmax(0, 1fr); gap:8px; align-items:center; width:100%; @@ -1237,12 +1241,34 @@ ul.ms1-menu-compte li a:hover, ul.ms1-menu-compte li a:active { 58px 44px 48px - minmax(48px, 1fr) - minmax(48px, 1fr) - minmax(48px, 1fr) + auto 28px; } +.epr-col-stats{ + display:grid; + grid-template-columns:56px 48px 48px; + gap:4px; + align-items:center; + justify-content:start; + min-width:0; +} + +.epr-col-stats > .bib-last, +.epr-col-stats > .bib-used, +.epr-col-stats > .bib-dispo{ + text-align:center; + font-size:13px; + min-width:0; +} + +.epr-line-header .epr-col-stats > div{ + display:flex; + align-items:center; + justify-content:center; + min-width:0; +} + .epr-line .bib-start, .epr-line .bib-end{ width:100%; @@ -1252,7 +1278,7 @@ ul.ms1-menu-compte li a:hover, ul.ms1-menu-compte li a:active { } .epr-add-range-row{ - margin-top:4px; + margin-top:6px; } .epr-col-batch{ @@ -1275,6 +1301,7 @@ ul.ms1-menu-compte li a:hover, ul.ms1-menu-compte li a:active { flex-direction:column; gap:10px; width:100%; + padding-top:2px; } /* MOBILE */ diff --git a/php/inc_fx_promoteur.php b/php/inc_fx_promoteur.php index d61ff0f..cdfab36 100644 --- a/php/inc_fx_promoteur.php +++ b/php/inc_fx_promoteur.php @@ -2681,17 +2681,32 @@ function fxBibGetInfoRow($clef) { return $bibInfoCache[$clef]; } -/** Libellé bib v4 — sur compte.php auto-crée si absent ; en AJAX, lecture seule + repli. */ -function fxBibTexte($clef, $mem_echo = 0, $strFallback = '') { +/** Libellé bib v4 — sur compte.php auto-crée si absent ; en AJAX, lecture seule + repli. + * $blnAllowEmptyLabel : si true, info_texte vide en BD reste vide (en-têtes colonnes éditables). */ +function fxBibTexte($clef, $mem_echo = 0, $strFallback = '', $blnAllowEmptyLabel = false) { $row = fxBibGetInfoRow($clef); + $blnHasDbRow = !empty($row) && array_key_exists('info_texte', $row); $str = trim($row['info_texte'] ?? ''); + if ($blnAllowEmptyLabel && $blnHasDbRow && $str === '') { + if ($mem_echo) { + echo ''; + } + return ''; + } + if ($str === '' || $str === $clef || $str === '*' . $clef . '*') { if (!defined('MS1_BIB_AJAX') || !MS1_BIB_AJAX) { - $str = trim(afficheTexte($clef, 0)); + if (!$blnAllowEmptyLabel || $strFallback !== '') { + $str = trim(afficheTexte($clef, 0)); + } } if ($str === '' || $str === $clef || $str === '*' . $clef . '*') { - $str = $strFallback !== '' ? $strFallback : $clef; + if ($strFallback !== '') { + $str = $strFallback; + } else { + $str = $blnAllowEmptyLabel ? '' : $clef; + } } } @@ -2769,10 +2784,15 @@ function fxBibBlockHeader($clef, $strFallback = '') { return '' . fxBibEsc(fxBibTexte($clef, 0, $strFallback)) . fxBibAideButton($clef) . ''; } -/** Cellule d'en-tête de colonne séquence + aide optionnelle. */ -function fxBibColHeader($clef, $strFallback) { - return '' - . fxBibEsc(fxBibTexte($clef, 0, $strFallback)) +/** Cellule d'en-tête de colonne séquence + aide optionnelle (info_texte peut être vide). */ +function fxBibColHeader($clef, $strFallback = '') { + $strLabel = fxBibTexte($clef, 0, $strFallback, true); + $strClass = 'epr-col-header-label'; + if ($strLabel === '') { + $strClass .= ' epr-col-header-label--empty'; + } + return '' + . fxBibEsc($strLabel) . fxBibAideButton($clef) . ''; } @@ -2809,14 +2829,16 @@ function renderBibRangeHeader() { ob_start(); ?>
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
- -
-
- +
+
+
+
diff --git a/sql/MSIN-4379-bib_v4-traductions.sql b/sql/MSIN-4379-bib_v4-traductions.sql index 8ed8197..e2f8924 100644 --- a/sql/MSIN-4379-bib_v4-traductions.sql +++ b/sql/MSIN-4379-bib_v4-traductions.sql @@ -13,16 +13,16 @@ INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_ INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_gestion_title', 'en', 'Event management', 'Reserved for quantities and settings — coming soon.', 'compte.php', '', 0, 1, '', '', '', NOW()); INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_gestion_placeholder', 'fr', 'Quantités et paramètres — à venir.', '', 'compte.php', '', 0, 1, '', '', '', NOW()); INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_gestion_placeholder', 'en', 'Quantities and settings — coming soon.', '', 'compte.php', '', 0, 1, '', '', '', NOW()); -INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_view', 'fr', 'View', 'Voir la grille des dossards de cette séquence.', 'compte.php', '', 0, 1, '', '', '', NOW()); -INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_view', 'en', 'View', 'View the bib grid for this sequence.', 'compte.php', '', 0, 1, '', '', '', NOW()); +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_view', 'fr', '', 'Voir la grille des dossards de cette séquence.', 'compte.php', '', 0, 1, '', '', '', NOW()); +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_view', 'en', '', 'View the bib grid for this sequence.', 'compte.php', '', 0, 1, '', '', '', NOW()); INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_start', 'fr', 'Début', 'Premier numéro de la séquence.', 'compte.php', '', 0, 1, '', '', '', NOW()); INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_start', 'en', 'Start', 'First number in the sequence.', 'compte.php', '', 0, 1, '', '', '', NOW()); INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_end', 'fr', 'Fin', 'Dernier numéro de la séquence.', 'compte.php', '', 0, 1, '', '', '', NOW()); INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_end', 'en', 'End', 'Last number in the sequence.', 'compte.php', '', 0, 1, '', '', '', NOW()); -INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_ok', 'fr', 'OK', 'Enregistrer cette séquence.', 'compte.php', '', 0, 1, '', '', '', NOW()); -INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_ok', 'en', 'OK', 'Save this sequence.', 'compte.php', '', 0, 1, '', '', '', NOW()); -INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_del', 'fr', 'Suppr.', 'Supprimer la séquence.', 'compte.php', '', 0, 1, '', '', '', NOW()); -INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_del', 'en', 'Del.', 'Delete this sequence.', 'compte.php', '', 0, 1, '', '', '', NOW()); +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_ok', 'fr', '', 'Enregistrer cette séquence.', 'compte.php', '', 0, 1, '', '', '', NOW()); +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_ok', 'en', '', 'Save this sequence.', 'compte.php', '', 0, 1, '', '', '', NOW()); +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_del', 'fr', '', 'Supprimer la séquence.', 'compte.php', '', 0, 1, '', '', '', NOW()); +INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_del', 'en', '', 'Delete this sequence.', 'compte.php', '', 0, 1, '', '', '', NOW()); INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_last', 'fr', 'Dernier', 'Dernier dossard assigné dans la séquence.', 'compte.php', '', 0, 1, '', '', '', NOW()); INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_last', 'en', 'Last', 'Last bib assigned in the sequence.', 'compte.php', '', 0, 1, '', '', '', NOW()); INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_col_used', 'fr', 'Utilisé', 'Nombre de dossards déjà assignés.', 'compte.php', '', 0, 1, '', '', '', NOW()); @@ -67,3 +67,6 @@ INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_ INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_batch_simulate', 'en', 'Simulate', 'Shows who would receive which bib without changing the database.', 'compte.php', '', 0, 1, '', '', '', NOW()); INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_batch_go', 'fr', 'GO', 'Lance l''assignation batch pour de vrai.', 'compte.php', '', 0, 1, '', '', '', NOW()); INSERT INTO info (info_clef, info_langue, info_texte, info_aide, info_prg, info_description, info_trie, info_actif, info_option1, info_option2, info_option3, info_creation) VALUES ('bib_v4_batch_go', 'en', 'GO', 'Runs the batch assignment for real.', 'compte.php', '', 0, 1, '', '', '', NOW()); + +-- Mise à jour légère (BD déjà importée) — colonnes icône sans libellé, aide (?) inchangée : +-- UPDATE info SET info_texte = '' WHERE info_clef IN ('bib_v4_col_view','bib_v4_col_ok','bib_v4_col_del') AND info_prg = 'compte.php'; diff --git a/tools/gen_bib_v4_traductions_sql.py b/tools/gen_bib_v4_traductions_sql.py index 3488852..61221a1 100644 --- a/tools/gen_bib_v4_traductions_sql.py +++ b/tools/gen_bib_v4_traductions_sql.py @@ -25,11 +25,11 @@ ROWS = [ "", "Quantities and settings — coming soon.", ""), - ("bib_v4_col_view", "View", "Voir la grille des dossards de cette séquence.", "View", "View the bib grid for this sequence."), + ("bib_v4_col_view", "", "Voir la grille des dossards de cette séquence.", "", "View the bib grid for this sequence."), ("bib_v4_col_start", "Début", "Premier numéro de la séquence.", "Start", "First number in the sequence."), ("bib_v4_col_end", "Fin", "Dernier numéro de la séquence.", "End", "Last number in the sequence."), - ("bib_v4_col_ok", "OK", "Enregistrer cette séquence.", "OK", "Save this sequence."), - ("bib_v4_col_del", "Suppr.", "Supprimer la séquence.", "Del.", "Delete this sequence."), + ("bib_v4_col_ok", "", "Enregistrer cette séquence.", "", "Save this sequence."), + ("bib_v4_col_del", "", "Supprimer la séquence.", "", "Delete this sequence."), ("bib_v4_col_last", "Dernier", "Dernier dossard assigné dans la séquence.", "Last", "Last bib assigned in the sequence."), ("bib_v4_col_used", "Utilisé", "Nombre de dossards déjà assignés.", "Used", "Number of bibs already assigned."), ("bib_v4_col_avail", "Dispo", "Dossards encore disponibles dans la séquence.", "Avail.", "Bibs still available in the sequence."), diff --git a/tools/gen_bib_v4_traductions_xlsx.py b/tools/gen_bib_v4_traductions_xlsx.py index 68fa2fb..4c7f9a1 100644 --- a/tools/gen_bib_v4_traductions_xlsx.py +++ b/tools/gen_bib_v4_traductions_xlsx.py @@ -24,15 +24,15 @@ rows = [ "", ""), ("bib_v4_col_view", "Colonne tableau séquences", "colonne", - "View", "Voir la grille des dossards de cette séquence.", "View", "View the bib grid for this sequence.", ""), + "", "Voir la grille des dossards de cette séquence.", "", "View the bib grid for this sequence.", "info_texte vide — icône œil + ?"), ("bib_v4_col_start", "Colonne tableau séquences", "colonne", "Début", "Premier numéro de la plage.", "Start", "First number in the range.", "aide optionnelle"), ("bib_v4_col_end", "Colonne tableau séquences", "colonne", "Fin", "Dernier numéro de la plage.", "End", "Last number in the range.", ""), ("bib_v4_col_ok", "Colonne tableau séquences", "colonne", - "OK", "Enregistrer cette plage.", "OK", "Save this range.", ""), + "", "Enregistrer cette plage.", "", "Save this range.", "icône OK + ?"), ("bib_v4_col_del", "Colonne tableau séquences", "colonne", - "Suppr.", "Supprimer la plage.", "Del.", "Delete this range.", ""), + "", "Supprimer la plage.", "", "Delete this range.", "icône poubelle + ?"), ("bib_v4_col_last", "Colonne tableau séquences", "colonne", "Dernier", "Dernier dossard assigné dans la plage.", "Last", "Last bib assigned in the range.", ""), ("bib_v4_col_used", "Colonne tableau séquences", "colonne",