Skip to content

Repository maintenance - #1749

Open
luixlive wants to merge 13 commits into
developfrom
repository-maintenance
Open

luixlive wants to merge 13 commits into
developfrom
repository-maintenance

Conversation

@luixlive

@luixlive luixlive commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

What does this PR do?

Repository maintenance. Linting now passes cleanly across the whole repository, and the files nothing uses are gone. The only behavior changes are fixes for four bugs the new lint rules uncovered.

Cleanup

  • Removes files nothing uses: the Docker dev stack (docker-compose.yml, Dockerfile.dev, Dockerfile.test, nginx/), mock-api/, restart.sh, test.sh, VERSION, .gitconfig, the leftover CRA public/index.html, and two unused Terraform files (outputs.tf, remote_state.tf).
  • Rewrites .gitignore and .dockerignore for this project, in commented groups. ESLint, Jest and the Vite dev server now also ignore Claude Code worktrees under .claude/.
  • Trims the .env* files to the variables the app still reads.
  • Moves the build and test tooling (eslint, jest, babel-jest, jest-watch-typeahead, workbox-build) to devDependencies, and bumps dotenv to 18.0.5.
  • Adds vite-ignore to the /config.js script tag. Vite no longer warns at build time, and the runtime config still loads the same way.

ESLint

  • Renames the config to eslint.config.mjs, which ends Node's module-type warning.
  • Reduces the config to the recommended JS, React, React Hooks and Jest rule sets, with Node and service worker globals scoped to the files that use them.
  • Fixes every problem it reports across the repository, including the unused React imports.
  • The React Compiler rules flag some code whose current logic is intended. Those spots are suppressed inline, and each suppression gives its reason.
  • Lint now runs --fix, and jest/valid-expect then awaits any expect(...).rejects that is not awaited on the line where it is written. So a fake-timer test advances the timers and awaits the rejection in one Promise.all (see utils/auth-recovery.test.js).
  • Moves a shared Jira widget test helper into src/__test-helpers/, and deletes 4 empty test.todo placeholders.

Stylelint and Sass

  • Replaces .stylelintrc.json with stylelint.config.mjs on stylelint-config-standard-scss, with camelCase class names in CSS modules. Global stylesheets are exempt, because they target Bootstrap and Mapbox markup.
  • Migrates @import to @use and the deprecated global Sass color functions to sass:color.
  • Fixes every remaining problem. Apart from the class renames, 32 compiled rules change, all with no visible effect on the browsers the bundle supports: appearance replaces -webkit-appearance, chained :not() selectors merge into one, clip-path replaces clip, overflow: overlay becomes auto, and word-break: break-word goes away.

Bug fixes
The new rules flagged these, and each one now has a regression test:

  • System status: a data integration that reports no heartbeat or datasource time now shows no time, instead of crashing the whole app when the System Status menu opens.
  • Map marker names: the Settings → Map choices survive a reload again. The component no longer deletes _persist from the store while rendering.
  • Analyzers: the geofence and proximity highlight now clears when the pointer leaves. The layer's map handlers stay stable, so Mapbox stops rebinding them on every render.
  • Track length: the subject popup stops showing a track's length once the track is hidden.

Tooling and docs

  • Replaces yarn lint and yarn stylelint with a single yarn format, which runs eslint --fix . and then stylelint --fix "**/*.scss", matching report-form-builder.
  • Updates README.md, AGENTS.md and CONTRIBUTING.md to recommend yarn format. CONTRIBUTING.md also drops its outdated Airbnb style guide and npm run lint references.

🤖 Generated with Claude Code

luixlive and others added 6 commits October 1, 2026 09:56
Remove leftovers from the create-react-app era and the docker-compose setup that nobody uses anymore.

