MSIN-4470 — Refactor bib workspace navigation and action buttons for improved accessibility and user experience. Update styles for workspace elements and enhance button interactions. Increment version code to 4.72.858.

This commit is contained in:
2026-07-21 15:19:49 -04:00
parent 31a7c9d012
commit f29ed77969
6 changed files with 160 additions and 26 deletions

View File

@ -1078,7 +1078,7 @@ ul.ms1-menu-compte li a:hover, ul.ms1-menu-compte li a:active {
margin-top:10px;
}
#module-bib .bib-workspace-nav{
#module-bib .bib-workspace-bar{
display:flex;
align-items:stretch;
gap:4px;
@ -1089,6 +1089,12 @@ ul.ms1-menu-compte li a:hover, ul.ms1-menu-compte li a:active {
overflow-x:auto;
}
#module-bib .bib-workspace-nav{
display:flex;
align-items:stretch;
gap:4px;
}
#module-bib .bib-workspace-tab{
display:inline-flex;
align-items:center;
@ -1107,6 +1113,41 @@ ul.ms1-menu-compte li a:hover, ul.ms1-menu-compte li a:active {
cursor:pointer;
}
/* MSIN-4470 — L'impression PDF reste accessible à droite des espaces principaux. */
#module-bib .bib-workspace-action{
display:flex;
flex:0 0 auto;
margin-left:auto;
}
#module-bib .bib-workspace-action .bib-tool-btn{
width:auto;
min-height:42px;
padding:8px 16px;
border-width:0;
background:transparent;
color:#495057;
font-size:13px;
font-weight:600;
line-height:1.25;
}
#module-bib .bib-workspace-action .bib-tool-btn:not(.is-active):hover,
#module-bib .bib-workspace-action .bib-tool-btn:not(.is-active):focus{
background:#e8f0f8;
color:#1e4a9e;
box-shadow:none;
}
#module-bib .bib-workspace-action .bib-tool-btn.is-active,
#module-bib .bib-workspace-action .bib-tool-btn.is-active:hover,
#module-bib .bib-workspace-action .bib-tool-btn.is-active:focus{
background:#2f5fd0;
color:#fff;
border-color:transparent;
box-shadow:none;
}
#module-bib .bib-workspace-tab:hover,
#module-bib .bib-workspace-tab:focus{
background:#e8f0f8;
@ -1655,6 +1696,7 @@ ul.ms1-menu-compte li a:hover, ul.ms1-menu-compte li a:active {
}
@media (max-width:768px){
#module-bib .bib-workspace-bar,
#module-bib .bib-workspace-nav{
align-items:stretch;
}
@ -2103,13 +2145,18 @@ ul.ms1-menu-compte li a:hover, ul.ms1-menu-compte li a:active {
.bib-race-summary__group h4{
margin:0 0 5px;
color:#6c757d;
font-size:10px;
font-weight:700;
letter-spacing:.03em;
color:#1e3a6e;
font-size:11px;
font-weight:800;
letter-spacing:.06em;
text-transform:uppercase;
}
/* MSIN-4470 — Accentue légèrement les deux repères principaux de chaque épreuve. */
.bib-race-summary__group--bibs h4{
color:#1e4fbf;
}
.bib-race-summary__stats{
display:grid;
grid-template-columns:repeat(3, minmax(0, 1fr));

View File

@ -540,9 +540,14 @@
if (toolId === 'event_config') {
return 'settings';
}
if (toolId === 'global_batch' || toolId === 'dist_print') {
if (toolId === 'global_batch') {
return 'operations';
}
// MSIN-4470 — L'action PDF est globale et s'ouvre depuis la barre supérieure
// sans déplacer l'utilisateur vers un autre espace de travail.
if (toolId === 'dist_print') {
return bibActiveWorkspace;
}
return 'preparation';
}
@ -1983,6 +1988,15 @@
bibOpenTool(toolBtn.getAttribute('data-bib-tool'));
});
// MSIN-4469 — Le téléchargement part dans un nouvel onglet;
// lécran principal revient aussitôt à Quantités et assignation.
moduleBib.addEventListener('submit', function (e) {
var productionForm = e.target.closest('.bib-production-return-preparation-form');
if (productionForm && moduleBib.contains(productionForm)) {
bibSetWorkspace('preparation');
}
});
moduleBib.addEventListener('click', function (e) {
var workspaceTab = e.target.closest('.bib-workspace-tab');
if (workspaceTab && moduleBib.contains(workspaceTab)) {

View File

@ -160,6 +160,8 @@ function fxBibProductionCollectSnapshot($intEveId, $strLangue = 'fr') {
continue;
}
// MSIN-4469 — La commande porte sur toute la séquence à imprimer,
// même lorsquaucun coureur ni aucun dossard assigné ne sy trouve encore.
$tabRangesRaw = $objDatabase->fxGetResults(
"SELECT epr_bib_id, epr_bib_start, epr_bib_finish
FROM inscriptions_epreuves_bib

View File

@ -5048,7 +5048,8 @@ function renderBibProductionPreview(array $tabEpreuves, $strLangue = 'fr') {
</p>
<?php if (($tabProductionOrder['bpo_status'] ?? '') === 'ready') { ?>
<form method="post" action="<?php echo fxBibEsc($strExcelUrl); ?>" target="_blank">
<form method="post" action="<?php echo fxBibEsc($strExcelUrl); ?>" target="_blank"
class="bib-production-return-preparation-form">
<input type="hidden" name="action" value="download">
<input type="hidden" name="eve_id" value="<?php echo $intEveId; ?>">
<input type="hidden" name="order_id" value="<?php echo (int)$tabProductionOrder['bpo_id']; ?>">
@ -5080,7 +5081,8 @@ function renderBibProductionPreview(array $tabEpreuves, $strLangue = 'fr') {
<?php } ?>
<?php } elseif ($intRangeTotal > 0) { ?>
<p class="text-muted small"><?php fxBibTexteTrad('bib_v5_production_excel_generate_help', 1); ?></p>
<form method="post" action="<?php echo fxBibEsc($strExcelUrl); ?>" target="_blank">
<form method="post" action="<?php echo fxBibEsc($strExcelUrl); ?>" target="_blank"
class="bib-production-return-preparation-form">
<input type="hidden" name="action" value="generate">
<input type="hidden" name="eve_id" value="<?php echo $intEveId; ?>">
<input type="hidden" name="csrf_token" value="<?php echo fxBibEsc(fxBibCsrfToken()); ?>">
@ -5160,7 +5162,7 @@ function renderBibProductionPreview(array $tabEpreuves, $strLangue = 'fr') {
}
/**
* MSIN-4440 / MSIN-4467 — Espaces principaux + outils et panneau de détail unique.
* MSIN-4440 / MSIN-4467 / MSIN-4470 — Espaces principaux + outils et panneau de détail unique.
*/
function renderBibToolNav($int_eve_id, $tabEpreuves, $strLangue = 'fr') {
$int_eve_id = (int)$int_eve_id;
@ -5181,12 +5183,17 @@ function renderBibToolNav($int_eve_id, $tabEpreuves, $strLangue = 'fr') {
ob_start();
?>
<div class="bib-tool-hub">
<nav class="bib-workspace-nav" role="tablist" aria-label="<?php echo fxBibEsc($strNavLabel); ?>">
<?php echo renderBibWorkspaceTab('preparation', 'bib_v5_workspace_preparation', true); ?>
<?php echo renderBibWorkspaceTab('operations', 'bib_v5_workspace_operations'); ?>
<?php echo renderBibWorkspaceTab('settings', 'bib_v5_workspace_settings'); ?>
<?php echo renderBibWorkspaceTab('production', 'bib_v5_workspace_production'); ?>
</nav>
<div class="bib-workspace-bar">
<nav class="bib-workspace-nav" role="tablist" aria-label="<?php echo fxBibEsc($strNavLabel); ?>">
<?php echo renderBibWorkspaceTab('preparation', 'bib_v5_workspace_preparation', true); ?>
<?php echo renderBibWorkspaceTab('operations', 'bib_v5_workspace_operations'); ?>
<?php echo renderBibWorkspaceTab('settings', 'bib_v5_workspace_settings'); ?>
<?php echo renderBibWorkspaceTab('production', 'bib_v5_workspace_production'); ?>
</nav>
<div class="bib-workspace-action">
<?php echo renderBibToolNavBtn('dist_print', 'bib_v4_dist_print_title'); ?>
</div>
</div>
<section class="bib-workspace-panel" data-bib-workspace-panel="preparation">
<?php echo renderBibPreparationOverview($tabEpreuves, $strAnomBadges); ?>
@ -5204,7 +5211,6 @@ function renderBibToolNav($int_eve_id, $tabEpreuves, $strLangue = 'fr') {
<?php if (fxBibGlobalBatchToolIsAvailable($int_eve_id, $tabEpreuves)) {
echo renderBibToolNavBtn('global_batch', 'bib_v4_global_batch_title');
} ?>
<?php echo renderBibToolNavBtn('dist_print', 'bib_v4_dist_print_title'); ?>
</nav>
</section>
@ -5697,15 +5703,17 @@ function fxShowBibTool4($str_code, $int_eve_id, $strLangue){
?>
<div class="card-header bib-tool-card-header">
<h2 class="bib-tool-card-title"><?php afficheTexte('promoteur_bib_tool')?></h2>
<?php
if (function_exists('fxEveAccesPermInspectBadge')) {
echo ' ' . fxEveAccesPermInspectBadge('dossards.manage', 'bib');
echo ' ' . fxEveAccesPermInspectBadge('epreuves.edit_qte', 'bib');
}
?>
</div>
<?php
// MSIN-4470 — Retire le bandeau « Épreuves » sans masquer les badges d'inspection des permissions.
$strPermInspectBadges = '';
if (function_exists('fxEveAccesPermInspectBadge')) {
$strPermInspectBadges .= fxEveAccesPermInspectBadge('dossards.manage', 'bib');
$strPermInspectBadges .= fxEveAccesPermInspectBadge('epreuves.edit_qte', 'bib');
}
if (trim($strPermInspectBadges) !== '') {
echo '<div class="bib-tool-permission-inspect">' . $strPermInspectBadges . '</div>';
}
?>
<div id="module-bib" class="epr-wrapper" data-csrf-token="<?php echo fxBibEsc(fxBibCsrfToken()); ?>" data-lang="<?php echo fxBibEsc($strLangue); ?>" data-eve-id="<?php echo (int)$int_eve_id; ?>" data-allow-inter-epr="<?php echo fxBibEventAllowsInterEprDuplicates((int)$int_eve_id) ? '1' : '0'; ?>"<?php echo fxBibModuleJsDataAttrs(); ?><?php echo fxAdminTextEditModeActive() ? ' data-bib-trad="1"' : ''; ?>>

View File

@ -7,7 +7,7 @@
* Constantes *
*
**************/
define('_VERSION_CODE', '4.72.856'); // MSIN-4469
define('_VERSION_CODE', '4.72.858'); // MSIN-4470
define('_DATE_CODE', '2026-07-21');
//MSIN-4290
define('QR_SECRET_KEY', 'ms1_qr_2026_cle_secrete_longue_et_fixe');

View File

@ -0,0 +1,63 @@
-- MSIN-4470 — Corrections de l'interface des dossards
-- Prérequis : MSIN-4424-bib-allow-inter-epr.sql et MSIN-4467-refonte-visuelle-dossards.sql.
-- Idempotent. Exécuter avant le déploiement PHP/CSS/JS.
UPDATE info
SET info_texte = 'Autoriser les mêmes numéros de dossard entre épreuves (doublons)',
info_description = 'MSIN-4470'
WHERE info_clef = 'bib_v4_allow_inter_epr'
AND info_langue = 'fr'
AND info_prg = 'compte.php';
UPDATE info
SET info_texte = 'Allow the same bib numbers across races (duplicates)',
info_description = 'MSIN-4470'
WHERE info_clef = 'bib_v4_allow_inter_epr'
AND info_langue = 'en'
AND info_prg = 'compte.php';
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
)
SELECT
src.info_clef,
src.info_langue,
src.info_texte,
'',
'compte.php',
'MSIN-4470',
0,
1,
'',
'',
'',
NOW()
FROM (
SELECT
'bib_v4_allow_inter_epr' AS info_clef,
'fr' AS info_langue,
'Autoriser les mêmes numéros de dossard entre épreuves (doublons)' AS info_texte
UNION ALL
SELECT
'bib_v4_allow_inter_epr',
'en',
'Allow the same bib numbers across races (duplicates)'
) src
WHERE NOT EXISTS (
SELECT 1
FROM info current_info
WHERE current_info.info_clef = src.info_clef
AND current_info.info_langue = src.info_langue
AND current_info.info_prg = 'compte.php'
);