Skip to content

MMGIS 5.0.0 — React 18, Design System, Theming, UI Restructure#959

Open
tariqksoliman wants to merge 466 commits into
NASA-AMMOS:developmentfrom
JPL-Devin:development
Open

MMGIS 5.0.0 — React 18, Design System, Theming, UI Restructure#959
tariqksoliman wants to merge 466 commits into
NASA-AMMOS:developmentfrom
JPL-Devin:development

Conversation

@tariqksoliman
Copy link
Copy Markdown
Member

With Devin

MMGIS 5.0.0 — React 18, Design System, Theming, UI Restructure

Screenshot 2026-05-05 165916

Purpose

MMGIS 5.0.0 modernizes the frontend by upgrading from React 16 + jQuery/Materialize to React 18 + Base UI, introduces a configurable theme system with 18 built-in themes, rewrites the separated tools system as React components, restructures the UI layout (TopBar, BottomBar, globe controls), and adds a new design system with reusable components and CSS Modules. All changes are fully backward compatible with existing mission configurations.


Proposed Changes

React 18 + Base UI Migration

  • [ADD] Upgraded from React 16 to React 18 with Base UI replacing jQuery/Materialize for UI primitives
  • [ADD] New src/design-system/ directory with reusable React components: Button, Dropdown, IconButton, Modal, Toast, Toggle, Tooltip — all styled with CSS Modules
  • [ADD] dompurify dependency for safe HTML rendering in Help content
  • [CHANGE] Migrated Ancillary UI components (Modal, Tooltip, Toast, Help, ContextMenu, Coordinates) from jQuery/Materialize to React + Base UI
  • [CHANGE] Dissolved the src/essence/Ancillary/ directory — components reorganized into src/essence/Basics/UserInterface_/components/
  • [CHANGE] Service modules (DataShaders, LocalFilterer, QueryURL, Sprites) moved to src/essence/services/
  • [CHANGE] Upgraded react-chartjs-2 to ^4.3.1 and react-resize-detector to ^9.1.0 for React 18 compatibility

Configurable Theme System

  • [ADD] 18 built-in themes configurable from the Configure page UI tab:
    • Dark: Default, Blue, Warm, Mars, Midnight, Terra, Nebula, Lunar, Supernova, Heliosphere, Monokai
    • Light (experimental): Default, Cool, Slate, Warm, Botanical, Solarized
    • High Contrast: WCAG-oriented high-contrast theme
  • [ADD] --color-shadow CSS variable for theme-aware shadow styling
  • [ADD] Live ThemePreview component in the Configure page showing a miniature preview of each theme before selection
  • [ADD] New optional configuration fields: look.theme, look.primarycolor, look.secondarycolor, look.tertiarycolor, look.accentcolor, look.highlightcolor

Separated Tools System Rewrite

  • [CHANGE] Rewrote the entire separated/floating tools system from jQuery to React components
  • [CHANGE] Tool panel is now a floating panel with a close button and drag handle
  • [CHANGE] Removed separatedTool and justification configuration toggles (silently ignored if still present in existing configs)

Mobile UI

  • [ADD] Panel toggle, account button, and menu now accessible in the mobile top-right bar
  • [CHANGE] Exclusive panel toggling enforced on mobile — only one panel (Map/Globe/Viewer) open at a time

UI Restructure

  • [CHANGE] Moved Screenshot and Fullscreen buttons to the BottomBar; moved About to the TopBar kebab menu
  • [CHANGE] BottomBar buttons reordered (Copy Link, Screenshot, Fullscreen) with unified sizing
  • [CHANGE] TopBar hides Viewer/Globe toggles based on which panels are configured
  • [CHANGE] Repositioned Viewer and Globe panel buttons to top-right
  • [CHANGE] Cesium link button moved to top-right with Leaflet zoom button styling
  • [CHANGE] Globe controls rearranged: compass top-right circular, nav row vertical, panels open left
  • [CHANGE] Map logo anchored to document.body to avoid CSS filter containing-block issues; hidden on mobile
  • [CHANGE] Redesigned About modal
  • [CHANGE] Reverted tooltips to tippy.js for consistency

