diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml
index be22b5ba2d..2a0fe3b60e 100644
--- a/.github/workflows/CI.yml
+++ b/.github/workflows/CI.yml
@@ -8,14 +8,23 @@ on:
- master
# using filter pattern: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet
- '[cC][0-9][0-9][0-9]-+**' # c123 or c123-something for custom branch
- - '[0-9][0-9][0-9][0-9].[0-9][0-9].xx' # stable brances. E.g. 2021.01.xx
+ - '[0-9][0-9][0-9][0-9].[0-9][0-9].xx' # stable branches. E.g. 2021.01.xx
pull_request:
+ types: [opened, synchronize, reopened]
branches:
- master
# using filter pattern: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet
- '[cC][0-9][0-9][0-9]-+**' # c123 or c123-something for custom branch
- - '[0-9][0-9][0-9][0-9].[0-9][0-9].xx' # stable brances. E.g. 2021.01.xx
-
+ - '[0-9][0-9][0-9][0-9].[0-9][0-9].xx' # stable branches. E.g. 2021.01.xx
+ - '[geonode]-[0-9].[0-9].x' # stable branches for GeoNode. E.g. geonode-4.4.x
+ pull_request_target:
+ types: [opened, synchronize, reopened]
+ branches:
+ - master
+ # using filter pattern: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet
+ - '[cC][0-9][0-9][0-9]-+**' # c123 or c123-something for custom branch
+ - '[0-9][0-9][0-9][0-9].[0-9][0-9].xx' # stable branches. E.g. 2021.01.xx
+ - '[geonode]-[0-9].[0-9].x' # stable branches for GeoNode. E.g. geonode-4.4.x
jobs:
test-front-end:
runs-on: ubuntu-latest
@@ -180,6 +189,10 @@ jobs:
# Here it deploys only java modules and root, needed for MS project builds.
# Product, binary modules are to big to be hosted on the repository in snapshots, so they are skipped
run: |
+ # Setup SSH keys for SFTP
+ mkdir -p ~/.ssh && chmod 700 ~/.ssh
+ # add geo-solutions.it to known hosts to avoid prompts
+ ssh-keyscan -H maven.geo-solutions.it >> ~/.ssh/known_hosts
# deploys java packages
mvn clean install deploy -f java/pom.xml
# deploys also the root module, needed for dependencies
@@ -189,4 +202,3 @@ jobs:
MAVEN_PASSWORD: ${{ secrets.GS_MAVEN_PASSWORD }}
-
diff --git a/binary/bin-war/pom.xml b/binary/bin-war/pom.xml
index 362345d95a..707585b97d 100644
--- a/binary/bin-war/pom.xml
+++ b/binary/bin-war/pom.xml
@@ -65,6 +65,29 @@
+
+
+ maven-assembly-plugin
+ 2.1
+
+
+ ../bin.xml
+
+ mapstore2-${binary.number}
+
+ ${project.build.directory}/../../target
+
+
+
+ make-assembly
+ verify
+
+ single
+
+ false
+
+
+
diff --git a/binary/bin.xml b/binary/bin.xml
index d3ef17718e..2c5ec5233c 100644
--- a/binary/bin.xml
+++ b/binary/bin.xml
@@ -4,10 +4,12 @@
zipfalse
+
+
-
- ./bin-war/target/
+
+ target/mapstore2/webapps/mapstore.war
@@ -22,7 +24,7 @@
-
+
target/dependencymapstore2/lib
@@ -31,8 +33,8 @@
-
- bin
+
+ ../binkeepmapstore2/
@@ -40,8 +42,8 @@
-
- bin
+
+ ../binunixmapstore2/0755
@@ -51,21 +53,21 @@
-
- tomcat
+
+ ../tomcatmapstore2**/*
-
- logs
+
+ ../logsmapstore2
-
- work
+
+ ../workmapstore2
diff --git a/binary/pom.xml b/binary/pom.xml
index 2e31c26c96..b0dc3b65ec 100644
--- a/binary/pom.xml
+++ b/binary/pom.xml
@@ -13,7 +13,7 @@
http://www.geo-solutions.itUTF-8
- 9.0.108
+ 9.0.110${mapstore2.version}
@@ -142,27 +142,6 @@
-
-
- maven-assembly-plugin
- 2.1
-
-
- bin.xml
-
- mapstore2-${binary.number}
- ${project.build.directory}
-
-
-
- make-assembly
- install
-
- single
-
-
-
-
diff --git a/build/testConfig.js b/build/testConfig.js
index 2ccf9ad99a..1ef479d663 100644
--- a/build/testConfig.js
+++ b/build/testConfig.js
@@ -63,7 +63,7 @@ module.exports = ({browsers = [ 'ChromeHeadless' ], files, path, testFile, singl
},
browserConsoleLogOptions: {
terminal: true,
- level: 'DISABLE'
+ level: 'DEBUG'
},
webpack: {
devtool: 'eval',
diff --git a/docs/developer-guide/mapstore-migration-guide.md b/docs/developer-guide/mapstore-migration-guide.md
index 5b32f04278..c66eacb0b2 100644
--- a/docs/developer-guide/mapstore-migration-guide.md
+++ b/docs/developer-guide/mapstore-migration-guide.md
@@ -22,6 +22,28 @@ This is a list of things to check if you want to update from a previous version
## Migration from 2025.01.01 to 2025.02.00
+### Update authenticationRules in localConfig.json
+
+The previous default authentication rule used a broad pattern (`.*geostore.*`) that unintentionally matched internal GeoServer delegation endpoints (e.g., `/rest/security/usergroup/service/geostore/...`). This could cause delegated user/group requests to fail due to forced `bearer` authentication overriding the intended method (e.g., `authkey`).
+
+To avoid this conflict, update the authenticationRules entry in localConfig.json as follows:
+
+``` diff
+{
+ "authenticationRules": [
+ {
+- "urlPattern": ".*geostore.*",
++ "urlPattern": ".*rest/geostore.*",
+ "method": "bearer"
+ },
+ {
+ "urlPattern": ".*rest/config.*",
+ "method": "bearer"
+ }
+ ]
+}
+```
+
### Set minimum NodeJS version to 20
Node 16 and 18 are at end of life. Therefore there is no reason to keep maintaining compatibility with these old versions. In the meantime we want to concentrate to Make MapStore compatible with future version of NodeJS, and update the libraries to reduce the dependency tree.
diff --git a/docs/user-guide/filtering-layers.md b/docs/user-guide/filtering-layers.md
index 4e93f90b7e..665a2e24ad 100644
--- a/docs/user-guide/filtering-layers.md
+++ b/docs/user-guide/filtering-layers.md
@@ -18,7 +18,7 @@ In [MapStore](https://mapstore.geosolutionsgroup.com/mapstore/#/) it is possible
* With the [Quick Filter](attributes-table.md#quick-filter) available in the [Attribute Table](attributes-table.md#attribute-table)
-### Layer Filter
+### Layer Filters
This filter is applicable from the **Filter layer** button in TOC's [Layers Toolbar](toc.md#toolbar-options) and it will persist in the following situations:
@@ -56,7 +56,7 @@ This tool is used to define advanced filters in [MapStore](https://mapstore.geos
-#### Attribute filter
+#### Attribute Filter
This filter allows to set one or more conditions referred to the [Attribute Table](attributes-table.md#attribute-table) fields.
First of all it is possible to choose if the filter will match:
@@ -87,7 +87,7 @@ A simple *Attribute Filter* applied for a numerical field can be, for example:
-#### Area of interest
+#### Area of Interest
In order to set this filter the user can:
@@ -107,7 +107,7 @@ Once this filter is set, it is always possible to edit the coordinates and the d
Also for [Dashboard](exploring-dashboards.md) [widgets](widgets.md) (charts, table and counter) it is possible to define a spatial filter without necessarily connect the widget to the map widget by using the usual **Area of interest** filtering section. The example below sows how:
-#### Layer filter
+#### Layer Filter
This tool allows to set [cross-layer filters](https://docs.geoserver.org/stable/en/user/extensions/querylayer/index.html) for a layer by using another layer or even the same one.
@@ -132,3 +132,11 @@ In particular, if our goal is to take a look at the Italian Regions that contain
!!! note
The **Layer Filter** option is only available for [widgets](widgets.md) defined in [Map viewer](exploring-maps.md) and not for [Dashboards](exploring-dashboards.md) widgets.
+
+#### Combining Multiple Filtering
+
+To filter a layer, the user can also combine the two methods described above. This way, the user can first apply an [Area of Interest Filter](filtering-layers.md#area-of-interest) to a layer and then use a second layer to define the cross-layer filter using the [Layer Filter](filtering-layers.md#layer-filter) method.
+
+The following example shows this workflow: the meteorites layer is filtered using a square area of interest, and then a second filter excludes features located in the state of California by using the USA States layer. It is also worth clarifying that the AOI thus defined is used in this case to also restrict the [Layer Filter's](filtering-layers.md#layer-filter) action to that area only.
+
+
diff --git a/docs/user-guide/img/button/new_tag_button.jpg b/docs/user-guide/img/button/new_tag_button.jpg
index 515eed2147..5ce350c17e 100644
Binary files a/docs/user-guide/img/button/new_tag_button.jpg and b/docs/user-guide/img/button/new_tag_button.jpg differ
diff --git a/docs/user-guide/img/filtering-layers/cascading-search-filter.jpg b/docs/user-guide/img/filtering-layers/cascading-search-filter.jpg
new file mode 100644
index 0000000000..105e939b31
Binary files /dev/null and b/docs/user-guide/img/filtering-layers/cascading-search-filter.jpg differ
diff --git a/docs/user-guide/img/layer-settings/display-3d-tiles.jpg b/docs/user-guide/img/layer-settings/display-3d-tiles.jpg
index 80882b3897..b0b4d027e5 100644
Binary files a/docs/user-guide/img/layer-settings/display-3d-tiles.jpg and b/docs/user-guide/img/layer-settings/display-3d-tiles.jpg differ
diff --git a/docs/user-guide/img/layer-settings/imagery-layers.jpg b/docs/user-guide/img/layer-settings/imagery-layers.jpg
new file mode 100644
index 0000000000..4cf0a736a2
Binary files /dev/null and b/docs/user-guide/img/layer-settings/imagery-layers.jpg differ
diff --git a/docs/user-guide/img/tags/new_tag.jpg b/docs/user-guide/img/tags/new_tag.jpg
index 11b5cace34..1be72fd458 100644
Binary files a/docs/user-guide/img/tags/new_tag.jpg and b/docs/user-guide/img/tags/new_tag.jpg differ
diff --git a/docs/user-guide/img/tags/search_tag.jpg b/docs/user-guide/img/tags/search_tag.jpg
index 9a878ad368..b23d3b4895 100644
Binary files a/docs/user-guide/img/tags/search_tag.jpg and b/docs/user-guide/img/tags/search_tag.jpg differ
diff --git a/docs/user-guide/img/tags/tags-panel.jpg b/docs/user-guide/img/tags/tags-panel.jpg
index 916d8d2651..3d58574ddb 100644
Binary files a/docs/user-guide/img/tags/tags-panel.jpg and b/docs/user-guide/img/tags/tags-panel.jpg differ
diff --git a/docs/user-guide/img/widgets/customize-current-time.jpg b/docs/user-guide/img/widgets/customize-current-time.jpg
new file mode 100644
index 0000000000..b6f9c58d71
Binary files /dev/null and b/docs/user-guide/img/widgets/customize-current-time.jpg differ
diff --git a/docs/user-guide/img/widgets/show-current-time.jpg b/docs/user-guide/img/widgets/show-current-time.jpg
new file mode 100644
index 0000000000..ecc698a1cb
Binary files /dev/null and b/docs/user-guide/img/widgets/show-current-time.jpg differ
diff --git a/docs/user-guide/img/widgets/trace_null_value.jpg b/docs/user-guide/img/widgets/trace_null_value.jpg
new file mode 100644
index 0000000000..47bb769460
Binary files /dev/null and b/docs/user-guide/img/widgets/trace_null_value.jpg differ
diff --git a/docs/user-guide/layer-settings.md b/docs/user-guide/layer-settings.md
index d798be4e9d..fcb2c0bc70 100644
--- a/docs/user-guide/layer-settings.md
+++ b/docs/user-guide/layer-settings.md
@@ -132,6 +132,10 @@ On the *Display* tab, only the following options are available for a **3D Tile**
* The **Visibility limits** to display the layer only within certain scale limits, as reported above.
+* The **Imagery Layers Overlay** to drape imagery layers, such as `WMS`, `TMS`, or `WMTS`, on top of `3D Tiles` and rendering them sequentially in the order defined in the TOC. An example can be the following one:
+
+
+
* The **Height Offset** above the ground.
* The **Format** choosing between `3D Model` and `Point Cloud`. The *Point Cloud* option allows the user to customize the `Maximum Attenuation` of the points based on the distance from the current viewpoint and customize the `Lighting strength` and the `Lighting radius` to improve visualization of the point cloud.
diff --git a/docs/user-guide/tags.md b/docs/user-guide/tags.md
index ae79beaf89..8a44414d43 100644
--- a/docs/user-guide/tags.md
+++ b/docs/user-guide/tags.md
@@ -10,17 +10,17 @@ As an admin user, it is possible to manage **Tags** by selecting **Manage Tags**
-The *Tags panel* opens, allowing the admin user to:
+The *Manager* page opens on **Tags** tab, allowing the admin user to:
-
+
* Create a **New tag** through the button and customize it by adding a *Name*, a *Description* and choosing a *Color* for the label.
-
+
* **Search** for a tag using the search bar
-
+
* **Edit** a tag through the button next to each tag in the list.
diff --git a/docs/user-guide/widgets.md b/docs/user-guide/widgets.md
index fbd9a02db3..b8220b3199 100644
--- a/docs/user-guide/widgets.md
+++ b/docs/user-guide/widgets.md
@@ -73,6 +73,7 @@ Once the chart type is chosen, it is possible to set up the trace with the follo
* **Trace style**
* **Trace axes**
* **Trace value formatting**
+* **Null Value Handling**
##### Trace Data
@@ -182,6 +183,18 @@ An example of a custom trace value tooltip can be the following:
+##### Null Value Handling
+
+The user can customize how **Null Value** are handled for the `X Attribute` field by selecting a *Strategy* from the following options:
+
+
+
+* **Ignore** to keep the *Null* values unchanged in the data.
+
+* **Exclude** to remove all records where the value is *Null*
+
+* **Use Placeholder** to replace *Null* values with a custom value provided by the user
+
##### Trace legend options
For the *Pie Charts*, the *Trace legend options* is available and it is displayed as follows:
@@ -210,6 +223,16 @@ Through this section, for each axis, the user is allowed to:
* Choose the **Type** (between `Auto`, `Linear`, `Category`, `Log` or `Date`): the axis type is auto-detected by looking at the data (*Auto* option is automatically managed and selected by the tool and it is usually good as default setting).
+!!! Note
+ If **`Date`** is selected in the *Type* option, the **Show the Current Time** setting becomes available in the *Axes* panel, allowing you to highlight the current date in the chart.
+
+ Once enabled, you can customize the appearance of the current time line using the following options:
+
+
+ * **Color**: choose the line color using the *Color Picker*.
+ * **Size**: set the line thickness in `px`.
+ * **Style**: select the line style from `Solid`, `Dot`, `Dash`, `LongDash` or `DashDot`
+
* Change the **Color** through the color picker
* Change the **Font size**
diff --git a/java/services/pom.xml b/java/services/pom.xml
index a75312b32b..4d556bc101 100644
--- a/java/services/pom.xml
+++ b/java/services/pom.xml
@@ -163,15 +163,15 @@
org.apache.maven.wagon
- wagon-ftp
- 1.0-beta-2
+ wagon-ssh
+ 3.5.3
-
+ geosolutions
- ftp://maven.geo-solutions.it/
+ sftp://maven.geo-solutions.it/
diff --git a/java/web/pom.xml b/java/web/pom.xml
index 957260f419..494b2a0801 100644
--- a/java/web/pom.xml
+++ b/java/web/pom.xml
@@ -104,20 +104,20 @@
-
+
org.apache.maven.wagon
- wagon-ftp
- 1.0-beta-2
+ wagon-ssh
+ 3.5.3
-
+ geosolutions
- ftp://maven.geo-solutions.it/
+ sftp://maven.geo-solutions.it/
diff --git a/package.json b/package.json
index 325394ac68..1bf87b3b61 100644
--- a/package.json
+++ b/package.json
@@ -43,7 +43,6 @@
"@babel/core": "7.28.4",
"@babel/preset-env": "7.28.3",
"@babel/preset-react": "7.27.1",
- "@babel/runtime": "7.23.9",
"@geosolutions/acorn-jsx": "4.0.2",
"@geosolutions/jsdoc": "3.4.4",
"@geosolutions/mocha": "6.2.1-3",
diff --git a/pom.xml b/pom.xml
index ab8a530e1a..96486d8ae8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -49,7 +49,7 @@
2.4-SNAPSHOT2.3.4
- 1.6-SNAPSHOT
+ 1.5.02.3
@@ -397,10 +397,10 @@
-
+ geosolutions
- ftp://maven.geo-solutions.it/
+ sftp://maven.geo-solutions.it/
@@ -467,8 +467,8 @@
org.apache.maven.wagon
- wagon-ftp
- 1.0-beta-2
+ wagon-ssh
+ 3.5.3
diff --git a/project/standard/templates/configs/pluginsConfig.json b/project/standard/templates/configs/pluginsConfig.json
index 60be44cc5b..dbd0ee4232 100644
--- a/project/standard/templates/configs/pluginsConfig.json
+++ b/project/standard/templates/configs/pluginsConfig.json
@@ -139,6 +139,17 @@
"children": ["Permalink"],
"autoEnableChildren": ["Permalink"]
},
+ {
+ "name": "DynamicLegend",
+ "glyph": "align-left",
+ "title": "plugins.DynamicLegend.title",
+ "description": "plugins.DynamicLegend.description",
+ "dependencies": ["SidebarMenu"],
+ "defaultConfig": {
+ "isFloating": false,
+ "flatLegend": false
+ }
+ },
{
"name": "Permalink",
"glyph": "link",
diff --git a/project/standard/templates/pom.xml b/project/standard/templates/pom.xml
index 43e6947a92..3a282d3711 100644
--- a/project/standard/templates/pom.xml
+++ b/project/standard/templates/pom.xml
@@ -29,9 +29,9 @@
1.10.21.10-SNAPSHOT
- 2.4-SNAPSHOT
- 1.6-SNAPSHOT
- 2.3.3
+ 2.3-SNAPSHOT
+ 1.5.0
+ 2.3.4
diff --git a/web/client/api/GeoStoreDAO.js b/web/client/api/GeoStoreDAO.js
index 60bcbcf470..3904afdae0 100644
--- a/web/client/api/GeoStoreDAO.js
+++ b/web/client/api/GeoStoreDAO.js
@@ -298,7 +298,7 @@ const Api = {
},
writeSecurityRules: function(SecurityRuleList = {}) {
return "" +
- (castArray(SecurityRuleList.SecurityRule) || []).map( rule => {
+ (castArray(SecurityRuleList.SecurityRule) || []).flatMap( rule => {
if (rule.canRead || rule.canWrite) {
if (rule.user) {
return ""
@@ -312,8 +312,18 @@ const Api = {
+ "" + boolToString(rule.canWrite) + ""
+ "" + (rule.group.id || "") + "" + (rule.group.groupName || "") + ""
+ "";
+ } else if (rule.ipRanges) {
+ // Create a separate SecurityRule for each IP range
+ const ipRangesArray = castArray(rule.ipRanges.ipRange);
+ return ipRangesArray.map(ipRange =>
+ ""
+ + "" + boolToString(rule.canRead || rule.canWrite) + ""
+ + "" + boolToString(rule.canWrite) + ""
+ + "" + (ipRange.id) + ""
+ + ""
+ );
}
- // NOTE: if rule has no group or user, it is skipped
+ // NOTE: if rule has no group, user, or ipRanges, it is skipped
// NOTE: if rule is "no read and no write", it is skipped
}
return "";
@@ -660,6 +670,42 @@ const Api = {
removeFavoriteResource: (userId, resourceId, options) => {
const url = `/users/user/${userId}/favorite/${resourceId}`;
return axios.delete(url, Api.addBaseUrl(parseOptions(options))).then((response) => response.data);
+ },
+ getIPRanges: function(options = {}) {
+ const url = "ipranges/";
+ return axios.get(url, this.addBaseUrl(parseOptions(options))).then(function(response) {return response.data || []; });
+ },
+ createIPRange: function(ipRange, options) {
+ const url = "ipranges/";
+ const xmlPayload = [
+ '',
+ ``,
+ ``,
+ ''
+ ].join('');
+ return axios.post(url, xmlPayload, this.addBaseUrl(merge({
+ headers: {
+ 'Content-Type': "application/xml"
+ }
+ }, parseOptions(options)))).then(function(response) {return response.data; });
+ },
+ updateIPRange: function(id, ipRange, options = {}) {
+ const url = "ipranges/" + id;
+ const xmlPayload = [
+ '',
+ ``,
+ ``,
+ ''
+ ].join('');
+ return axios.put(url, xmlPayload, this.addBaseUrl(merge({
+ headers: {
+ 'Content-Type': "application/xml"
+ }
+ }, parseOptions(options)))).then(function(response) {return response.data; });
+ },
+ deleteIPRange: function(id, options = {}) {
+ const url = "ipranges/" + id;
+ return axios.delete(url, this.addBaseUrl(parseOptions(options))).then(function(response) {return response.data; });
}
};
diff --git a/web/client/components/TOC/fragments/settings/ThreeDTilesSettings.jsx b/web/client/components/TOC/fragments/settings/ThreeDTilesSettings.jsx
index 3f5aa9f99f..5042c05c91 100644
--- a/web/client/components/TOC/fragments/settings/ThreeDTilesSettings.jsx
+++ b/web/client/components/TOC/fragments/settings/ThreeDTilesSettings.jsx
@@ -9,11 +9,12 @@
import React from 'react';
import PropTypes from 'prop-types';
-import { FormGroup, ControlLabel, InputGroup } from 'react-bootstrap';
+import { FormGroup, ControlLabel, InputGroup, Checkbox } from 'react-bootstrap';
import DebouncedFormControl from '../../../misc/DebouncedFormControl';
import Message from '../../../I18N/Message';
import PointCloudShadingSettings from './PointCloudShadingSettings';
import Select from 'react-select';
+import InfoPopover from '../../../widgets/widget/InfoPopover';
/**
* ThreeDTilesSettings. This component shows the 3d tiles options available
@@ -29,6 +30,17 @@ function ThreeDTilesSettings({
}
return (