Foro: edición/borrado de posts, moderación de temas y búsqueda

Portado desde forum/db.py + forum/permissions.py de Django:
- lib/forum-perm.ts: forumIsModerator (gmlevel >= FORUM_MOD_GMLEVEL) y
  canEditPost (autor o moderador).
- Edición y borrado lógico de posts (autor o mod), respetando tema bloqueado,
  con validación de longitud mínima (plainLength).
- Moderación de temas (solo mod): bloquear/desbloquear, fijar/no fijar, borrar.
- Búsqueda de temas por título/contenido (searchTopics/countSearchTopics)
  con página /forum/search y buscador en el índice.
- API: PATCH/DELETE /api/forum/post, POST /api/forum/moderate (401/403 correctos).
- UI: PostActions, TopicModBar, ForumSearchBox; marca "editado" y "[Fijado]".
- i18n: 22 claves nuevas en es/en.

Verificado: build OK, /forum y /forum/search 200, APIs 401 sin sesión.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-13 00:28:39 +00:00
parent 13636d097a
commit 1de1002938
14 changed files with 590 additions and 9 deletions
+23 -1
View File
@@ -268,7 +268,29 @@
"sending": "Sending…",
"loginToPost": "Sign in to participate.",
"emptyError": "Fill in all fields.",
"genericError": "Something went wrong. Please try again later."
"genericError": "Something went wrong. Please try again later.",
"moderation": "Moderation",
"lock": "Lock",
"unlock": "Unlock",
"pin": "Pin",
"unpin": "Unpin",
"pinned": "Pinned",
"deleteTopic": "Delete topic",
"confirmDeleteTopic": "Are you sure you want to delete this topic?",
"edit": "Edit",
"delete": "Delete",
"save": "Save",
"cancel": "Cancel",
"confirmDeletePost": "Are you sure you want to delete this post?",
"tooShort": "The message is too short (minimum 5 characters).",
"topicLocked": "This topic is locked.",
"editedMark": "edited",
"search": "Search",
"searchPlaceholder": "Search the forum…",
"searchHint": "Type at least 2 characters to search.",
"noResults": "No results for “{query}”.",
"resultsCount": "{count} result(s) for “{query}”.",
"in": "in"
},
"Admin": {
"title": "Admin panel",
+23 -1
View File
@@ -268,7 +268,29 @@
"sending": "Enviando…",
"loginToPost": "Inicia sesión para participar.",
"emptyError": "Completa todos los campos.",
"genericError": "Algo ha salido mal. Inténtalo más tarde."
"genericError": "Algo ha salido mal. Inténtalo más tarde.",
"moderation": "Moderación",
"lock": "Bloquear",
"unlock": "Desbloquear",
"pin": "Fijar",
"unpin": "No fijar",
"pinned": "Fijado",
"deleteTopic": "Borrar tema",
"confirmDeleteTopic": "¿Seguro que quieres borrar este tema?",
"edit": "Editar",
"delete": "Borrar",
"save": "Guardar",
"cancel": "Cancelar",
"confirmDeletePost": "¿Seguro que quieres borrar este mensaje?",
"tooShort": "El mensaje es demasiado corto (mínimo 5 caracteres).",
"topicLocked": "El tema está bloqueado.",
"editedMark": "editado",
"search": "Buscar",
"searchPlaceholder": "Buscar en el foro…",
"searchHint": "Escribe al menos 2 caracteres para buscar.",
"noResults": "No hay resultados para «{query}».",
"resultsCount": "{count} resultado(s) para «{query}».",
"in": "en"
},
"Admin": {
"title": "Panel de administración",