Fragment path changed from committee-committee-years to
fragments/committee-years (required prefix for FragmentService)
Fragment content converted from action-button rows to an Index row
(ALBUM_INDEX) with STARTS_WITH match on committee/, sorted DESC
Index configured with maxColumns: 3, showSwiper: true,
indexMarkdown: "## Committee Years", autoTitle: false
Hardcoded "EKWG" intro text replaced with dynamic lookup from
system config area.shortName
new Date() replaced with dateTimeFromMillis() from dates.ts
Each year page's committeeDocuments.imageSource populated from the
existing fragment action-button column images
Image Discovery for Index
findFirstImageInPage() in both IndexService and
LocationExtractionService now checks row.committeeDocuments?.imageSource
before scanning columns — enables Index cards to display committee doc images
Committee Documents Site Edit
Image Actions dropdown (edit/replace/remove) with image cropper added
to committee documents row editing
Image controls hidden when "Auto Populate" is checked (image comes
from child page)
Auto-Populate Improvements
Replaced fragile siteLinks-based child page lookup with direct
$regex database query for reliability
Page title derived from child page path instead of URL fragments
View Component Changes
hideEditToggle input threaded through DynamicContentView →
DynamicContentViewTextRow → MarkdownEditorComponent to suppress
inline edit buttons in fragment previews
contentDescription fallback to fragment path prevents
"Edit content for undefined" tooltip
Swiper Implementation (action-buttons.ts)
Continuous flex strip with overflow: hidden viewport replaces
slice-based viewableColumns() for swiper mode
gap: 24px on flex container with calc()-based flex-basis matches
Bootstrap grid spacing
Pixel-based translateX for both slide position and drag offset
Capture-phase click listener blocks navigation during drag
pointer-events: none and -webkit-user-drag: none on images
prevents native drag interference
Route changes
Removed hardcoded /committee route — committee pages now served
as CMS dynamic content via hasDynamicPath matcher
Added hasSendNotificationPath URL matcher for <area>/send-notification/<id>
Added PathSegment and RouteParam enums replacing hardcoded strings
Consolidated CommitteeEditFileModal into single-file component
Removed
CommitteeHomeComponent, CommitteeYearComponent and templates