- Delete VERSION, test.sh, Dockerfile.test and .gitconfig, which nothing references (.gitconfig pointed at a .githooks folder that doesn't exist).
- Delete the docker-compose dev stack (docker-compose.yml, Dockerfile.dev, restart.sh, nginx/) and mock-api/. Remove the REACT_APP_MOCK_* flags and their URL switches in the events, event types and event schemas ducks. Drop the matching eslint ignores.
- Delete public/index.html, the old CRA template. Vite builds from the root index.html.
- Trim the env files: drop GENERATE_SOURCEMAP (CRA only), the stale REACT_APP_FF_ notes, and the values that repeat .env.
- Rewrite .gitignore and .dockerignore from scratch. The Docker context now also excludes local env files, public/config.js, build output and non-build folders.
- Move dev-only tools (babel-jest, eslint, jest, jest-watch-typeahead, workbox-build) to devDependencies.
- Drop the obsolete shrink-to-fit=no from the viewport meta.

Production builds are unchanged apart from the viewport meta and the order of entries in the bundled package.json.
…'s rule set, remove unused React imports, fix the remaining problems without changing behavior, and suppress the React Compiler rules where the current logic is intended

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…andard-scss in an ESM config with camelCase module classes, migrate @import and the legacy Sass functions to the module system, and fix every remaining problem without changing the rendered styles

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tylelint commands with a unified format command, introduce a new ESLint configuration file, and update documentation to reflect these changes. Remove outdated test todos from event tests.
claude[bot]

This comment was marked as spam.

@luixlive
luixlive marked this pull request as draft October 1, 2026 19:49
@luixlive
luixlive requested a balanced review from Copilot October 1, 2026 19:49

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

No unresolved review comments, but the repository-wide scope and unrun builds and project tests warrant human approval.

Review effort: Balanced
Findings: None

What changed in this PR

Repository-wide maintenance for the EarthRanger client, modernizing source and styles and removing legacy tooling.

Changes:

  • Remove unused React imports and modernize property checks and catch clauses.
  • Update Sass modules, mixin references, formatting, and targeted lint annotations.
  • Remove obsolete infrastructure, container, mock API, and script files; simplify environment settings.
File Description
VERSION Remove legacy version marker.
test.sh Remove legacy test wrapper.
terraform/​remote_state.tf Remove remote-state configuration.
terraform/​outputs.tf Remove infrastructure outputs.
src/​WithTracker/​index.js React import cleanup.
src/​withSocketConnection/​useRealTimeImplementation/​index.js React import cleanup.
src/​withSocketConnection/​index.js React import cleanup.
src/​WithMapViewConfig/​index.js React import cleanup.
src/​views/​EULA/​index.test.js React import cleanup.
src/​utils/​toast.test.js React import cleanup.
src/​utils/​toast.js React import cleanup.
src/​utils/​subjects.js Use Object.hasOwn.
src/​utils/​patrols.js React import cleanup.
src/​utils/​geometry.js Remove unused catch binding.
src/​UserMenu/​index.test.js React import cleanup.
src/​UserMenu/​index.js React import cleanup.
src/​UserCurrentLocationPopup/​styles.module.scss Normalize spacing.
src/​UserCurrentLocationPopup/​index.js React import cleanup.
src/​UserCurrentLocationLayer/​styles.module.scss Migrate to Sass @use.
src/​TrackToggleButton/​PatrolAwareTrackToggleButton.js React import cleanup.
src/​TrackToggleButton/​index.js React import cleanup.
src/​TracksLayer/​track.test.js React import cleanup.
src/​TracksLayer/​index.js React import cleanup.
src/​TrackLegend/​TracksList/​index.test.js React import cleanup.
src/​TrackLegend/​TracksList/​index.js React import cleanup.
src/​TrackLegend/​TrackSettings/​index.test.js React import cleanup.
src/​TrackLegend/​TrackSettings/​index.js React import cleanup.
src/​TrackLegend/​TimeOfDaySettings/​TimeZoneSelect/​index.test.js React import cleanup.
src/​TrackLegend/​TimeOfDaySettings/​styles.module.scss Correct button mixin reference.
src/​TrackLegend/​TimeOfDaySettings/​index.test.js React import cleanup.
src/​TrackLegend/​TimeOfDaySettings/​index.js React import cleanup.
src/​TrackLegend/​index.test.js React import cleanup.
src/​TrackLegend/​index.js React import cleanup.
src/​ToastBody/​index.js React import cleanup.
src/​TimeSliderMapControl/​index.js React import cleanup.
src/​TimeSlider/​index.test.js React import cleanup.
src/​TimeSlider/​index.js React import cleanup.
src/​TimepointPopup/​index.test.js React import cleanup.
src/​TimepointPopup/​index.js React import cleanup.
src/​TimePicker/​styles.module.scss Normalize import spacing.
src/​TimePicker/​OptionsPopover/​index.test.js React import cleanup.
src/​TimePicker/​index.test.js React import cleanup.
src/​TimeAgo/​index.js React import cleanup.
src/​TileEventFeaturesProvider/​index.test.js React import cleanup.
src/​TextCopyBtn/​index.test.js React import cleanup.
src/​TextCopyBtn/​index.js React import cleanup.
src/​test-utils.jsx React import cleanup.
src/​SystemStatus/​index.test.js React import cleanup.
src/​SystemStatus/​index.js React import cleanup.
src/​Switch/​index.test.js React import cleanup.
src/​Switch/​index.js React import cleanup.
src/​sw-custom.js Remove redundant lint suppression.
src/​SvgIcon/​index.test.js React import cleanup.
src/​SvgIcon/​index.js React import cleanup.
src/​SubjectTrackLegend/​index.js React import cleanup.
src/​SubjectsLayer/​index.test.js React import cleanup.
src/​SubjectPopup/​index.js React import cleanup.
src/​SubjectMessagesPopup/​index.js React import cleanup.
src/​SubjectMessagesPopover/​index.js React import cleanup.
src/​SubjectMessagePopup/​index.js React import cleanup.
src/​SubjectHistoryButton/​PatrolAwareTrackToggleButton.js React import cleanup.
src/​SubjectHistoryButton/​index.js React import cleanup.
src/​SubjectHistoricalDataModal/​index.test.js React import cleanup.
src/​SubjectHeatmapLegend/​index.js React import cleanup.
src/​SubjectControls/​index.js React import cleanup.
src/​SubjectControls/​button.js React import cleanup.
src/​StaticSensorsLayer/​index.test.js React import cleanup.
src/​StaticSensorsLayer/​index.js Document memoization lint exception.
src/​StateManagedSocketConsumer/​index.js React import cleanup.
src/​SpatialFeaturesLayer/​index.test.js React import cleanup.
src/​SpatialFeaturesLayer/​index.js React import cleanup.
src/​SoundNotificationsPlayer/​RadioStateChangeToAlarmNotificationPlayer/​styles.module.scss Migrate to Sass @use.
src/​SoundNotificationsPlayer/​RadioStateChangeToAlarmNotificationPlayer/​index.test.js React import cleanup.
src/​SoundNotificationsPlayer/​NewInReachMessageNotificationPlayer/​index.test.js React import cleanup.
src/​SoundNotificationsPlayer/​NewInReachMessageNotificationPlayer/​index.js React import cleanup.
src/​SoundNotificationsPlayer/​NewEventNotificationPlayer/​index.test.js React import cleanup.
src/​SoundNotificationsPlayer/​index.test.js React import cleanup.
src/​SoundNotificationsPlayer/​index.js React import cleanup.
src/​SleepDetector/​index.test.js React import cleanup.
src/​SleepDetector/​index.js React import cleanup.
src/​SkyLayer/​index.test.js React import cleanup.
src/​SkyLayer/​index.js React import cleanup.
src/​SidebarScrollContext/​index.test.js React import cleanup.
src/​SidebarScrollContext/​index.js React import cleanup.
src/​SideBar/​utils/​navigateMenuWithKeyboard/​index.test.js React import cleanup.
src/​SideBar/​useReportsFeed/​index.test.js React import cleanup.
src/​SideBar/​useFetchPatrolsFeed/​index.test.js React import cleanup.
src/​SideBar/​TitleInput/​index.test.js React import cleanup.
src/​SideBar/​TitleInput/​index.js React import cleanup.
src/​SideBar/​SettingsPane/​MapTab/​MainMapSettingsView/​index.test.js React import cleanup.
src/​SideBar/​SettingsPane/​MapTab/​MainMapSettingsView/​index.js React import cleanup.
src/​SideBar/​SettingsPane/​MapTab/​index.test.js React import cleanup.
src/​SideBar/​SettingsPane/​MapTab/​index.js React import cleanup.
src/​SideBar/​SettingsPane/​MapTab/​CoordinateSystemSettingsView/​index.test.js React import cleanup.
src/​SideBar/​SettingsPane/​index.test.js React import cleanup.
src/​SideBar/​SettingsPane/​index.js React import cleanup.
src/​SideBar/​SettingsPane/​GeneralTab/​SoundFieldSet/​index.test.js React import cleanup.
src/​SideBar/​SettingsPane/​GeneralTab/​SoundFieldSet/​index.js React import cleanup.
src/​SideBar/​SettingsPane/​GeneralTab/​LanguageSelect/​index.test.js React import cleanup.
src/​SideBar/​SettingsPane/​GeneralTab/​LanguageSelect/​index.js React import cleanup.
src/​SideBar/​SettingsPane/​GeneralTab/​index.js React import cleanup.
src/​SideBar/​SettingsPane/​GeneralTab/​AppRefreshFieldSet/​index.test.js React import cleanup.
src/​SideBar/​SettingsPane/​GeneralTab/​AppRefreshFieldSet/​index.js React import cleanup.
src/​SideBar/​PatrolsManager/​StatusPill/​index.test.js React import cleanup.
src/​SideBar/​PatrolsManager/​StatusPill/​index.js React import cleanup.
src/​SideBar/​PatrolsManager/​PatrolsFeed/​Filters/​index.test.js React import cleanup.
src/​SideBar/​PatrolsManager/​PatrolOverview/​Overview/​index.test.js React import cleanup.
src/​SideBar/​PatrolsManager/​PatrolOverview/​index.test.js React import cleanup.
src/​SideBar/​PatrolsManager/​PatrolOverview/​Footer/​index.test.js React import cleanup.
src/​SideBar/​PatrolsManager/​NewPatrol/​index.test.js React import cleanup.
src/​SideBar/​PatrolsManager/​NewPatrol/​Footer/​index.test.js React import cleanup.
src/​SideBar/​PatrolsManager/​NewPatrol/​Footer/​index.js React import cleanup.
src/​SideBar/​PatrolsManager/​LegManager/​NewLeg/​Footer/​index.test.js React import cleanup.
src/​SideBar/​PatrolsManager/​LegManager/​LegOverview/​Footer/​index.test.js React import cleanup.
src/​SideBar/​PatrolsManager/​LegManager/​index.test.js React import cleanup.
src/​SideBar/​PatrolsManager/​LegManager/​EditLeg/​Footer/​index.test.js React import cleanup.
src/​SideBar/​PatrolsManager/​LegForm/​index.test.js React import cleanup.
src/​SideBar/​PatrolsManager/​index.test.js React import cleanup.
src/​SideBar/​PatrolsManager/​index.js React import cleanup.
src/​SideBar/​PatrolsManager/​DetailViewLoader/​index.test.js React import cleanup.
src/​SideBar/​PatrolsManager/​DetailViewLoader/​index.js React import cleanup.
src/​SideBar/​PatrolsManager/​Activity/​SummaryStats/​index.test.js React import cleanup.
src/​SideBar/​PatrolsManager/​Activity/​index.test.js React import cleanup.
src/​SideBar/​PatrolsManager/​Activity/​index.js React import cleanup.
src/​SideBar/​PatrolsManager/​_shared.scss Normalize import spacing.
src/​SideBar/​PatrolsFeed/​index.test.js React import cleanup.
src/​SideBar/​PatrolsFeed/​index.js React import cleanup.
src/​SideBar/​MapLayersTab/​SubjectsTab/​index.test.js React import cleanup.
src/​SideBar/​MapLayersTab/​index.test.js React import cleanup.
src/​SideBar/​MapLayersTab/​index.js React import cleanup.
src/​SideBar/​MapLayersTab/​Filters/​index.test.js React import cleanup.
src/​SideBar/​MapLayersTab/​Filters/​index.js React import cleanup.
src/​SideBar/​MapLayersTab/​FeaturesTab/​Content.js React import cleanup.
src/​SideBar/​MapLayersTab/​EventsTab/​styles.module.scss Normalize spacing.
src/​SideBar/​MapLayersTab/​EventsTab/​index.js React import cleanup.
src/​SideBar/​MapLayersTab/​AnalyzersTab/​index.test.js React import cleanup.
src/​SideBar/​index.test.js React import cleanup.
src/​SideBar/​GearTab/​index.test.js React import cleanup.
src/​SideBar/​GearTab/​index.js React import cleanup.
src/​SideBar/​EventsManager/​index.test.js React import cleanup.
src/​SideBar/​EventsManager/​index.js React import cleanup.
src/​SideBar/​EventsManager/​EventsFeed/​styles.module.scss Correct button mixin reference.
src/​SideBar/​EventsManager/​EventsFeed/​SortControls/​index.test.js React import cleanup.
src/​SideBar/​EventsManager/​EventsFeed/​index.test.js React import cleanup.
src/​SideBar/​EventsManager/​EventsFeed/​EventRow/​index.test.js React import cleanup.
src/​SideBar/​EventsManager/​EventsFeed/​EventRow/​Actions/​index.test.js React import cleanup.
src/​SideBar/​EventsManager/​EventOverview/​LinksSection/​index.js React import cleanup.
src/​SideBar/​EventsManager/​EventOverview/​Header/​StatusSelect/​index.test.js React import cleanup.
src/​SideBar/​EventsManager/​EventOverview/​Header/​ReportMenu/​index.test.js React import cleanup.
src/​SideBar/​EventsManager/​EventOverview/​Header/​index.test.js React import cleanup.
src/​SideBar/​EventsManager/​EventOverview/​Header/​index.js React import cleanup.
src/​SideBar/​EventsManager/​EventOverview/​Footer/​SaveSplitButton/​index.test.js React import cleanup.
src/​SideBar/​EventsManager/​EventOverview/​Footer/​index.test.js React import cleanup.
src/​SideBar/​EventsManager/​EventOverview/​Footer/​index.js React import cleanup.
src/​SideBar/​EventsManager/​EventOverview/​DetailsSection/​index.test.js React import cleanup.
src/​SideBar/​EventsManager/​EventOverview/​DetailsSection/​AreaPicker/​styles.module.scss Normalize import spacing.
src/​SideBar/​EventsManager/​EventOverview/​DetailsSection/​AreaPicker/​index.test.js React import cleanup.
src/​SideBar/​DetailViewLoader/​index.test.js React import cleanup.
src/​SideBar/​DetailViewLoader/​index.js React import cleanup.
src/​SideBar/​DetailViewHeader/​index.test.js React import cleanup.
src/​SideBar/​DetailViewHeader/​index.js React import cleanup.
src/​SideBar/​DetailViewHeader/​Breadcrumb/​index.test.js React import cleanup.
src/​SideBar/​DetailViewHeader/​Breadcrumb/​index.js React import cleanup.
src/​SelectListGroup/​SelectableItem/​styles.module.scss Normalize import spacing.
src/​SelectListGroup/​SelectableItem/​index.js React import cleanup.
src/​SelectListGroup/​index.test.js React import cleanup.
src/​SelectListGroup/​index.js React import cleanup.
src/​Select/​index.test.js React import cleanup.
src/​Select/​index.js React import cleanup.
src/​SearchBar/​index.test.js React import cleanup.
src/​SearchBar/​index.js React import cleanup.
src/​SchemaFormSummary/​Section/​index.test.js React import cleanup.
src/​SchemaFormSummary/​Section/​index.js React import cleanup.
src/​SchemaFormSummary/​index.test.js React import cleanup.
src/​SchemaFormSummary/​index.js React import cleanup.
src/​SchemaForm/​utils/​useUploadValidations/​index.test.js React import cleanup.
src/​SchemaForm/​utils/​useSchemaValidations/​index.test.js React import cleanup.
src/​SchemaForm/​utils/​useMapLocationMarkers/​index.test.js React import cleanup.
src/​SchemaForm/​utils/​useFormElementDomId/​index.test.js React import cleanup.
src/​SchemaForm/​index.test.js React import cleanup.
src/​SchemaForm/​index.js React import cleanup.
src/​SchemaForm/​formElements/​Text/​styles.module.scss Normalize import spacing.
src/​SchemaForm/​formElements/​Text/​index.test.js React import cleanup.
src/​SchemaForm/​formElements/​Text/​index.js React import cleanup.
src/​SchemaForm/​formElements/​Section/​index.test.js React import cleanup.
src/​SchemaForm/​formElements/​Section/​index.js React import cleanup.
src/​SchemaForm/​formElements/​Numeric/​styles.module.scss Normalize import spacing.
src/​SchemaForm/​formElements/​Numeric/​index.test.js React import cleanup.
src/​SchemaForm/​formElements/​Numeric/​index.js React import cleanup.
src/​SchemaForm/​formElements/​Location/​styles.module.scss Normalize import spacing.
src/​SchemaForm/​formElements/​Location/​index.test.js React import cleanup.
src/​SchemaForm/​formElements/​Location/​index.js React import cleanup.
src/​SchemaForm/​formElements/​Header/​styles.module.scss Shorten equivalent color notation.
src/​SchemaForm/​formElements/​Header/​index.test.js React import cleanup.
src/​SchemaForm/​formElements/​Header/​index.js React import cleanup.
src/​SchemaForm/​formElements/​DateTime/​index.test.js React import cleanup.
src/​SchemaForm/​formElements/​DateTime/​index.js React import cleanup.
src/​SchemaForm/​formElements/​Collection/​SortableList/​SortableItem/​index.js React import cleanup.
src/​SchemaForm/​formElements/​Collection/​SortableList/​Item/​index.test.js React import cleanup.
src/​SchemaForm/​formElements/​Collection/​SortableList/​Item/​FormPreview/​index.test.js React import cleanup.
src/​SchemaForm/​formElements/​Collection/​SortableList/​Item/​FormPreview/​index.js React import cleanup.
src/​SchemaForm/​formElements/​Collection/​SortableList/​Item/​FormModal/​index.test.js React import cleanup.
src/​SchemaForm/​formElements/​Collection/​index.test.js React import cleanup.
src/​SchemaForm/​formElements/​Collection/​index.js React import cleanup.
src/​SchemaForm/​formElements/​ChoiceList/​List.js React import cleanup.
src/​SchemaForm/​formElements/​ChoiceList/​index.test.js React import cleanup.
src/​SchemaForm/​formElements/​ChoiceList/​index.js React import cleanup.
src/​SchemaForm/​formElements/​ChoiceList/​Dropdown.js React import cleanup.
src/​SchemaForm/​formElements/​Boolean/​index.test.js React import cleanup.
src/​SchemaForm/​formElements/​Boolean/​index.js React import cleanup.
src/​SchemaForm/​formElements/​Attachment/​index.test.js React import cleanup.
src/​SchemaFields/​index.test.js React import cleanup.
src/​RequireEulaConfirmation/​index.test.js React import cleanup.
src/​RequireAccessToken/​index.test.js React import cleanup.
src/​RequireAccessToken/​index.js React import cleanup.
src/​ReportsHeatLayer/​index.test.js React import cleanup.
src/​ReportsHeatLayer/​index.js React import cleanup.
src/​ReportListItem/​index.test.js React import cleanup.
src/​ReportListItem/​index.js React import cleanup.
src/​ReportGeometryDrawer/​InformationModal/​index.js React import cleanup.
src/​ReportGeometryDrawer/​index.test.js React import cleanup.
src/​ReportGeometryDrawer/​Footer/​index.test.js React import cleanup.
src/​ReportGeometryDrawer/​Footer/​index.js React import cleanup.
src/​ReportGeometryDrawer/​CancelationConfirmationModal/​index.test.js React import cleanup.
src/​ReportGeometryDrawer/​CancelationConfirmationModal/​index.js React import cleanup.
src/​ReportFormSummary/​V1SchemaFormSummary/​index.js React import cleanup.
src/​ReportFormSummary/​index.test.js React import cleanup.
src/​ReportFormSummary/​index.js React import cleanup.
src/​ReporterSelect/​index.test.js React import cleanup.
src/​ReporterSelect/​index.js React import cleanup.
src/​ReportedBySelect/​index.js React import cleanup.
src/​QuickLinks/​index.test.js React import cleanup.
src/​QuickLinks/​index.js React import cleanup.
src/​PrintTitle/​index.test.js React import cleanup.
src/​PrintTitle/​index.js React import cleanup.
src/​PopupLayer/​index.js React import cleanup.
src/​Popup/​styles.module.scss No textual diff supplied.
src/​PickMapLocationButton/​index.test.js React import cleanup.
src/​PickMapLocationButton/​index.js React import cleanup.
src/​PatrolTracks/​index.js React import cleanup.
src/​PatrolTrackLegend/​index.test.js React import cleanup.
src/​PatrolTrackLegend/​index.js React import cleanup.
src/​PatrolTrackLayer/​index.js React import cleanup.
src/​PatrolTrackControls/​index.js React import cleanup.
src/​PatrolStartStopLayer/​index.test.js React import cleanup.
src/​PatrolStartStopLayer/​index.js React import cleanup.
src/​PatrolMenu/​index.js React import cleanup.
src/​PatrolListItem/​index.js React import cleanup.
src/​PatrolList/​index.js React import cleanup.
src/​PatrolFilter/​PatrolFilterSettings.js React import cleanup.
src/​PatrolFilter/​index.test.js React import cleanup.
src/​PatrolFilter/​FiltersPopover/​index.js React import cleanup.
src/​PatrolFilter/​DateRangePopover/​index.test.js React import cleanup.
src/​PatrolFilter/​DateRangePopover/​index.js React import cleanup.
src/​PatrolFilter/​DateRange.js React import cleanup.
src/​PatrolDetailView/​InvalidDatesModal/​index.test.js React import cleanup.
src/​PatrolDetailView/​InvalidDatesModal/​index.js React import cleanup.
src/​PatrolDetailView/​Header/​index.test.js React import cleanup.
src/​PatrolDetailView/​Header/​index.js React import cleanup.
src/​NumericInput/​index.test.js React import cleanup.
src/​NumericInput/​index.js React import cleanup.
src/​NoteModal/​index.js React import cleanup.
src/​NavigationPromptModal/​index.js React import cleanup.
src/​NavigationContextProvider/​index.test.js React import cleanup.
src/​NavigationContextProvider/​index.js React import cleanup.
src/​Nav/​NavHomeMenu/​index.js React import cleanup.
src/​Nav/​NavHomeItem/​index.js React import cleanup.
src/​Nav/​MessageMenu.js React import cleanup.
src/​Nav/​index.test.js React import cleanup.
src/​Nav/​index.js React import cleanup.
src/​MouseMarkerPopup/​index.js React import cleanup.
src/​MouseMarkerLayer/​index.js React import cleanup.
src/​ModalRenderer/​index.test.js React import cleanup.
src/​ModalRenderer/​index.js React import cleanup.
src/​MessagingSelect/​index.js React import cleanup.
src/​MessageList/​SenderDetails.js React import cleanup.
src/​MessageList/​MessageSummaryListItem.js React import cleanup.
src/​MessageList/​MessageListItem.js React import cleanup.
src/​MessageList/​index.js React import cleanup.
src/​MessageInput/​index.js React import cleanup.
src/​MediaModal/​index.test.js React import cleanup.
src/​MediaModal/​index.js React import cleanup.
src/​MapTerrain/​index.test.js React import cleanup.
src/​MapTerrain/​index.js React import cleanup.
src/​MapRulerControl/​PointPopup.test.js React import cleanup.
src/​MapRulerControl/​PointPopup.js React import cleanup.
src/​MapRulerControl/​index.test.js React import cleanup.
src/​MapMarkerDropper/​index.js React import cleanup.
src/​MapLocationSelectionOverview/​index.js React import cleanup.
src/​MapLegend/​index.test.js React import cleanup.
src/​MapLegend/​index.js React import cleanup.
src/​MapDrawingTools/​MapLayers.js React import cleanup.
src/​MapDrawingTools/​ContextProvider.js React import cleanup.
src/​Map/​layers/​useCrsBoundingBoxLayer/​index.test.js React import cleanup.
src/​Map/​index.test.js React import cleanup.
src/​Login/​index.test.js React import cleanup.
src/​Login/​index.js React import cleanup.
src/​LogarithmicSlider/​index.js React import cleanup.
src/​LocationPicker/​MenuPopover/​index.test.js React import cleanup.
src/​LocationPicker/​index.test.js React import cleanup.
src/​LocationPicker/​index.js React import cleanup.
src/​LocationJumpButton/​styles.module.scss Migrate Sass imports and correct mixins.
src/​LocationJumpButton/​index.test.js React import cleanup.
src/​LocationJumpButton/​index.js React import cleanup.
src/​LoadingOverlay/​styles.module.scss Modernize equivalent color syntax.
src/​LoadingOverlay/​index.test.js React import cleanup.
src/​LoadingOverlay/​index.js React import cleanup.
src/​Link/​index.test.js React import cleanup.
src/​LegacySelect/​index.js React import cleanup.
src/​LayerSelectorPopup/​index.test.js React import cleanup.
src/​LabeledPatrolSymbolLayer/​index.js React import cleanup.
src/​KMLExportModal/​index.js React import cleanup.
src/​KebabMenu/​index.test.js React import cleanup.
src/​KebabMenu/​index.js React import cleanup.
src/​JiraSupportWidget/​index.js React import cleanup.
src/​InReach/​index.js React import cleanup.
src/​index.js React import cleanup.
src/​IconTooltip/​index.test.js React import cleanup.
src/​IconTooltip/​index.js React import cleanup.
src/​hooks/​useWebVitals/​index.test.js React import cleanup.
src/​hooks/​useTileEventFeatures/​index.test.js React import cleanup.
src/​hooks/​useStringifyCoordinates/​index.test.js React import cleanup.
src/​hooks/​useSortedNodes/​index.test.js React import cleanup.
src/​hooks/​useSortedNodes/​index.js React import cleanup.
src/​hooks/​useReport/​index.test.js React import cleanup.
src/​hooks/​usePermissions/​index.test.js React import cleanup.
src/​hooks/​usePatrol/​index.test.js React import cleanup.
src/​hooks/​useOnScreen/​index.js Document effect-state lint exception.
src/​hooks/​useNavigationBlocker/​index.test.js React import cleanup.
src/​hooks/​useNavigate/​index.test.js React import cleanup.
src/​hooks/​useModalPopover/​index.test.js React import cleanup.
src/​hooks/​useMapSources/​index.test.js React import cleanup.
src/​hooks/​useMapLayers/​index.test.js React import cleanup.
src/​hooks/​useMapLayers/​index.js Remove unused catch binding.
src/​hooks/​useJumpToLocation/​index.test.js React import cleanup.
src/​hooks/​useClusterPolygon/​index.test.js React import cleanup.
src/​hooks/​index.js Document render-ref lint exception.
src/​hooks/​geometry.test.js React import cleanup.
src/​HeatmapToggleButton/​index.js React import cleanup.
src/​HeatmapStyleControls/​index.js React import cleanup.
src/​HeatmapLegend/​styles.module.scss Normalize spacing.
src/​HeatmapLegend/​index.js React import cleanup.
src/​HamburgerMenuIcon/​index.js React import cleanup.
src/​GpsInput/​index.test.js React import cleanup.
src/​GpsFormatTogglePopup/​index.js React import cleanup.
src/​GpsFormatToggle/​index.test.js React import cleanup.
src/​GpsFormatToggle/​index.js React import cleanup.
src/​GlobalMenuDrawer/​index.js React import cleanup.
src/​GetUserLocationButton/​styles.module.scss Normalize import spacing.
src/​GetUserLocationButton/​index.js React import cleanup.
src/​GeoLocationWatcher/​index.test.js React import cleanup.
src/​GearPopup/​index.test.js React import cleanup.
src/​GearLayer/​index.test.js React import cleanup.
src/​FriendlyFilterString/​index.test.js React import cleanup.
src/​FriendlyFilterString/​index.js React import cleanup.
src/​FeedListItem/​index.js React import cleanup.
src/​FeedDateFilter/​index.js React import cleanup.
src/​FeatureSymbolPopup/​index.test.js React import cleanup.
src/​FeatureSymbolPopup/​index.js React import cleanup.
src/​EventTypeListItem/​index.js React import cleanup.
src/​EventsVectorLayer/​index.test.js React import cleanup.
src/​EventsTileLayers/​index.test.js React import cleanup.
src/​EventsRealtimeOverlayLayer/​index.test.js React import cleanup.
src/​EventsClusterSymbolsLayer/​index.test.js React import cleanup.
src/​EventIcon/​index.test.js React import cleanup.
src/​EventIcon/​index.js React import cleanup.
src/​EventGeometryLayer/​index.test.js React import cleanup.
src/​EventFilter/​index.test.js React import cleanup.
src/​EventFilter/​index.js React import cleanup.
src/​EventFilter/​FiltersPopover/​index.test.js React import cleanup.
src/​EventFilter/​FiltersPopover/​index.js React import cleanup.
src/​EventFilter/​FiltersPopover/​EventTypesFilter/​styles.module.scss Correct button mixin reference.
src/​EventFilter/​FiltersPopover/​EventTypesFilter/​index.test.js React import cleanup.
src/​EventFilter/​FiltersPopover/​EventTypesFilter/​index.js React import cleanup.
src/​EventFilter/​DateRangePopover/​index.test.js React import cleanup.
src/​ErrorMessages/​index.js React import cleanup.
src/​ErrorMessage/​index.js React import cleanup.
src/​ErrorBoundary/​index.js React import cleanup.
src/​EditableItem/​Modal.js React import cleanup.
src/​EditableItem/​index.js React import cleanup.
src/​EditableItem/​Footer.js React import cleanup.
src/​EditableItem/​context.js React import cleanup.
src/​EditableItem/​Body.js React import cleanup.
src/​EditableItem/​AttachmentList.js React import cleanup.
src/​EditableItem/​AttachmentControls.js React import cleanup.
src/​EarthRangerMap/​Attribution.js React import cleanup.
src/​EarthRangerLogo/​index.js React import cleanup.
src/​EarthRangerIconLoadingOverlay/​styles.module.scss Normalize keyframe spacing.
src/​EarthRangerIconLoadingOverlay/​index.js React import cleanup.
src/​ducks/​popup.js Use Object.hasOwn.
src/​ducks/​features.js Remove unused catch binding.
src/​DroppedMarkerPopup/​styles.module.scss Normalize selector syntax and spacing.
src/​DroppedMarkerPopup/​index.js React import cleanup.
src/​Drawer/​index.test.js React import cleanup.
src/​Drawer/​index.js React import cleanup.
src/​DetectOffline/​index.js React import cleanup.
src/​DetailViewComponents/​HistorySection/​UpdateListItem/​index.js React import cleanup.
src/​DetailViewComponents/​HistorySection/​index.test.js React import cleanup.
src/​DetailViewComponents/​HistorySection/​index.js React import cleanup.
src/​DetailViewComponents/​AddReportButton/​styles.module.scss Correct button mixin reference.
src/​DetailViewComponents/​AddReportButton/​index.js React import cleanup.
src/​DetailViewComponents/​ActivitySection/​NoteListItem/​index.test.js React import cleanup.
src/​DetailViewComponents/​ActivitySection/​index.test.js React import cleanup.
src/​DetailViewComponents/​ActivitySection/​index.js React import cleanup.
src/​DetailViewComponents/​ActivitySection/​DateListItem/​index.test.js React import cleanup.
src/​DetailViewComponents/​ActivitySection/​ContainedReportListItem/​index.test.js React import cleanup.
src/​DetailViewComponents/​ActivitySection/​AttachmentListItem/​index.test.js React import cleanup.
src/​DelayedUnmount/​index.js Document effect-state lint exception.
src/​DateTimePicker/​index.test.js React import cleanup.
src/​DateTimePicker/​index.js React import cleanup.
src/​DateTime/​index.js React import cleanup.
src/​DateRangeSelector/​DateRangeSelectionString.js React import cleanup.
src/​DatePicker/​index.test.js React import cleanup.
src/​DatePicker/​index.js React import cleanup.
src/​DatePicker/​CalendarPopper/​MonthPicker/​index.test.js React import cleanup.
src/​DatePicker/​CalendarPopper/​index.test.js React import cleanup.
src/​DatePicker/​CalendarPopper/​index.js React import cleanup.
src/​DataExportModal/​index.js React import cleanup.
src/​DailyReportModal/​index.js React import cleanup.
src/​CursorGpsDisplay/​MenuPopover/​index.test.js React import cleanup.
src/​CursorGpsDisplay/​MenuPopover/​index.js React import cleanup.
src/​CursorGpsDisplay/​index.test.js React import cleanup.
src/​CursorGpsDisplay/​index.js React import cleanup.
src/​CommunityPage/​index.js Document effect-state lint exception.
src/​common/​styles/​vars/​controls.module.scss Namespace Sass variable export.
src/​common/​styles/​vars/​_controls.scss Modernize equivalent color syntax.
src/​common/​styles/​_filter-popovers.scss Correct box-shadow mixin reference.
src/​ClustersLayer/​index.test.js React import cleanup.
src/​ClustersLayer/​index.js React import cleanup.
src/​Checkmark/​index.js React import cleanup.
src/​CheckboxList/​index.test.js React import cleanup.
src/​CheckboxList/​index.js React import cleanup.
src/​CheckableList/​index.js React import cleanup.
src/​BaseLayerRenderer/​TileLayerRenderer.test.js React import cleanup.
src/​BaseLayerRenderer/​TileLayerRenderer.js React import cleanup.
src/​BaseLayerRenderer/​index.js React import cleanup.
src/​Badge/​index.js React import cleanup.
src/​Auth0TokenManager/​accountLinkingGate.integration.test.js React import cleanup.
src/​App.js React import cleanup.
src/​AnalyzerConfigPopup/​index.js React import cleanup.
src/​AlertsModal/​index.js React import cleanup.
src/​AddToIncidentModal/​index.test.js React import cleanup.
src/​AddToIncidentModal/​index.js React import cleanup.
src/​AddNoteButton/​styles.module.scss Correct button mixin reference.
src/​AddNoteButton/​index.test.js React import cleanup.
src/​AddNoteButton/​index.js React import cleanup.
src/​AdditionalDeviceProperties/​styles.module.scss Correct link-button mixin reference.
src/​AdditionalDeviceProperties/​index.test.js React import cleanup.
src/​AdditionalDeviceProperties/​index.js React import cleanup.
src/​AddItemButton/​index.test.js React import cleanup.
src/​AddItemButton/​AddItemModal/​TypesList/​index.test.js React import cleanup.
src/​AddItemButton/​AddItemModal/​TypesList/​index.js React import cleanup.
src/​AddItemButton/​AddItemModal/​AddReportTab/​index.test.js React import cleanup.
src/​AddItemButton/​AddItemModal/​AddPatrolTab/​index.test.js React import cleanup.
src/​AddAttachmentButton/​styles.module.scss Correct mixin and normalize spacing.
src/​AddAttachmentButton/​index.test.js React import cleanup.
src/​AddAttachmentButton/​index.js React import cleanup.
src/​__test-helpers/​navigationWrapper.js React import cleanup.
src/​__test-helpers/​MockSocketContext.js React import cleanup.
restart.sh Remove legacy restart wrapper.
nginx/​Dockerfile.dev Remove legacy development image.
mock-api/​api/​v2.0/​index.js Remove obsolete mock router.
mock-api/​api/​v1.0/​activity/​eventtypes/​index.js Remove obsolete mock schema endpoint.
mock-api/​.gitignore Remove obsolete mock ignore configuration.
mock-api/​.dockerignore Remove obsolete mock container configuration.
Dockerfile.test Remove legacy test image.
Dockerfile.dev Remove legacy development image.
.gitconfig Remove legacy hooks configuration.
.env.production Remove redundant environment settings.
.env.development Remove redundant and obsolete settings.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

…e tooling

- System status: a service without a heartbeat or datasource date stores null instead of an Invalid Date, which crashed the app when the menu opened.
- Map marker names: stop deleting `_persist` from the store during render, so the setting survives a reload again.
- Analyzers: stable map handlers, so the hover highlight clears when the pointer leaves.
- Track length: derive it during render, so it disappears with the track.
- ESLint, Jest and the Vite dev server ignore Claude Code worktrees under `.claude/`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Base automatically changed from patrol-updates to develop October 1, 2026 22:52
@luixlive
luixlive requested a review from JoshuaVulcan October 1, 2026 22:55
The favicon was a single black 16x16 bitmap, blurry on high-density
screens and nearly invisible on dark tab strips, and the manifest
listed sizes it did not contain.

- Add a teal favicon.svg drawn on a pixel grid, with a dark mode color
- Rebuild favicon.ico with 16, 32 and 48px images
- Add an apple-touch-icon and 192, 512 and maskable PWA icons
- Declare them in index.html and the manifest, set the theme color to
  white, and point start_url and id at the root
- Precache the icons and the manifest in the service worker
- Add yarn build-app-icons to regenerate them from their SVG sources

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@luixlive
luixlive marked this pull request as ready for review October 2, 2026 20:27
luixlive and others added 3 commits October 2, 2026 15:07
The icons are static files that rarely change, so they are kept as
plain assets in public/ rather than regenerated by tooling.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@luixlive luixlive added the deploy label Oct 5, 2026
@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown

🚀 PR Environment Deployed

App Sync Health Image
pr-web-repository-maintenance ✅ Synced ✅ Healthy f67566c7527e30d876e1aa71a4a392e49193b4d8

Access: https://repository-maintenance.dev.pamdas.org

View in ArgoCD

@luixlive
luixlive requested a review from chrisj-er October 5, 2026 22:50

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants