Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1205 commits
Select commit Hold shift + click to select a range
628d773
fix: correct horizon profile convergence formula for polar stereo
devin-ai-integration[bot] Jun 9, 2026
c75da48
refactor: extract rate limiters into shared scripts/rateLimiters.js m…
devin-ai-integration[bot] Jun 9, 2026
a67e31f
chore: bump version to 5.0.26-20260609 [version bump]
github-actions[bot] Jun 9, 2026
3becabf
fix: use geodesic destination for azimuth lines instead of angle rota…
devin-ai-integration[bot] Jun 9, 2026
3b6f3b9
chore: convert reference mission DEMs to Cloud Optimized GeoTIFF (COG)
devin-ai-integration[bot] Jun 9, 2026
7990fd9
feat: add lunar LSMT to chronice, fix TimeUI indicator cleanup and ob…
devin-ai-integration[bot] Jun 9, 2026
49241f8
fix: LSMT lng fallback to map center, hide empty DEM dropdown, Enter …
devin-ai-integration[bot] Jun 9, 2026
f807e2a
Improve Mars Reference Mission
tariqksoliman Jun 10, 2026
306e96f
chore: bump version to 5.0.28-20260610 [version bump]
github-actions[bot] Jun 10, 2026
9961897
fix: sightmap overlay CRS mismatch for non-custom projections, restor…
devin-ai-integration[bot] Jun 10, 2026
75bdcfa
fix: restore sightline config descriptions from ShadeTool, remove dat…
devin-ai-integration[bot] Jun 10, 2026
f567ca7
fix: observer time input 7hr drift — chronice result parsed as local …
devin-ai-integration[bot] Jun 10, 2026
b103eff
fix: sightmap sun direction for cylindrical projections, 1s time drif…
devin-ai-integration[bot] Jun 10, 2026
367fde1
fix: match old ShadeTool vstOptionTime styling and DOY format
devin-ai-integration[bot] Jun 10, 2026
2007997
ui: hide observer start time in static mode, show only 'Time' field
devin-ai-integration[bot] Jun 10, 2026
4a9c3f0
fix: horizon profile rotation for cylindrical CRS + visibility chart …
devin-ai-integration[bot] Jun 10, 2026
a9ac4b1
fix: horizon profile aspect ratio for geographic CRS + crosshair styl…
devin-ai-integration[bot] Jun 10, 2026
27c99bc
feat: add lime center dot at visible map center while sightline tool …
devin-ai-integration[bot] Jun 10, 2026
abc4692
fix: update crosshair position immediately when sweepCenter is set
devin-ai-integration[bot] Jun 10, 2026
60b9118
fix: sightmap route security + batch limits + test fix (Devin Review)
devin-ai-integration[bot] Jun 10, 2026
42b1e88
fix: add error handler + headersSent guards on sightmap spawn
devin-ai-integration[bot] Jun 10, 2026
f06799d
fix: get_pixel_scale uses actual array rows instead of ds.RasterYSize
devin-ai-integration[bot] Jun 10, 2026
2029e9d
fix: correct East vector cross product order in sun_azel_at_cell
devin-ai-integration[bot] Jun 10, 2026
d7abacf
refactor: remove dead code from sightmap.py
devin-ai-integration[bot] Jun 10, 2026
280d4ca
refactor: remove dead code from SightlineTool frontend
devin-ai-integration[bot] Jun 10, 2026
98603e1
fix: color picker/ramp dropdown clipping + reorder default colors
devin-ai-integration[bot] Jun 10, 2026
59747e1
fix: improve LSMT inverse conversion precision from ~30s to <1s
devin-ai-integration[bot] Jun 10, 2026
8b280c9
fix: color picker palette uses fixed positioning to escape overflow
devin-ai-integration[bot] Jun 10, 2026
4fd3286
fix: revert fixed positioning, use overflow:visible on open panels
devin-ai-integration[bot] Jun 10, 2026
c961047
Merge pull request #90 from JPL-Devin/devin/1780944405-sightline-tool…
tariqksoliman Jun 11, 2026
e1b65fc
Merge branch 'development' into development
tariqksoliman Jun 11, 2026
48d73cd
feat(sightline): implement 6 improvements to Sightline tool
devin-ai-integration[bot] Jun 11, 2026
6f6e36f
chore: bump version to 5.1.1-20260611 [version bump]
github-actions[bot] Jun 11, 2026
a5d2d1c
fix: resolve merge conflict in configure/package.json
devin-ai-integration[bot] Jun 11, 2026
e83d036
fix(sightline): set mode before sweepShowAllFrames, add distance to h…
devin-ai-integration[bot] Jun 11, 2026
8581190
fix(sightline): address 4 review issues
devin-ai-integration[bot] Jun 11, 2026
e82ef74
fix(sightline): hardcode 6 color ramps, revert crosshair to non-dragg…
devin-ai-integration[bot] Jun 11, 2026
35f0943
fix(sightline): reverse B&W ramp to White→Black, single color stop
devin-ai-integration[bot] Jun 11, 2026
aebffd0
fix(sightline): anchor horizon profile to sweep center when available
devin-ai-integration[bot] Jun 11, 2026
d0ad26e
perf(sightline): add timing instrumentation to sightmap pipeline
devin-ai-integration[bot] Jun 11, 2026
84caf66
TEMP: strip grid data from sightmap response for timing debug
devin-ai-integration[bot] Jun 11, 2026
4c9c4ae
perf(sightmap): cache frame-invariant data in batch mode
devin-ai-integration[bot] Jun 11, 2026
0bb009a
perf(sightmap): eliminate full-grid trig via angle addition formula
devin-ai-integration[bot] Jun 11, 2026
dd7571e
feat(sightline): add resolution dropdown + restore grid data
devin-ai-integration[bot] Jun 11, 2026
79adcda
feat(sightmap): scale frame limit by resolution
devin-ai-integration[bot] Jun 11, 2026
1233ce3
refactor(sightmap): replace times array with startTime/endTime/stepSe…
devin-ai-integration[bot] Jun 11, 2026
fd0c5c2
feat(sightline): range circles, max distance infinity toggle, viewpor…
devin-ai-integration[bot] Jun 11, 2026
6b265aa
fix: range circles use projected polygon, infinity mode preserves vie…
devin-ai-integration[bot] Jun 11, 2026
b3d6cc5
refactor: replace min/max distance fields with DEM Extent dropdown
devin-ai-integration[bot] Jun 11, 2026
3b83551
Revert "refactor: replace min/max distance fields with DEM Extent dro…
devin-ai-integration[bot] Jun 11, 2026
101c104
Revert "fix: range circles use projected polygon, infinity mode prese…
devin-ai-integration[bot] Jun 11, 2026
813caed
Revert "feat(sightline): range circles, max distance infinity toggle,…
devin-ai-integration[bot] Jun 11, 2026
8534906
feat(sightline): add Shadow Reach LOD field for distant shadow casting
devin-ai-integration[bot] Jun 11, 2026
65ee45c
fix(sightline): prevent OOM on large shadow reach, clamp to curvature…
devin-ai-integration[bot] Jun 11, 2026
2af148f
fix(sightline): Enter key triggers regen on Shadow Reach input
devin-ai-integration[bot] Jun 11, 2026
885a3f9
fix(sightline): respect drag order for sightmap z-index, fix drop ind…
devin-ai-integration[bot] Jun 11, 2026
20c471e
fix(sightline): position-aware drag-and-drop indicator (above/below)
devin-ai-integration[bot] Jun 11, 2026
955b976
fix(sightline): visibility timeline uses sightmap grid pixels, not ho…
devin-ai-integration[bot] Jun 12, 2026
5b3643d
chore(sightline): remove timing logs and fix graph slider performance
devin-ai-integration[bot] Jun 12, 2026
b061d5f
feat(sightline): add distance-based fog shading to horizon profile
devin-ai-integration[bot] Jun 12, 2026
1d0720b
fix(sightline): increase horizon profile fog opacity variation
devin-ai-integration[bot] Jun 12, 2026
a7e62b7
fix(sightline): horizon profile now refreshes after new sweep completes
devin-ai-integration[bot] Jun 12, 2026
19b64b6
feat(sightline): add hover tooltip to horizon profile showing azimuth…
devin-ai-integration[bot] Jun 12, 2026
6f28ab2
fix(sightline): increase horizon profile max radius from 5km to 50km
devin-ai-integration[bot] Jun 12, 2026
5ac3f9d
fix(sightline): increase horizon profile max radius to 250km
devin-ai-integration[bot] Jun 12, 2026
5a25050
perf(sightline): add log stepping + early termination to horizon profile
devin-ai-integration[bot] Jun 12, 2026
59b8ce6
feat(sightline): add header with dual-handle log-scale horizon distan…
devin-ai-integration[bot] Jun 12, 2026
ad3ce85
fix(sightline): default horizon range to 1m–250km and add tippy tooltip
devin-ai-integration[bot] Jun 12, 2026
30b07ed
fix(sightline): increase crosshair circle and center dot radius by 1px
devin-ai-integration[bot] Jun 12, 2026
1f2ab19
fix(sightline): deduplicate visibility chart time ticks and add user-…
devin-ai-integration[bot] Jun 12, 2026
0162ca6
fix(sightline): align visibility ticks with red slider position
devin-ai-integration[bot] Jun 12, 2026
3ec1171
fix(sightline): set vstTimeStep width to 76px
devin-ai-integration[bot] Jun 12, 2026
778ec20
refactor(sightline): extract Sightline into dedicated backend module
devin-ai-integration[bot] Jun 12, 2026
3c9569b
fix(sightline): update SPICE kernel relative path after script reloca…
devin-ai-integration[bot] Jun 12, 2026
f582580
docs(sightline): update help with detailed algorithm descriptions
devin-ai-integration[bot] Jun 12, 2026
0c66354
refactor(sightline): extract modules for Indicators, Export, Horizon,…
devin-ai-integration[bot] Jun 12, 2026
28e2b4e
feat(sightline): invert color ramp to black→white, add horizon polygo…
devin-ai-integration[bot] Jun 15, 2026
9154f20
feat(sightline): add horizon polygon toggle checkbox, increase polygo…
devin-ai-integration[bot] Jun 15, 2026
827189f
feat(sightline): thicker polygon border (weight 3), add tippy on Poly…
devin-ai-integration[bot] Jun 15, 2026
b3a66ce
fix(sightline): composite hover uses bounds-based lookup instead of t…
devin-ai-integration[bot] Jun 15, 2026
f76785e
fix(sightline): update azimuth lines on map pan/zoom
devin-ai-integration[bot] Jun 15, 2026
bdccf42
fix(sightline): composite hover uses projBounds for projected CRS maps
devin-ai-integration[bot] Jun 15, 2026
0a361f4
fix(sightline): update polygon tippy text, add user-select:none to la…
devin-ai-integration[bot] Jun 15, 2026
1e8b23f
fix(sightline): project mouse coords before comparing to projBounds
devin-ai-integration[bot] Jun 15, 2026
97d29ee
perf(sightline): progressive log2 stepping in sightmap ray march
devin-ai-integration[bot] Jun 15, 2026
975c772
Revert "perf(sightline): progressive log2 stepping in sightmap ray ma…
devin-ai-integration[bot] Jun 15, 2026
e2137d9
Revert "Revert "perf(sightline): progressive log2 stepping in sightma…
devin-ai-integration[bot] Jun 15, 2026
7c938c0
perf(sightline): add in-march early termination + reduce working DEM …
devin-ai-integration[bot] Jun 15, 2026
ba91f02
feat(sightline): add 2-minute timeout to sightmap.py
devin-ai-integration[bot] Jun 15, 2026
9d380f1
fix(sightline): prevent server crash on oversized sightmap output
devin-ai-integration[bot] Jun 15, 2026
9fb2751
feat(sightline): binary grid encoding, NDJSON streaming, delta compre…
devin-ai-integration[bot] Jun 15, 2026
922639a
fix(sightline): remove Python-side timeout, Node manages 3min single …
devin-ai-integration[bot] Jun 15, 2026
3164230
fix(sightline): cap batch timeout at 5 minutes
devin-ai-integration[bot] Jun 15, 2026
c71099d
docs: fix stale comment — batch timeout cap is 5 min, not 30
devin-ai-integration[bot] Jun 15, 2026
707ad34
feat(sightline): replace CSV export with GeoTIFF for all modes
devin-ai-integration[bot] Jun 15, 2026
b3fd083
fix(sightline): fix GeoTIFF export — use correct writeArrayBuffer inp…
devin-ai-integration[bot] Jun 15, 2026
2205eea
revert(sightline): remove GeoTIFF exports, drop playback CSV export
devin-ai-integration[bot] Jun 15, 2026
eccc3bd
Merge pull request #92 from JPL-Devin/devin/1781207656-sightline-impr…
tariqksoliman Jun 15, 2026
57646ea
Merge branch 'NASA-AMMOS:development' into development
tariqksoliman Jun 15, 2026
b67cdd3
Merge branch 'development' into devin/1780447795-audit-attributions-n…
tariqksoliman Jun 15, 2026
a103441
Merge pull request #89 from JPL-Devin/devin/1780447795-audit-attribut…
tariqksoliman Jun 15, 2026
ef7e371
Merge branch 'NASA-AMMOS:development' into development
tariqksoliman Jun 15, 2026
4c74f96
merge: resolve conflicts with development + refactor Sightline late-b…
devin-ai-integration[bot] Jun 15, 2026
a16f8a1
chore: bump version to 5.1.2-20260615 [version bump]
github-actions[bot] Jun 15, 2026
80d1252
Merge pull request #91 from JPL-Devin/devin/1781041207-refactor-rate-…
tariqksoliman Jun 15, 2026
37d1a9b
Merge branch 'NASA-AMMOS:development' into development
tariqksoliman Jun 15, 2026
22f4881
feat: Phase 1 plugin restructure — unified /plugins/ directory
devin-ai-integration[bot] Jun 15, 2026
1e7ac01
fix: correct relative require paths in moved backends
devin-ai-integration[bot] Jun 15, 2026
243b949
chore: bump version to 5.1.3-20260615 [version bump]
github-actions[bot] Jun 15, 2026
fbce4c7
fix: escape glob pattern in JSDoc comment that broke parser
devin-ai-integration[bot] Jun 15, 2026
fd734c2
fix: correct rootDir path depth and plugin.json version
devin-ai-integration[bot] Jun 16, 2026
796cf98
chore: bump version to 5.1.4-20260616 [version bump]
github-actions[bot] Jun 16, 2026
563ff18
fix: update relative import paths for plugin directory restructure
devin-ai-integration[bot] Jun 16, 2026
8fec7ea
fix: correct SPICE kernel path depth in sightmap.py and address revie…
devin-ai-integration[bot] Jun 16, 2026
1eaaf84
feat(Phase 2): Standardize plugin manifests, split backend lifecycle,…
devin-ai-integration[bot] Jun 16, 2026
a11caef
chore: remove /notes directory
devin-ai-integration[bot] Jun 16, 2026
5d11d2b
fix: overridable check inspects registered plugin, not incoming; fix …
devin-ai-integration[bot] Jun 16, 2026
67830e6
feat: Phase 3 — Plugin CLI and git-based registry system
devin-ai-integration[bot] Jun 16, 2026
b7acf69
fix: address Devin Review findings for Phase 3
devin-ai-integration[bot] Jun 16, 2026
422ace5
fix: CONTRIBUTING.md template walkthrough references setup.js instead…
devin-ai-integration[bot] Jun 16, 2026
7e03407
fix: CLI deps command uses claim.entry for pip/conda conflicts, not c…
devin-ai-integration[bot] Jun 16, 2026
01a70b2
fix: add description to backend KNOWN_FIELDS for consistency
devin-ai-integration[bot] Jun 16, 2026
6c70c39
fix: mergeNpm picks highest-lower-bound range; docs mark type/version…
devin-ai-integration[bot] Jun 16, 2026
15bc479
feat: support "version": "core" — auto-resolves to MMGIS version
devin-ai-integration[bot] Jun 16, 2026
830b8d2
feat: add author, license, repository, keywords fields to plugin mani…
devin-ai-integration[bot] Jun 16, 2026
04f7d6d
feat: CLI visual overhaul + fix Devin Review bugs
devin-ai-integration[bot] Jun 16, 2026
3c5db0e
fix: revert info to flat layout, add type headers to list
devin-ai-integration[bot] Jun 16, 2026
be40941
fix: use high-contrast colors for dark/light terminal support
devin-ai-integration[bot] Jun 16, 2026
ae14d22
feat: add webpack aliases for plugin-friendly imports
devin-ai-integration[bot] Jun 16, 2026
8b81ed1
feat: local install copies by default, --link for symlink
devin-ai-integration[bot] Jun 16, 2026
a28ff38
refactor: consolidate plugin docs, remove legacy templates
devin-ai-integration[bot] Jun 16, 2026
75ef8e5
refactor: rename discoverPluginsUnified to discoverPlugins, improve w…
devin-ai-integration[bot] Jun 16, 2026
6bf463f
feat: add activate command, auto-activate on plugin changes, fix back…
devin-ai-integration[bot] Jun 16, 2026
7f61bf3
refactor: activate prints diff only, suppresses verbose logger output
devin-ai-integration[bot] Jun 16, 2026
8f42ffb
fix: color-code 'no changes' in activate based on context
devin-ai-integration[bot] Jun 16, 2026
493cc07
fix: red 'Discovered 0 plugin(s)' on install, green otherwise
devin-ai-integration[bot] Jun 16, 2026
bcbf720
fix: restore console output if activate throws (try/finally)
devin-ai-integration[bot] Jun 16, 2026
1cf318a
feat: add 'create' command to scaffold new plugins
devin-ai-integration[bot] Jun 16, 2026
5f8fea8
feat: --json flag for all CLI commands + create scaffold command
devin-ai-integration[bot] Jun 16, 2026
eff1e6d
docs: update README with create command, --json for all, --container …
devin-ai-integration[bot] Jun 16, 2026
75e9dfb
fix: puzzle-outline fallback icon, tool header scaffold, Configure pa…
devin-ai-integration[bot] Jun 16, 2026
a8c4d77
feat: add destroy command to plugin CLI
devin-ai-integration[bot] Jun 16, 2026
c2e829e
fix: correct 'plugin-cli list' message, add webpack restart note on d…
devin-ai-integration[bot] Jun 16, 2026
c7beab3
fix: add margin-right 6px to scaffold tool header close button
devin-ai-integration[bot] Jun 16, 2026
ef7eac3
fix: move margin-right 6px to global .mmgisToolHeader, remove per-too…
devin-ai-integration[bot] Jun 16, 2026
296685f
feat: add 'required' field — manifest-driven disable/destroy protection
devin-ai-integration[bot] Jun 16, 2026
e39ba1a
fix: update stale comments about core plugin state protection
devin-ai-integration[bot] Jun 16, 2026
19a5f36
fix: info/enable show required status, display singular type
devin-ai-integration[bot] Jun 16, 2026
81cf984
test: add e2e tests for CLI install/remove/enable/disable/create/dest…
devin-ai-integration[bot] Jun 16, 2026
0d851b1
feat: add 'npm run plugin' alias for common mistype
devin-ai-integration[bot] Jun 16, 2026
975d64e
feat: validate local paths in registry add, add registry e2e tests
devin-ai-integration[bot] Jun 16, 2026
bb82df4
fix: --json output audit — consistent types, error JSON, registry JSON
devin-ai-integration[bot] Jun 16, 2026
8a0925f
chore: remove unused container-level plugin.json, expand tier enum
devin-ai-integration[bot] Jun 16, 2026
b452a72
docs: update AGENTS.md, add comprehensive PLUGIN-JSON.md field reference
devin-ai-integration[bot] Jun 16, 2026
a5c73b1
feat: add aliases — Sightline: shade, Draw: camp
devin-ai-integration[bot] Jun 16, 2026
7710a33
docs: merge AGENTS.md + PLUGIN-JSON.md into README.md with TOC
devin-ai-integration[bot] Jun 16, 2026
0f540a6
feat: registry add supports --tier, --description, --license, --autho…
devin-ai-integration[bot] Jun 16, 2026
e369534
fix: remove incorrect TimeUI component reference from README
devin-ai-integration[bot] Jun 16, 2026
bb22cce
fix: revert .secrets.baseline to original, add Applies-to column to f…
devin-ai-integration[bot] Jun 16, 2026
0bad5a2
fix: README cleanup — remove Sightline reference, fix field metadata …
devin-ai-integration[bot] Jun 16, 2026
5a039e2
feat: install resolves registry names from plugin-registries.json
devin-ai-integration[bot] Jun 16, 2026
6d5645a
feat: add --only flag for install, enable-all/disable-all commands
devin-ai-integration[bot] Jun 16, 2026
579b836
fix: update test fixture paths to match new plugins/ directory conven…
devin-ai-integration[bot] Jun 16, 2026
57226e6
fix: core protection, alias resolution, ambiguity warnings, post-inst…
devin-ai-integration[bot] Jun 17, 2026
d105b49
fix: remove --container core examples from README and CLI help
devin-ai-integration[bot] Jun 17, 2026
d3b8e10
docs: update core protection section to match new CLI behavior
devin-ai-integration[bot] Jun 17, 2026
15cd4ca
fix: read backend priority from plugin.json manifest, not lifecycle m…
devin-ai-integration[bot] Jun 17, 2026
1689088
feat: add pluginDependencies for inter-plugin dependency tracking
devin-ai-integration[bot] Jun 17, 2026
2a54034
fix: remove incorrect Datasets dependency from Draw tool
devin-ai-integration[bot] Jun 17, 2026
fc5184b
feat: warn about missing/disabled plugin dependencies at build, start…
devin-ai-integration[bot] Jun 17, 2026
7c13fb4
feat: warn about missing plugin deps at build/startup/validate; fix e…
devin-ai-integration[bot] Jun 17, 2026
bbde11f
fix: add jsonError() to local-path install error paths
devin-ai-integration[bot] Jun 17, 2026
bd9a429
refactor: rename SegmentTool/ directory to Segment/ for consistency
devin-ai-integration[bot] Jun 17, 2026
70f80de
Move some tools out to go into the new MMGIS-Plugin repo
tariqksoliman Jun 17, 2026
70f1665
feat: add MMGIS-Plugins as default official registry
devin-ai-integration[bot] Jun 17, 2026
f4674e4
fix: isolate registry tests from pre-registered MMGIS-Plugins entry
devin-ai-integration[bot] Jun 17, 2026
fbaf870
Merge pull request #93 from JPL-Devin/devin/1781563383-plugin-ecosyst…
tariqksoliman Jun 17, 2026
b9e2a31
Bump version from 5.1.4-20260616 to 5.2.0-20260617
tariqksoliman Jun 17, 2026
9d64d3f
Bump version from 5.1.4-20260616 to 5.2.0-20260617
tariqksoliman Jun 17, 2026
f14e1b2
Add CurtainTool back to core
tariqksoliman Jun 18, 2026
5414aa0
fix: guard against undefined flatHierarchy in findChanges to prevent …
devin-ai-integration[bot] Jun 18, 2026
d7805f6
chore: bump version to 5.2.1-20260618 [version bump]
github-actions[bot] Jun 18, 2026
7b3d090
fix: pass verbose as options param instead of mutating req.query
devin-ai-integration[bot] Jun 18, 2026
d232f56
fix: replace req.query mutations in Geodatasets and Config routes
devin-ai-integration[bot] Jun 18, 2026
5e9f915
fix: add global error handlers to prevent server crashes
devin-ai-integration[bot] Jun 18, 2026
db16b54
fix: exit after uncaughtException to avoid corrupted process state
devin-ai-integration[bot] Jun 18, 2026
c8f7a66
fix: also exit on unhandledRejection for consistent crash-and-restart…
devin-ai-integration[bot] Jun 18, 2026
9b304e0
test: add e2e tests for Geodatasets /get/:layer and Config /clone
devin-ai-integration[bot] Jun 18, 2026
0b69f92
Merge branch 'NASA-AMMOS:development' into development
tariqksoliman Jun 18, 2026
bedbcff
fix: handle empty files array in compile() to prevent hanging request
devin-ai-integration[bot] Jun 18, 2026
2de75b9
fix: geodataset test reads entries from correct response shape
devin-ai-integration[bot] Jun 18, 2026
f298030
revert: remove empty files.length === 0 handling in compile()
devin-ai-integration[bot] Jun 18, 2026
f4d2352
revert: remove process-level unhandledRejection and uncaughtException…
devin-ai-integration[bot] Jun 18, 2026
ae5e22e
docs: update README plugin section to reflect new plugin system and o…
devin-ai-integration[bot] Jun 18, 2026
56be145
docs: update plugin sections in README and Contributing to reflect ne…
devin-ai-integration[bot] Jun 18, 2026
8aa2ad2
chore: bump version to 5.2.1-20260618 [version bump]
github-actions[bot] Jun 18, 2026
c0ba6cb
Merge pull request #94 from JPL-Devin/devin/1781804139-fix-fh-undefin…
tariqksoliman Jun 18, 2026
f93a1d1
feat(plugins): rename remove to uninstall, use short registry name fo…
devin-ai-integration[bot] Jun 18, 2026
17ea197
chore: bump version to 5.2.2-20260618 [version bump]
github-actions[bot] Jun 18, 2026
8b3491e
Merge branch 'NASA-AMMOS:development' into development
tariqksoliman Jun 18, 2026
0ea6cbc
Merge branch 'development' into devin/1781820524-update-readme-plugins
tariqksoliman Jun 18, 2026
0074895
docs: update CONTRIBUTING.md to use uninstall instead of remove
devin-ai-integration[bot] Jun 18, 2026
a50cd4e
test: update pluginCliE2e tests to use uninstall instead of remove
devin-ai-integration[bot] Jun 18, 2026
13f811f
feat(plugins): use org--repo container naming for git installs
devin-ai-integration[bot] Jun 18, 2026
603bf43
fix(plugins): uninstall should not remove registry entries
devin-ai-integration[bot] Jun 18, 2026
d838ff2
test: fix registry cleanup to use org--repo name for git URLs
devin-ai-integration[bot] Jun 18, 2026
3c9d82a
feat(plugins): use relative paths in plugin.json
devin-ai-integration[bot] Jun 18, 2026
2bed4e5
fix(plugins): move core guard after name resolution in cmdUninstall
devin-ai-integration[bot] Jun 18, 2026
f90dfdd
fix(plugins): use separate map for pluginPaths, normalize separators
devin-ai-integration[bot] Jun 18, 2026
83ae5fa
fix(plugins): only record pluginPath after successful registration
devin-ai-integration[bot] Jun 18, 2026
ac77ea7
Merge pull request #95 from JPL-Devin/devin/1781820524-update-readme-…
tariqksoliman Jun 18, 2026
b4d2729
Merge branch 'NASA-AMMOS:development' into development
tariqksoliman Jun 18, 2026
9db9710
fix: DrawTool Review panel hidden by tool panel overflow/backdrop-filter
devin-ai-integration[bot] Jun 18, 2026
b0298ff
chore: bump version to 5.2.3-20260618 [version bump]
github-actions[bot] Jun 18, 2026
6b96789
feat: widen tool panel to 390px during Review, restore on close
devin-ai-integration[bot] Jun 19, 2026
f4cd91b
chore: bump version to 5.2.4-20260619 [version bump]
github-actions[bot] Jun 19, 2026
1f9104c
fix: copy plugins/ directory into Docker runtime stage
devin-ai-integration[bot] Jun 19, 2026
59cfd17
chore: bump version to 5.2.3-20260619 [version bump]
github-actions[bot] Jun 19, 2026
c92e146
fix: directly set toolPanel DOM width alongside store update
devin-ai-integration[bot] Jun 19, 2026
4302f87
style: update drawToolShapesModeMessage styling
devin-ai-integration[bot] Jun 19, 2026
a58591d
Merge pull request #97 from JPL-Devin/devin/1781827624-dockerfile-cop…
tariqksoliman Jun 19, 2026
9c963a7
Merge branch 'NASA-AMMOS:development' into development
tariqksoliman Jun 19, 2026
da82bf6
Merge branch 'development' into devin/1781826091-fix-drawtool-review-…
tariqksoliman Jun 19, 2026
fa660ff
fix: restore tool panel width when DrawTool is destroyed while review…
devin-ai-integration[bot] Jun 19, 2026
e56fdf5
fix: remove inline background/color styles from drawToolShapesModeMes…
devin-ai-integration[bot] Jun 19, 2026
fd9f8fe
Merge pull request #96 from JPL-Devin/devin/1781826091-fix-drawtool-r…
tariqksoliman Jun 19, 2026
62522ee
Merge branch 'NASA-AMMOS:development' into development
tariqksoliman Jun 19, 2026
0f1cea2
security: harden CI permissions, validate geodataset _source, strip a…
devin-ai-integration[bot] Jun 22, 2026
501f1ba
chore: bump version to 5.2.5-20260622 [version bump]
github-actions[bot] Jun 22, 2026
6c4f067
refactor: use Utils.forceAlphaNumUnder for _source validation
devin-ai-integration[bot] Jun 22, 2026
b6a7735
test: update logger-sanitization tests to match hardened sanitizeForLog
devin-ai-integration[bot] Jun 22, 2026
081ee71
security: Fix 1 XSS prevention, forceAlphaNumUnder allowList, review …
devin-ai-integration[bot] Jun 22, 2026
44bbb3e
fix: sanitize existing tag/folder rendering paths in DrawTool_Files.js
devin-ai-integration[bot] Jun 22, 2026
8d23f2c
fix: allow hyphens in _source property names for geodataset queries
devin-ai-integration[bot] Jun 22, 2026
7486ab0
Merge pull request #98 from JPL-Devin/devin/1782155883-security-fixes…
tariqksoliman Jun 22, 2026
41e15da
Merge branch 'NASA-AMMOS:development' into development
tariqksoliman Jun 22, 2026
db304e1
Merge branch 'NASA-AMMOS:development' into development
tariqksoliman Jun 25, 2026
38a2e64
fix: use Dropy globalConstruct for filter operator dropdowns to preve…
devin-ai-integration[bot] Jun 25, 2026
d03b0a9
chore: bump version to 5.2.6-20260625 [version bump]
github-actions[bot] Jun 25, 2026
abdba18
fix: update inline title span on selection in globalConstruct onChange
devin-ai-integration[bot] Jun 25, 2026
27a69a3
fix: dynamic globalConstruct for correct selection highlight + DOM cl…
devin-ai-integration[bot] Jun 25, 2026
ce6bb14
fix: clean up _global dropdown elements in destroy() and Clear Filter
devin-ai-integration[bot] Jun 25, 2026
3c2203f
fix: set z-index 10000 on globalConstruct dropdown overlay
devin-ai-integration[bot] Jun 25, 2026
4723f6e
fix: smart open direction, close on scroll, and empty on outside click
devin-ai-integration[bot] Jun 25, 2026
68c4f8c
fix: remove openUp class when opening downward so translateY(-100%) d…
devin-ai-integration[bot] Jun 25, 2026
6683057
revert: undo all Dropy globalConstruct changes
devin-ai-integration[bot] Jun 29, 2026
4d56e3c
feat: replace Dropy dropdowns with custom OpGridSelector grid component
devin-ai-integration[bot] Jun 29, 2026
86ed1c2
chore: bump version to 5.2.7-20260629 [version bump]
github-actions[bot] Jun 29, 2026
2441ec2
fix: set value operator width to 30px, change grid to 5x2
devin-ai-integration[bot] Jun 29, 2026
9587321
Merge pull request #100 from JPL-Devin/devin/1782411357-fix-filtering…
tariqksoliman Jun 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion configure/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "configure",
"version": "5.2.5-20260622",
"version": "5.2.7-20260629",
"homepage": "./configure/build",
"private": true,
"dependencies": {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "mmgis",
"version": "5.2.5-20260622",
"version": "5.2.7-20260629",
"description": "A web-based mapping and localization solution for science operation on planetary missions.",
"homepage": "build",
"repository": {
Expand Down
29 changes: 1 addition & 28 deletions src/essence/Basics/Layers_/Filtering/Filtering.css
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@
}
.layersTool_filtering_value_operator {
box-sizing: border-box;
width: 30px;
}
.layersTool_filtering_value .layersTool_filtering_value_value {
flex: 1;
Expand Down Expand Up @@ -264,14 +265,6 @@
.layersTool_filtering_group_operator_select.op_not_or {
background: var(--color-p4);
}
.layersTool_filtering_group_operator_select .dropy__title span {
padding: 4px 0px !important;
width: 100%;
font-size: 12px;
font-weight: bold;
letter-spacing: 1px;
text-align: center !important;
}

.layersTool_filtering_value_operator_select:hover {
background: var(--color-a2);
Expand Down Expand Up @@ -301,26 +294,6 @@
background: #fffb80;
}

#layersTool_filtering .dropy,
#layersTool_filtering .dropy__title {
height: 30px;
border: none;
}
#layersTool_filtering .dropy__title span {
padding: 6px;
}
#layersTool_filtering .dropy .dropy__content li a {
padding: 6px;
border-top: 1px solid var(--color-m);
margin-bottom: 0px;
height: 30px;
}
#layersTool_filtering .dropy__content .dropy__header {
display: none;
}
#layersTool_filtering .dropy__content ul {
transition: none;
}

