{"id":"69d99346a9a2778def4610a8","title":"2026 04 11","path":"how-to/committee/release-notes/2026-04-11","contentMarkdown":"# 11-Apr-2026 — replace hardcoded component with seeded CMS page [#214](https://github.com/nbarrett/ngx-ramblers/issues/214)\n\n## [build 583](https://github.com/nbarrett/ngx-ramblers/actions/runs/24269781422) — [commit e80fb2c](https://github.com/nbarrett/ngx-ramblers/commit/e80fb2c1b643dbf7604e3d3197b0b6158c76f49f)\n\n_____\n\nWhat changed for users\n\n- New CMS-managed Privacy Policy page seeded at about-us/privacy-policy\non both fresh bootstraps and existing environments, populated with\nthe group's longName from System Settings\n- The page covers what is stored on device (JWTs, display preferences)\nwith PECR Reg 6(4) strictly-necessary justification, plus analytics\noptions (Google, Cloudflare cookieless), third-party services, and a\nforward link to the technical article\n- Privacy Policy is automatically added to footer.legals so it is\ndiscoverable through the conventional footer pattern rather than\norphaned in the navbar\n- Any legacy root-level privacy-policy page is removed when the\nmigration runs so environments do not end up with two copies\n- New Allow Search checkbox in action-buttons row settings (off by\ndefault) renders a search input above the cards that filters by\ntitle or content text, matching the existing album-index search\n\nTechnical\n\n- Remove hardcoded PrivacyPolicyComponent and its app-routing entry;\nthe privacy policy is now editable through the CMS like any other\npage\n- Add createPrivacyPolicyPage() and PRIVACY_POLICY_PATH constant to\nsample-data templates and wire it into createAllSamplePageContent()\nfor the bootstrap path\n- Add 20260404000000 migration using replaceOne+upsert against the\npage-content collection so re-runs pick up the latest group name\nfrom System Settings, and createOrUpdateKey(ConfigKey.SYSTEM, ...)\nfor the footer.legals update via the proper config helpers rather\nthan raw collection access\n- Refactor 20260319 committee-page and 20260325 navbar-access-levels\nmigrations to read system config via the systemConfig() helper and\nwrite via createOrUpdateKey(ConfigKey.SYSTEM, ...) instead of hand\nrolled findOne/updateOne against the config collection\n- Extract a reusable DynamicContentSearchInputComponent and pure\nfilterColumnsBySearchText() helper from the album-index view so the\nsearch input, debounce, URL/localStorage sync, and column filtering\nlive in exactly one place\n- Add an opt-in allowSearch flag on PageContentRow exposed via the\nMongoose schema, consumed by both DynamicContentViewIndex and\nActionButtons through the shared component and helper","contentHtml":"<h1>11-Apr-2026 — replace hardcoded component with seeded CMS page <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/214\">#214</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/24269781422\">build 583</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/e80fb2c1b643dbf7604e3d3197b0b6158c76f49f\">commit e80fb2c</a></h2>\n<hr>\n<p>What changed for users</p>\n<ul>\n<li>New CMS-managed Privacy Policy page seeded at about-us/privacy-policy\non both fresh bootstraps and existing environments, populated with\nthe group&#39;s longName from System Settings</li>\n<li>The page covers what is stored on device (JWTs, display preferences)\nwith PECR Reg 6(4) strictly-necessary justification, plus analytics\noptions (Google, Cloudflare cookieless), third-party services, and a\nforward link to the technical article</li>\n<li>Privacy Policy is automatically added to footer.legals so it is\ndiscoverable through the conventional footer pattern rather than\norphaned in the navbar</li>\n<li>Any legacy root-level privacy-policy page is removed when the\nmigration runs so environments do not end up with two copies</li>\n<li>New Allow Search checkbox in action-buttons row settings (off by\ndefault) renders a search input above the cards that filters by\ntitle or content text, matching the existing album-index search</li>\n</ul>\n<p>Technical</p>\n<ul>\n<li>Remove hardcoded PrivacyPolicyComponent and its app-routing entry;\nthe privacy policy is now editable through the CMS like any other\npage</li>\n<li>Add createPrivacyPolicyPage() and PRIVACY_POLICY_PATH constant to\nsample-data templates and wire it into createAllSamplePageContent()\nfor the bootstrap path</li>\n<li>Add 20260404000000 migration using replaceOne+upsert against the\npage-content collection so re-runs pick up the latest group name\nfrom System Settings, and createOrUpdateKey(ConfigKey.SYSTEM, ...)\nfor the footer.legals update via the proper config helpers rather\nthan raw collection access</li>\n<li>Refactor 20260319 committee-page and 20260325 navbar-access-levels\nmigrations to read system config via the systemConfig() helper and\nwrite via createOrUpdateKey(ConfigKey.SYSTEM, ...) instead of hand\nrolled findOne/updateOne against the config collection</li>\n<li>Extract a reusable DynamicContentSearchInputComponent and pure\nfilterColumnsBySearchText() helper from the album-index view so the\nsearch input, debounce, URL/localStorage sync, and column filtering\nlive in exactly one place</li>\n<li>Add an opt-in allowSearch flag on PageContentRow exposed via the\nMongoose schema, consumed by both DynamicContentViewIndex and\nActionButtons through the shared component and helper</li>\n</ul>\n"}