The write-back that records a composer send onto its conversation stamped every attachment with an empty contentType, but the stored-message schema required that field. Mongoose rejects an empty string for a required field, so the message insert threw on any send carrying an attachment: the thread was created but the message was never stored, leaving an empty conversation and no "Sent from Email Composer" entry. Attachment-free sends stored fine, which is why it went unnoticed - 41 recorded sends, none with an attachment.
application/octet-stream fallback rather than an empty content type (EmailAttachment carries no content type to pass through).contentType, sizeBytes or s3Key: a missing piece of attachment metadata must never discard the whole message. Inbound attachments still carry their real content types.Emails already dropped this way cannot be recovered - the send happened at the provider but nothing was stored locally; only new sends are fixed.
Previewing a CSV or text attachment does an in-page fetch of the file to render it, built from the group's configured address. When the page is served from www. but the group address is the bare domain, that fetch is cross-origin and the browser blocks it with a CORS error, while a plain Download is unaffected.
UrlService.sameOriginUrl(url) rebuilds an /api/... URL onto the actual browser origin, so the preview read never crosses the www/non-www boundary. It rebuilds on absoluteUrl() rather than baseUrl(), which prefers the group href.The composer's Send button lived only inside the final Send step, so you had to click through the wizard to reach it.
confirmAndSend() action, so progress and any confirmation stay visible.The stacked-icon count on grouped conversations read "Grouped across N role inboxes", which was confusing and, when the grouped threads share a single role, inaccurate. The folding behaviour is unchanged; only the badge and its now-unused helper are gone.
Groups migrating from other platforms hold walk data (like leader names) that never reached Walks Manager, so their imported walks arrive with blanks. Event Data Management now lets an admin export any category of events as Walks Manager format CSVs, fill in the gaps in a spreadsheet, and keep the ids needed to amend the same records later - the immediate driver being Walks Manager walks with no leader name.
walks-export-<timestamp>-BK05-pvr-group-walk-file-import.csv. Export is disabled until at least one row is ticked.Walk ID column as the matching key for a CSV amend round trip: the Ramblers id where the walk came from Walks Manager, falling back to the Mongo id for manually created and file-imported events....-images.csv per group in exactly the format the CSV import consumes (Walk ID, Image GUID, Local Filename, Image Order), with the full CDN URL in Image GUID and the bare filename the import matcher looks for in Local Filename.POST /api/database/walks/csv-zip endpoint (adm-zip)walkToWalkUploadRow code as the Ramblers upload, so the output is genuine Walks Manager format; walkUploadHeadings() is now public with an opt-in Walk ID heading and the upload path is unchanged.csvContentFrom() function shared by the component and the new export.walkToWalkUploadRow crashed on imported events with no difficulty (Cannot read properties of undefined (reading 'description')) and would have crashed next on a null description; both are now guarded..ngx-data-table / .ngx-data-table-card styling in place of the old granite styled-table look.