#layersTool_filtering_submit_loading {
display: none;
Expand Down
112 changes: 42 additions & 70 deletions src/essence/Basics/Layers_/Filtering/Filtering.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import ESFilterer from './ESFilterer'
import GeodatasetFilterer from './GeodatasetFilterer'

import Help from '../../UserInterface_/components/Help/Help'
import Dropy from '../../../../external/Dropy/dropy'
import OpGridSelector from './OpGridSelector'
import { circle } from '@turf/turf'

import Sortable from 'sortablejs'
Expand Down Expand Up @@ -191,6 +191,7 @@ const Filtering = {
destroy: function () {
// Clear Spatial Filter
Map_.rmNotNull(Filtering.mapSpatialLayer)
OpGridSelector.destroy()

$('#layersTool_filtering').remove()
},
Expand Down Expand Up @@ -520,58 +521,31 @@ const Filtering = {
Filtering.setSubmitButtonState(true)
})

// Operator Dropdown
// Operator Grid Selector
elmId = `#layersTool_filtering_group_operator_${F_.getSafeName(
layerName
)}_${id}`

const ops = ['AND', 'OR', 'NOT_AND', 'NOT_OR']
const opId = Math.max(ops.indexOf(options.op), 0)
$(elmId).html(
Dropy.construct(
[
`<div style='font-family: monospace;'>All Must Match (AND)</div>`,
`<div style='font-family: monospace;'>Any May Match (OR)</div>`,
`<div style='font-family: monospace;'>Not All May Match (NOT AND)</div>`,
`<div style='font-family: monospace;'>None Must Match (NOT OR)</div>`,
],
'op',
opId,
{ openUp: true, hideChevron: true }
)
)
Dropy.init($(elmId), function (idx) {
const newOp = ops[idx]
Filtering.filters[layerName].values[id].op = newOp
switch (newOp) {
case 'AND':
$(elmId).removeClass('op_or')
$(elmId).removeClass('op_not_and')
$(elmId).removeClass('op_not_or')
$(elmId).addClass('op_and')
break
case 'OR':
$(elmId).removeClass('op_and')
$(elmId).removeClass('op_not_and')
$(elmId).removeClass('op_not_or')
$(elmId).addClass('op_or')
break
case 'NOT_AND':
$(elmId).removeClass('op_and')
$(elmId).removeClass('op_or')
$(elmId).removeClass('op_not_or')
$(elmId).addClass('op_not_and')
break
case 'NOT_OR':
$(elmId).removeClass('op_and')
$(elmId).removeClass('op_or')
$(elmId).removeClass('op_not_and')
$(elmId).addClass('op_not_or')
break
default:
break
}
Filtering.setSubmitButtonState(true)

const groupOpItems = [
{ html: `<div style='font-family: monospace; font-size: 11px; white-space: nowrap;'>AND</div>`, title: 'All Must Match (AND)' },
{ html: `<div style='font-family: monospace; font-size: 11px; white-space: nowrap;'>OR</div>`, title: 'Any May Match (OR)' },
{ html: `<div style='font-family: monospace; font-size: 11px; white-space: nowrap;'>NAND</div>`, title: 'Not All May Match (NOT AND)' },
{ html: `<div style='font-family: monospace; font-size: 11px; white-space: nowrap;'>NOR</div>`, title: 'None Must Match (NOT OR)' },
]

OpGridSelector.init($(elmId), groupOpItems, opId, {
columns: 4,
onSelect: function (idx) {
const newOp = ops[idx]
Filtering.filters[layerName].values[id].op = newOp
$(elmId)
.removeClass('op_and op_or op_not_and op_not_or')
.addClass('op_' + newOp.toLowerCase())
Filtering.setSubmitButtonState(true)
},
})
},
attachValueEvents: function (id, layerName, options) {
Expand Down Expand Up @@ -696,7 +670,7 @@ const Filtering = {
} else $(this).css('border', '1px solid var(--color-p4)')
})

