Skip to content

Commit 3a30133

Browse files
Merge branch 'development' into development
2 parents 4fdf12a + 25b35e5 commit 3a30133

File tree

5 files changed

+112
-33
lines changed

5 files changed

+112
-33
lines changed

AGENTS.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# MMGIS - AI Agent Context
22

33
**Project**: MMGIS (Multi-Mission Geographic Information System)
4-
**Version**: 4.2.34
5-
**Last Updated**: 2026-04-01
4+
**Version**: 4.3.0
5+
**Last Updated**: 2026-04-07
66

77
## Important Instructions
88

CHANGELOG.md

Lines changed: 71 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,82 @@
44

55
_TBD_
66

7+
## 4.2.34
8+
9+
_April 2, 2026_
10+
11+
#### Summary
12+
13+
This release introduces beta CesiumJS integration as an alternative 3D globe renderer, a new Plugin Components system for extensible UI behaviors, and a Playwright-based end-to-end testing framework. The DrawTool gains DynamicExtent for viewport-based feature loading and a new Point template type. AnimationTool receives multiple improvements and STAC URL fixes. TimeControl is promoted to core infrastructure under Basics. New API callbacks and events expand extensibility (newActiveFeature, layersToolHeaderStateChange, madeLegendTool, viewer_open). Mobile mode sees significant improvements including configurable initial zoom, layout fixes, and a responsive login page. Security hardening includes adjacent servers placed behind authentication, npm audit fixes, and multiple vulnerability patches. The codebase is cleaned up with D3 largely removed, legacy scripts and files pruned, and an improved Dockerfile. Two new open-source components are released: AnalysisTool and OperationsClock.
14+
15+
#### Added
16+
17+
- Beta CesiumJS integration as an alternative 3D globe renderer (#810)
18+
- Plugin Components system for lightweight, extensible UI behaviors (#849)
19+
- AnalysisTool and OperationsClock released as open-source components (#904)
20+
- Playwright end-to-end testing framework (#216)
21+
- DrawTool DynamicExtent for viewport-based feature loading (#852)
22+
- DrawTool Template for Point type (#843)
23+
- DrawTool endpoint support via long-term tokens (#841)
24+
- TiTiler layer support in Cesium Globe (#898)
25+
- External MMGIS STAC catalog linking (#863)
26+
- viewer_open as a new layer Kind (#855)
27+
- Configurable initial zoom for mobile mode (#866)
28+
- Latitude/Longitude option in coordinates display (#905)
29+
- Callback for layersToolHeaderStateChange (#846)
30+
- Callback for madeLegendTool (#858)
31+
- Additional newActiveFeature events (#845)
32+
- Font types as webpack assets (#874)
33+
- AGENTS.md and spec-kit for AI development (#828)
34+
- .gitattributes file (#901)
35+
736
#### Changed
837

9-
- Moved TimeControl from `Ancillary/` to `Basics/TimeControl_/` to reflect its role as core infrastructure (#835)
10-
- TimeControl and TimeUI now located in `src/essence/Basics/TimeControl_/`
11-
- Updated import paths across 19 files
12-
- **Breaking change for external plugins**: Import path changed from `'Ancillary/TimeControl'` to `'Basics/TimeControl_/TimeControl'`
13-
- Moved admin login assets from `config/login/` to `public/` directory
14-
- `adminlogin.js` and `adminlogin.css` now served from `/public`
38+
- Moved TimeControl from Ancillary/ to Basics/TimeControl\_/ to reflect its role as core infrastructure (#835)
39+
- Breaking change for external plugins: Import path changed from 'Ancillary/TimeControl' to 'Basics/TimeControl\_/TimeControl'
40+
- Removed D3 dependency (mostly) (#826)
41+
- Improved Dockerfile with multi-stage build and reduced image size (#868)
42+
- Upgraded all adjacent servers and sample ENVs (#897)
43+
- Updated time and timetype metaconfigurations (#891)
44+
- Removed redundant urlencoded middleware (#888)
45+
- AnimationTool improvements including playback and UI enhancements (#856)
46+
- Updated GitHub workflow: docker-build.yml (#917)
47+
- Updated README.md (#913)
48+
49+
#### Fixed
50+
51+
- LegendTool overflow (#848)
52+
- Viewer and globe splitter icons (#850)
53+
- Time and Refresh Interval enabled layers incorrectly set to layernotfound (#853)
54+
- AnimationTool STAC URLs (#860, #861, #867)
55+
- Return value for layersToolHeaderStateChange event (#862)
56+
- Bug in viewer_open kind (#865, #882)
57+
- titiler-pgstac performance issue (#870)
58+
- DynamicExtent + Threshold layers not properly updating (#871)
59+
- Multiple mobile mode layout and interaction issues (#875, #878)
60+
- Login page layout on smaller screens (#883)
61+
- Initial Start and End Time configuration parameters (#886)
62+
- Time Type = Local and Refresh Interval not working together (#889)
63+
- queryTilesetTimes not updating on layer toggles (#892)
64+
- DrawTool bugs: template field naming, not-null advanced filters (#895)
65+
- DrawTool Templated Point origin point getting stuck (#909)
66+
- updateClampedRasterForLayer is not a function error (#907)
67+
- Image loading in OpenSeadragon (#899)
68+
- Missions middleware (#914)
69+
- Hover Feature Label and Layer Tags wrongly assigned (#915)
70+
- Critical security vulnerabilities (#880, #884)
1571

1672
#### Removed
1773

18-
- Legacy jQuery/Materialize configure page and `/configure-legacy` route (#830)
19-
- Removed entire `config/` directory (css, js, fonts, pre, login subdirectories)
20-
- Removed `views/configure.pug` template
21-
- Use `/configure` for React-based configure interface
22-
- `database/` directory - Old Docker Postgres migration/upgrade scripts
23-
- `src/essence/Tools/_OLD/` directory (Distance, FileManager, Query, Search, Sketch tools)
24-
- `Dockerfile.legacy` (superseded by main Dockerfile)
74+
- Legacy jQuery/Materialize configure page and /configure-legacy route (#830)
75+
- database/ directory containing old Docker Postgres migration scripts (#830)
76+
- src/essence/Tools/\_OLD/ directory (#830)
77+
- Dockerfile.legacy (#830)
78+
79+
#### Security
80+
81+
- npm audit fix (unforced) (#832)
82+
- Adjacent servers placed behind authentication (#911)
2583

2684
## 4.1.0
2785

configure/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "configure",
3-
"version": "4.2.38-20260408",
3+
"version": "4.3.1-20260408",
44
"homepage": "./configure/build",
55
"private": true,
66
"dependencies": {

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mmgis",
3-
"version": "4.2.38-20260408",
3+
"version": "4.3.1-20260408",
44
"description": "A web-based mapping and localization solution for science operation on planetary missions.",
55
"homepage": "build",
66
"repository": {

src/essence/Tools/Layers/LayersTool.js

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,11 @@ var LayersTool = {
143143
}
144144

145145
if (L_.UserInterface_.isMobile === true) {
146-
const mapRect = document.getElementById('map').getBoundingClientRect()
146+
const mapRect = document
147+
.getElementById('map')
148+
.getBoundingClientRect()
147149
this.width = 'full'
148-
this.height = Math.round(mapRect.height * 0.70)
150+
this.height = Math.round(mapRect.height * 0.7)
149151
}
150152
},
151153
finalize: function () {
@@ -286,12 +288,15 @@ var LayersTool = {
286288
},
287289
populateCogScale: function (layerName) {
288290
let layer = L_.asLayerUUID(layerName)
291+
if (layer == null) return
289292
let units = ''
290293
layer = L_.layers.data[layer]
294+
if (layer == null) return
291295
if (L_.layers.layer[layer.name] === null) return
292296

293297
// data layers use demtileurl; other layers use url
294298
const layerUrl = layer.url || layer.demtileurl || ''
299+
if (typeof layerUrl !== 'string') return
295300
if (
296301
!layerUrl.startsWith('stac-collection:') &&
297302
!layerUrl.startsWith('COG:') &&
@@ -500,20 +505,18 @@ function interfaceWithMMGIS(fromInit) {
500505
separateFromMMGIS()
501506
}
502507

503-
const divID = L_.UserInterface_.isMobile === true ? '#tools' : '#toolPanel'
508+
const divID = L_.UserInterface_.isMobile === true ? '#tools' : '#toolPanel'
504509

505510
const toolsContainer = $(divID)
506511
//Clear it
507512
toolsContainer.empty()
508513
//Add a semantic container
509-
const tools = $('<div>')
510-
.attr('id', 'layersTool')
511-
.css({
512-
'display': 'flex',
513-
'flex-flow': 'column',
514-
'overflow': 'hidden',
515-
'height': '100%'
516-
})
514+
const tools = $('<div>').attr('id', 'layersTool').css({
515+
display: 'flex',
516+
'flex-flow': 'column',
517+
overflow: 'hidden',
518+
height: '100%',
519+
})
517520
toolsContainer.append(tools)
518521

519522
if (fromInit) tools.css('display', 'none')
@@ -993,7 +996,11 @@ function interfaceWithMMGIS(fromInit) {
993996
additionalSettings = ''
994997
const shader = F_.getIn(node[i], 'variables.shader')
995998

996-
if (shader && DataShaders[shader.type] && typeof DataShaders[shader.type].getHTML === 'function') {
999+
if (
1000+
shader &&
1001+
DataShaders[shader.type] &&
1002+
typeof DataShaders[shader.type].getHTML === 'function'
1003+
) {
9971004
// prettier-ignore
9981005
additionalSettings = [
9991006
DataShaders[shader.type].getHTML(node[i].name, shader)
@@ -2714,7 +2721,11 @@ function interfaceWithMMGIS(fromInit) {
27142721
$('#searchLayers > #collapse').click()
27152722

27162723
// Expand individual headers based on its configuration settings
2717-
LayersTool.traverseHeaderLayersExpandedState(L_.configData.layers, {}, 0)
2724+
LayersTool.traverseHeaderLayersExpandedState(
2725+
L_.configData.layers,
2726+
{},
2727+
0
2728+
)
27182729
})
27192730

27202731
$('#filterLayers .right > div').on('click', function () {
@@ -2960,7 +2971,11 @@ function interfaceWithMMGIS(fromInit) {
29602971
if (LayersTool.vars.expanded !== true) {
29612972
$('#searchLayers > #collapse').click()
29622973
// Expand individual headers based on its configuration settings
2963-
LayersTool.traverseHeaderLayersExpandedState(L_.configData.layers, {}, 0)
2974+
LayersTool.traverseHeaderLayersExpandedState(
2975+
L_.configData.layers,
2976+
{},
2977+
0
2978+
)
29642979
}
29652980

29662981
// Sublayer things
@@ -3166,12 +3181,18 @@ function interfaceWithMMGIS(fromInit) {
31663181
}
31673182
}
31683183

3169-
document.addEventListener('layerRefreshStatusChanged', handleRefreshStatusChange)
3184+
document.addEventListener(
3185+
'layerRefreshStatusChanged',
3186+
handleRefreshStatusChange
3187+
)
31703188

31713189
//Share everything. Don't take things that aren't yours.
31723190
// Put things back where you found them.
31733191
function separateFromMMGIS() {
3174-
document.removeEventListener('layerRefreshStatusChanged', handleRefreshStatusChange)
3192+
document.removeEventListener(
3193+
'layerRefreshStatusChanged',
3194+
handleRefreshStatusChange
3195+
)
31753196
}
31763197
}
31773198

0 commit comments

Comments
 (0)