@eeacms/volto-arcgis-block 0.1.337 → 0.1.338
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file. Dates are d
|
|
|
4
4
|
|
|
5
5
|
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
|
6
6
|
|
|
7
|
+
### [0.1.338](https://github.com/eea/volto-arcgis-block/compare/0.1.337...0.1.338) - 18 February 2025
|
|
8
|
+
|
|
9
|
+
#### :hammer_and_wrench: Others
|
|
10
|
+
|
|
11
|
+
- CLMS-282421 (feat): Ticket complete [Unai Bolivar - [`7ed8b6d`](https://github.com/eea/volto-arcgis-block/commit/7ed8b6d1a6bfe918b7e7f916ea65f51b031d34a4)]
|
|
12
|
+
- CLMS-282421 (feat): WMS service upload ticket is done. [Unai Bolivar - [`ff4c428`](https://github.com/eea/volto-arcgis-block/commit/ff4c42837bebf2974c1b799df497ede8e7defae4)]
|
|
13
|
+
- CLMS-282421 (feat): WMS service upload is finalized. Styles for widget are done. Working on pop up. [Unai Bolivar - [`d482874`](https://github.com/eea/volto-arcgis-block/commit/d482874f9257ecc51bbd3a76a4c419cbaa1abb5b)]
|
|
14
|
+
- CLMS-282421 (feat): WMS service upload is finalized. Halfway through the finishing touches. [Unai Bolivar - [`4c0b0d1`](https://github.com/eea/volto-arcgis-block/commit/4c0b0d15b8ed9d098032d15717060f21b3cb4585)]
|
|
15
|
+
- CLMS-282421 (feat): WMS service upload is finalized. Need to apply some style corrections. [Unai Bolivar - [`043f786`](https://github.com/eea/volto-arcgis-block/commit/043f786f574a4b742bfe2c87c12ba3ff1480375b)]
|
|
16
|
+
- filled in new script with base structure [Unai Bolivar - [`2b68aa7`](https://github.com/eea/volto-arcgis-block/commit/2b68aa7982a97f44ee0cb4d54988d7773cd440f1)]
|
|
17
|
+
- created new script [Unai Bolivar - [`eb2c984`](https://github.com/eea/volto-arcgis-block/commit/eb2c98424dc7850cd777e942f87e87182071c252)]
|
|
7
18
|
### [0.1.337](https://github.com/eea/volto-arcgis-block/compare/0.1.336...0.1.337) - 18 February 2025
|
|
8
19
|
|
|
9
20
|
### [0.1.336](https://github.com/eea/volto-arcgis-block/compare/0.1.335...0.1.336) - 11 February 2025
|
package/package.json
CHANGED
|
@@ -21,6 +21,7 @@ import HotspotWidget from './HotspotWidget';
|
|
|
21
21
|
import PanWidget from './PanWidget';
|
|
22
22
|
import BookmarkWidget from './BookmarkWidget';
|
|
23
23
|
import LoadingSpinner from './LoadingSpinner';
|
|
24
|
+
import UploadWidget from './UploadWidget';
|
|
24
25
|
import { injectLazyLibs } from '@plone/volto/helpers/Loadable';
|
|
25
26
|
//import { getTaxonomy } from '@eeacms/volto-taxonomy/actions';
|
|
26
27
|
|
|
@@ -450,6 +451,17 @@ class MapViewer extends React.Component {
|
|
|
450
451
|
);
|
|
451
452
|
}
|
|
452
453
|
|
|
454
|
+
renderUploadService() {
|
|
455
|
+
if (this.view)
|
|
456
|
+
return (
|
|
457
|
+
<UploadWidget
|
|
458
|
+
mapviewer_config={this.props.mapviewer_config}
|
|
459
|
+
view={this.view}
|
|
460
|
+
map={this.map}
|
|
461
|
+
mapViewer={this}
|
|
462
|
+
/>
|
|
463
|
+
);
|
|
464
|
+
}
|
|
453
465
|
/**
|
|
454
466
|
* This method renders the map viewer, invoking if necessary the methods
|
|
455
467
|
* to render the other widgets to display
|
|
@@ -482,6 +494,7 @@ class MapViewer extends React.Component {
|
|
|
482
494
|
{this.renderMenu()}
|
|
483
495
|
{this.renderBookmark()}
|
|
484
496
|
{this.renderLoadingSpinner()}
|
|
497
|
+
{this.renderUploadService()}
|
|
485
498
|
</div>
|
|
486
499
|
</div>
|
|
487
500
|
);
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import React, { createRef } from 'react';
|
|
2
|
+
import { loadModules } from 'esri-loader';
|
|
3
|
+
// import { FontAwesomeIcon } from '@eeacms/volto-clms-utils/components';
|
|
4
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
5
|
+
|
|
6
|
+
var WMSLayer;
|
|
7
|
+
|
|
8
|
+
class UploadWidget extends React.Component {
|
|
9
|
+
/**
|
|
10
|
+
* Creator of the Upload widget class
|
|
11
|
+
* @param {*} props
|
|
12
|
+
*/
|
|
13
|
+
constructor(props) {
|
|
14
|
+
super(props);
|
|
15
|
+
//We create a reference to a DOM element to be mounted
|
|
16
|
+
this.container = createRef();
|
|
17
|
+
//Initially, we set the state of the component to
|
|
18
|
+
//not be showing the basemap panel
|
|
19
|
+
this.state = {
|
|
20
|
+
showMapMenu: false,
|
|
21
|
+
showInfoPopup: false,
|
|
22
|
+
infoPopupType: '',
|
|
23
|
+
wmsServiceUrl: '',
|
|
24
|
+
};
|
|
25
|
+
this.menuClass =
|
|
26
|
+
'esri-icon-sketch-rectangle esri-widget--button esri-widget esri-interactive';
|
|
27
|
+
this.mapviewer_config = this.props.mapviewer_config;
|
|
28
|
+
this.fileInput = createRef();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
loader() {
|
|
32
|
+
return loadModules(['esri/layers/WMSLayer']).then(([_WMSLayer]) => {
|
|
33
|
+
[WMSLayer] = [_WMSLayer];
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Method that will be invoked when the
|
|
39
|
+
* button is clicked. It controls the open
|
|
40
|
+
* and close actions of the component
|
|
41
|
+
*/
|
|
42
|
+
openMenu() {
|
|
43
|
+
if (this.state.showMapMenu) {
|
|
44
|
+
this.props.mapViewer.setActiveWidget();
|
|
45
|
+
this.container.current.querySelector('.right-panel').style.display =
|
|
46
|
+
'none';
|
|
47
|
+
this.container.current.querySelector(
|
|
48
|
+
'.right-panel-content',
|
|
49
|
+
).style.overflowY = 'auto';
|
|
50
|
+
this.container.current.querySelector(
|
|
51
|
+
'.right-panel-content',
|
|
52
|
+
).style.display = 'none';
|
|
53
|
+
this.container.current.querySelector(
|
|
54
|
+
'.right-panel-content',
|
|
55
|
+
).style.alignItems = 'none';
|
|
56
|
+
this.container.current.querySelector('.upload-panel').style.display =
|
|
57
|
+
'none';
|
|
58
|
+
this.container.current.querySelector('.upload-panel').style.flexWrap =
|
|
59
|
+
'none';
|
|
60
|
+
this.container.current
|
|
61
|
+
.querySelector('.esri-widget--button')
|
|
62
|
+
.classList.remove('active-widget');
|
|
63
|
+
document
|
|
64
|
+
.querySelector('.esri-ui-top-right.esri-ui-corner')
|
|
65
|
+
.classList.remove('show-panel');
|
|
66
|
+
// By invoking the setState, we notify the state we want to reach
|
|
67
|
+
// and ensure that the component is rendered again
|
|
68
|
+
this.setState({
|
|
69
|
+
showMapMenu: false,
|
|
70
|
+
showInfoPopup: false,
|
|
71
|
+
infoPopupType: '',
|
|
72
|
+
});
|
|
73
|
+
this.clearWidget();
|
|
74
|
+
} else {
|
|
75
|
+
this.props.mapViewer.setActiveWidget(this);
|
|
76
|
+
this.container.current.querySelector('.right-panel').style.display =
|
|
77
|
+
'flex';
|
|
78
|
+
this.container.current.querySelector(
|
|
79
|
+
'.right-panel-content',
|
|
80
|
+
).style.overflowY = 'hidden';
|
|
81
|
+
this.container.current.querySelector(
|
|
82
|
+
'.right-panel-content',
|
|
83
|
+
).style.display = 'flex';
|
|
84
|
+
this.container.current.querySelector(
|
|
85
|
+
'.right-panel-content',
|
|
86
|
+
).style.alignItems = 'center';
|
|
87
|
+
this.container.current.querySelector('.upload-panel').style.display =
|
|
88
|
+
'flex';
|
|
89
|
+
this.container.current.querySelector('.upload-panel').style.flexWrap =
|
|
90
|
+
'wrap';
|
|
91
|
+
this.container.current
|
|
92
|
+
.querySelector('.esri-widget--button')
|
|
93
|
+
.classList.add('active-widget');
|
|
94
|
+
document
|
|
95
|
+
.querySelector('.esri-ui-top-right.esri-ui-corner')
|
|
96
|
+
.classList.add('show-panel');
|
|
97
|
+
// By invoking the setState, we notify the state we want to reach
|
|
98
|
+
// and ensure that the component is rendered again
|
|
99
|
+
this.setState({
|
|
100
|
+
showMapMenu: true,
|
|
101
|
+
showInfoPopup: false,
|
|
102
|
+
infoPopupType: '',
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
clearWidget() {
|
|
108
|
+
window.document.querySelector('.pan-container').style.display = 'none';
|
|
109
|
+
this.props.mapViewer.view.popup.close();
|
|
110
|
+
const { wmsLayer } = this.state;
|
|
111
|
+
if (wmsLayer) {
|
|
112
|
+
this.props.view.map.remove(wmsLayer);
|
|
113
|
+
// this.props.view.graphics.removeAll();
|
|
114
|
+
}
|
|
115
|
+
this.setState({
|
|
116
|
+
wmsLayer: null,
|
|
117
|
+
wmsServiceUrl: '',
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
document.querySelector('.esri-attribution__powered-by').style.display =
|
|
121
|
+
'none';
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
handleWmsServiceUrlChange = (event) => {
|
|
125
|
+
this.setState({ wmsServiceUrl: event.target.value });
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
handleUploadService = async () => {
|
|
129
|
+
const { wmsServiceUrl, wmsLayer } = this.state;
|
|
130
|
+
if (wmsLayer) {
|
|
131
|
+
this.props.view.map.remove(wmsLayer);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
const newWmsLayer = new WMSLayer({
|
|
136
|
+
url: wmsServiceUrl,
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
await newWmsLayer.load();
|
|
140
|
+
this.props.view.map.add(newWmsLayer);
|
|
141
|
+
this.setState({
|
|
142
|
+
wmsLayer: newWmsLayer,
|
|
143
|
+
showInfoPopup: false,
|
|
144
|
+
infoPopupType: '',
|
|
145
|
+
wmsServiceUrl: '',
|
|
146
|
+
});
|
|
147
|
+
} catch (error) {
|
|
148
|
+
this.setState({
|
|
149
|
+
showInfoPopup: true,
|
|
150
|
+
infoPopupType: 'uploadError',
|
|
151
|
+
wmsServiceUrl: '',
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* This method is executed after the render method is executed
|
|
157
|
+
*/
|
|
158
|
+
async componentDidMount() {
|
|
159
|
+
await this.loader();
|
|
160
|
+
this.props.view.when(() => {
|
|
161
|
+
this.container.current !== null &&
|
|
162
|
+
this.props.view.ui.add(this.container.current, 'top-right');
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* This method renders the component
|
|
168
|
+
* @returns jsx
|
|
169
|
+
*/
|
|
170
|
+
render() {
|
|
171
|
+
return (
|
|
172
|
+
<>
|
|
173
|
+
<div ref={this.container} className="upload-container">
|
|
174
|
+
<div tooltip="Add Map service" direction="left" type="widget">
|
|
175
|
+
<div
|
|
176
|
+
className={this.menuClass}
|
|
177
|
+
id="map_upload_button"
|
|
178
|
+
aria-label="WMS service upload"
|
|
179
|
+
onClick={this.openMenu.bind(this)}
|
|
180
|
+
onKeyDown={(e) => {
|
|
181
|
+
if (
|
|
182
|
+
!e.altKey &&
|
|
183
|
+
e.code !== 'Tab' &&
|
|
184
|
+
!e.ctrlKey &&
|
|
185
|
+
e.code !== 'Delete' &&
|
|
186
|
+
!e.shiftKey &&
|
|
187
|
+
!e.code.startsWith('F')
|
|
188
|
+
) {
|
|
189
|
+
this.openMenu(this);
|
|
190
|
+
}
|
|
191
|
+
}}
|
|
192
|
+
tabIndex="0"
|
|
193
|
+
role="button"
|
|
194
|
+
></div>
|
|
195
|
+
</div>
|
|
196
|
+
<div className="right-panel">
|
|
197
|
+
<div className="right-panel-header">
|
|
198
|
+
<span>Add map service</span>
|
|
199
|
+
<span
|
|
200
|
+
className="map-menu-icon esri-icon-close"
|
|
201
|
+
onClick={this.openMenu.bind(this)}
|
|
202
|
+
onKeyDown={(e) => {
|
|
203
|
+
if (
|
|
204
|
+
!e.altKey &&
|
|
205
|
+
e.code !== 'Tab' &&
|
|
206
|
+
!e.ctrlKey &&
|
|
207
|
+
e.code !== 'Delete' &&
|
|
208
|
+
!e.shiftKey &&
|
|
209
|
+
!e.code.startsWith('F')
|
|
210
|
+
) {
|
|
211
|
+
this.openMenu(this);
|
|
212
|
+
}
|
|
213
|
+
}}
|
|
214
|
+
tabIndex="0"
|
|
215
|
+
role="button"
|
|
216
|
+
></span>
|
|
217
|
+
</div>
|
|
218
|
+
<div className="right-panel-content">
|
|
219
|
+
<div className="upload-panel">
|
|
220
|
+
<div className="ccl-form">
|
|
221
|
+
<div className="field">
|
|
222
|
+
<label>
|
|
223
|
+
Map service address
|
|
224
|
+
<input
|
|
225
|
+
type="text"
|
|
226
|
+
placeholder="Add map service URL (https://...)"
|
|
227
|
+
value={this.state.wmsServiceUrl}
|
|
228
|
+
onChange={this.handleWmsServiceUrlChange}
|
|
229
|
+
/>
|
|
230
|
+
</label>
|
|
231
|
+
</div>
|
|
232
|
+
<button
|
|
233
|
+
className="esri-button"
|
|
234
|
+
onClick={this.handleUploadService}
|
|
235
|
+
>
|
|
236
|
+
Upload service
|
|
237
|
+
</button>
|
|
238
|
+
</div>
|
|
239
|
+
</div>
|
|
240
|
+
</div>
|
|
241
|
+
</div>
|
|
242
|
+
{this.state.showInfoPopup && (
|
|
243
|
+
<div className="map-container popup-block">
|
|
244
|
+
<div className="drawRectanglePopup-block">
|
|
245
|
+
<div className="drawRectanglePopup-content">
|
|
246
|
+
{this.state.infoPopupType === 'uploadError' && (
|
|
247
|
+
<>
|
|
248
|
+
<span className="drawRectanglePopup-icon">
|
|
249
|
+
<FontAwesomeIcon icon={['fas', 'info-circle']} />
|
|
250
|
+
</span>
|
|
251
|
+
<div className="drawRectanglePopup-text">
|
|
252
|
+
Error uploading the map service.
|
|
253
|
+
</div>
|
|
254
|
+
</>
|
|
255
|
+
)}
|
|
256
|
+
</div>
|
|
257
|
+
</div>
|
|
258
|
+
</div>
|
|
259
|
+
)}
|
|
260
|
+
</div>
|
|
261
|
+
</>
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
export default UploadWidget;
|
|
@@ -97,6 +97,10 @@
|
|
|
97
97
|
order: 7;
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
+
.upload-container {
|
|
101
|
+
order: 8;
|
|
102
|
+
}
|
|
103
|
+
|
|
100
104
|
/* Basemap */
|
|
101
105
|
.basemap-container {
|
|
102
106
|
display: flex;
|
|
@@ -464,6 +468,37 @@ label.ccl-form-radio-label span.nuts-menu-icon {
|
|
|
464
468
|
color: red;
|
|
465
469
|
font-size: 15px;
|
|
466
470
|
}
|
|
471
|
+
/* WMS Upload */
|
|
472
|
+
div.upload-container.esri-component
|
|
473
|
+
> div.right-panel
|
|
474
|
+
> div.right-panel-content {
|
|
475
|
+
display: unset !important;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
.upload-container {
|
|
479
|
+
display: flex;
|
|
480
|
+
box-shadow: none !important;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
.upload-container input::placeholder {
|
|
484
|
+
color: #999;
|
|
485
|
+
font-size: 0.875rem;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
.upload-container .esri-button:hover {
|
|
489
|
+
border: none;
|
|
490
|
+
background-color: #a0b128;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
.upload-container .esri-button {
|
|
494
|
+
border-color: #a0b128;
|
|
495
|
+
background-color: white;
|
|
496
|
+
color: #a0b128;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
.upload-panel {
|
|
500
|
+
display: unset !important;
|
|
501
|
+
}
|
|
467
502
|
/* Left menu */
|
|
468
503
|
.map-menu {
|
|
469
504
|
position: relative;
|