Wiki source code of Home
Version 15.1 by Isaac Mejia on 2025/12/05 17:08
Hide last authors
| author | version | line-number | content |
|---|---|---|---|
| |
6.1 | 1 | {{velocity}} |
| |
11.1 | 2 | ## --------------------------------------------- |
| |
6.1 | 3 | ## KB Home (Main.WebHome) |
| |
11.1 | 4 | ## Discover category landing pages dynamically. |
| 5 | ## --------------------------------------------- | ||
| |
4.1 | 6 | |
| |
11.1 | 7 | ## 1) Find all top-level category pages under "Main" |
| 8 | ## We exclude: | ||
| 9 | ## - WebHome itself | ||
| 10 | ## - any technical KB* pages (KBStyles, KBArticleHeader, etc.) | ||
| 11 | ## - hidden docs | ||
| |
9.1 | 12 | #set ($xwql = |
| |
11.1 | 13 | "select doc.fullName, doc.title, doc.name " + |
| |
9.1 | 14 | "from XWikiDocument doc " + |
| |
11.1 | 15 | "where doc.space = 'Main' " + |
| 16 | "and doc.name <> 'WebHome' " + | ||
| 17 | "and doc.name not like 'KB%' " + | ||
| |
9.1 | 18 | "and doc.hidden <> true " + |
| 19 | "order by lower(doc.title)" | ||
| 20 | ) | ||
| |
11.1 | 21 | #set ($query = $services.query.xwql($xwql)) |
| |
9.1 | 22 | #set ($rows = $query.execute()) |
| 23 | |||
| |
11.1 | 24 | ## 2) Icon map (optional overrides) |
| 25 | #set ($kbCategoryIcons = { | ||
| 26 | "Member Management": "👥", | ||
| 27 | "Configuration": "⚙️", | ||
| 28 | "Billing & Payments": "💳", | ||
| 29 | "Payment Management": "💳", | ||
| 30 | "Reporting & Analytics": "📊", | ||
| 31 | "Notifications": "🔔", | ||
| 32 | "Integrations": "🔗" | ||
| 33 | }) | ||
| |
9.1 | 34 | |
| |
11.1 | 35 | ## 3) Optional hand-authored descriptions for known categories |
| 36 | #set ($kbCategoryDescriptions = { | ||
| |
9.1 | 37 | "Member Management": "How to manage members, families, and profiles.", |
| 38 | "Configuration": "Set up locations, billing, and core system settings.", | ||
| 39 | "Billing & Payments": "Invoices, collections, and payment processing.", | ||
| |
11.1 | 40 | "Payment Management": "Articles and guides for Payment Management.", |
| |
9.1 | 41 | "Reporting & Analytics": "Understand your numbers and performance.", |
| |
11.1 | 42 | "Notifications": "Articles and guides for Notifications.", |
| 43 | "Integrations": "Connect Member Solutions with other tools in your stack." | ||
| |
9.1 | 44 | }) |
| 45 | |||
| |
11.1 | 46 | ## 4) Build a normalized list of category objects |
| 47 | #set ($kbCategories = []) | ||
| 48 | |||
| 49 | #foreach ($row in $rows) | ||
| 50 | #set ($fullName = $row.get(0)) ## e.g. "Main.Member Management" | ||
| 51 | #set ($title = $row.get(1)) ## display title | ||
| 52 | #set ($pageName = $row.get(2)) ## page name, used in URL & article space | ||
| 53 | #set ($catDoc = $xwiki.getDocument($fullName)) | ||
| 54 | |||
| 55 | ## Label shown on the card | ||
| 56 | #set ($label = $catDoc.displayTitle) | ||
| 57 | #if ("$!label" == "") | ||
| 58 | #set ($label = $pageName) | ||
| 59 | #end | ||
| 60 | |||
| 61 | ## Default description (auto-generated if we don't have a custom one) | ||
| 62 | #set ($desc = $kbCategoryDescriptions.get($label)) | ||
| 63 | #if ("$!desc" == "") | ||
| 64 | #set ($desc = "Articles and guides for $label.") | ||
| 65 | #end | ||
| 66 | |||
| 67 | ## Article space follows the convention: | ||
| 68 | ## Main.<PageName with spaces replaced by underscores> | ||
| 69 | ## e.g. Member Management -> space "Main.Member_Management" | ||
| 70 | #set ($articleSpace = "Main." + $pageName.replace(" ", "_")) | ||
| 71 | |||
| 72 | ## Count non-hidden, non-WebHome pages in that article space | ||
| 73 | #set ($articleCount = 0) | ||
| 74 | #set ($countXwql = | ||
| 75 | "select count(doc.fullName) " + | ||
| 76 | "from XWikiDocument doc " + | ||
| 77 | "where doc.space = :space " + | ||
| 78 | "and doc.name <> 'WebHome' " + | ||
| 79 | "and doc.hidden <> true" | ||
| 80 | ) | ||
| 81 | #set ($countQuery = $services.query.xwql($countXwql).bindValue("space", $articleSpace)) | ||
| 82 | #try | ||
| 83 | #set ($resultList = $countQuery.execute()) | ||
| 84 | #if ($resultList && $resultList.size() > 0) | ||
| 85 | #set ($articleCount = $resultList.get(0)) | ||
| 86 | #end | ||
| 87 | #catch | ||
| 88 | ## Swallow query errors so we don't break the homepage | ||
| 89 | #end | ||
| 90 | |||
| 91 | ## Icon, with a sensible default | ||
| 92 | #set ($icon = $kbCategoryIcons.get($label)) | ||
| 93 | #if ("$!icon" == "") | ||
| 94 | #set ($icon = "📘") | ||
| 95 | #end | ||
| 96 | |||
| 97 | ## Build clean URL: /bin/view/Main/<PageName> (no trailing slash) | ||
| 98 | #set ($encoded = $escapetool.url($pageName)) | ||
| 99 | #set ($cleanUrl = "/bin/view/Main/$encoded") | ||
| 100 | |||
| 101 | ## Push into our categories array as a small map | ||
| 102 | #set ($entry = { | ||
| 103 | "label": $label, | ||
| 104 | "pageName": $pageName, | ||
| 105 | "desc": $desc, | ||
| 106 | "icon": $icon, | ||
| 107 | "url": $cleanUrl, | ||
| 108 | "count": $articleCount | ||
| 109 | }) | ||
| 110 | #set ($discard = $kbCategories.add($entry)) | ||
| 111 | #end | ||
| 112 | |||
| |
6.1 | 113 | {{html clean="false"}} |
| 114 | <div class="kb-home"> | ||
| |
1.1 | 115 | |
| |
6.1 | 116 | <!-- HERO --> |
| 117 | <div class="kb-hero"> | ||
| 118 | <h1 class="kb-hero-title">Member Solutions Knowledge Base</h1> | ||
| 119 | <p class="kb-hero-subtitle"> | ||
| 120 | Guides, walkthroughs, and best practices to help you and your team get the most out of the platform. | ||
| 121 | </p> | ||
| |
1.1 | 122 | |
| |
11.1 | 123 | <!-- Enhanced search box (still uses XWiki search under the hood) --> |
| |
6.1 | 124 | <div class="kb-hero-search"> |
| 125 | <form action="$xwiki.getURL('Main.WebHome', 'view')" method="get"> | ||
| 126 | <input | ||
| 127 | type="text" | ||
| 128 | name="text" | ||
| 129 | placeholder="Search for an article (e.g. "family membership")" | ||
| |
11.1 | 130 | aria-label="Search the knowledge base" |
| |
6.1 | 131 | /> |
| 132 | </form> | ||
| 133 | </div> | ||
| 134 | </div> | ||
| |
4.1 | 135 | |
| |
6.1 | 136 | <!-- CATEGORY GRID --> |
| 137 | <div class="kb-section"> | ||
| 138 | <h2 class="kb-section-title">Browse by category</h2> | ||
| |
4.1 | 139 | |
| |
6.1 | 140 | <div class="kb-category-grid"> |
| |
11.1 | 141 | #foreach ($cat in $kbCategories) |
| 142 | #set ($label = $cat.get("label")) | ||
| 143 | #set ($desc = $cat.get("desc")) | ||
| 144 | #set ($icon = $cat.get("icon")) | ||
| 145 | #set ($url = $cat.get("url")) | ||
| 146 | #set ($count = $cat.get("count")) | ||
| |
4.1 | 147 | |
| |
11.1 | 148 | <a class="kb-card" href="$url"> |
| |
7.2 | 149 | <div> |
| |
11.1 | 150 | <div class="kb-card-title"> |
| 151 | <span class="kb-card-icon">$icon</span> | ||
| 152 | $escapetool.xml($label) | ||
| 153 | </div> | ||
| |
7.2 | 154 | <div class="kb-card-body"> |
| 155 | $escapetool.xml($desc) | ||
| 156 | </div> | ||
| 157 | </div> | ||
| |
11.1 | 158 | <div class="kb-card-meta"> |
| 159 | #if ($count == 1) | ||
| 160 | 1 article | ||
| 161 | #elseif ($count > 1) | ||
| 162 | $count articles | ||
| 163 | #else | ||
| 164 | Category | ||
| 165 | #end | ||
| 166 | </div> | ||
| |
7.2 | 167 | </a> |
| |
6.1 | 168 | #end |
| 169 | </div> | ||
| |
4.1 | 170 | </div> |
| 171 | |||
| 172 | </div> | ||
| |
2.1 | 173 | {{/html}} |
| |
11.1 | 174 | |
| 175 | ## Reusable bottom CTA (support panel) | ||
| 176 | {{include reference="KBSupportCTA.WebHome"/}} | ||
| |
6.1 | 177 | {{/velocity}} |