diff --git a/config/js/config.js b/config/js/config.js index 1b81e827..0b25e778 100644 --- a/config/js/config.js +++ b/config/js/config.js @@ -889,7 +889,7 @@ function makeLayerBarAndModal(d, level) { dataSel = "selected"; break; case "query": - barColor = "#0fbd4d"; + barColor = "#62bd0f"; querySel = "selected"; break; case "vector": diff --git a/package-lock.json b/package-lock.json index abf10834..7cc0466b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,14 +61,13 @@ "jest-resolve": "24.9.0", "jest-watch-typeahead": "0.4.2", "jquery": "^3.5.1", - "lithosphere": "^1.2.1", + "lithosphere": "^1.3.0", "mark.js": "^8.11.1", "memorystore": "^1.6.2", "mini-css-extract-plugin": "0.9.0", "nipplejs": "^0.8.5", "node-fetch": "^2.6.1", "node-schedule": "^1.3.2", - "openseadragon": "^2.4.2", "optimize-css-assets-webpack-plugin": "5.0.3", "pg-promise": "^10.6.1", "png-js": "^1.0.0", @@ -11884,15 +11883,15 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "node_modules/lithosphere": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/lithosphere/-/lithosphere-1.2.1.tgz", - "integrity": "sha512-Vx4Xx4ZPfK3thjGhcGHKQ4D7IIoVPZbfokVWSQHtrLbnJoo7TmafpVOseBYAIGLRgXnL+Qrx3fMLmOLSnLaqww==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/lithosphere/-/lithosphere-1.3.0.tgz", + "integrity": "sha512-At+QPHC2P4PcTfCW93H7KnxpBaLeWoAJM98yrXl8TvdVY4v/5jvISvbXpi/JI0Tniz8XXm93MPjIM9DHUf/aag==", "dependencies": { "@turf/boolean-intersects": "^6.3.0", "@turf/circle": "^6.3.0", "3d-tiles-renderer": "^0.2.6", "proj4": "^2.7.0", - "three": "^0.125.2" + "three": ">=0.122.0" }, "peerDependencies": { "three": ">=0.122.0" @@ -13187,11 +13186,6 @@ "node": ">=8" } }, - "node_modules/openseadragon": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/openseadragon/-/openseadragon-2.4.2.tgz", - "integrity": "sha512-398KbZwRtOYA6OmeWRY4Q0737NTacQ9Q6whmr9Lp1MNQO3p0eBz5LIASRne+4gwequcSM1vcHcjfy3dIndQziw==" - }, "node_modules/opn": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", @@ -17990,9 +17984,9 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "node_modules/three": { - "version": "0.125.2", - "resolved": "https://registry.npmjs.org/three/-/three-0.125.2.tgz", - "integrity": "sha512-7rIRO23jVKWcAPFdW/HREU2NZMGWPBZ4XwEMt0Ak0jwLUKVJhcKM55eCBWyGZq/KiQbeo1IeuAoo/9l2dzhTXA==" + "version": "0.138.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.138.0.tgz", + "integrity": "sha512-xM/WwUd53ClkbHFrftW29aIzMVvyhj4rSZmIVgn6hZ/kYB7aMjDD8FFy4VJamygXSrldJuOgEJuaI+E+8mt/KA==" }, "node_modules/throat": { "version": "4.1.0", @@ -30277,15 +30271,15 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "lithosphere": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/lithosphere/-/lithosphere-1.2.1.tgz", - "integrity": "sha512-Vx4Xx4ZPfK3thjGhcGHKQ4D7IIoVPZbfokVWSQHtrLbnJoo7TmafpVOseBYAIGLRgXnL+Qrx3fMLmOLSnLaqww==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/lithosphere/-/lithosphere-1.3.0.tgz", + "integrity": "sha512-At+QPHC2P4PcTfCW93H7KnxpBaLeWoAJM98yrXl8TvdVY4v/5jvISvbXpi/JI0Tniz8XXm93MPjIM9DHUf/aag==", "requires": { "@turf/boolean-intersects": "^6.3.0", "@turf/circle": "^6.3.0", "3d-tiles-renderer": "^0.2.6", "proj4": "^2.7.0", - "three": "^0.125.2" + "three": ">=0.122.0" } }, "load-json-file": { @@ -31380,11 +31374,6 @@ } } }, - "openseadragon": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/openseadragon/-/openseadragon-2.4.2.tgz", - "integrity": "sha512-398KbZwRtOYA6OmeWRY4Q0737NTacQ9Q6whmr9Lp1MNQO3p0eBz5LIASRne+4gwequcSM1vcHcjfy3dIndQziw==" - }, "opn": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", @@ -35359,9 +35348,9 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "three": { - "version": "0.125.2", - "resolved": "https://registry.npmjs.org/three/-/three-0.125.2.tgz", - "integrity": "sha512-7rIRO23jVKWcAPFdW/HREU2NZMGWPBZ4XwEMt0Ak0jwLUKVJhcKM55eCBWyGZq/KiQbeo1IeuAoo/9l2dzhTXA==" + "version": "0.138.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.138.0.tgz", + "integrity": "sha512-xM/WwUd53ClkbHFrftW29aIzMVvyhj4rSZmIVgn6hZ/kYB7aMjDD8FFy4VJamygXSrldJuOgEJuaI+E+8mt/KA==" }, "throat": { "version": "4.1.0", diff --git a/package.json b/package.json index eabdd152..4f27c2e6 100644 --- a/package.json +++ b/package.json @@ -95,14 +95,13 @@ "jest-resolve": "24.9.0", "jest-watch-typeahead": "0.4.2", "jquery": "^3.5.1", - "lithosphere": "^1.2.1", + "lithosphere": "^1.3.0", "mark.js": "^8.11.1", "memorystore": "^1.6.2", "mini-css-extract-plugin": "0.9.0", "nipplejs": "^0.8.5", "node-fetch": "^2.6.1", "node-schedule": "^1.3.2", - "openseadragon": "^2.4.2", "optimize-css-assets-webpack-plugin": "5.0.3", "pg-promise": "^10.6.1", "png-js": "^1.0.0", diff --git a/src/css/mmgis.css b/src/css/mmgis.css index c20cc68b..8f2ce009 100644 --- a/src/css/mmgis.css +++ b/src/css/mmgis.css @@ -32,11 +32,11 @@ body { /*Color variables*/ :root { - --color-mmgis: #26a8ff; + --color-mmgis: #08aeea; --color-a: #010102; /*#1f1f1f;*/ --color-a1: #1f1f1f; --color-b: #555555; - --color-c: #009eff; + --color-c: #08aeea; --color-d: #2a2a2a; --color-e: #4f4f4f; --color-f: #e1e1e1; @@ -71,6 +71,18 @@ body { --color-r5: #00b7c7; --color-r6: #8be04e; --color-r7: #ebdc78; + + --color-p0: #bdbd0f; + --color-p1: #c0822f; + --color-p2: #ffeaaf; + --color-p3: #62bd0f; + --color-p4: #bd0f32; + --color-p5: #edd49e; + --color-p6: #e7bdcb; + --color-p7: #72d1cb; + --color-p8: #08aeea; + --color-p9: #770fbd; + --color-p10: #bd0f8e; } #nodeenv { @@ -299,7 +311,7 @@ body { width: 20px !important; height: 20px !important; color: #ffffff !important; - background: #26a8ff !important; + background: var(--color-mmgis) !important; } .leaflet-popup-content { margin: 1px 7px 1px 7px; diff --git a/src/css/mmgisUI.css b/src/css/mmgisUI.css index c372f011..dd4d58da 100644 --- a/src/css/mmgisUI.css +++ b/src/css/mmgisUI.css @@ -914,6 +914,9 @@ blink { .slider2.darker { background: var(--color-a); } +.slider2.lighter { + background: var(--color-m1); +} .slider2:hover { opacity: 1; diff --git a/src/essence/Basics/Formulae_/Formulae_.js b/src/essence/Basics/Formulae_/Formulae_.js index d2b9741b..ce046bc9 100644 --- a/src/essence/Basics/Formulae_/Formulae_.js +++ b/src/essence/Basics/Formulae_/Formulae_.js @@ -34,9 +34,12 @@ var Formulae_ = { } }, getExtension: function (string) { - var ex = /(?:\.([^.]+))?$/.exec(string)[1] + const ex = /(?:\.([^.]+))?$/.exec(string)[1] return ex || '' }, + fileNameFromPath: function (path) { + return path.replace(/^.*[\\\/]/, '').replace(/\.[^/.]+$/, '') + }, pad: function (num, size) { let s = '000000000000000000000000000000' + num return s.substr(s.length - size) diff --git a/src/essence/Basics/Layers_/Layers_.js b/src/essence/Basics/Layers_/Layers_.js index 3e5792fe..5d0c861b 100644 --- a/src/essence/Basics/Layers_/Layers_.js +++ b/src/essence/Basics/Layers_/Layers_.js @@ -78,6 +78,7 @@ var L_ = { searchFile: null, toolsLoaded: false, addedfiles: {}, //filename -> null (not null if added) + activeFeature: null, lastActivePoint: { layerName: null, lat: null, @@ -133,6 +134,7 @@ var L_ = { L_.searchStrings = null L_.searchFile = null L_.toolsLoaded = false + L_.activeFeature = null L_.lastActivePoint = { layerName: null, lat: null, @@ -408,24 +410,30 @@ var L_ = { } } }, - disableAllBut: function (name, skipDisabling) { - if (L_.layersNamed.hasOwnProperty(name)) { - var l + disableAllBut: function (siteName, skipDisabling) { + if (L_.layersNamed.hasOwnProperty(siteName)) { + let l if (skipDisabling !== true) { - for (var i = 0; i < L_.layersData.length; i++) { + for (let i = 0; i < L_.layersData.length; i++) { l = L_.layersData[i] if (L_.toggledArray[l.name] == true) { - L_.toggleLayer(l) + if (l.name != 'Mars Overview') L_.toggleLayer(l) + } + if (L_.toggledArray['Mars Overview'] === false) { + if (l.name === 'Mars Overview') L_.toggleLayer(l) } } } - for (var i = 0; i < L_.layersData.length; i++) { - l = L_.layersData[i] - if (L_.toggledArray[l.name] == false) { - if (l.name == name) L_.toggleLayer(l) - } - if (L_.toggledArray['Mars Overview'] == false) { - if (l.name == 'Mars Overview') L_.toggleLayer(l) + + for (let n in L_.layersParent) { + if (L_.layersParent[n] === siteName && L_.layersDataByName[n]) { + l = L_.layersDataByName[n] + if ( + l.visibility === true && // initial visibility + L_.toggledArray[l.name] === false + ) { + L_.toggleLayer(l) + } } } } @@ -564,40 +572,42 @@ var L_ = { }, }) } else if (L_.layersData[i].type != 'header') { - L_.Globe_.litho.addLayer( - L_.layersData[i].type == 'vector' - ? 'clamped' - : L_.layersData[i].type, - { - name: s.name, - order: 1000 - L_.layersIndex[s.name], // Since higher order in litho is on top - on: L_.opacityArray[s.name] ? true : false, - geojson: L_.layersGroup[s.name].toGeoJSON(), - onClick: (feature, lnglat, layer) => { - this.selectFeature(layer.name, feature) - }, - useKeyAsHoverName: s.useKeyAsName, - style: { - // Prefer feature[f].properties.style values - letPropertiesStyleOverride: true, // default false - default: { - fillColor: s.style.fillColor, //Use only rgb and hex. No css color names - fillOpacity: parseFloat( - s.style.fillOpacity - ), - color: s.style.color, - weight: s.style.weight, - radius: s.radius, + if (typeof L_.layersGroup[s.name].toGeoJSON === 'function') + L_.Globe_.litho.addLayer( + L_.layersData[i].type == 'vector' + ? 'clamped' + : L_.layersData[i].type, + { + name: s.name, + order: 1000 - L_.layersIndex[s.name], // Since higher order in litho is on top + on: L_.opacityArray[s.name] ? true : false, + geojson: L_.layersGroup[s.name].toGeoJSON(), + onClick: (feature, lnglat, layer) => { + this.selectFeature(layer.name, feature) }, - bearing: s.variables?.markerAttachments?.bearing - ? s.variables.markerAttachments.bearing - : null, - }, - opacity: L_.opacityArray[s.name], - minZoom: 0, //s.minZoom, - maxZoom: 100, //s.maxNativeZoom, - } - ) + useKeyAsHoverName: s.useKeyAsName, + style: { + // Prefer feature[f].properties.style values + letPropertiesStyleOverride: true, // default false + default: { + fillColor: s.style.fillColor, //Use only rgb and hex. No css color names + fillOpacity: parseFloat( + s.style.fillOpacity + ), + color: s.style.color, + weight: s.style.weight, + radius: s.radius, + }, + bearing: s.variables?.markerAttachments + ?.bearing + ? s.variables.markerAttachments.bearing + : null, + }, + opacity: L_.opacityArray[s.name], + minZoom: 0, //s.minZoom, + maxZoom: 100, //s.maxNativeZoom, + } + ) } } } @@ -607,23 +617,36 @@ var L_ = { layer.setStyle(newStyle) } catch (err) {} }, - select(layer) { + setActiveFeature(layer) { + if (layer && layer.feature && layer.options?.layerName) + L_.activeFeature = { + feature: layer.feature, + layerName: layer.options.layerName, + layer: layer, + } + else L_.activeFeature = null + L_.setLastActivePoint(layer) L_.resetLayerFills() L_.highlight(layer) L_.Map_.activeLayer = layer Description.updatePoint(L_.Map_.activeLayer) - L_.Globe_.highlight( - L_.Globe_.findSpriteObject( - layer.options.layerName, - layer.feature.properties[layer.useKeyAsName] - ), - false - ) - L_.Viewer_.highlight(layer) + if (layer) { + L_.Globe_.highlight( + L_.Globe_.findSpriteObject( + layer.options.layerName, + layer.feature.properties[layer.useKeyAsName] + ), + false + ) + L_.Viewer_.highlight(layer) + } + + ToolController_.notifyActiveTool('setActiveFeature', L_.activeFeature) }, highlight(layer) { + if (layer == null) return const color = (L_.configData.look && L_.configData.look.highlightcolor) || 'red' try { @@ -1139,11 +1162,14 @@ var L_ = { * @param {object} layer - leaflet layer object */ setLastActivePoint: function (layer) { - var layerName = layer.hasOwnProperty('options') - ? layer.options.layerName - : null - var lat = layer.hasOwnProperty('_latlng') ? layer._latlng.lat : null - var lon = layer.hasOwnProperty('_latlng') ? layer._latlng.lng : null + let layerName, lat, lon + if (layer) { + layerName = layer.hasOwnProperty('options') + ? layer.options.layerName + : null + lat = layer.hasOwnProperty('_latlng') ? layer._latlng.lat : null + lon = layer.hasOwnProperty('_latlng') ? layer._latlng.lng : null + } if (layerName != null && lat != null && layerName != null) { L_.lastActivePoint = { diff --git a/src/essence/Basics/Map_/Map_.js b/src/essence/Basics/Map_/Map_.js index 2e30b125..bcb0fd09 100644 --- a/src/essence/Basics/Map_/Map_.js +++ b/src/essence/Basics/Map_/Map_.js @@ -1309,9 +1309,7 @@ function clearOnMapClick(event) { // If no feature was selected by this click event, clear the currently selected item if (!found) { - Map_.activeLayer = null - L_.resetLayerFills() - L_.clearVectorLayerInfo() + L_.setActiveFeature(null) } } } diff --git a/src/essence/Basics/ToolController_/ToolController_.js b/src/essence/Basics/ToolController_/ToolController_.js index 4313baf4..d2f24f20 100644 --- a/src/essence/Basics/ToolController_/ToolController_.js +++ b/src/essence/Basics/ToolController_/ToolController_.js @@ -188,6 +188,12 @@ let ToolController_ = { newWidth = newWidth || 'full' this.UserInterface.setToolWidth(newWidth) }, + notifyActiveTool: function (type, payload) { + if (this.activeTool != null) { + if (typeof this.activeTool.notify === 'function') + this.activeTool.notify(type, payload) + } + }, closeActiveTool: function () { var prevActive = $('#toolcontroller_incdiv .active') prevActive.removeClass('active').css({ diff --git a/src/essence/Basics/UserInterface_/UserInterface_.js b/src/essence/Basics/UserInterface_/UserInterface_.js index bbd93c84..a9833b4e 100644 --- a/src/essence/Basics/UserInterface_/UserInterface_.js +++ b/src/essence/Basics/UserInterface_/UserInterface_.js @@ -540,7 +540,7 @@ var UserInterface = { .style('image-rendering', 'pixelated') .html( `` ) .on('click', F_.toHostForceLanding) diff --git a/src/essence/Basics/Viewer_/Viewer_.js b/src/essence/Basics/Viewer_/Viewer_.js index 5d4d47a1..168e52a7 100644 --- a/src/essence/Basics/Viewer_/Viewer_.js +++ b/src/essence/Basics/Viewer_/Viewer_.js @@ -3,7 +3,6 @@ import * as d3 from 'd3' import F_ from '../Formulae_/Formulae_' import L_ from '../Layers_/Layers_' -import OpenSeadragon from 'openseadragon' import * as THREE from '../../../external/THREE/three118' import Photosphere from './Photosphere' @@ -13,8 +12,6 @@ import Dropy from '../../../external/Dropy/dropy' import './Viewer_.css' -//import fabricOverlay from '../../../external/OpenSeadragon/openseadragon-fabricjs-overlay' -let fabricOverlay = {} let L = window.L var Viewer_ = { diff --git a/src/essence/Tools/Draw/DrawTool_Drawing.js b/src/essence/Tools/Draw/DrawTool_Drawing.js index 270bd2db..71311e9c 100644 --- a/src/essence/Tools/Draw/DrawTool_Drawing.js +++ b/src/essence/Tools/Draw/DrawTool_Drawing.js @@ -416,6 +416,7 @@ var drawing = { } d.lastVertex = e.latlng + d.shape = d.drawing._poly }, complete: function () { var d = drawing.polygon @@ -483,7 +484,7 @@ var drawing = { } } - d.shape = d.drawing._poly + d.shape = d.drawing._poly || d.shape }, stop: function () { var d = drawing.polygon @@ -604,6 +605,7 @@ var drawing = { } d.lastVertex = e.latlng + d.shape = d.drawing._poly }, complete: function () { var d = drawing.line @@ -670,7 +672,7 @@ var drawing = { } } - d.shape = d.drawing._poly + d.shape = d.drawing._poly || d.shape }, stop: function () { var d = drawing.line diff --git a/src/essence/Tools/Kinds/Kinds.js b/src/essence/Tools/Kinds/Kinds.js index fa7970c1..ee7c343d 100644 --- a/src/essence/Tools/Kinds/Kinds.js +++ b/src/essence/Tools/Kinds/Kinds.js @@ -16,7 +16,7 @@ var Kinds = { preFeatures, lastFeatureLayers ) { - L_.select(layer) + L_.setActiveFeature(layer) if (typeof kind !== 'string') return const layerVar = L_.layersNamed[layer.options.layerName].variables diff --git a/src/essence/Tools/Layers/LayersTool.css b/src/essence/Tools/Layers/LayersTool.css index 4f8d74ca..ffa9f22a 100644 --- a/src/essence/Tools/Layers/LayersTool.css +++ b/src/essence/Tools/Layers/LayersTool.css @@ -58,22 +58,22 @@ color: #ccc; } #layersTool #filterLayers div.vector.on { - border-bottom: 4px solid rgba(15, 119, 189, 1); + border-bottom: 4px solid var(--color-p8); } #layersTool #filterLayers div.tile.on { - border-bottom: 4px solid rgba(119, 15, 189, 1); + border-bottom: 4px solid var(--color-p9); } #layersTool #filterLayers div.vectortile.on { - border-bottom: 4px solid #bd0f8e; + border-bottom: 4px solid var(--color-p10); } #layersTool #filterLayers div.query.on { - border-bottom: 4px solid rgba(15, 189, 77, 1); + border-bottom: 4px solid var(--color-p3); } #layersTool #filterLayers div.data.on { - border-bottom: 4px solid rgba(189, 15, 50, 1); + border-bottom: 4px solid var(--color-p4); } #layersTool #filterLayers div.model.on { - border-bottom: 4px solid rgba(189, 189, 15, 1); + border-bottom: 4px solid var(--color-p0); } #layersTool #filterLayers div.visible.on { border-bottom: 4px solid rgba(255, 255, 255, 1); @@ -300,26 +300,26 @@ } .layersToolColor { - width: 6px; + width: 3px; height: 100%; } .layersToolColor.vector { - background: rgb(15, 119, 189); + background: var(--color-p8); } .layersToolColor.tile { - background: rgb(119, 15, 189); + background: var(--color-p9); } .layersToolColor.vectortile { - background: #bd0f8e; + background: var(--color-p10); } .layersToolColor.query { - background: rgb(15, 189, 77); + background: var(--color-p3); } .layersToolColor.data { - background: rgb(189, 15, 50); + background: var(--color-p4); } .layersToolColor.model { - background: rgb(189, 189, 15); + background: var(--color-p0); } #LayersToolLayer.model { @@ -418,7 +418,7 @@ #LayersToolNav { padding: 0px 10px; text-align: left; - background: #26a8ff; + background: var(--color-mmgis); box-shadow: 0px 4px 2px rgba(0, 0, 0, 0.2); } diff --git a/src/essence/mmgisAPI/mmgisAPI.js b/src/essence/mmgisAPI/mmgisAPI.js index 424bb57d..8abd39c5 100644 --- a/src/essence/mmgisAPI/mmgisAPI.js +++ b/src/essence/mmgisAPI/mmgisAPI.js @@ -158,7 +158,7 @@ var mmgisAPI_ = { return null }, - // Returns an object with the visiblity state of all layers + // Returns an object with the visibility state of all layers getVisibleLayers: function () { // Also return the visibility of the DrawTool layers var drawToolVisibility = {} @@ -362,7 +362,7 @@ var mmgisAPI = { */ getActiveFeature: mmgisAPI_.getActiveFeature, - /** getVisibleLayers - returns an object with the visiblity state of all layers + /** getVisibleLayers - returns an object with the visibility state of all layers * @returns {object} - an object containing the visibility state of each layer */ getVisibleLayers: mmgisAPI_.getVisibleLayers, diff --git a/src/external/Dropy/dropy.js b/src/external/Dropy/dropy.js index 3b7bcdef..79dcb642 100644 --- a/src/external/Dropy/dropy.js +++ b/src/external/Dropy/dropy.js @@ -13,7 +13,6 @@ export default { // placeholder // selectedIndex int null for none construct: function (items, placeholder, selectedIndex) { - console.log(items) // prettier-ignore return [ '