Template:Category/Forum
Render template for Category:Forum pages.
Called by the SemanticSchemas dispatcher when a page belongs to Category:Forum. The page is a forum landing page in a subject namespace (e.g. Forum:Hardware); post pages (DT-styled discussion threads) live as subpages of the talk-namespace counterpart (Forum talk:Hardware/<UTC>_<user>), where labki-platform's labki-forum module styles them as forum cards and adds the breadcrumb back to the landing. See docs/labki-forum.md in labki-platform for the underlying wiring (DT widget, Echo, custom SMW properties, namespace setup).
Two render modes, switched by the Is hub Boolean:
Leaf mode (Is hub unset / No — default)
Renders, top to bottom, inside a .labki-forum-landing
wrapper:
- Parent-forum breadcrumb — small italic kicker "← Back to <Parent>"
above the description, when Has parent forum is set
- Optional description as an italic kicker (when Has description is
set), styled with Codex tokens for light/dark parity
- Stats meta row — a posts count chip and a "last activity" chip
rendered when the forum has at least one post; chip styling matches Template:Category/Dashboard's meta row
- Sub-forums KPI-card grid (only when at least one Category:Forum
page has Has parent forum::<this page>) — natural support for the "middle ground" leaf-with-children case (a forum that hosts its own posts AND is a parent to sub-forums)
- Right-justified "Make new post" button (rendered as a
.wiki-buttonwith thedata-labki-forum-new-posthook so labki-forum's click handler still binds), placed just above the posts list à la Discourse's "+ New Topic" placement.
- Posts list — a styled card-row list (see
Template:Category/Forum/post_row) surfacing every post subpage
under the talk-namespace counterpart, sorted by last activity. Top
posts marked true are pinned
at the top of the same list (limit 5) with a 📌 marker and warm
tint; the regular section below shows non-announcements only (the
post_row template suppresses announcements when called in
regular mode, so they appear exactly once). A 2px separator,
drawn by CSS adjacent-sibling, divides pinned from regular only
when both exist. Each row also carries a color-coded sub-forum
chip (first-letter hash → 8-color palette); on a pure leaf the
chip is redundant (one forum) but stays consistent for the
middle-ground case and for hub-mode listings.
Hub mode (Is hub=Yes)
For pure-navigation pages like Forum:Home that organize the forum tree without hosting their own posts:
- Breadcrumb + description (same as leaf mode)
- Sub-forums KPI-card grid (always; if empty, the hub renders just
the description — that's a misconfiguration to flag)
- Recent posts list — pinned announcements (across all child
forums) at the top, then a regular activity feed below. Driven by thechained property: each post page has aHas forumannotation (set by labki-platform's labki-forum hook from the page's base title), and we walk that to its parent forum. The sub-forum chip is meaningful here — each row may come from a different child forum and the color signals which one.
- No stats meta row, no "Make new post" button — hubs don't host
posts directly. Posts created at Forum talk:Home/<slug>
via URL-crafting will exist but never surface here, by design.
Posts list construction
A single "Posts" / "Recent posts" h2 covers both pinned and regular,
matching the user-facing model of "one list of posts with the
important ones pinned at the top". Mechanically it's two
#ask calls back-to-back:
- Pinned — filters
true,
limit=5. Wrapped in<div class="wiki-forum-list wiki-forum-list-pinned">viaintro=/outro=, which SMW omits when the query returns zero rows — so there's no empty pinned div when no announcements exist.
- Regular — no announcement filter,
limit=25. The
post_row template emits empty output for announcement rows (its
mode=regular default suppresses them), so the visible
count drops below 25 by however many announcements are in the
fetch window. Over-fetching by 5 covers the typical case where
all pinned items also appear in the first 25 by date.
Sorting the regular list separately rather than projecting an
"Is announcement desc" sort on a single query keeps the announcement
ceiling at 5 — without that cap, a forum with 20 announcements would
push 20 pinned rows to the top of one merged list. Also dodges the
SMW "!true doesn't match unset
values" pitfall: posts that pre-date the Is announcement property
(or simply have it unset) wouldn't appear in a negative-filter query,
but they show up fine in the unfiltered regular query and don't get
suppressed by post_row.
Namespace genericity
Talk namespace and page-name LIKE pattern (used in leaf mode) are
derived from Template talk/Category/Forum,
so the template works for any subject/talk namespace pair (Forum/
Forum talk, Forum admin/Forum admin talk, Project/Project talk, etc.) —
same namespace-agnostic shape as labki-platform's labki-forum hooks.
Splitting into a namespace condition Template talk:+
plus a name pattern ~*Category/Forum/* is the working
idiom; SMW's ~LIKE doesn't match a namespace prefix as a single
token (per labki-forum.md).
Hub mode caveats
- Activity feed is one chain-step deep — posts in grandchild forums
don't surface. For two-level "Home → leaf" hierarchies (the typical miniscope-org / aharoni-lab shape), this is correct. Deeper nesting would need a denormalized "Has root forum" annotation in labki-forum.
- Activity feed depends on labki-platform exposing
Has forum
via the labki-forum ParserAfterParse hook. Until that lands and arebuildData.phpbackfill runs, the hub-mode feed will show itsdefault=empty-state text.
Parameters (from dispatcher):
has_description— the forum's description texthas_parent_forum— page name of the parent forum, when nestedis_hub— Boolean (Yes/No). When Yes (or any truthy token:
yes,y,true,t,1), renders in hub mode. Empty/missing defaults to leaf mode — the typical "open forum" stays open with no field set.