Tile Fade Behavior

  • [ADD] Per-layer fade control: time-enabled and shade/viewshed layers never fade during transitions
  • [ADD] Selective tile fade: tiles fade on pan/zoom but update instantly on refresh/reload

New Help Documentation

  • [ADD] In-app help content for 9 tools: Analysis, Animation, Chemistry, Curtain, Draw, Isochrone, Legend, Measure, Sites

Additional UI Polish

  • [ADD] Legend empty state message when no legend items are present
  • [ADD] Hover effect on MMGIS logo (subtle background highlight)
  • [CHANGE] Migrated ~69 ad-hoc CursorInfo toast calls to the proper Toast component
  • [CHANGE] Removed ~600 lines of dead CSS; deleted tools.css
  • [FIX] TimeUI dropdown z-index above tool panel; #toggleTimeUI click handler, tippy, and active class restored
  • [FIX] TimeControl .fina() assignment operator bug (used = instead of ===)
  • [FIX] TimeUI border radius and rounded corners on shell, action wrappers, mode dropdown
  • [FIX] time.initiallyOpen now respected when a live deep-link is set
  • [FIX] XSS prevention: HTML escaping in tooltip builders for GeoJSON values
  • [FIX] Help.jsx fetch error handling and HTML sanitization with DOMPurify
  • [FIX] Circular import in TimeUI.js

Internal

  • [CHANGE] Removed internal Test_ module, testModules, and DrawTool.test in favor of the Playwright-based E2E framework
  • [CHANGE] Updated CITATION.cff to version 5.0.0, dated 2026-05-01
  • [ADD] CHANGELOG.md entry for 5.0.0 release
  • [ADD] .knowledge/ directory with AI agent development context
  • [CHANGE] Updated AGENTS.md with current architecture documentation

Compatibility

  • Mission configurations: Fully backward compatible — no changes required to existing config JSON files. The removed justification field is silently ignored if still present.
  • JavaScript API (window.mmgisAPI): Fully backward compatible — all public API functions unchanged
  • End users: No breaking changes — UI is modernized but all functionality is preserved
  • Developers: Import paths changed for components previously under Ancillary/; jQuery UI component APIs replaced with React; Test_ module removed (use tests/e2e/ Playwright framework)

Issues

  • N/A — cumulative sync of the development fork

Testing

  • All changes individually tested and merged into JPL-Devin/MMGIS development
  • Existing Playwright E2E test suite passes
  • CI checks verified

devin-ai-integration Bot and others added 30 commits April 22, 2026 22:27
Switched from the newer gdal2customtiles.py to the legacy version which
generates each zoom level as base tiles from the source DEM, avoiding
the overview averaging that corrupts IEEE 754 float bytes. Legacy script
also generates 2 extra zoom levels (14-15) for DEM mode.

All 132 tiles verified clean: zero unreasonable pixel values at any zoom.
Updated maxNativeZoom from 13 to 15.

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
getTool returns a fallback object (not null) when the tool is absent,
so the null check alone is insufficient. Added typeof check to prevent
TypeError if LayersTool is excluded from a custom build.

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
…xtra ramps, fix docs

- Remove zoom level 15 tiles (maxNativeZoom now 14)
- Add 0 to noDataValues array so true-zero elevations are treated as nodata
- Set precise bounding box from tilemapresource.xml
- Add Viridis and Inferno color ramps alongside existing RdYlBu
- Fix noDataValues description in Data.md docs to be accurate

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
Previously bounds was only passed to the inner L.tileLayer instances
(via options.options), but the outer L.GridLayer (L.TileLayer.GL) never
received it. This meant L.GridLayer._isValidTile() could not filter
out-of-bounds tiles, causing tile requests for the entire viewport.

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
…a-tiles

Support data layers with plain URL rgba tiles in populateCogScale
…-encoded float tiles

When --dem flag is used, float32 elevation values are encoded into RGBA bytes
via IEEE 754 binary representation. The scale_query_to_tile function was using
gdal.RegenerateOverview with 'average' resampling, which averages the raw RGBA
byte values. Since these bytes represent IEEE 754 float encoding, averaging them
produces garbage float values (e.g. 6.54e+27 instead of ~150m elevation).

This is especially visible at tile edges where valid RGBA-encoded pixels neighbor
transparent (0,0,0,0) nodata pixels.

