Skip to content

Commit dec517a

Browse files
committed
form: enabling the uniqueLayer mode configuration in the GeometryField
1 parent fb86fcf commit dec517a

File tree

6 files changed

+24
-87
lines changed

6 files changed

+24
-87
lines changed

src/lib/components/form/fields/GeometryField/GeometryField.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import { InteractiveMap } from './InteractiveMap';
4848
* @param {Function} onDataLoad Function called when the data is loaded. This function can be used to present
4949
* a message (e.g., toast) to the user.
5050
* @param {Object} interactiveMapConfig Configuration object for the `Interactive Map` component.
51+
* @param {Boolean} uniqueLayer Enable/Disable users to draw multiple geometries in the map.
5152
* @returns {JSX.Element}
5253
*/
5354
export const GeometryField = ({
@@ -60,14 +61,15 @@ export const GeometryField = ({
6061
onDataClean,
6162
onDataLoad,
6263
interactiveMapConfig,
64+
uniqueLayer,
6365
}) => {
6466
// States
6567
const [interactiveMapInitialized, setInteractiveMapInitialized] =
6668
useState(false);
6769
const [activatedBreadcrumb, setActivatedBreadcrumb] = useState('menu');
6870

6971
// Local store
70-
const geometryStore = new GeometryStore();
72+
const geometryStore = new GeometryStore(null, uniqueLayer);
7173

7274
// Handlers
7375
const changeBreadcrumb = (breadcrumbName) =>

src/lib/components/form/fields/GeometryField/GeometryField.stories.js

Lines changed: 6 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,9 @@ const Template = (args) => (
4949
/**
5050
* Component stories
5151
*/
52-
export const MultipleLayers = Template.bind({});
53-
MultipleLayers.args = {
52+
export const UniqueLayer = Template.bind({});
53+
UniqueLayer.args = {
54+
uniqueLayer: true,
5455
fieldPath: 'geometry',
5556
label: 'Geometry',
5657
labelIcon: 'location arrow',
@@ -66,43 +67,11 @@ MultipleLayers.args = {
6667
});
6768
}, 100);
6869
},
69-
interactiveMapConfig: {
70-
mapConfig: {
71-
mapContainer: {
72-
center: [30, -50],
73-
zoom: 1,
74-
zoomControl: true,
75-
},
76-
geometryEditorConfig: {
77-
toolbarConfig: {
78-
positions: {
79-
draw: 'topleft',
80-
edit: 'topright',
81-
},
82-
drawText: false,
83-
drawCircleMarker: false,
84-
drawCircle: false,
85-
cutPolygon: false,
86-
controlOrder: [
87-
'drawMarker',
88-
'drawPolyline',
89-
'drawRectangle',
90-
'drawPolygon',
91-
'editMode',
92-
'dragMode',
93-
'cutPolygon',
94-
'rotateMode',
95-
'removalMode',
96-
],
97-
},
98-
uniqueLayer: false,
99-
},
100-
},
101-
},
10270
};
10371

104-
export const UniqueGeometry = Template.bind({});
105-
UniqueGeometry.args = {
72+
export const MultipleLayers = Template.bind({});
73+
MultipleLayers.args = {
74+
uniqueLayer: false,
10675
fieldPath: 'geometry',
10776
label: 'Geometry',
10877
labelIcon: 'location arrow',
@@ -118,37 +87,4 @@ UniqueGeometry.args = {
11887
});
11988
}, 100);
12089
},
121-
interactiveMapConfig: {
122-
mapConfig: {
123-
mapContainer: {
124-
center: [30, -50],
125-
zoom: 1,
126-
zoomControl: true,
127-
},
128-
geometryEditorConfig: {
129-
toolbarConfig: {
130-
positions: {
131-
draw: 'topleft',
132-
edit: 'topright',
133-
},
134-
drawText: false,
135-
drawCircleMarker: false,
136-
drawCircle: false,
137-
cutPolygon: false,
138-
controlOrder: [
139-
'drawMarker',
140-
'drawPolyline',
141-
'drawRectangle',
142-
'drawPolygon',
143-
'editMode',
144-
'dragMode',
145-
'cutPolygon',
146-
'rotateMode',
147-
'removalMode',
148-
],
149-
},
150-
uniqueLayer: true,
151-
},
152-
},
153-
},
15490
};

