Wiki source code of Home
Last modified by Isaac Mejia on 2025/12/22 19:31
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. |
| |
34.1 | 5 | ## (WITH HARD ALLOWLIST) |
| |
11.1 | 6 | ## --------------------------------------------- |
| |
4.1 | 7 | |
| |
11.1 | 8 | ## 1) Find all top-level category pages under "Main" |
| 9 | ## We exclude: | ||
| 10 | ## - WebHome itself | ||
| 11 | ## - any technical KB* pages (KBStyles, KBArticleHeader, etc.) | ||
| 12 | ## - hidden docs | ||
| |
9.1 | 13 | #set ($xwql = |
| |
11.1 | 14 | "select doc.fullName, doc.title, doc.name " + |
| |
9.1 | 15 | "from XWikiDocument doc " + |
| |
11.1 | 16 | "where doc.space = 'Main' " + |
| 17 | "and doc.name <> 'WebHome' " + | ||
| 18 | "and doc.name not like 'KB%' " + | ||
| |
9.1 | 19 | "and doc.hidden <> true " + |
| 20 | "order by lower(doc.title)" | ||
| |
25.1 | 21 | )## |
| 22 | #set ($query = $services.query.xwql($xwql))## | ||
| 23 | #set ($rows = $query.execute())## | ||
| |
9.1 | 24 | |
| |
11.1 | 25 | ## 2) Icon map (optional overrides) |
| 26 | #set ($kbCategoryIcons = { | ||
| 27 | "Member Management": "👥", | ||
| 28 | "Configuration": "⚙️", | ||
| 29 | "Billing & Payments": "💳", | ||
| 30 | "Payment Management": "💳", | ||
| 31 | "Reporting & Analytics": "📊", | ||
| 32 | "Notifications": "🔔", | ||
| 33 | "Integrations": "🔗" | ||
| |
25.1 | 34 | })## |
| |
9.1 | 35 | |
| |
11.1 | 36 | ## 3) Optional hand-authored descriptions for known categories |
| 37 | #set ($kbCategoryDescriptions = { | ||
| |
38.1 | 38 | "Member Management": "How to manage members, families, and profiles.", |
| |
9.1 | 39 | "Configuration": "Set up locations, billing, and core system settings.", |
| 40 | "Billing & Payments": "Invoices, collections, and payment processing.", | ||
| |
11.1 | 41 | "Payment Management": "Articles and guides for Payment Management.", |
| |
9.1 | 42 | "Reporting & Analytics": "Understand your numbers and performance.", |
| |
11.1 | 43 | "Notifications": "Articles and guides for Notifications.", |
| |
38.1 | 44 | "Integrations": "Connect Member Solutions with other tools in your stack.", |
| 45 | "Feature Release Notes": "Find out about our latest updates" | ||
| |
25.1 | 46 | })## |
| |
9.1 | 47 | |
| |
34.1 | 48 | ## --- HARD ALLOWLIST: only show these categories on the homepage --- |
| 49 | ## IMPORTANT: These must match the CATEGORY PAGE DISPLAY TITLE / NAME shown on cards. | ||
| 50 | #set ($allowedCategories = [ | ||
| 51 | "Check-In", | ||
| 52 | "Configuration", | ||
| 53 | "Lead Management", | ||
| 54 | "Member Management", | ||
| 55 | "Member Portal", | ||
| 56 | "Notifications", | ||
| 57 | "Payment Management", | ||
| |
35.1 | 58 | "Reporting", |
| 59 | "Feature Release Notes" | ||
| |
34.1 | 60 | ])## |
| 61 | |||
| |
11.1 | 62 | ## 4) Build a normalized list of category objects |
| |
25.1 | 63 | #set ($kbCategories = [])## |
| |
11.1 | 64 | |
| |
25.1 | 65 | #foreach ($row in $rows)## |
| 66 | #set ($fullName = $row.get(0))## ## e.g. "Main.Member Management" | ||
| 67 | #set ($title = $row.get(1))## ## display title | ||
| 68 | #set ($pageName = $row.get(2))## ## page name, used in URL & article space | ||
| 69 | #set ($catDoc = $xwiki.getDocument($fullName))## | ||
| |
11.1 | 70 | |
| 71 | ## Label shown on the card | ||
| |
25.1 | 72 | #set ($label = $catDoc.displayTitle)## |
| 73 | #if ("$!label" == "")## | ||
| 74 | #set ($label = $pageName)## | ||
| 75 | #end## | ||
| |
11.1 | 76 | |
| |
34.1 | 77 | ## Only include categories we actually want |
| 78 | #if ($allowedCategories.contains($label))## | ||
| |
11.1 | 79 | |
| |
34.1 | 80 | ## Description (custom if defined, otherwise auto) |
| 81 | #set ($desc = $kbCategoryDescriptions.get($label))## | ||
| 82 | #if ("$!desc" == "")## | ||
| 83 | #set ($desc = "Articles and guides for $label.")## | ||
| 84 | #end## | ||
| |
11.1 | 85 | |
| |
36.1 | 86 | ## Article spaces (support both naming conventions) |
| 87 | #set ($spaceA = "Main." + $pageName)## | ||
| 88 | #set ($spaceB = "Main." + $pageName.replace(" ", "_"))## | ||
| |
11.1 | 89 | |
| |
36.1 | 90 | ## Count non-hidden, non-WebHome pages in either article space |
| |
34.1 | 91 | #set ($articleCount = 0)## |
| 92 | #set ($countXwql = | ||
| 93 | "select count(doc.fullName) " + | ||
| 94 | "from XWikiDocument doc " + | ||
| |
36.1 | 95 | "where doc.space in (:spaceA, :spaceB) " + |
| |
34.1 | 96 | "and doc.name <> 'WebHome' " + |
| 97 | "and doc.hidden <> true" | ||
| 98 | )## | ||
| |
36.1 | 99 | #set ($countQuery = $services.query.xwql($countXwql))## |
| 100 | #set ($discard = $countQuery.bindValue("spaceA", $spaceA))## | ||
| 101 | #set ($discard = $countQuery.bindValue("spaceB", $spaceB))## | ||
| |
34.1 | 102 | #set ($resultList = $countQuery.execute())## |
| 103 | #if ($resultList && $resultList.size() > 0)## | ||
| 104 | #set ($articleCount = $resultList.get(0))## | ||
| 105 | #end## | ||
| |
11.1 | 106 | |
| |
34.1 | 107 | ## Icon, with a sensible default |
| 108 | #set ($icon = $kbCategoryIcons.get($label))## | ||
| 109 | #if ("$!icon" == "")## | ||
| 110 | #set ($icon = "📘")## | ||
| 111 | #end## | ||
| |
11.1 | 112 | |
| |
34.1 | 113 | ## Build clean URL: /bin/view/Main/<PageName> (no trailing slash) |
| 114 | #set ($encoded = $escapetool.url($pageName))## | ||
| 115 | #set ($cleanUrl = "/bin/view/Main/$encoded")## | ||
| 116 | |||
| 117 | ## Push into our categories array as a small map | ||
| 118 | #set ($entry = { | ||
| 119 | "label": $label, | ||
| 120 | "pageName": $pageName, | ||
| 121 | "desc": $desc, | ||
| 122 | "icon": $icon, | ||
| 123 | "url": $cleanUrl, | ||
| 124 | "count": $articleCount | ||
| 125 | })## | ||
| 126 | #set ($discard = $kbCategories.add($entry))## | ||
| 127 | |||
| 128 | #end## | ||
| |
25.1 | 129 | #end## |
| |
11.1 | 130 | |
| |
6.1 | 131 | {{html clean="false"}} |
| 132 | <div class="kb-home"> | ||
| |
1.1 | 133 | |
| |
6.1 | 134 | <!-- HERO --> |
| 135 | <div class="kb-hero"> | ||
| 136 | <h1 class="kb-hero-title">Member Solutions Knowledge Base</h1> | ||
| 137 | <p class="kb-hero-subtitle"> | ||
| 138 | Guides, walkthroughs, and best practices to help you and your team get the most out of the platform. | ||
| 139 | </p> | ||
| |
1.1 | 140 | |
| |
30.1 | 141 | <!-- Hero search wired to custom KB search page --> |
| 142 | <div class="kb-hero-search"> | ||
| 143 | <form action="$xwiki.getURL('Main.KBSearch', 'view')" method="get"> | ||
| 144 | <input | ||
| 145 | type="text" | ||
| 146 | name="text" | ||
| 147 | placeholder="Search for an article (e.g. "family membership")" | ||
| 148 | aria-label="Search the knowledge base" | ||
| 149 | /> | ||
| 150 | </form> | ||
| 151 | </div> | ||
| |
6.1 | 152 | </div> |
| |
4.1 | 153 | |
| |
6.1 | 154 | <!-- CATEGORY GRID --> |
| 155 | <div class="kb-section"> | ||
| 156 | <h2 class="kb-section-title">Browse by category</h2> | ||
| |
4.1 | 157 | |
| |
6.1 | 158 | <div class="kb-category-grid"> |
| |
11.1 | 159 | #foreach ($cat in $kbCategories) |
| 160 | #set ($label = $cat.get("label")) | ||
| 161 | #set ($desc = $cat.get("desc")) | ||
| 162 | #set ($icon = $cat.get("icon")) | ||
| 163 | #set ($url = $cat.get("url")) | ||
| 164 | #set ($count = $cat.get("count")) | ||
| |
4.1 | 165 | |
| |
11.1 | 166 | <a class="kb-card" href="$url"> |
| |
7.2 | 167 | <div> |
| |
11.1 | 168 | <div class="kb-card-title"> |
| 169 | <span class="kb-card-icon">$icon</span> | ||
| 170 | $escapetool.xml($label) | ||
| 171 | </div> | ||
| |
7.2 | 172 | <div class="kb-card-body"> |
| 173 | $escapetool.xml($desc) | ||
| 174 | </div> | ||
| 175 | </div> | ||
| |
11.1 | 176 | <div class="kb-card-meta"> |
| 177 | #if ($count == 1) | ||
| 178 | 1 article | ||
| 179 | #elseif ($count > 1) | ||
| 180 | $count articles | ||
| 181 | #else | ||
| 182 | Category | ||
| 183 | #end | ||
| 184 | </div> | ||
| |
7.2 | 185 | </a> |
| |
6.1 | 186 | #end |
| 187 | </div> | ||
| |
4.1 | 188 | </div> |
| |
17.1 | 189 | |
| |
4.1 | 190 | </div> |
| |
30.2 | 191 | |
| 192 | <style> | ||
| 193 | /* HOMEPAGE HERO OVERRIDE – BIGGER + MORE BREATHING ROOM */ | ||
| 194 | |||
| 195 | /* Scope tightly so we only touch KB home hero */ | ||
| 196 | body.viewbody.page-WebHome[class*="space-Main"] #xwikicontent .kb-hero { | ||
| |
34.1 | 197 | padding: 4.2rem 1rem 3.3rem !important; |
| |
30.2 | 198 | max-width: 1100px; |
| 199 | margin: 0 auto; | ||
| 200 | } | ||
| 201 | |||
| 202 | /* Title */ | ||
| 203 | body.viewbody.page-WebHome[class*="space-Main"] #xwikicontent .kb-hero-title { | ||
| 204 | font-size: 3.5rem !important; | ||
| 205 | font-weight: 800 !important; | ||
| 206 | line-height: 1.15; | ||
| 207 | margin-bottom: 1rem !important; | ||
| 208 | color: #0f172a; | ||
| 209 | } | ||
| 210 | |||
| 211 | /* Subtitle */ | ||
| 212 | body.viewbody.page-WebHome[class*="space-Main"] #xwikicontent .kb-hero-subtitle { | ||
| 213 | font-size: 1.35rem !important; | ||
| 214 | line-height: 1.7; | ||
| 215 | color: #4b5563 !important; | ||
| 216 | max-width: 720px; | ||
| |
34.1 | 217 | margin: 0 auto 2.3rem !important; |
| |
30.2 | 218 | } |
| 219 | |||
| 220 | /* Search bar – taller + larger text */ | ||
| 221 | body.viewbody.page-WebHome[class*="space-Main"] #xwikicontent .kb-hero-search input[type="text"] { | ||
| 222 | max-width: 650px !important; | ||
| 223 | padding: 1.25rem 1.6rem !important; | ||
| 224 | font-size: 1.2rem !important; | ||
| 225 | border-radius: 999px; | ||
| 226 | border: 1px solid #d1d5db; | ||
| 227 | box-shadow: | ||
| 228 | 0 26px 60px rgba(15, 23, 42, 0.14), | ||
| 229 | 0 2px 4px rgba(15, 23, 42, 0.06) !important; | ||
| 230 | } | ||
| 231 | |||
| 232 | /* Placeholder text tone/size */ | ||
| 233 | body.viewbody.page-WebHome[class*="space-Main"] #xwikicontent .kb-hero-search input[type="text"]::placeholder { | ||
| 234 | font-size: 1.15rem; | ||
| 235 | color: #9ca3af; | ||
| 236 | } | ||
| 237 | |||
| 238 | /* Extra space between hero and "Browse by category" */ | ||
| 239 | body.viewbody.page-WebHome[class*="space-Main"] #xwikicontent .kb-section { | ||
| 240 | margin-top: 4.6rem !important; | ||
| 241 | } | ||
| 242 | </style> | ||
| 243 | |||
| |
2.1 | 244 | {{/html}} |
| |
20.1 | 245 | {{/velocity}} |
| 246 | |||
| |
19.1 | 247 | {{include reference="KBSupportCTA.WebHome"/}} |