{ ({ height }) =>
state,
state => lastActiveToolSelector(state),
state => mapLayoutValuesSelector(state, {dockSize: true, bottom: true, height: true}),
- sidebarIsActiveSelector
-], (state, lastActiveTool, style, isActive) => ({
+ sidebarIsActiveSelector,
+ isSidebarWithFullHeight
+], (state, lastActiveTool, style, isActive, isSidebarFullHeight ) => ({
style,
lastActiveTool,
state,
- isActive
+ isActive,
+ isSidebarFullHeight
}));
/**
diff --git a/web/client/plugins/Widgets.jsx b/web/client/plugins/Widgets.jsx
index 27dc3e3549..e69c8015eb 100644
--- a/web/client/plugins/Widgets.jsx
+++ b/web/client/plugins/Widgets.jsx
@@ -22,7 +22,8 @@ import {
getFloatingWidgetsLayout,
getMaximizedState,
getVisibleFloatingWidgets,
- isTrayEnabled
+ isTrayEnabled,
+ getTblWidgetZoomLoader
} from '../selectors/widgets';
import {
changeLayout,
@@ -56,7 +57,8 @@ compose(
(state) => mapLayoutValuesSelector(state, { right: true}),
state => state.browser && state.browser.mobile,
getFloatingWidgets,
- (id, widgets, layouts, maximized, dependencies, mapLayout, isMobileAgent, dropdownWidgets) => ({
+ getTblWidgetZoomLoader,
+ (id, widgets, layouts, maximized, dependencies, mapLayout, isMobileAgent, dropdownWidgets, recordZoomLoading) => ({
id,
widgets,
layouts,
@@ -64,7 +66,8 @@ compose(
dependencies,
mapLayout,
isMobileAgent,
- dropdownWidgets
+ dropdownWidgets,
+ recordZoomLoading
})
), {
editWidget,
@@ -273,10 +276,12 @@ compose(
class Widgets extends React.Component {
static propTypes = {
- enabled: PropTypes.bool
+ enabled: PropTypes.bool,
+ enableZoomInTblWidget: PropTypes.bool
};
static defaultProps = {
- enabled: true
+ enabled: true,
+ enableZoomInTblWidget: true
};
render() {
return this.props.enabled ? : null;
diff --git a/web/client/plugins/__tests__/DashboardSave-test.jsx b/web/client/plugins/__tests__/DashboardSave-test.jsx
index 3b147745b1..fa3ceaa9be 100644
--- a/web/client/plugins/__tests__/DashboardSave-test.jsx
+++ b/web/client/plugins/__tests__/DashboardSave-test.jsx
@@ -29,7 +29,7 @@ describe('DashboardSave Plugins (DashboardSave, DashboardSaveAs)', () => {
document.body.innerHTML = '';
setTimeout(done);
});
- describe('DashboardSave', () => {
+ describe('DashboardSave within burger menu', () => {
const DUMMY_ACTION = { type: "DUMMY_ACTION" };
it('hidden by default, visibility of the button', () => {
const { Plugin, containers } = getPluginForTest(DashboardSave, stateMocker(DUMMY_ACTION), {
@@ -54,7 +54,32 @@ describe('DashboardSave Plugins (DashboardSave, DashboardSaveAs)', () => {
expect(document.getElementsByClassName('modal-fixed').length).toBe(1);
});
});
- describe('DashboardSaveAs', () => {
+ describe('DashboardSave within sidebar menu', () => {
+ const DUMMY_ACTION = { type: "DUMMY_ACTION" };
+ it('hidden by default, visibility of the button', () => {
+ const { Plugin, containers } = getPluginForTest(DashboardSave, stateMocker(DUMMY_ACTION), {
+ SidebarMenuPlugin: {}
+ });
+ // check container for burger menu
+ expect(Object.keys(containers)).toContain('SidebarMenu');
+ ReactDOM.render(, document.getElementById("container"));
+ expect(document.getElementsByClassName('modal-fixed').length).toBe(0);
+ // check log-in logout properties selector for button in burger menu
+ // hide when not logged in
+ expect(containers.SidebarMenu.selector({ security: {} }).style.display).toBe("none");
+ // hide when logged in but without resource selected
+ expect(containers.SidebarMenu.selector({security: {user: {}}}).style.display).toBe("none");
+ // hide if you don't have permissions
+ expect(containers.SidebarMenu.selector({ security: { user: {} }, dashboard: { resource: { id: 1234, canEdit: false } } }).style.display ).toBe("none");
+ });
+ it('show when control is set to "save"', () => {
+ const storeState = stateMocker(DUMMY_ACTION, triggerSave(true));
+ const { Plugin } = getPluginForTest(DashboardSave, storeState);
+ ReactDOM.render(, document.getElementById("container"));
+ expect(document.getElementsByClassName('modal-fixed').length).toBe(1);
+ });
+ });
+ describe('DashboardSaveAs within burger menu', () => {
const DUMMY_ACTION = { type: "DUMMY_ACTION" };
it('hidden by default, visibility of the button', () => {
const { Plugin, containers } = getPluginForTest(DashboardSaveAs, stateMocker(DUMMY_ACTION), {
@@ -92,4 +117,43 @@ describe('DashboardSave Plugins (DashboardSave, DashboardSaveAs)', () => {
expect(inputEl.value).toBe('f');
});
});
+
+ describe('DashboardSaveAs within sidebar menu', () => {
+ const DUMMY_ACTION = { type: "DUMMY_ACTION" };
+ it('hidden by default, visibility of the button', () => {
+ const { Plugin, containers } = getPluginForTest(DashboardSaveAs, stateMocker(DUMMY_ACTION), {
+ SidebarMenuPlugin: {}
+ });
+ // check container for burger menu
+ expect(Object.keys(containers)).toContain('SidebarMenu');
+ ReactDOM.render(, document.getElementById("container"));
+ expect(document.getElementsByClassName('modal-fixed').length).toBe(0);
+ // check log-in logout properties selector for button in burger menu
+ // hide when not logged in
+ expect(containers.SidebarMenu.selector({ security: {} }).style.display).toBe("none");
+ // always show when user logged in
+ expect(containers.SidebarMenu.selector({ security: { user: {} } }).style.display).toNotExist();
+ // show if resource is available for clone
+ expect(containers.SidebarMenu.selector({
+ security: { user: {} },
+ geostory: { resource: { id: 1234, canEdit: false } }
+ }).style.display).toNotExist();
+ });
+ it('show when control is set to "saveAs"', () => {
+ const { Plugin } = getPluginForTest(DashboardSaveAs, stateMocker(DUMMY_ACTION, triggerSaveAs(true)));
+ ReactDOM.render(, document.getElementById("container"));
+ expect(document.getElementsByClassName('modal-fixed').length).toBe(1);
+ });
+ it('title is editable', () => {
+ const { Plugin } = getPluginForTest(DashboardSaveAs, stateMocker(DUMMY_ACTION, triggerSaveAs(true)));
+ ReactDOM.render(, document.getElementById("container"));
+ const modal = document.getElementsByClassName('modal-fixed')[0];
+ expect(modal).toExist();
+ const inputEl = modal.getElementsByTagName('input')[1];
+ expect(inputEl).toExist();
+ inputEl.value = 'f';
+ TestUtils.Simulate.change(inputEl);
+ expect(inputEl.value).toBe('f');
+ });
+ });
});
diff --git a/web/client/plugins/__tests__/SidebarMenu-test.jsx b/web/client/plugins/__tests__/SidebarMenu-test.jsx
index 331c04d3a2..f0b4c7f295 100644
--- a/web/client/plugins/__tests__/SidebarMenu-test.jsx
+++ b/web/client/plugins/__tests__/SidebarMenu-test.jsx
@@ -39,4 +39,23 @@ describe('SidebarMenu Plugin', () => {
const elements = document.querySelectorAll('#mapstore-sidebar-menu > button, #mapstore-sidebar-menu #extra-items + .dropdown-menu li');
expect(elements.length).toBe(2);
});
+
+ it('sidebar menu with full height', () => {
+ document.getElementById('container').style.height = '600px';
+ const { Plugin } = getPluginForTest(SidebarMenu, {});
+ const items = [{
+ name: 'test',
+ position: 1,
+ text: 'Test Item'
+ }, {
+ name: 'test2',
+ position: 2,
+ text: 'Test Item 2'
+ }];
+ ReactDOM.render(, document.getElementById("container"));
+ const sidebarMenuContainer = document.getElementById('mapstore-sidebar-menu-container');
+ expect(sidebarMenuContainer).toExist();
+ const elements = document.querySelectorAll('#mapstore-sidebar-menu > button, #mapstore-sidebar-menu #extra-items + .dropdown-menu li');
+ expect(elements.length).toBe(2);
+ });
});
diff --git a/web/client/plugins/featuregrid/gridTools.jsx b/web/client/plugins/featuregrid/gridTools.jsx
index f440c9a2f7..6ce1314b8d 100644
--- a/web/client/plugins/featuregrid/gridTools.jsx
+++ b/web/client/plugins/featuregrid/gridTools.jsx
@@ -21,5 +21,8 @@ export default [{
:
}>
-
+ ,
+ tableWidgetFormatter: }>
+
+
}];
diff --git a/web/client/plugins/sidebarmenu/sidebarmenu.less b/web/client/plugins/sidebarmenu/sidebarmenu.less
index 04fdf249a6..f9aabcc145 100644
--- a/web/client/plugins/sidebarmenu/sidebarmenu.less
+++ b/web/client/plugins/sidebarmenu/sidebarmenu.less
@@ -35,3 +35,8 @@
}
}
}
+
+#mapstore-sidebar-menu-container.fullHeightSideBar{
+ position: relative;
+ max-height: 100% !important;
+}
\ No newline at end of file
diff --git a/web/client/plugins/widgetbuilder/enhancers/catalogEditorEnhancer.js b/web/client/plugins/widgetbuilder/enhancers/catalogEditorEnhancer.js
index 5c0c56e7a6..d36da4f0f7 100644
--- a/web/client/plugins/widgetbuilder/enhancers/catalogEditorEnhancer.js
+++ b/web/client/plugins/widgetbuilder/enhancers/catalogEditorEnhancer.js
@@ -12,6 +12,16 @@ import { dashboardSetSelectedService, setDashboardCatalogMode, dashboardDeleteSe
import { dashboardServicesSelector,
selectedDashboardServiceSelector, dashboardCatalogModeSelector, dashboardIsNewServiceSelector } from '../../../selectors/dashboard';
import { error } from '../../../actions/notifications';
+import {
+ getSupportedFormatsInNewServiceSelector,
+ getSupportedGFIFormatsSelector,
+ formatsLoadingSelector,
+ showFormatErrorSelector
+} from '../../../selectors/catalog';
+import {
+ formatOptionsFetch
+} from '../../../actions/catalog';
+
import CatalogServiceEditor from '../CatalogServiceEditor';
export const catalogEditorEnhancer = compose(
@@ -20,12 +30,17 @@ export const catalogEditorEnhancer = compose(
marginRight: "5px"}}),
connect((state) => ({
mode: dashboardCatalogModeSelector(state),
+ showFormatError: showFormatErrorSelector(state),
dashboardServices: dashboardServicesSelector(state),
+ formatsLoading: formatsLoadingSelector(state),
+ infoFormatOptions: getSupportedGFIFormatsSelector(state),
+ formatOptions: getSupportedFormatsInNewServiceSelector(state),
dashboardSelectedService: selectedDashboardServiceSelector(state),
isNew: dashboardIsNewServiceSelector(state)
}), {
onChangeSelectedService: dashboardSetSelectedService,
onChangeCatalogMode: setDashboardCatalogMode,
+ onFormatOptionsFetch: formatOptionsFetch,
onDeleteService: dashboardDeleteService,
onAddService: updateDashboardService,
error: error
diff --git a/web/client/product/plugins.js b/web/client/product/plugins.js
index ceef399b86..367494a474 100644
--- a/web/client/product/plugins.js
+++ b/web/client/product/plugins.js
@@ -158,7 +158,9 @@ export const plugins = {
WidgetsTrayPlugin: toModulePlugin('WidgetsTray', () => import(/* webpackChunkName: 'plugins/widgetsTray' */ '../plugins/WidgetsTray')),
ZoomAllPlugin: toModulePlugin('ZoomAll', () => import(/* webpackChunkName: 'plugins/zoomAll' */ '../plugins/ZoomAll')),
ZoomInPlugin: toModulePlugin('ZoomIn', () => import(/* webpackChunkName: 'plugins/zoomIn' */ '../plugins/ZoomIn')),
- ZoomOutPlugin: toModulePlugin('ZoomOut', () => import(/* webpackChunkName: 'plugins/zoomOut' */ '../plugins/ZoomOut'))
+ ZoomOutPlugin: toModulePlugin('ZoomOut', () => import(/* webpackChunkName: 'plugins/zoomOut' */ '../plugins/ZoomOut')),
+ AddWidgetDashboardPlugin: toModulePlugin('AddWidgetDashboard', () => import(/* webpackChunkName: 'plugins/AddWidgetDashboard' */ '../plugins/AddWidgetDashboard')),
+ MapConnectionDashboardPlugin: toModulePlugin('MapConnectionDashboard', () => import(/* webpackChunkName: 'plugins/MapConnectionDashboard' */ '../plugins/MapConnectionDashboard'))
};
const pluginsDefinition = {
diff --git a/web/client/reducers/__tests__/config-test.js b/web/client/reducers/__tests__/config-test.js
index 4b0ab8e061..785337cb53 100644
--- a/web/client/reducers/__tests__/config-test.js
+++ b/web/client/reducers/__tests__/config-test.js
@@ -75,7 +75,7 @@ describe('Test the mapConfig reducer', () => {
expect(state.map.info).toExist();
expect(state.map.info.canEdit).toBe(true);
});
- it('DETAILS_LOADED', () => {
+ it('DETAILS_LOADED Map', () => {
const detailsUri = "details/uri";
var state = mapConfig({
map: {
@@ -83,11 +83,24 @@ describe('Test the mapConfig reducer', () => {
mapId: 1
}
}
- }, {type: DETAILS_LOADED, mapId: 1, detailsUri});
+ }, {type: DETAILS_LOADED, id: 1, detailsUri});
expect(state.map).toExist();
expect(state.map.info).toExist();
expect(state.map.info.details).toBe(detailsUri);
});
+ it('DETAILS_LOADED Dahboard', () => {
+ const detailsUri = "details/uri";
+ var state = mapConfig({
+ dashboard: {
+ resource: {
+ id: "1", attributes: {}
+ }
+ }
+ }, {type: DETAILS_LOADED, id: "1", detailsUri});
+ expect(state.dashboard).toExist();
+ expect(state.dashboard.resource).toExist();
+ expect(state.dashboard.resource.attributes.details).toBe(detailsUri);
+ });
it('map created', () => {
expect(mapConfig({
diff --git a/web/client/reducers/catalog.js b/web/client/reducers/catalog.js
index bc6b2c4129..ccb842e725 100644
--- a/web/client/reducers/catalog.js
+++ b/web/client/reducers/catalog.js
@@ -30,6 +30,7 @@ import {
TOGGLE_TEMPLATE,
TOGGLE_ADVANCED_SETTINGS,
FORMAT_OPTIONS_LOADING,
+ SHOW_FORMAT_ERROR,
SET_FORMAT_OPTIONS,
NEW_SERVICE_STATUS
} from '../actions/catalog';
@@ -60,6 +61,7 @@ function catalog(state = {
},
delayAutoSearch: 1000,
loading: false,
+ showFormatError: false,
pageSize: 4,
services: {},
selectedService: "",
@@ -112,6 +114,7 @@ function catalog(state = {
newService: action.isNew ? emptyService : assign({}, state.services && state.services[state.selectedService || ""] || {}, {oldService: state.selectedService || ""}),
mode: action.mode,
result: null,
+ showFormatError: false,
loadingError: null,
layerError: null});
case MAP_CONFIG_LOADED: {
@@ -133,7 +136,7 @@ function catalog(state = {
case CHANGE_TITLE:
return set("newService.title", action.title, state);
case CHANGE_URL:
- return set("newService.url", action.url, state);
+ return set("newService.url", action.url, set("showFormatError", false, state));
case CHANGE_SERVICE_FORMAT:
return set("newService.format", action.format, state);
case CHANGE_TYPE: {
@@ -211,6 +214,9 @@ function catalog(state = {
case FORMAT_OPTIONS_LOADING: {
return set("formatsLoading", action.loading, state);
}
+ case SHOW_FORMAT_ERROR: {
+ return set("showFormatError", action.status, state);
+ }
case SET_FORMAT_OPTIONS: {
return set("newService.supportedFormats", action.formats, set("newService.formatUrlUsed", action.url, state));
}
diff --git a/web/client/reducers/config.js b/web/client/reducers/config.js
index 8119591743..d8b648ae84 100644
--- a/web/client/reducers/config.js
+++ b/web/client/reducers/config.js
@@ -110,8 +110,9 @@ function mapConfig(state = null, action) {
}
return state;
case DETAILS_LOADED:
+ let dashboardResource = state.dashboard?.resource;
map = state && state.map && state.map.present ? state.map.present : state && state.map;
- if (map && map.mapId.toString() === action.mapId.toString()) {
+ if (map && map.mapId.toString() === action.id.toString()) {
map = assign({}, map, {
info:
assign({}, map.info, {
@@ -120,6 +121,17 @@ function mapConfig(state = null, action) {
})
});
return assign({}, state, {map: map});
+ } else if (dashboardResource && dashboardResource.id === action.id.toString()) {
+ dashboardResource = assign({}, dashboardResource, {
+ attributes:
+ assign({}, dashboardResource.attributes, {
+ details: action.detailsUri,
+ detailsSettings: action.detailsSettings
+ })
+ });
+ return assign({}, state, {dashboard: {
+ ...state.dashboard, resource: dashboardResource
+ }});
}
return state;
case MAP_CREATED: {
diff --git a/web/client/reducers/details.js b/web/client/reducers/details.js
index 630b355bf8..a071f9b721 100644
--- a/web/client/reducers/details.js
+++ b/web/client/reducers/details.js
@@ -13,7 +13,7 @@ import {
const details = (state = {}, action) => {
switch (action.type) {
case UPDATE_DETAILS: {
- return {...state, detailsText: action.detailsText};
+ return {...state, detailsText: action.detailsText, id: action.id};
}
default:
return state;
diff --git a/web/client/selectors/__tests__/dashboard-test.js b/web/client/selectors/__tests__/dashboard-test.js
index 1c7c2a7f11..8e9048c1d3 100644
--- a/web/client/selectors/__tests__/dashboard-test.js
+++ b/web/client/selectors/__tests__/dashboard-test.js
@@ -22,7 +22,10 @@ import {
selectedDashboardServiceSelector,
dashboardCatalogModeSelector,
dashboardIsNewServiceSelector,
- dashboardSaveServiceSelector
+ dashboardSaveServiceSelector,
+ dashboardResourceInfoSelector,
+ dashbaordInfoDetailsUriFromIdSelector,
+ dashboardInfoDetailsSettingsFromIdSelector
} from '../dashboard';
describe('dashboard selectors', () => {
@@ -122,5 +125,28 @@ describe('dashboard selectors', () => {
it("getDashboardId should return undefined in case resource does not exists", () => {
expect(getDashboardId({dashboard: {resource: {}}})).toBe(undefined);
});
-
+ it("test dashboardResourceInfoSelector", () => {
+ const resource = {};
+ expect(dashboardResourceInfoSelector({dashboard: {
+ resource: resource
+ }})).toBe(resource);
+ });
+ it("test dashbaordInfoDetailsUriFromIdSelector", () => {
+ expect(dashbaordInfoDetailsUriFromIdSelector({dashboard: {
+ resource: {
+ attributes: {
+ details: "Details"
+ }
+ }
+ }})).toBe("Details");
+ });
+ it("test dashboardInfoDetailsSettingsFromIdSelector", () => {
+ expect(dashboardInfoDetailsSettingsFromIdSelector({dashboard: {
+ resource: {
+ attributes: {
+ detailsSettings: "detailsSettings"
+ }
+ }
+ }})).toBe("detailsSettings");
+ });
});
diff --git a/web/client/selectors/catalog.js b/web/client/selectors/catalog.js
index 09d3f954b9..4f38c24f93 100644
--- a/web/client/selectors/catalog.js
+++ b/web/client/selectors/catalog.js
@@ -56,9 +56,12 @@ export const catalogSearchInfoSelector = createStructuredSelector({
projection: projectionSelector
});
export const formatsLoadingSelector = (state) => get(state, "catalog.formatsLoading", false);
+export const getSupportedFormatsInNewServiceSelector = (state) => get(state, "catalog.newService.supportedFormats.imageFormats", []);
export const getSupportedFormatsSelector = (state) => modeSelector(state) === 'edit'
- ? get(state, "catalog.newService.supportedFormats.imageFormats", [])
+ ? getSupportedFormatsInNewServiceSelector(state)
: selectedCatalogSelector(state)?.supportedFormats?.imageFormats || [];
+
export const getSupportedGFIFormatsSelector = (state) => get(state, "catalog.newService.supportedFormats.infoFormats", getDefaultSupportedGetFeatureInfoFormats());
export const getFormatUrlUsedSelector = (state) => get(state, "catalog.newService.formatUrlUsed", '');
export const getNewServiceStatusSelector = (state) => get(state, "catalog.isNewServiceAdded", false);
+export const showFormatErrorSelector = (state) => get(state, "catalog.showFormatError", false);
diff --git a/web/client/selectors/dashboard.js b/web/client/selectors/dashboard.js
index 967c64e883..5f565ce8be 100644
--- a/web/client/selectors/dashboard.js
+++ b/web/client/selectors/dashboard.js
@@ -6,6 +6,7 @@
* LICENSE file in the root directory of this source tree.
*/
import { createSelector } from 'reselect';
+import {get} from 'lodash';
import { pathnameSelector } from './router';
export const getDashboardId = state => state?.dashboard?.resource?.id;
@@ -27,3 +28,7 @@ export const selectedDashboardServiceSelector = state => state && state.dashboar
export const dashboardCatalogModeSelector = state => state && state.dashboard && state.dashboard.mode || "view";
export const dashboardIsNewServiceSelector = state => state.dashboard?.isNew || false;
export const dashboardSaveServiceSelector = state => state.dashboard?.saveServiceLoading || false;
+export const dashboardResourceInfoSelector = state => get(state, "dashboard.resource");
+export const dashbaordInfoDetailsUriFromIdSelector = state => state?.dashboard?.resource?.attributes?.details;
+export const dashboardInfoDetailsSettingsFromIdSelector = state => get(dashboardResource(state), "attributes.detailsSettings");
+
diff --git a/web/client/selectors/details.js b/web/client/selectors/details.js
index 68241b5c71..98d51ac963 100644
--- a/web/client/selectors/details.js
+++ b/web/client/selectors/details.js
@@ -6,4 +6,23 @@
* LICENSE file in the root directory of this source tree.
*/
+import { dashboardInfoDetailsSettingsFromIdSelector, getDashboardId, dashbaordInfoDetailsUriFromIdSelector } from "./dashboard";
+import { mapIdSelector, mapInfoDetailsSettingsFromIdSelector, mapInfoDetailsUriFromIdSelector } from "./map";
+
export const detailsTextSelector = state => state?.details?.detailsText;
+
+export const detailsUriSelector = state => {
+ const mapId = mapIdSelector(state);
+ const dashboardId = getDashboardId(state);
+ // todo: this is now for map and dashboard only, in the future if something else needs to use this like geostory, an additional contional should be added
+ let detailsUri = dashboardId && dashbaordInfoDetailsUriFromIdSelector(state, dashboardId) || mapId && mapInfoDetailsUriFromIdSelector(state, mapId);
+ return detailsUri;
+};
+
+export const detailsSettingsSelector = state => {
+ const mapId = mapIdSelector(state);
+ const dashboardId = getDashboardId(state);
+ // todo: this is now for map and dashboard only, in the future if something else needs to use this like geostory, an additional contional should be added
+ let detailsSettings = dashboardId && dashboardInfoDetailsSettingsFromIdSelector(state, dashboardId) || mapId && mapInfoDetailsSettingsFromIdSelector(state, mapId);
+ return detailsSettings;
+};
diff --git a/web/client/selectors/sidebarmenu.js b/web/client/selectors/sidebarmenu.js
index f93cf8488e..a0bdc08951 100644
--- a/web/client/selectors/sidebarmenu.js
+++ b/web/client/selectors/sidebarmenu.js
@@ -1,5 +1,11 @@
import {get} from "lodash";
+import { isDashboardAvailable } from "./dashboard";
export const lastActiveToolSelector = (state) => get(state, "sidebarmenu.lastActiveItem", false);
export const sidebarIsActiveSelector = (state) => get(state, 'controls.sidebarMenu.enabled', false);
+export const isSidebarWithFullHeight = (state) =>{
+ // here It is just for dashboard, but in the future if sidebar with full height is needed for anythinf else put here
+ return isDashboardAvailable(state);
+};
+
diff --git a/web/client/selectors/widgets.js b/web/client/selectors/widgets.js
index d4bba4b428..97f44fc81e 100644
--- a/web/client/selectors/widgets.js
+++ b/web/client/selectors/widgets.js
@@ -185,3 +185,8 @@ export const getWidgetFilterKey = (state) => {
// Set chart key if editor widget type is chart
return selectedChartId ? `charts[${selectedChartId}].filter` : "filter";
};
+
+export const getTblWidgetZoomLoader = state => {
+ let tableWidgets = (getFloatingWidgets(state) || []).filter(({ widgetType } = {}) => widgetType === "table");
+ return tableWidgets?.find(t=>t.dependencies?.zoomLoader) ? true : false;
+};
diff --git a/web/client/themes/default/less/catalog.less b/web/client/themes/default/less/catalog.less
index 44975d0b4c..06c4a539c8 100644
--- a/web/client/themes/default/less/catalog.less
+++ b/web/client/themes/default/less/catalog.less
@@ -15,10 +15,18 @@
// **************
// Layout
// **************
+.ms2-border-layout-body.catalog {
+ .form-group-flex {
+ padding: 0;
+ }
+}
.catalog-panel {
position: relative;
width: 100%;
height: 100%;
+ .form-group-flex {
+ padding: 0;
+ }
.panel-body {
padding: 0;
position: absolute;
diff --git a/web/client/themes/default/less/common.less b/web/client/themes/default/less/common.less
index 41a1512f0d..92893c09a4 100644
--- a/web/client/themes/default/less/common.less
+++ b/web/client/themes/default/less/common.less
@@ -76,6 +76,23 @@
.background-color-var(@theme-vars[main-bg]);
}
}
+ .form-group-flex {
+ &.has-success {
+ .Select-control {
+ .border-color-var(@theme-vars[success], true);
+ }
+ }
+ &.has-error {
+ .Select-control {
+ .border-color-var(@theme-vars[danger], true);
+ }
+ }
+ &.has-warning {
+ .Select-control {
+ .border-color-var(@theme-vars[warning], true);
+ }
+ }
+ }
}
// **************
@@ -396,3 +413,24 @@ div#sync-popover.popover {
float: unset;
}
+
+.form-group-flex {
+ display: flex;
+ align-items: center;
+ padding: 0 8px;
+ .checkbox,
+ .control-label {
+ flex: 1;
+ font-weight: normal;
+ &.strong{
+ font-weight: bold;
+ }
+ }
+ .input-group {
+ flex: 1;
+ }
+ input {
+ z-index: 0;
+ }
+ margin-bottom: 8px;
+}
diff --git a/web/client/themes/default/less/dashboard.less b/web/client/themes/default/less/dashboard.less
index e35a1ff7f3..1ebe1ab335 100644
--- a/web/client/themes/default/less/dashboard.less
+++ b/web/client/themes/default/less/dashboard.less
@@ -28,7 +28,6 @@
#mapstore-navbar-container {
margin-bottom: 0;
- z-index: 100;
}
.ms2-border-layout-content {
diff --git a/web/client/themes/default/less/details.less b/web/client/themes/default/less/details.less
index 9223bb2738..adb0ab86d6 100644
--- a/web/client/themes/default/less/details.less
+++ b/web/client/themes/default/less/details.less
@@ -89,3 +89,8 @@
text-align: inherit;
}
}
+
+// issue in react-dock fixed left with a fixed value and it can't be overrided
+#details-container.leftZeroPanel> div.ms-side-panel> div> div{
+ left: auto !important;
+}
diff --git a/web/client/themes/default/less/navbar.less b/web/client/themes/default/less/navbar.less
index 055be3c0ce..66f597ca3f 100644
--- a/web/client/themes/default/less/navbar.less
+++ b/web/client/themes/default/less/navbar.less
@@ -59,7 +59,7 @@ ol {
#mapstore-navbar-container {
height: @square-btn-size;
-
+ z-index: 1032;
.nav {
&.pull-left {
display: flex;
diff --git a/web/client/themes/default/less/react-select.less b/web/client/themes/default/less/react-select.less
index d1787121d4..c4d1de2c1e 100644
--- a/web/client/themes/default/less/react-select.less
+++ b/web/client/themes/default/less/react-select.less
@@ -195,3 +195,7 @@
margin-top: 3px;
}
}
+
+.Select.is-open {
+ z-index: 20;
+}
\ No newline at end of file
diff --git a/web/client/themes/default/less/wizard.less b/web/client/themes/default/less/wizard.less
index df81921d05..a51e44545d 100644
--- a/web/client/themes/default/less/wizard.less
+++ b/web/client/themes/default/less/wizard.less
@@ -179,4 +179,3 @@
}
}
}
-
diff --git a/web/client/translations/data.de-DE.json b/web/client/translations/data.de-DE.json
index 4358063988..ccc7eeccb5 100644
--- a/web/client/translations/data.de-DE.json
+++ b/web/client/translations/data.de-DE.json
@@ -57,8 +57,8 @@
"404": "Übersetzungsdatei nicht gefunden"
},
"details": {
- "title": "Infos zu dieser Karte",
- "tooltip": "Infos zu dieser Karte"
+ "title": "Infos zu dieser Inhalt",
+ "tooltip": "Infos zu dieser Inhalt"
},
"showEmptyMessageGFI": "Nachricht mit leeren Ergebnissen anzeigen",
"remove": "Löschen",
@@ -116,6 +116,7 @@
"heightOffset": "Höhenversatz (m)",
"wmsLayerTileSize": "Kachelgröße (WMS)",
"serverType": "Servertyp",
+ "formatError": "Es war nicht möglich, Format und Informationsblattformat vom konfigurierten Dienst abzurufen. Wahrscheinlich verwenden Sie einen No-Vendor-Dienst und dieser wird nicht unterstützt (z. B. GeoNetwork).",
"serverTypeOption": {
"noVendor": "No Vendor",
"geoserver": "GeoServer"
@@ -156,6 +157,21 @@
"scale": "Maßstab",
"resolution": "Auflösung"
},
+ "3dTiles": {
+ "format": "Format",
+ "3dModel": "3D-Modell",
+ "pointCloud": "Punktwolke",
+ "pointCloudShading": {
+ "title": "Visualisierungsoptionen",
+ "attenuationInfo": "Punktabschwächung basierend auf der Entfernung vom aktuellen Blickpunkt durchführen",
+ "attenuation": "Dämpfung aktivieren",
+ "maximumAttenuation": "Maximale Dämpfung",
+ "eyeDomeLightingInfo": "Dies ermöglicht eine Augenkuppelbeleuchtung, um die Visualisierung der Punktwolke zu verbessern. Dies stellt nicht das echte Sonnenlicht dar",
+ "eyeDomeLighting": "Beleuchtung aktivieren",
+ "eyeDomeLightingStrength": "Lichtstärke",
+ "eyeDomeLightingRadius": "Beleuchtungsradius"
+ }
+ },
"tooltip": {
"label": "QuickInfo",
"title": "Titel",
@@ -182,6 +198,8 @@
},
"format": {
"title": "Format",
+ "tile": "Fliese",
+ "information": "Infoblatt",
"refresh": "Unterstützte Formate abrufen",
"loading": "Wird geladen...",
"noOption": "Keine Option",
@@ -222,7 +240,8 @@
"warningSaveUpdatedMap": "Einige Ebenen wurden nicht korrekt aktualisiert",
"saveUpdatedMap": "Alle Ebenen wurden erfolgreich aktualisiert",
"incompatibleBackgroundAndProjection":"Die von Ihnen ausgewählte Projektion ist nicht mit der Hintergrundkarte kompatibel. Wechseln Sie zu einer kompatiblen oder leeren Hintergrundkarte und wählen Sie danach diese Projektion aus!",
- "incompatibleDataAndProjection":"Die aktuellen Ebenen und die Kartenprojektion sind nicht vollständig kompatibel. Teile oder alle Daten werden möglicherweise nicht auf der Karte angezeigt"
+ "incompatibleDataAndProjection":"Die aktuellen Ebenen und die Kartenprojektion sind nicht vollständig kompatibel. Teile oder alle Daten werden möglicherweise nicht auf der Karte angezeigt",
+ "errorLoadingGF":"Fehler laden GF GEOM"
},
"dock": {
"row": "{rowsSelected}. Zeile ausgewählt",
@@ -1571,7 +1590,8 @@
"urlTemplate": "URL-Vorlage",
"urlTemplateHint": "
Vorlagen-URL für Ihren benutzerdefinierten TMS-Dienst mit der Möglichkeit, Variablen einzufügen (ausgedrückt in geschweiften Klammern, z. B. {var_name} code>), die von der Anwendung ersetzt werden. . Die Variablen {x} code>, {y} code> und {z} code> sind für Kachelgitterkoordinatenwerte reserviert. Sie können auch Variablen verwenden {s} code> für Subdomains. Jede andere in der URL angegebene Variable muss auch in den Optionen unter \"Benutzerdefinierte TMS-Konfiguration\" (Erweiterte Einstellungen) angegeben werden.
\"subdomains\": ['a', 'b'] code>: Wird für mehrere Domains verwendet. Ersetzen des {s} in der URL-Vorlage
\"maxNativeZoom\": 20 : Maximaler Zoom vom Server
",
+ "forceDefaultTileGrid": "Standard-Kachelraster erzwingen",
"forceDefaultTileGridDescription": "Verwenden Sie das Kachelraster der globalen Projektion anstelle des vom Server bereitgestellten Ursprungs und der vom Server bereitgestellten Auflösungen. Dies ist nützlich für einige TMS-Dienste, die falsche Ursprünge oder Ergebnisse anzeigen."
},
"tileprovider": {
@@ -2544,7 +2564,8 @@
"startPoint": "Startpunkt",
"endPoint": "Endpunkt",
"line": "Linie",
- "geodesicLine": "Geodätische Linie"
+ "geodesicLine": "Geodätische Linie",
+ "pointCloudSizeInfo": "Der Punktwolkenradius wird nur angewendet, wenn die Dämpfungsoptionen deaktiviert sind. Die Dämpfungsoption hat Vorrang vor dieser Eigenschaft."
},
"playback": {
"settings": {
diff --git a/web/client/translations/data.en-US.json b/web/client/translations/data.en-US.json
index 9995418617..c19d70a83d 100644
--- a/web/client/translations/data.en-US.json
+++ b/web/client/translations/data.en-US.json
@@ -57,8 +57,8 @@
"404": "Translation file not found"
},
"details": {
- "title": "About this map",
- "tooltip": "About this map"
+ "title": "About this content",
+ "tooltip": "About this content"
},
"showEmptyMessageGFI": "Show empty results message in GetFeatureInfo panel",
"remove": "Delete",
@@ -116,6 +116,7 @@
"heightOffset": "Height offset (m)",
"wmsLayerTileSize": "Tile size (WMS)",
"serverType": "Server Type",
+ "formatError": "It was not possible to fetch format and information sheet format from the service configured. Probably you are using a No Vendor service and this is not supported (e.g. GeoNetwork)",
"serverTypeOption": {
"noVendor": "No Vendor",
"geoserver": "GeoServer"
@@ -156,6 +157,21 @@
"scale": "Scale",
"resolution": "Resolution"
},
+ "3dTiles": {
+ "format": "Format",
+ "3dModel": "3D Model",
+ "pointCloud": "Point Cloud",
+ "pointCloudShading": {
+ "title": "Visualization options",
+ "attenuationInfo": "Perform point attenuation based on the distance from the current view point",
+ "attenuation": "Enable attenuation",
+ "maximumAttenuation": "Maximum attenuation",
+ "eyeDomeLightingInfo": "This enable an eye dome lighting to improve visualization of the point cloud. This does not represent the real sun lighting",
+ "eyeDomeLighting": "Enable lighting",
+ "eyeDomeLightingStrength": "Lighting strength",
+ "eyeDomeLightingRadius": "Lighting radius"
+ }
+ },
"tooltip": {
"label": "Tooltip",
"title": "Title",
@@ -182,6 +198,8 @@
},
"format": {
"title": "Format",
+ "tile": "Tile",
+ "information": "Information sheet",
"refresh": "Fetch supported formats",
"loading": "Loading...",
"noOption": "No option",
@@ -222,7 +240,8 @@
"warningSaveUpdatedMap": "Some layers haven't been updated correctly.",
"saveUpdatedMap": "All the layers have been successfully updated.",
"incompatibleBackgroundAndProjection":"The Projection you selected is not compatible with background. Switch to a compatible -or an empty- background, then select this projection.",
- "incompatibleDataAndProjection":"The current layer(s) and map projection are not completely compatible. Parts or all of the data might not appear in the map."
+ "incompatibleDataAndProjection":"The current layer(s) and map projection are not completely compatible. Parts or all of the data might not appear in the map.",
+ "errorLoadingGF":"Error loading GF Geom"
},
"dock": {
"row": "{rowsSelected} row selected",
@@ -2517,7 +2536,8 @@
"startPoint": "Start point",
"endPoint": "End point",
"line": "Line",
- "geodesicLine": "Geodesic line"
+ "geodesicLine": "Geodesic line",
+ "pointCloudSizeInfo": "The point cloud radius is applied only when the attenuation options is disabled. The attenuation option takes precedence over this property."
},
"playback": {
"settings": {
diff --git a/web/client/translations/data.es-ES.json b/web/client/translations/data.es-ES.json
index 0b6d36d50f..d44ef196df 100644
--- a/web/client/translations/data.es-ES.json
+++ b/web/client/translations/data.es-ES.json
@@ -57,8 +57,8 @@
"404": "Archivo de traducción no encontrado"
},
"details": {
- "title": "Información en este mapa",
- "tooltip": "Información en este mapa"
+ "title": "Información en este contenido",
+ "tooltip": "Información en este contenido"
},
"showEmptyMessageGFI": "Mostrar mensaje de resultados vacío en el panel de GFI",
"remove": "Borrar",
@@ -113,6 +113,7 @@
"heightOffset": "Desplazamiento de altura (m)",
"wmsLayerTileSize": "Tamaño del mosaico (WMS)",
"serverType": "Tipo de servidor",
+ "formatError": "No fue posible recuperar el formato y el formato de la hoja de información del servicio configurado. Probablemente esté utilizando un servicio sin proveedor y no es compatible (por ejemplo, GeoNetwork)",
"serverTypeOption": {
"noVendor": "No Vendor",
"geoserver": "GeoServer"
@@ -153,6 +154,21 @@
"scale": "Escala",
"resolution": "Resolución"
},
+ "3dTiles": {
+ "format": "Formato",
+ "3dModel": "Modelo 3D",
+ "pointCloud": "Nube de puntos",
+ "pointCloudShading": {
+ "title": "Opciones de visualización",
+ "attenuationInfo": "Realiza atenuación de puntos según la distancia desde el punto de vista actual",
+ "attenuation": "Habilitar atenuación",
+ "maximumAttenuation": "Atenuación máxima",
+ "eyeDomeLightingInfo": "Esto habilita una iluminación de domo ocular para mejorar la visualización de la nube de puntos. Esto no representa la iluminación solar real",
+ "eyeDomeLighting": "Habilitar iluminación",
+ "eyeDomeLightingStrength": "Intensidad de iluminación",
+ "eyeDomeLightingRadius": "Radio de iluminación"
+ }
+ },
"tooltip": {
"label": "Información sobre herramientas",
"title": "Título",
@@ -182,6 +198,8 @@
},
"format": {
"title": "Formato",
+ "tile": "Teja",
+ "information": "Identificar el formato de respuesta",
"refresh": "Obtener formatos admitidos",
"loading": "Cargando...",
"noOption": "Sin opcion",
@@ -222,7 +240,8 @@
"warningSaveUpdatedMap": "Algunas capas no han sido actualizadas correctamente",
"saveUpdatedMap": "Todas las capas han sido actulizadas correctamente",
"incompatibleBackgroundAndProjection":"La proyección que seleccionó no es compatible con el fondo, cambie a un fondo compatible -o un vacío-, luego seleccione esta proyección!",
- "incompatibleDataAndProjection":"la (s) capa (s) actual (es) y la proyección del mapa no son completamente compatibles. Partes o todos los datos podrían no aparecer en el mapa"
+ "incompatibleDataAndProjection":"la (s) capa (s) actual (es) y la proyección del mapa no son completamente compatibles. Partes o todos los datos podrían no aparecer en el mapa",
+ "errorLoadingGF":"Error de carga de GF Geometry"
},
"dock": {
"row": "{rowsSelected} fila seleccionada",
@@ -2507,7 +2526,8 @@
"startPoint": "Punto de inicio",
"endPoint": "Punto final",
"line": "Línea",
- "geodesicLine": "Línea geodésica"
+ "geodesicLine": "Línea geodésica",
+ "pointCloudSizeInfo": "El radio de la nube de puntos se aplica sólo cuando las opciones de atenuación están deshabilitadas. La opción de atenuación tiene prioridad sobre esta propiedad."
},
"playback": {
"settings": {
diff --git a/web/client/translations/data.fr-FR.json b/web/client/translations/data.fr-FR.json
index bca0accddb..602b4826fe 100644
--- a/web/client/translations/data.fr-FR.json
+++ b/web/client/translations/data.fr-FR.json
@@ -57,8 +57,8 @@
"404": "Fichier de traduction introuvable"
},
"details": {
- "title": "À propos de cette carte",
- "tooltip": "À propos de cette carte"
+ "title": "À propos de cette contenu",
+ "tooltip": "À propos de cette contenu"
},
"showEmptyMessageGFI": "Afficher un message de résultat vide dans le panneau GetFeatureInfo",
"remove": "Supprimer",
@@ -116,6 +116,7 @@
"heightOffset": "Décalage en hauteur (m)",
"wmsLayerTileSize": "Taille de la tuile (WMS)",
"serverType": "Type de serveur",
+ "formatError": "Il n'a pas été possible de récupérer le format et le format de la fiche d'information à partir du service configuré. Vous utilisez probablement un service No Vendor et celui-ci n'est pas pris en charge (par exemple GeoNetwork)",
"serverTypeOption": {
"noVendor": "No Vendor",
"geoserver": "GeoServer"
@@ -156,6 +157,21 @@
"scale": "Échelle",
"resolution": "Résolution"
},
+ "3dTiles": {
+ "format": "Formater",
+ "3dModel": "Modèle 3D",
+ "pointCloud": "Nuage de points",
+ "pointCloudShading": {
+ "title": "Options de visualisation",
+ "attenuationInfo": "Effectuer une atténuation de point en fonction de la distance du point de vue actuel",
+ "attenuation": "Activer l'atténuation",
+ "maximumAttenuation": "Atténuation maximale",
+ "eyeDomeLightingInfo": "Cela permet à un éclairage du dôme oculaire d'améliorer la visualisation du nuage de points. Cela ne représente pas l'éclairage réel du soleil",
+ "eyeDomeLighting": "Activer l'éclairage",
+ "eyeDomeLightingStrength": "Force d'éclairage",
+ "eyeDomeLightingRadius": "Rayon d'éclairage"
+ }
+ },
"tooltip": {
"label": "Infobulle",
"title": "Titre",
@@ -182,6 +198,8 @@
},
"format": {
"title": "Format",
+ "tile": "Tile",
+ "information": "Fiche d'information",
"refresh": "Récupérer les formats pris en charge",
"loading": "Chargement...",
"noOption": "Pas d'option",
@@ -222,7 +240,8 @@
"warningSaveUpdatedMap": "Certaines couches n'ont pas été mises à jour correctement",
"saveUpdatedMap": "Toutes les couches ont bien été mises à jour",
"incompatibleBackgroundAndProjection": "La projection que vous avez choisie n'est pas compatible avec le fond de plan. Changez pour un fond de plan compatible ou retirez le fond de plan, puis sélectionnez à nouveau la projection.",
- "incompatibleDataAndProjection": "La/les couche(s) actuelle(s) et la projection cartographique ne sont pas totalement compatibles. Certaines données voire toutes les données risquent de ne pas apparaître sur la carte."
+ "incompatibleDataAndProjection": "La/les couche(s) actuelle(s) et la projection cartographique ne sont pas totalement compatibles. Certaines données voire toutes les données risquent de ne pas apparaître sur la carte.",
+ "errorLoadingGF":"Erreur Chargement GF Geom"
},
"dock": {
"row": "{rowsSelected} ligne sélectionnée",
@@ -2507,7 +2526,8 @@
"startPoint": "Point de départ",
"endPoint": "Point final",
"line": "Ligne",
- "geodesicLine": "Ligne géodésique"
+ "geodesicLine": "Ligne géodésique",
+ "pointCloudSizeInfo": "Le rayon du nuage de points est appliqué uniquement lorsque les options d'atténuation sont désactivées. L'option d'atténuation est prioritaire sur cette propriété."
},
"playback": {
"settings": {
diff --git a/web/client/translations/data.is-IS.json b/web/client/translations/data.is-IS.json
index 7466070478..67a233c29b 100644
--- a/web/client/translations/data.is-IS.json
+++ b/web/client/translations/data.is-IS.json
@@ -57,8 +57,8 @@
"404": "Translation file not found"
},
"details": {
- "title": "About this map",
- "tooltip": "About this map"
+ "title": "About this content",
+ "tooltip": "About this content"
},
"showEmptyMessageGFI": "Show empty results message in GetFeatureInfo panel",
"remove": "Delete",
diff --git a/web/client/translations/data.it-IT.json b/web/client/translations/data.it-IT.json
index f978182b98..0a49ddffb8 100644
--- a/web/client/translations/data.it-IT.json
+++ b/web/client/translations/data.it-IT.json
@@ -57,8 +57,8 @@
"404": "File di traduzione non trovato"
},
"details": {
- "title": "Info su questa mappa",
- "tooltip": "Info su questa mappa"
+ "title": "Info su questo contenuto",
+ "tooltip": "Info su questo contenuto"
},
"showEmptyMessageGFI": "Mostra il messaggio: Nessuna feature per gli altri layer",
"remove": "Rimuovi",
@@ -116,6 +116,7 @@
"heightOffset": "Spostamento in altezza (m)",
"wmsLayerTileSize": "Dimensione tile (WMS)",
"serverType": "Tipo di Server",
+ "formatError": "Non è stato possibile recuperare le informazioni sui formati dal servizio configurato. Probabilmente stai usando un servizio \"No Vendor\" e questo non è supportato (es. GeoNetwork)",
"serverTypeOption": {
"noVendor": "No Vendor",
"geoserver": "GeoServer"
@@ -156,6 +157,21 @@
"scale": "Scala",
"resolution": "Risoluzione"
},
+ "3dTiles": {
+ "format": "Formato",
+ "3dModel": "Modello 3D",
+ "pointCloud": "Nuvola di punti",
+ "pointCloudShading": {
+ "title": "Opzioni di visualizzazione",
+ "attenuationInfo": "Applica una attenuazione della nuvola di punti basata sul punto di vista corrente",
+ "attenuation": "Abilita attenuazione",
+ "maximumAttenuation": "Massima attenuazione",
+ "eyeDomeLightingInfo": "Abilita l'illuminazione di tipo eye dome per migliorare la visualizzazione della nuvola di punti. Questa non rappresenta l'attuale illuminazione del sole",
+ "eyeDomeLighting": "Abilita illuminazione",
+ "eyeDomeLightingStrength": "Intensità luminosa",
+ "eyeDomeLightingRadius": "Raggio di illuminazione"
+ }
+ },
"tooltip": {
"label": "Tooltip",
"title": "Titolo",
@@ -182,6 +198,8 @@
},
"format": {
"title": "Formato",
+ "tile": "Tile",
+ "information": "Risposte interrogazioni su mappa",
"refresh": "Recupera i formati supportati",
"loading": "Caricamento in corso...",
"noOption": "Nessuna opzione",
@@ -222,7 +240,8 @@
"warningSaveUpdatedMap": "Alcuni layer non sono stati aggiornati correttamente",
"saveUpdatedMap": "Tutti i layer sono stati aggiornati con successo",
"incompatibleBackgroundAndProjection":"The Projection you selected is not compatible with background, switch to a compatible -or an empty- background, then select this projection!",
- "incompatibleDataAndProjection":"Uno o più livelli non sono completamente compatibili con la proiezione selezionata. I dati potrebbero essere (tutti o in parte) non visibili in mappa"
+ "incompatibleDataAndProjection":"Uno o più livelli non sono completamente compatibili con la proiezione selezionata. I dati potrebbero essere (tutti o in parte) non visibili in mappa",
+ "errorLoadingGF":"Errore di caricamento della geometria"
},
"dock": {
"row": "{rowsSelected} riga selezionata",
@@ -2508,7 +2527,8 @@
"startPoint": "Punto iniziale",
"endPoint": "Punto finale",
"line": "Linea",
- "geodesicLine": "Linea geodesica"
+ "geodesicLine": "Linea geodesica",
+ "pointCloudSizeInfo": "Il raggio della nuvola di punti viene applicato solo quando le opzioni di attenuazione sono disabilitate. L'opzione di attenuazione ha la precedenza su questa proprietà."
},
"playback": {
"settings": {
diff --git a/web/client/utils/LayersUtils.js b/web/client/utils/LayersUtils.js
index e57e396a5c..8cfca18d72 100644
--- a/web/client/utils/LayersUtils.js
+++ b/web/client/utils/LayersUtils.js
@@ -655,7 +655,8 @@ export const saveLayer = (layer) => {
layer.tileGridStrategy ? { tileGridStrategy: layer.tileGridStrategy } : {},
layer.tileGridCacheSupport ? { tileGridCacheSupport: layer.tileGridCacheSupport } : {},
!isNil(layer.forceProxy) ? { forceProxy: layer.forceProxy } : {},
- !isNil(layer.disableFeaturesEditing) ? { disableFeaturesEditing: layer.disableFeaturesEditing } : {});
+ !isNil(layer.disableFeaturesEditing) ? { disableFeaturesEditing: layer.disableFeaturesEditing } : {},
+ layer.pointCloudShading ? { pointCloudShading: layer.pointCloudShading } : {});
};
/**
diff --git a/web/client/utils/MapUtils.js b/web/client/utils/MapUtils.js
index 380817b304..9ca76e86a2 100644
--- a/web/client/utils/MapUtils.js
+++ b/web/client/utils/MapUtils.js
@@ -842,7 +842,7 @@ export const compareMapChanges = (map1 = {}, map2 = {}) => {
* used to override default ones in order to have a local hooks object
* one for each map widget
*/
-export const createRegisterHooks = () => {
+export const createRegisterHooks = (id) => {
let hooksCustom = {};
return {
registerHook: (name, hook) => {
@@ -858,7 +858,8 @@ export const createRegisterHooks = () => {
return dontExistCallback();
}
return null;
- }
+ },
+ id
};
};
diff --git a/web/client/utils/__tests__/LayersUtils-test.js b/web/client/utils/__tests__/LayersUtils-test.js
index 7e628fc827..4354ed5394 100644
--- a/web/client/utils/__tests__/LayersUtils-test.js
+++ b/web/client/utils/__tests__/LayersUtils-test.js
@@ -1246,6 +1246,20 @@ describe('LayersUtils', () => {
l => {
expect(l.disableFeaturesEditing).toBeTruthy();
}
+ ],
+ [
+ {
+ pointCloudShading: {
+ attenuation: true,
+ maximumAttenuation: 4,
+ eyeDomeLighting: true,
+ eyeDomeLightingStrength: 1,
+ eyeDomeLightingRadius: 1
+ }
+ },
+ l => {
+ expect(l.pointCloudShading).toBeTruthy();
+ }
]
];
layers.map(([layer, test]) => test(LayersUtils.saveLayer(layer)) );