{"id":"69acc70db73c05ef28c940eb","title":"2026 03 08","path":"how-to/committee/release-notes/2026-03-08","contentMarkdown":"# 08-Mar-2026 — Events and Album-backgrounds: 2 features [#12](https://github.com/nbarrett/ngx-ramblers/issues/12)\n\n## [build 512](https://github.com/nbarrett/ngx-ramblers/actions/runs/22810447767) — [commit 75cf506](https://github.com/nbarrett/ngx-ramblers/commit/75cf50661f1c7c7f771546d5705d20e27751f9e1)\n\n_____\n\n## Events Standardisation\n### Navigation and URL improvements\n- Replace MongoDB IDs with human-readable slugs in social event URLs for view, edit, and cancel flows\n- Add `eventIdentifier()` to `UrlService` to extract event identifiers from both `area/<id>` and `area/<slug>/view|edit` URL patterns\n- Update `pathContainsEventIdOrSlug()` to recognise 3-segment paths ending in \"edit\"\n- Social event edit now navigates to `<area>/<event-slug>/edit` instead of `<area>/<mongo-id>/edit`\n- Cancel from social edit returns to `<area>/<event-slug>` instead of `<area>/<mongo-id>`\n- Walk card titles use `routerLink` with slug-based URLs instead of `[href]` with MongoDB IDs\n### Dynamic routing for renamed areas\n- Add `hasTrailingEditPath` URL matcher for `<area>/<slug>/edit` pattern in `path-matchers.ts`\n- Route `<area>/<slug>/edit` to `SocialEditComponent` for dynamically named social event areas (e.g. `group-events`)\n- Placed before `hasDynamicPath` catch-all to ensure edit routes are matched before falling through to dynamic content\n### Polymorphic event rendering\n- `CardImageOrMap` renders navigation links using `[href]` with type-aware URL resolution for walks and social events\n- `WalksViewSelector` dispatches to `SocialViewPageComponent` when viewing a `GROUP_EVENT` within walks routes\n- `WalkDisplayService.edit()` routes social events to the social edit page with slug-based URLs\n### Advanced search improvements\n- Extract `advancedSearchSummary()` as a reusable function from `EventsFull` for use in both `EventsFull` and `WalkList`\n- Advanced search criteria now persisted in URL query parameters and restored on page load\n- Add `advancedSearchChange` output event to `WalkSearch`, replacing `BroadcastService` for advanced search events\n- Filter summary displayed in alert messages for both list and map views\n- `AdvancedSearchPane` wraps `populateFromCriteria` and `convertKebabLabelsToIds` in try/finally to ensure `suppressCriteriaChanges` is always reset\n- `applyFilterRangePreset` accepts an `emit` parameter to prevent spurious criteria emissions during initialisation\n- Sync filter option dropdown with advanced criteria after date range loads\n- `rangesAreClose()` uses `PRESET_MATCH_THRESHOLD_MS` for consistent preset matching\n- `resetQueryDrivenState()` clears filters, pagination, and view when navigating without query parameters\n### Alert layout improvements\n- Long alert messages render on a separate full-width row below pagination for better readability\n- `alertUsesFullRow()` and `showResultsHeaderRow()` control layout based on message length\n- Map view spacing adjusted with conditional `mt-2` margin when alerts are visible\n### Map view enhancements\n- Add `HeightResizerComponent` to walks map view for user-adjustable map height\n- Increase max map height from 900px to 2000px\n### Date formatting standardisation\n- Add `UIDateFormat.DAY_NAME` and `UIDateFormat.YEAR_MONTH_DAY_T_HHMM` enum values\n- Replace inline `toFormat()` calls with `dateUtils.asString()` using `UIDateFormat` enums in `DateRangeSlider`, `MigrationSettings`, and `WalkExport`\n- `DateUtilsService.asDateTime()` now handles `DateTime` inputs directly\n- `daysOfWeek()` and `mongoDayOfWeekFromName()` use `UIDateFormat.DAY_NAME` format\n### Dynamic page awareness\n- `SocialDisplayService.socialArea()` and `WalkDisplayService.socialArea()` resolve the current area from URL or page configuration\n- Social view \"Back to\" link uses dynamic area title instead of hard-coded \"social events\"\n### Walk admin \"back\" navigation\n- Replace hard-coded `navigateTo([\"walks\", \"admin\"])` with `Location.back()` in 6 walk admin sub-pages (add-slots, config, export, import, meetup-settings, event-data-management)\n- Users now return to wherever they navigated from instead of always going to `/walks/admin`\n### Social page migration\n- Migration script now converts legacy social pages (`<href>#social-content` fragments) to root pages with an events row for `group-event` type\n- Resolves social page path dynamically from system config `group.pages`\n- Delete `SocialHomeComponent` — no longer needed after migration creates root social pages\n- `SocialViewSelector` treats `LIST` dispatch as `DYNAMIC_CONTENT`, rendering the dynamic content page for both cases\n- Event type strings use named constants (`EVENT_TYPE_GROUP_WALK`, `EVENT_TYPE_GROUP_EVENT`) instead of inline literals\n\n### **album-backgrounds**: backgrounds view, events row, and admin improvements ([#12](https://github.com/nbarrett/ngx-ramblers/issues/12))\n\nNew backgrounds album view with smooth crossfade transitions between photos\nand wave-transparency overlays. Text and event links are displayed over the\nimagery with configurable colours, scale, padding, and markdown content that\ncan now be edited directly in-place on the preview.\nColour selections (Title Colour, Text Colour) now persist correctly after\nsaving. The admin panel has been tidied up with consistent range sliders\nfor padding and offset controls, and a reusable RangeSliderComponent for\nfuture use.\nEvents can now be displayed as a page content row with server-side\npagination that no longer causes a full page refresh. Walks pages are\nmigrated to use this new events row pattern.\nAlso removed the legacy social carousel, fixed a gap above the gallery\nview, added PNG upload preview support, and ensured the selected album\nview persists across page refreshes in edit mode.","contentHtml":"<h1>08-Mar-2026 — Events and Album-backgrounds: 2 features <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/12\">#12</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/22810447767\">build 512</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/75cf50661f1c7c7f771546d5705d20e27751f9e1\">commit 75cf506</a></h2>\n<hr>\n<h2>Events Standardisation</h2>\n<h3>Navigation and URL improvements</h3>\n<ul>\n<li>Replace MongoDB IDs with human-readable slugs in social event URLs for view, edit, and cancel flows</li>\n<li>Add <code>eventIdentifier()</code> to <code>UrlService</code> to extract event identifiers from both <code>area/&lt;id&gt;</code> and <code>area/&lt;slug&gt;/view|edit</code> URL patterns</li>\n<li>Update <code>pathContainsEventIdOrSlug()</code> to recognise 3-segment paths ending in &quot;edit&quot;</li>\n<li>Social event edit now navigates to <code>&lt;area&gt;/&lt;event-slug&gt;/edit</code> instead of <code>&lt;area&gt;/&lt;mongo-id&gt;/edit</code></li>\n<li>Cancel from social edit returns to <code>&lt;area&gt;/&lt;event-slug&gt;</code> instead of <code>&lt;area&gt;/&lt;mongo-id&gt;</code></li>\n<li>Walk card titles use <code>routerLink</code> with slug-based URLs instead of <code>[href]</code> with MongoDB IDs</li>\n</ul>\n<h3>Dynamic routing for renamed areas</h3>\n<ul>\n<li>Add <code>hasTrailingEditPath</code> URL matcher for <code>&lt;area&gt;/&lt;slug&gt;/edit</code> pattern in <code>path-matchers.ts</code></li>\n<li>Route <code>&lt;area&gt;/&lt;slug&gt;/edit</code> to <code>SocialEditComponent</code> for dynamically named social event areas (e.g. <code>group-events</code>)</li>\n<li>Placed before <code>hasDynamicPath</code> catch-all to ensure edit routes are matched before falling through to dynamic content</li>\n</ul>\n<h3>Polymorphic event rendering</h3>\n<ul>\n<li><code>CardImageOrMap</code> renders navigation links using <code>[href]</code> with type-aware URL resolution for walks and social events</li>\n<li><code>WalksViewSelector</code> dispatches to <code>SocialViewPageComponent</code> when viewing a <code>GROUP_EVENT</code> within walks routes</li>\n<li><code>WalkDisplayService.edit()</code> routes social events to the social edit page with slug-based URLs</li>\n</ul>\n<h3>Advanced search improvements</h3>\n<ul>\n<li>Extract <code>advancedSearchSummary()</code> as a reusable function from <code>EventsFull</code> for use in both <code>EventsFull</code> and <code>WalkList</code></li>\n<li>Advanced search criteria now persisted in URL query parameters and restored on page load</li>\n<li>Add <code>advancedSearchChange</code> output event to <code>WalkSearch</code>, replacing <code>BroadcastService</code> for advanced search events</li>\n<li>Filter summary displayed in alert messages for both list and map views</li>\n<li><code>AdvancedSearchPane</code> wraps <code>populateFromCriteria</code> and <code>convertKebabLabelsToIds</code> in try/finally to ensure <code>suppressCriteriaChanges</code> is always reset</li>\n<li><code>applyFilterRangePreset</code> accepts an <code>emit</code> parameter to prevent spurious criteria emissions during initialisation</li>\n<li>Sync filter option dropdown with advanced criteria after date range loads</li>\n<li><code>rangesAreClose()</code> uses <code>PRESET_MATCH_THRESHOLD_MS</code> for consistent preset matching</li>\n<li><code>resetQueryDrivenState()</code> clears filters, pagination, and view when navigating without query parameters</li>\n</ul>\n<h3>Alert layout improvements</h3>\n<ul>\n<li>Long alert messages render on a separate full-width row below pagination for better readability</li>\n<li><code>alertUsesFullRow()</code> and <code>showResultsHeaderRow()</code> control layout based on message length</li>\n<li>Map view spacing adjusted with conditional <code>mt-2</code> margin when alerts are visible</li>\n</ul>\n<h3>Map view enhancements</h3>\n<ul>\n<li>Add <code>HeightResizerComponent</code> to walks map view for user-adjustable map height</li>\n<li>Increase max map height from 900px to 2000px</li>\n</ul>\n<h3>Date formatting standardisation</h3>\n<ul>\n<li>Add <code>UIDateFormat.DAY_NAME</code> and <code>UIDateFormat.YEAR_MONTH_DAY_T_HHMM</code> enum values</li>\n<li>Replace inline <code>toFormat()</code> calls with <code>dateUtils.asString()</code> using <code>UIDateFormat</code> enums in <code>DateRangeSlider</code>, <code>MigrationSettings</code>, and <code>WalkExport</code></li>\n<li><code>DateUtilsService.asDateTime()</code> now handles <code>DateTime</code> inputs directly</li>\n<li><code>daysOfWeek()</code> and <code>mongoDayOfWeekFromName()</code> use <code>UIDateFormat.DAY_NAME</code> format</li>\n</ul>\n<h3>Dynamic page awareness</h3>\n<ul>\n<li><code>SocialDisplayService.socialArea()</code> and <code>WalkDisplayService.socialArea()</code> resolve the current area from URL or page configuration</li>\n<li>Social view &quot;Back to&quot; link uses dynamic area title instead of hard-coded &quot;social events&quot;</li>\n</ul>\n<h3>Walk admin &quot;back&quot; navigation</h3>\n<ul>\n<li>Replace hard-coded <code>navigateTo([&quot;walks&quot;, &quot;admin&quot;])</code> with <code>Location.back()</code> in 6 walk admin sub-pages (add-slots, config, export, import, meetup-settings, event-data-management)</li>\n<li>Users now return to wherever they navigated from instead of always going to <code>/walks/admin</code></li>\n</ul>\n<h3>Social page migration</h3>\n<ul>\n<li>Migration script now converts legacy social pages (<code>&lt;href&gt;#social-content</code> fragments) to root pages with an events row for <code>group-event</code> type</li>\n<li>Resolves social page path dynamically from system config <code>group.pages</code></li>\n<li>Delete <code>SocialHomeComponent</code> — no longer needed after migration creates root social pages</li>\n<li><code>SocialViewSelector</code> treats <code>LIST</code> dispatch as <code>DYNAMIC_CONTENT</code>, rendering the dynamic content page for both cases</li>\n<li>Event type strings use named constants (<code>EVENT_TYPE_GROUP_WALK</code>, <code>EVENT_TYPE_GROUP_EVENT</code>) instead of inline literals</li>\n</ul>\n<h3><strong>album-backgrounds</strong>: backgrounds view, events row, and admin improvements (<a href=\"https://github.com/nbarrett/ngx-ramblers/issues/12\">#12</a>)</h3>\n<p>New backgrounds album view with smooth crossfade transitions between photos\nand wave-transparency overlays. Text and event links are displayed over the\nimagery with configurable colours, scale, padding, and markdown content that\ncan now be edited directly in-place on the preview.\nColour selections (Title Colour, Text Colour) now persist correctly after\nsaving. The admin panel has been tidied up with consistent range sliders\nfor padding and offset controls, and a reusable RangeSliderComponent for\nfuture use.\nEvents can now be displayed as a page content row with server-side\npagination that no longer causes a full page refresh. Walks pages are\nmigrated to use this new events row pattern.\nAlso removed the legacy social carousel, fixed a gap above the gallery\nview, added PNG upload preview support, and ensured the selected album\nview persists across page refreshes in edit mode.</p>\n"}