+ {/* Alta de categoría */}
+
+
+ {initial.length === 0 &&
{t('noCategories')}
}
+
+ {initial.map(({ category, forums }) => (
+
+
+
+ {category.name} #{category.order}
+
+
+
+
+ {/* Foros de la categoría */}
+
+ {forums.length === 0 && - {t('noForums')}
}
+ {forums.map((f) => (
+ -
+
+
+ {f.name} {f.visibility === 0 && ({t('hidden')})}
+
+ {f.description &&
{f.description}
}
+
+
+
+
+
+
+ ))}
+
+
+ {/* Alta de foro en esta categoría */}
+
+
+ ))}
+
+ )
+}
diff --git a/web-next/lib/admin-forum.ts b/web-next/lib/admin-forum.ts
new file mode 100644
index 0000000..6cbaf3c
--- /dev/null
+++ b/web-next/lib/admin-forum.ts
@@ -0,0 +1,86 @@
+import type { RowDataPacket, ResultSetHeader } from 'mysql2'
+import { db, DB } from './db'
+
+export interface AdminCategory {
+ id: number
+ name: string
+ order: number
+}
+
+export interface AdminForum {
+ id: number
+ category_id: number
+ name: string
+ description: string
+ order: number
+ visibility: number
+}
+
+/** Categorías con sus foros (incluye ocultos y sin borrar), para el admin. */
+export async function listCategoriesWithForums(): Promise<
+ { category: AdminCategory; forums: AdminForum[] }[]
+> {
+ const [cats] = await db(DB.web).query