All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Event exports scoped to current lowering —
ExportDropdownin the review replay view was passingcruiseIDinstead ofloweringID, causing exports to return all events across the cruise rather than just the current lowering - Event comment not saved without file attachments — submitting a comment in the event comment modal returned early before calling
handleUpdateEventwhen no file attachments were present, silently discarding the comment
- Clickable elements styled as interactive — elements with
onClickhandlers now show a pointer cursor; icons acting as buttons carryrole="button"; event list rows extend the click target to the full row width including the comment icon; event image cards show reduced opacity on hover
- Removed underline-on-hover from clickable elements to match design intent
- Updated
babel-loaderto v10,eslint-config-prettierto v10,sass-loaderto v16, andwebpack-clito v7 - Switched
sass-loaderto modern Sass API (api: 'modern') - Renamed
--node-envto--config-node-envin npm scripts to match webpack-cli v7
- Event file attachments — events can now have files attached via the event template options modal; attached files are stored as
eventFileAttachmentsaux data records - Attachment previews in comment modal — file attachments are displayed as thumbnail image previews with filename and delete controls in the event comment modal
- Login via email — users can now log in using either their username or email address
- POWER_LOGGER user role — new role added for users who need elevated event logging permissions
- WebSocket live updates in Event Management — the event list now updates in real time as events are created, modified, or deleted
- Newest event not displaying — race condition in event history caused the most recent event to not appear on load
- Event history card stability — the newest event card no longer changes when navigating to older pages; it always reflects the most recent event
- Review replay stale state — playback controls (play, fast-forward, reverse, start, end) were advancing to the wrong event due to stale state reads after
setState; all fixed - Review replay timer leak — slider debounce timer was stored in component state, preventing proper cleanup on unmount
- Gallery tab timer — pagination debounce timer moved from component state to instance variable, eliminating stale state reads
- Event management pagination — page number now adjusts correctly after an event is deleted
- WebSocket disconnect — execute modal now properly disconnects its WebSocket client on unmount
- Resolved all npm audit vulnerabilities
- Upgraded
@hapi/nesto v14
- Extracted shared utilities (
resolveStartTS,connectWSClient,buildEventQuery) intosrc/utils.js; adopted across event history, event management, event template list, and footer - Removed unused
lowering_dropdown.jscomponent - Removed pointless
connect(null, null)Redux wrappers fromCustomPaginationandExportDropdown - Eliminated state-mirroring-props pattern in
ExportDropdown; extracted triplicated query building intobuildQuery() - Extracted repeated
findCurrentCruise()helper inCruiseMenu - Removed empty constructor and unused import in
EventLogging - Removed unused
replayEventIndexstate and dead code branch inReviewGallery - Updated
prettier,concurrently, andsassto latest