Refactor control panel: merge Lecteur tab into Visibilité and add loading bar to Mes picks

- Remove 'Lecteur' subtab from Réglages section
- Move player UI settings (show Source/Progress) into Visibilité tab
- Consolidate reload/save buttons to use single set for both visibility and player UI settings
- Simplify visibility tab formatting with minimalistic, consistent styling
- Add loading bar progress indicator to Mes picks tab matching movies/checklist/stats pages
- Update JavaScript to handle both visibility config and player UI settings together
- Improve code organization and user experience
This commit is contained in:
Mathieu Moran
2025-12-28 02:20:21 -05:00
parent 211c115d41
commit d10164076c
4 changed files with 246 additions and 81 deletions
+50 -20
View File
@@ -2671,8 +2671,21 @@ window.onload = async function () {
if (visibilityConfigReloadBtn) {
visibilityConfigReloadBtn.addEventListener('click', async () => {
await loadVisibilityConfig();
showResponse('success', 'Configuration rechargée');
visibilityConfigReloadBtn.disabled = true;
const oldText = visibilityConfigReloadBtn.textContent;
visibilityConfigReloadBtn.textContent = 'Chargement...';
try {
await Promise.all([
loadVisibilityConfig(),
loadPlayerUiIntoUi()
]);
showResponse('success', 'Configuration rechargée');
} catch (err) {
showResponse('warning', 'Erreur lors du rechargement: ' + (err.message || 'Erreur inconnue'));
} finally {
visibilityConfigReloadBtn.disabled = false;
visibilityConfigReloadBtn.textContent = oldText;
}
});
}
@@ -2687,35 +2700,49 @@ window.onload = async function () {
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
})
});
// Save both visibility config and player UI settings
const [visibilityRes, playerUiPayload] = await Promise.all([
fetch('/api/settings/visibility-config', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({
showPicksButton,
showBonPicksColumn
})
}),
Promise.resolve(getPlayerUiFormValue())
]);
if (!res.ok) {
const error = await res.json();
throw new Error(error.message || 'Failed to save');
if (!visibilityRes.ok) {
const error = await visibilityRes.json();
throw new Error(error.message || 'Failed to save visibility config');
}
const data = await res.json();
// Save player UI settings
try {
const saved = await savePlayerUi(playerUiPayload);
setPlayerUiForm(saved);
} catch (playerErr) {
// If player UI save fails, still show success for visibility but warn
console.warn('Player UI save failed:', playerErr);
}
const data = await visibilityRes.json();
// Clear cache so all pages get the new setting immediately
localStorage.removeItem('visibility_config_cache');
showResponse('success', 'Configuration de visibilité enregistrée');
showResponse('success', 'Configuration enregistrée');
} catch (err) {
if (visibilityConfigAlert) {
visibilityConfigAlert.className = 'alert alert-danger';
visibilityConfigAlert.textContent = 'Erreur: ' + err.message;
visibilityConfigAlert.classList.remove('d-none');
}
showResponse('danger', 'Erreur lors de l\'enregistrement: ' + err.message);
} finally {
visibilityConfigSaveBtn.disabled = false;
visibilityConfigSaveBtn.textContent = oldText;
@@ -2723,11 +2750,14 @@ window.onload = async function () {
});
}
// Load visibility config when visibility tab is shown
// Load visibility config and player UI when visibility tab is shown
const visibilitySubTab = document.getElementById('admin-settings-subtab-visibility');
if (visibilitySubTab) {
visibilitySubTab.addEventListener('shown.bs.tab', async () => {
await loadVisibilityConfig();
await Promise.all([
loadVisibilityConfig(),
loadPlayerUiIntoUi()
]);
});
}