Add Mots-clés and Langues management to contenus page

- Add searchLanguages, getAllLanguagesWithCount, renameLanguage, mergeLanguage, deleteLanguage to Database
- Create actions/language.php handler with rename/merge/merge_bulk/delete actions
- Add merge_bulk action to actions/tag.php
- Add Mots-clés section to contenus template with HTMX search, select checkboxes, rename/delete/merge buttons, and multi-select merge toolbar
- Add Langues section to contenus template with same pattern
- Create contenus-tags-fragment.php and contenus-languages-fragment.php HTMX fragments
- Remove form-settings- from flat-fieldset CSS selector so fieldsets in contenus retain border/padding
- contenus.php: add 'Gérer les mots-clés' link to /admin/tags.php
- contenus.php: add Langues fieldset with HTMX search + table (rename/merge/delete/bulk)
- tags.php: add HTMX search bar, checkbox column, bulk merge toolbar
- Create tags-fragment.php and contenus-langues-fragment.php for HTMX
- Remove tab component and associated CSS
- Simplify JS: separate tags/langues-prefixed functions
- Fix redirects: tag.php defaults to /admin/tags.php, supports return override
- Keep tags.php standalone page and Mots-clés button unchanged
This commit is contained in:
Pontoporeia
2026-05-10 12:13:26 +02:00
parent 494675d78c
commit 396cf19e9f
13 changed files with 814 additions and 195 deletions

View File

@@ -615,16 +615,14 @@ th.admin-ap-col {
margin-bottom: var(--space-xl);
}
/* Fieldsets inside flat sections: no card border */
.admin-body main > section[aria-labelledby^="settings-"] fieldset,
.admin-body main > section[aria-labelledby^="form-settings-"] fieldset {
/* Fieldsets inside flat settings sections: no card border */
.admin-body main > section[aria-labelledby^="settings-"] fieldset {
border: none;
border-radius: 0;
padding: var(--space-m) 0;
}
.admin-body main > section[aria-labelledby^="settings-"] fieldset legend,
.admin-body main > section[aria-labelledby^="form-settings-"] fieldset legend {
.admin-body main > section[aria-labelledby^="settings-"] fieldset legend {
padding: 0;
font-weight: 600;
letter-spacing: 0.04em;
@@ -633,8 +631,7 @@ th.admin-ap-col {
}
.admin-body main > section[aria-labelledby^="settings-"] > h2,
.admin-body main > section[aria-labelledby^="static-pages-"] > h2,
.admin-body main > section[aria-labelledby^="form-settings-"] > h2 {
.admin-body main > section[aria-labelledby^="static-pages-"] > h2 {
font-weight: 600;
letter-spacing: 0.06em;
text-transform: uppercase;
@@ -1992,3 +1989,56 @@ th.admin-ap-col {
50.01% { transform: scaleX(1); transform-origin: right; }
100% { transform: scaleX(0); transform-origin: right; }
}
/* ── Sidebar TOC ───────────────────────────────────────────────────────────── */
.admin-with-toc {
display: flex;
gap: var(--space-m);
align-items: flex-start;
max-width: var(--content-max-width, 1200px);
margin: 0 auto;
padding: 0 var(--space-s);
}
.admin-with-toc > main {
flex: 1;
min-width: 0;
}
.admin-toc {
position: sticky;
top: var(--space-m);
width: 160px;
flex-shrink: 0;
padding-top: var(--space-s);
}
.admin-toc-list {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 2px;
}
.admin-toc-list a {
display: block;
padding: var(--space-3xs) var(--space-2xs);
font-size: var(--step--2);
color: var(--text-secondary);
text-decoration: none;
border-left: 2px solid transparent;
transition: color 0.15s, border-color 0.15s;
}
.admin-toc-list a:hover {
color: var(--text-primary);
}
.admin-toc-list a.admin-toc-active {
color: var(--text-primary);
font-weight: 600;
border-left-color: var(--accent, var(--color-primary));
}