Add visibility toggle for picks features and rename Mes choix to Mes picks

- Renamed 'Mes choix' to 'Mes picks' across all pages and JavaScript files
- Added visibility toggle in control panel (Réglages > Visibilité) to control:
  - Display of 'Mes picks' button in navigation
  - Display of 'Bon picks' column in user statistics
- Combined both visibility options into single toggle for simplicity
- Added backend API endpoints for visibility configuration
- Implemented localStorage caching for instant visibility updates
- Fixed flash of content issues when navigating between pages
- Updated stats endpoint to calculate correct picks on-the-fly from current winners
- Renamed 'Bonnes réponses' to 'Bon picks' in user statistics table
This commit is contained in:
Mathieu Moran
2025-12-27 22:03:01 -05:00
parent 1281d77c4e
commit 70b309d1ae
14 changed files with 488 additions and 314 deletions
+84
View File
@@ -2676,6 +2676,90 @@ window.onload = async function () {
await loadPointsConfig();
// Visibility config
const visibilityShowPicksFeaturesEl = document.getElementById('visibility-show-picks-features');
const visibilityConfigReloadBtn = document.getElementById('visibility-config-reload');
const visibilityConfigSaveBtn = document.getElementById('visibility-config-save');
const visibilityConfigAlert = document.getElementById('visibility-config-alert');
async function loadVisibilityConfig() {
try {
const res = await fetch('/api/settings/visibility-config', { cache: 'no-store' });
if (!res.ok) throw new Error('Failed to load visibility config');
const config = await res.json();
// Both settings should be the same - use showPicksButton as the master
const isEnabled = config.showPicksButton !== false && config.showBonPicksColumn !== false;
if (visibilityShowPicksFeaturesEl) visibilityShowPicksFeaturesEl.checked = isEnabled;
} catch (err) {
console.error('Error loading visibility config:', err);
// Default to showing both
if (visibilityShowPicksFeaturesEl) visibilityShowPicksFeaturesEl.checked = true;
}
}
if (visibilityConfigReloadBtn) {
visibilityConfigReloadBtn.addEventListener('click', async () => {
await loadVisibilityConfig();
showResponse('success', 'Configuration rechargée');
});
}
if (visibilityConfigSaveBtn) {
visibilityConfigSaveBtn.addEventListener('click', async () => {
const isEnabled = visibilityShowPicksFeaturesEl ? visibilityShowPicksFeaturesEl.checked : true;
const showPicksButton = isEnabled;
const showBonPicksColumn = isEnabled;
try {
visibilityConfigSaveBtn.disabled = true;
const oldText = visibilityConfigSaveBtn.textContent;
visibilityConfigSaveBtn.textContent = 'Enregistrement...';
const res = await fetch('/api/settings/visibility-config', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({
showPicksButton,
showBonPicksColumn
})
});
if (!res.ok) {
const error = await res.json();
throw new Error(error.message || 'Failed to save');
}
const data = await res.json();
// Clear cache so all pages get the new setting immediately
localStorage.removeItem('visibility_config_cache');
showResponse('success', 'Configuration de visibilité enregistrée');
} catch (err) {
if (visibilityConfigAlert) {
visibilityConfigAlert.className = 'alert alert-danger';
visibilityConfigAlert.textContent = 'Erreur: ' + err.message;
visibilityConfigAlert.classList.remove('d-none');
}
} finally {
visibilityConfigSaveBtn.disabled = false;
visibilityConfigSaveBtn.textContent = oldText;
}
});
}
// Load visibility config when visibility tab is shown
const visibilitySubTab = document.getElementById('admin-settings-subtab-visibility');
if (visibilitySubTab) {
visibilitySubTab.addEventListener('shown.bs.tab', async () => {
await loadVisibilityConfig();
});
}
// Categories management
const importPdfForm = document.getElementById('import-pdf-form');
const createCategoryForm = document.getElementById('create-category-form');