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",