Admin: gestión de foros (categorías y foros)

- lib/admin-forum.ts: listCategoriesWithForums, createCategory/deleteCategory
  (solo si vacía), createForum/deleteForum (borrado lógico), setForumVisibility.
- API: /api/admin/forum(+/[id] DELETE/PATCH visibilidad) y
  /api/admin/forum/category(+/[id]) (403 sin admin).
- UI: /admin/forum (AdminForumManager) — alta de categorías, alta/borrado de foros
  por categoría, mostrar/ocultar; tarjeta "Gestionar foros" en el índice del admin.
- i18n es/en (Admin): 13 claves nuevas.

Verificado: build OK, /admin/forum 307->login, APIs 403 sin admin.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-13 01:49:52 +00:00
parent af2438399d
commit 8bb18838ff
10 changed files with 339 additions and 2 deletions
+14 -1
View File
@@ -386,7 +386,20 @@
"itemLink": "Item link",
"iconClass": "Icon class",
"noRewards": "No rewards.",
"requiredFriendsShort": "{n} friend(s)"
"requiredFriendsShort": "{n} friend(s)",
"manageForum": "Manage forums",
"newCategory": "New category",
"categoryName": "Category name",
"order": "Order",
"noCategories": "No categories.",
"noForums": "No forums in this category.",
"forumName": "Forum name",
"forumDescription": "Description",
"addForum": "Add forum",
"hidden": "hidden",
"show": "Show",
"hide": "Hide",
"categoryNotEmpty": "Category has forums; delete them first."
},
"Vote": {
"title": "Vote for us",
+14 -1
View File
@@ -386,7 +386,20 @@
"itemLink": "Enlace del objeto",
"iconClass": "Clase del icono",
"noRewards": "No hay recompensas.",
"requiredFriendsShort": "{n} amigo(s)"
"requiredFriendsShort": "{n} amigo(s)",
"manageForum": "Gestionar foros",
"newCategory": "Nueva categoría",
"categoryName": "Nombre de la categoría",
"order": "Orden",
"noCategories": "No hay categorías.",
"noForums": "Sin foros en esta categoría.",
"forumName": "Nombre del foro",
"forumDescription": "Descripción",
"addForum": "Añadir foro",
"hidden": "oculto",
"show": "Mostrar",
"hide": "Ocultar",
"categoryNotEmpty": "La categoría tiene foros; bórralos primero."
},
"Vote": {
"title": "Votar por nosotros",