Fix: when options.isDEMtile is True, use 'near' (nearest-neighbor) resampling
instead of 'average' in scale_query_to_tile. This preserves the RGBA byte
encoding integrity during the querysize-to-tile_size downscale step.

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
…es.py

Tiles regenerated at zoom levels 10-14 using the corrected script that uses
nearest-neighbor resampling for DEM tiles instead of average. All 23,660 data
pixels verified to decode to valid elevations within the source DEM range.

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
…esampling

Fix DEM tile corruption by using nearest-neighbor resampling for RGBA-encoded float tiles
… and AI agent safety rules

- Add NODE_ENV=production and DATABASE_URL production-indicator checks
  to tests/global-setup.js and tests/test-db-clean.js
- Support DB_USER_TEST / DB_PASS_TEST env vars for least-privilege
  test database credential separation
- Add Database Safety Rules section to AGENTS.md and AI-GETTING-STARTED.md
- Create .cursorrules with database safety guidelines for AI agents

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
…t test creds in test-db-clean

- Remove DATABASE_URL production check (no such ENV exists)
- Change 'destructive test operations' to 'test operations' in error message
- test-db-clean.js now requires DB_USER_TEST/DB_PASS_TEST with no fallback

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
- Make STAC DB name configurable via STAC_DB_NAME in API/connection.js
  and scripts/init-db.js (defaults to 'mmgis-stac')
- global-setup.js creates mmgis-stac-test when STAC services are enabled
  and passes STAC_DB_NAME to the test server
- Adjacent server .env files rewritten to use mmgis-stac-test
- test-db-clean.js drops mmgis-stac-test alongside mmgis-test
- Add DB_USER_TEST, DB_PASS_TEST, STAC_DB_NAME to sample.env and ENVs.md
- Update safety rules in AGENTS.md and AI-GETTING-STARTED.md

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
…endence

- Comment out DB_USER_TEST, DB_PASS_TEST, STAC_DB_NAME in sample.env to
  prevent dotenv from setting them to empty/whitespace values
- Fix early return in test-db-clean.js so mmgis-stac-test cleanup runs
  independently of whether mmgis-test exists

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
- Remove fallback to DB_USER/DB_PASS in global-setup.js credential resolution
- Add DB_USER_TEST/DB_PASS_TEST to CI workflow .env setup
- Update ENVs.md to reflect these are now required for tests

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
…test

- Revert API/connection.js to hardcoded 'mmgis-stac'
- Revert scripts/init-db.js to hardcoded 'mmgis-stac'
- Test infrastructure uses hardcoded 'mmgis-stac-test' constant
- Remove STAC_DB_NAME from sample.env and ENVs.md

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
…o fallback

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
Prevents execSync and spawn calls in global-setup.js from flashing
empty terminal windows on Windows machines.

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
…provements

feat: add e2e test safety improvements (production fail-safe, test DB credentials, AI agent rules)
Adapted all 36 UI tasks from PR #47 to work with development's full
React component architecture (Toolbar, Splitter, BottomBarReact, etc.)
instead of PR #45's null-stub + jQuery layout.

Layout & Positioning (Tasks 1, 4, 5, 11, 16, 17, 20, 27):
- BottomElementPositioner: immediate positioning with toolPanelWidth offset
- Scalebar/compass: 12px permanent right push + tool panel width
- Toolbar: flex-direction column layout

Controls & Navigation (Tasks 2, 9, 10):
- Map zoom: Home button resets to configured initial view
- BottomBarReact: reduced to About + Copy Link only
- TopBar: kebab menu with Screenshot, Fullscreen, Hotkeys, Settings

Tool System (Tasks 3, 6, 7, 13):
- Tool buttons: CSS classes (.toolButtonActive) instead of inline styles
- Tool headers: standardized with mmgisToolHeader/mmgisToolTitle classes
- MeasureTool: close button at top, reset/download at bottom

Visual Polish (Tasks 8, 14, 18, 25, 26, 29, 30, 32, 34, 36):
- Splitter: invisible by default, accent color on hover
- Compass: smooth left transition
- Coordinates: background, separator between mouse/pick
- mmgislogo: border-right matching topbar border-bottom
- toolsWrapper: no border in bottomFloatingBar