src/lib/components/form/fields/GeometryField/GeometryStore.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ export class GeometryStore {
2222
/**
2323
* @constructor
2424
* @param {Object} formikProps Formik Bag object.
25+
* @param {Boolean} uniqueLayer Enable/Disable users to draw multiple geometries in the map.
2526
*/
26-
constructor(formikProps = null) {
27+
constructor(formikProps = null, uniqueLayer = false) {
2728
// definitions
2829
this.formikProps = null;
2930
this.fieldPath = null;
31+
this.uniqueLayer = uniqueLayer;
3032

3133
this.indexKey = 0;
3234
this.geometryIndex = {};
@@ -172,6 +174,10 @@ export class GeometryStore {
172174
addLayer(layer) {
173175
const layerKey = this._generateKey();
174176

177+
if (this.uniqueLayer) {
178+
this.geometryIndex = {};
179+
}
180+
175181
layer._store_identifier = layerKey;
176182
this.geometryIndex[layerKey] = layer;
177183

src/lib/components/form/fields/GeometryField/InteractiveMap/GeometryEditor.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export const GeometryEditor = ({ geometryStore, geometryEditorConfig }) => {
3131
const [controlRendered, setControlRendered] = useState(false);
3232

3333
// Configurations
34-
const { uniqueLayer } = geometryEditorConfig;
34+
const uniqueLayer = geometryStore.uniqueLayer;
3535

3636
// Auxiliary functions
3737
const renderFlagGenerator = (id) => {
@@ -41,8 +41,7 @@ export const GeometryEditor = ({ geometryStore, geometryEditorConfig }) => {
4141
// Handlers
4242
const mapEventHandler = new MapEventHandler(
4343
geometryStore,
44-
renderFlagGenerator,
45-
geometryEditorConfig
44+
renderFlagGenerator
4645
);
4746

4847
// Hooks
@@ -61,7 +60,7 @@ export const GeometryEditor = ({ geometryStore, geometryEditorConfig }) => {
6160
<LayerLoader
6261
renderFlag={renderFlag}
6362
layers={geometryStore.getLayers()}
64-
enableMultipleLayers={!geometryEditorConfig.uniqueLayer}
63+
enableMultipleLayers={!uniqueLayer}
6564
/>
6665
</>
6766
) : null}
@@ -100,6 +99,5 @@ GeometryEditor.defaultProps = {
10099
'removalMode',
101100
],
102101
},
103-
uniqueLayer: false,
104102
},
105103
};

src/lib/components/form/fields/GeometryField/InteractiveMap/InteractiveMap.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
import React from 'react';
1010
import PropTypes from 'prop-types';
1111

12-
import _get from 'lodash/get';
13-
1412
import { MapContainer } from 'react-leaflet';
1513

1614
import { GeometryStore } from '../GeometryStore';
@@ -50,7 +48,7 @@ export const InteractiveMap = React.memo(InteractiveMapComponent, (props) => {
5048
// we need rerender to sync the map and the formik store;
5149
// - uniqueLayer (false): All drawn layers will be presented, and we do not
5250
// need to rerender.
53-
return !_get(props, 'mapConfig.geometryEditorConfig.uniqueLayer');
51+
return !props.geometryStore.uniqueLayer;
5452
});
5553

5654
InteractiveMap.propTypes = {

src/lib/components/form/fields/GeometryField/InteractiveMap/MapEventHandler.js

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,11 @@ export class MapEventHandler {
1414
* @constructor
1515
* @param {Object} geometryStore Geometry Store object.
1616
* @param {Function} renderFlagGenerator Function to generate a flag identifier
17-
* for the current render step
18-
* @param {Object} config Configuration object for the `Map Event Handler`.
17+
* for the current render step.
1918
*/
20-
constructor(geometryStore, renderFlagGenerator, config = {}) {
19+
constructor(geometryStore, renderFlagGenerator) {
2120
this.geometryStore = geometryStore;
22-
this.config = config;
21+
this.uniqueLayer = geometryStore.uniqueLayer;
2322

2423
this.renderFlagGenerator = renderFlagGenerator;
2524
}
@@ -29,9 +28,7 @@ export class MapEventHandler {
2928
* @private
3029
*/
3130
_checkForUniqueLayer() {
32-
const uniqueLayerEnabled = this.config ? this.config.uniqueLayer : false;
33-
34-
if (uniqueLayerEnabled) {
31+
if (this.uniqueLayer) {
3532
this.geometryStore.getLayers().forEach((layer) => {
3633
this._removeLayerFromIndex(layer);
3734
});

0 commit comments

Comments
 (0)