// Operator Dropdown
// Operator Grid Selector
elmId = `#layersTool_filtering_value_operator_${F_.getSafeName(
layerName
)}_${id}`
Expand All @@ -714,28 +688,26 @@ const Filtering = {
'endswith',
]
const opId = Math.max(ops.indexOf(options.op), 0)
$(elmId).html(
Dropy.construct(
[
`<i class='mdi mdi-equal mdi-18px' title='Equals'></i>`,
`<div title='Not Equals' style='font-family: monospace;'>!=</div>`,
`<div title='Comma-separated list' style='font-family: monospace;'>in</div>`,
`<i class='mdi mdi-less-than mdi-18px' title='Less than'></i>`,
`<i class='mdi mdi-greater-than mdi-18px' title='Greater than'></i>`,
`<i class='mdi mdi-less-than-or-equal mdi-18px' title='Less than or Equal'></i>`,
`<i class='mdi mdi-greater-than-or-equal mdi-18px' title='Greater than or Equal'></i>`,
`<i class='mdi mdi-contain mdi-18px' title='Contains'></i>`,
`<i class='mdi mdi-contain-start mdi-18px' title='Begins With'></i>`,
`<i class='mdi mdi-contain-end mdi-18px' title='Ends With'></i>`,
],
'op',
opId,
{ openUp: true, hideChevron: true }
)
)
Dropy.init($(elmId), function (idx) {
Filtering.filters[layerName].values[id].op = ops[idx]
Filtering.setSubmitButtonState(true)

const valueOpItems = [
{ html: `<i class='mdi mdi-equal mdi-18px'></i>`, title: 'Equals' },
{ html: `<div style='font-family: monospace;'>!=</div>`, title: 'Not Equals' },
{ html: `<div style='font-family: monospace;'>in</div>`, title: 'Comma-separated list' },
{ html: `<i class='mdi mdi-less-than mdi-18px'></i>`, title: 'Less than' },
{ html: `<i class='mdi mdi-greater-than mdi-18px'></i>`, title: 'Greater than' },
{ html: `<i class='mdi mdi-less-than-or-equal mdi-18px'></i>`, title: 'Less than or Equal' },
{ html: `<i class='mdi mdi-greater-than-or-equal mdi-18px'></i>`, title: 'Greater than or Equal' },
{ html: `<i class='mdi mdi-contain mdi-18px'></i>`, title: 'Contains' },
{ html: `<i class='mdi mdi-contain-start mdi-18px'></i>`, title: 'Begins With' },
{ html: `<i class='mdi mdi-contain-end mdi-18px'></i>`, title: 'Ends With' },
]

OpGridSelector.init($(elmId), valueOpItems, opId, {
columns: 5,
onSelect: function (idx) {
Filtering.filters[layerName].values[id].op = ops[idx]
Filtering.setSubmitButtonState(true)
},
})

// Value AutoComplete
Expand Down
45 changes: 45 additions & 0 deletions src/essence/Basics/Layers_/Filtering/OpGridSelector.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
.op-grid-trigger {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
cursor: pointer;
transition: background 0.2s cubic-bezier(0.785, 0.135, 0.15, 0.86);
}
.op-grid-trigger:hover {
background: var(--color-a3);
}

.op-grid-popup {
display: grid;
background: var(--color-a1);
border: 1px solid var(--color-a4);
border-radius: 3px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
padding: 2px;
gap: 1px;
}

.op-grid-item {
display: flex;
align-items: center;
justify-content: center;
height: 28px;
min-width: 28px;
padding: 2px 6px;
cursor: pointer;
border-radius: 2px;
color: var(--color-f);
transition: background 0.1s ease;
}
.op-grid-item:hover {
background: var(--color-a4);
}
.op-grid-item--selected {
background: var(--color-c);
font-weight: bold;
}
.op-grid-item--selected:hover {
background: var(--color-c2);
}
131 changes: 131 additions & 0 deletions src/essence/Basics/Layers_/Filtering/OpGridSelector.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
// Compact grid-based operator selector for the Filtering tool.
// Renders a trigger button showing the current selection and a
// fixed-position popup grid that escapes ancestor overflow clipping.

import $ from 'jquery'

import './OpGridSelector.css'

let activePopup = null
let scrollHandler = null
let clickHandler = null

function closeActivePopup() {
if (activePopup) {
activePopup.remove()
activePopup = null
}
if (scrollHandler) {
document.removeEventListener('scroll', scrollHandler, true)
scrollHandler = null
}
if (clickHandler) {
document.removeEventListener('mousedown', clickHandler, true)
clickHandler = null
}
}

/**
* Initialize an operator grid selector.
* @param {jQuery} $container - The container element to render into
* @param {Array} items - Array of { html, title } for each grid cell
* @param {number} selectedIdx - Initially selected index
* @param {object} opts - { columns, onSelect }
* columns: number of grid columns (default 4)
* onSelect(idx): callback fired when an item is selected
*/
function init($container, items, selectedIdx, opts = {}) {
const columns = opts.columns || 4
const onSelect = opts.onSelect || (() => {})

let currentIdx = selectedIdx

// Render trigger button showing current selection
const triggerHtml = `<div class="op-grid-trigger">${items[currentIdx].html}</div>`
$container.html(triggerHtml)

const $trigger = $container.find('.op-grid-trigger')

$trigger.on('click', function (e) {
e.stopPropagation()

// If this popup is already open, close it
if (activePopup && activePopup.data('owner') === $container[0]) {
closeActivePopup()
return
}

// Close any other open popup
closeActivePopup()

// Build grid popup
let gridHtml = `<div class="op-grid-popup" style="grid-template-columns: repeat(${columns}, 1fr);">`
for (let i = 0; i < items.length; i++) {
const selectedClass = i === currentIdx ? ' op-grid-item--selected' : ''
gridHtml += `<div class="op-grid-item${selectedClass}" data-idx="${i}" title="${items[i].title}">${items[i].html}</div>`
}
gridHtml += '</div>'

const $popup = $(gridHtml)
$popup.data('owner', $container[0])
$('body').append($popup)
activePopup = $popup

// Position: fixed relative to trigger
const bcr = $trigger[0].getBoundingClientRect()
const openDown = bcr.top < window.innerHeight / 2

$popup.css({
position: 'fixed',
left: bcr.left,
zIndex: 10000,
})

if (openDown) {
$popup.css('top', bcr.bottom + 2)
} else {
// Measure popup height then position above trigger
$popup.css({ top: 0, visibility: 'hidden' })
const popupHeight = $popup.outerHeight()
$popup.css({
top: bcr.top - popupHeight - 2,
visibility: 'visible',
})
}

// Item click
$popup.on('click', '.op-grid-item', function () {
const idx = parseInt($(this).attr('data-idx'), 10)
currentIdx = idx
$trigger.html(items[idx].html)
onSelect(idx)
closeActivePopup()
})

// Close on scroll (capture phase catches nested scrollables)
scrollHandler = () => closeActivePopup()
document.addEventListener('scroll', scrollHandler, true)

// Close on outside click
clickHandler = (evt) => {
if (
activePopup &&
!activePopup[0].contains(evt.target) &&
!$trigger[0].contains(evt.target)
) {
closeActivePopup()
}
}
// Delay to avoid catching the current click
setTimeout(() => {
document.addEventListener('mousedown', clickHandler, true)
}, 0)
})
}

// Clean up any open popup (call on destroy)
function destroy() {
closeActivePopup()
}

export default { init, destroy }
Loading