TimeUI & Settings (Tasks 15, 23, 24, 28):
- toggleTimeUI button removed from coordinates
- TimeUI toggle added to Settings modal
- Popover positioning uses window.innerHeight - bcr.top

Modals & Config (Tasks 12, 19, 21):
- About modal: MMGIS logo, version, attributions, markdown content
- Modal close: proper click handler with stopPropagation
- Attributions: removed from DOM, collected for About modal

Panel Sync (Task 31):
- TopBar panel toggles sync with Zustand store via subscribe

Dependencies & Config:
- Added dompurify for markdown sanitization
- Added aboutModalContent to config template and Reference Mission
- Added 9 help markdown files for tools

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
…port

- Port design-system: themes.js (6 presets), applyTheme.js, themeApplier.js, useTheme.js
- Wire theme into Zustand store (themeName + setTheme action)
- Wire theme into UserInterfaceBridge init/fina and Stylize.js
- Add theme dropdown to configure page (look.theme field)
- Update mmgisUI.css to use CSS variables for theme support
- Make tool panel float over map instead of docking/pushing
- Hide splitter drag handles by default
- Fix Coordinates.css margin for removed TimeUI button

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
…d of useSyncExternalStore)

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
… topbar

- ToolPanel: 12px inset margins from toolbar/topbar, border-radius 10px,
  backdrop-filter blur(20px), opacity transition on open/close
- Toolbar: box-shadow, z-index 101, 34x34 tool buttons with border-radius 8px,
  starts below topbar (top: topSize), Toolbar.css imported
- TopBar: solid background + border-bottom via themeApplier, box-shadow via CSS
- Bottom floating bar: new BottomFloatingBar wraps toolsWrapper + timeUIDock
  inside #splitscreens with 12px margins, backdrop blur, border-radius
- TimeUI reparented into floating bar via MutationObserver
- BottomElementPositioner: recalculated offsets based on floating bar height
- Separated tools: offset by toolPanelWidth + 24px when tool panel is open
- Splitter arrow buttons hidden (panel toggles in TopBar replace them)
- FloatingElements.css: backdrop blur for TimeUI, coordinates, compass, zoom
- SplitScreens.css, BottomBarReact.css, ToolPanel.css, Toolbar.css added

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
- Remove toolPanelWidth/toolsWrapperRawWidth reactive styles that shifted
  TopBar right when tool panel opened
- TopBar now always uses left:0, width:100%, padding-left:40px (from CSS)
- Tool panel floats underneath TopBar (z-index 2005 > 1400)
- Add theme colors for toggle buttons, user avatar via CSS variables
- Remove redundant z-index override in TopBar.css

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
@tariqksoliman tariqksoliman moved this to Backlog in MMGIS May 8, 2026
@tariqksoliman tariqksoliman moved this from Backlog to Todo in MMGIS May 8, 2026
@tariqksoliman tariqksoliman moved this from Todo to In Progress in MMGIS May 8, 2026
devin-ai-integration Bot and others added 23 commits May 11, 2026 17:38
…lopment

Upstream changes:
- NASA-AMMOS#967: Fix configure/upsert SQL and websocket body causing memory spike
- NASA-AMMOS#961: Fix DrawTool templated point time filtering and associated points
- README: Add Minimum Specs section

Conflicts resolved:
- package.json, configure/package.json: kept Devin branch version (5.0.1-20260507)
- DrawTool_Editing.js: kept Devin branch changes, applied upstream's departing feature associated-points logic

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
Sync upstream NASA-AMMOS/MMGIS development into JPL-Devin development
Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
…er-on-toggle

fix: render Globe panel immediately on first open without window resize
Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
…itle, margin above subtitles

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
…and-split-gradients

style: add theme borders to Viewer/Map/Globe panels and gradient backgrounds to map/globe splitters
…back

Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
Co-Authored-By: tariq.k.soliman <tariqksoliman@gmail.com>
…3col

style: vertical hotkeys modal + tighter leaflet zoom button gap
…-hover-fix

style: theme-aware splitter gradient + restore hover feedback
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement For making an existing feature better

Projects

Status: In Progress

Development

Successfully merging this pull request may close these issues.

1 participant