@eeacms/volto-arcgis-block 0.1.344 → 0.1.346

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,19 @@ 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.346](https://github.com/eea/volto-arcgis-block/compare/0.1.345...0.1.346) - 1 April 2025
8
+
9
+ #### :hammer_and_wrench: Others
10
+
11
+ - CLMS-286065 (bug): Pan cursor no longer pushes other widget buttons down when loading in view [Unai Bolivar - [`98bb42b`](https://github.com/eea/volto-arcgis-block/commit/98bb42bcf2ef04fae4b2821c2b7290e911c84478)]
12
+ - CLMS-286065 (bug): Fixed bug where deleting a user service does not uncheck the rest of the user services [Unai Bolivar - [`300be08`](https://github.com/eea/volto-arcgis-block/commit/300be0808a3c81ee21581ae64080b1533ac9b784)]
13
+ - CLMS-286081 (bug): Fixed persistence for user services of logged user. [Unai Bolivar - [`43dacf7`](https://github.com/eea/volto-arcgis-block/commit/43dacf79aefaf6925f9cdfdaedacb7fcae9fab63)]
14
+ - CLMS-286042 (bug): Fixed user wms service not loading after being deleted from my services [Unai Bolivar - [`17c8bef`](https://github.com/eea/volto-arcgis-block/commit/17c8bef7ac05c1ea1bedfdf61c54ed3193a27c3d)]
15
+ ### [0.1.345](https://github.com/eea/volto-arcgis-block/compare/0.1.344...0.1.345) - 28 March 2025
16
+
17
+ #### :hammer_and_wrench: Others
18
+
19
+ - Revert "Develop" [Urkorue - [`912673e`](https://github.com/eea/volto-arcgis-block/commit/912673ec966b3d8a3dc6937b0db475ed0901fb15)]
7
20
  ### [0.1.344](https://github.com/eea/volto-arcgis-block/compare/0.1.343...0.1.344) - 27 March 2025
8
21
 
9
22
  #### :hammer_and_wrench: Others
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eeacms/volto-arcgis-block",
3
- "version": "0.1.344",
3
+ "version": "0.1.346",
4
4
  "description": "volto-arcgis-block: Volto add-on",
5
5
  "main": "src/index.js",
6
6
  "author": "European Environment Agency: CodeSyntax",
@@ -855,6 +855,9 @@ class AreaWidget extends React.Component {
855
855
  rectanglehandler(event) {
856
856
  this.clearWidget();
857
857
  window.document.querySelector('.pan-container').style.display = 'flex';
858
+ window.document.querySelector('.pan-container').style.position = 'absolute';
859
+ window.document.querySelector('.pan-container').style.paddingRight =
860
+ '21rem';
858
861
  var fillSymbol = {
859
862
  type: 'simple-fill',
860
863
  color: [255, 255, 255, 0.5],
@@ -61,6 +61,7 @@ class MapViewer extends React.Component {
61
61
  layers: {},
62
62
  uploadedFile: true,
63
63
  wmsServiceUrl: '',
64
+ uploadError: false,
64
65
  };
65
66
  this.activeLayersHandler = this.activeLayersHandler.bind(this);
66
67
  this.activeLayersArray = {};
@@ -169,16 +170,10 @@ class MapViewer extends React.Component {
169
170
  this.setState({ uploadedFile: message });
170
171
  }
171
172
 
172
- uploadFileErrorHandler = (error) => {
173
- this.setState({
174
- showInfoPopup: true,
175
- infoPopupType: 'uploadError',
176
- });
173
+ uploadFileErrorHandler = () => {
174
+ this.setState({ uploadError: true });
177
175
  setTimeout(() => {
178
- this.setState({
179
- showInfoPopup: false,
180
- infoPopupType: '',
181
- });
176
+ this.setState({ uploadError: false });
182
177
  }, 3000);
183
178
  };
184
179
 
@@ -191,7 +186,7 @@ class MapViewer extends React.Component {
191
186
  }
192
187
  };
193
188
 
194
- serviceAddedHandler = () => {
189
+ serviceChangeHandler = () => {
195
190
  // Reset wmsServiceUrl without causing a new update of the children
196
191
  this.setState({ wmsServiceUrl: '' });
197
192
  };
@@ -481,43 +476,43 @@ class MapViewer extends React.Component {
481
476
  );
482
477
  }
483
478
 
484
- renderMenu() {
485
- if (this.view)
486
- return (
487
- <MenuWidget
488
- location={this.location}
489
- view={this.view}
490
- conf={this.props.mapviewer_config.Components}
491
- download={this.props.mapviewer_config.Download}
492
- map={this.map}
493
- mapViewer={this}
494
- updateArea={this.updateArea}
495
- area={this.state.area}
496
- layers={this.state.layers}
497
- activeLayersHandler={this.activeLayersHandler}
498
- urls={this.cfgUrls}
499
- loadingHandler={this.loadingHandler}
500
- hotspotDataHandler={this.hotspotDataHandler}
501
- hotspotData={this.state.hotspotData}
502
- mapLayersHandler={this.mapLayersHandler}
503
- bookmarkData={this.state.bookmarkData}
504
- bookmarkHandler={this.bookmarkHandler}
505
- prepackageChecked={this.state.prepackageChecked}
506
- prepackageHandler={this.prepackageHandler}
507
- uploadedFile={this.state.uploadedFile}
508
- uploadFileHandler={this.uploadFileHandler}
509
- uploadUrlServiceHandler={this.uploadUrlServiceHandler}
510
- wmsServiceUrl={this.state.wmsServiceUrl}
511
- onServiceAdded={this.serviceAddedHandler}
512
- uploadFileErrorHandler={this.uploadFileErrorHandler}
513
- //getTaxonomy={this.getTaxonomy}
514
- />
515
- ); //call conf
516
- }
479
+ // renderMenu() {
480
+ // if (this.view)
481
+ // return (
482
+ // <MenuWidget
483
+ // location={this.location}
484
+ // view={this.view}
485
+ // conf={this.props.mapviewer_config.Components}
486
+ // download={this.props.mapviewer_config.Download}
487
+ // map={this.map}
488
+ // mapViewer={this}
489
+ // updateArea={this.updateArea}
490
+ // area={this.state.area}
491
+ // layers={this.state.layers}
492
+ // activeLayersHandler={this.activeLayersHandler}
493
+ // urls={this.cfgUrls}
494
+ // loadingHandler={this.loadingHandler}
495
+ // hotspotDataHandler={this.hotspotDataHandler}
496
+ // hotspotData={this.state.hotspotData}
497
+ // mapLayersHandler={this.mapLayersHandler}
498
+ // bookmarkData={this.state.bookmarkData}
499
+ // bookmarkHandler={this.bookmarkHandler}
500
+ // prepackageChecked={this.state.prepackageChecked}
501
+ // prepackageHandler={this.prepackageHandler}
502
+ // uploadedFile={this.state.uploadedFile}
503
+ // uploadFileHandler={this.uploadFileHandler}
504
+ // uploadUrlServiceHandler={this.uploadUrlServiceHandler}
505
+ // wmsServiceUrl={this.state.wmsServiceUrl}
506
+ // onServiceChange={this.serviceChangeHandler}
507
+ // uploadFileErrorHandler={this.uploadFileErrorHandler}
508
+ // //getTaxonomy={this.getTaxonomy}
509
+ // />
510
+ // ); //call conf
511
+ // }
517
512
 
518
- renderBookmark() {
519
- if (this.view) return <CheckUserID reference={this} />;
520
- }
513
+ // renderBookmark() {
514
+ // if (this.view) return <CheckUserID reference={this} />;
515
+ // }
521
516
 
522
517
  appLanguage() {
523
518
  return intl && <CheckLanguage />;
@@ -538,8 +533,9 @@ class MapViewer extends React.Component {
538
533
  map={this.map}
539
534
  mapViewer={this}
540
535
  wmsServiceUrl={this.state.wmsServiceUrl}
536
+ showErrorPopup={this.state.uploadError}
541
537
  uploadUrlServiceHandler={this.uploadUrlServiceHandler}
542
- uploadfileErrorHandler={this.uploadFileErrorHandler}
538
+ uploadFileErrorHandler={this.uploadFileErrorHandler}
543
539
  />
544
540
  );
545
541
  }
@@ -572,8 +568,9 @@ class MapViewer extends React.Component {
572
568
  {this.renderScale()}
573
569
  {this.renderInfo()}
574
570
  {this.renderHotspot()}
575
- {this.renderMenu()}
576
- {this.renderBookmark()}
571
+ {/*this.renderMenu()*/}
572
+ {/*this.renderBookmark()*/}
573
+ <CheckUserID reference={this} />
577
574
  {this.renderLoadingSpinner()}
578
575
  {this.renderUploadService()}
579
576
  </div>
@@ -607,20 +604,54 @@ export const CheckLogin = ({ reference }) => {
607
604
  };
608
605
  export const CheckUserID = ({ reference }) => {
609
606
  let { user_id } = useCartState();
607
+
610
608
  return (
611
609
  <>
612
- {
613
- <BookmarkWidget
614
- view={reference.view}
615
- map={reference.map}
616
- layers={reference.state.layers}
617
- mapViewer={reference}
618
- userID={user_id}
619
- hotspotData={reference.state.hotspotData}
620
- bookmarkHandler={reference.bookmarkHandler}
621
- bookmarkData={reference.state.bookmarkData}
622
- />
623
- }
610
+ {reference.view && (
611
+ <>
612
+ {/* BookmarkWidget with user_id */}
613
+ <BookmarkWidget
614
+ view={reference.view}
615
+ map={reference.map}
616
+ layers={reference.state.layers}
617
+ mapViewer={reference}
618
+ userID={user_id}
619
+ hotspotData={reference.state.hotspotData}
620
+ bookmarkHandler={reference.bookmarkHandler}
621
+ bookmarkData={reference.state.bookmarkData}
622
+ />
623
+
624
+ {/* MenuWidget with user_id */}
625
+ <MenuWidget
626
+ location={reference.location}
627
+ view={reference.view}
628
+ conf={reference.props.mapviewer_config.Components}
629
+ download={reference.props.mapviewer_config.Download}
630
+ map={reference.map}
631
+ mapViewer={reference}
632
+ updateArea={reference.updateArea}
633
+ area={reference.state.area}
634
+ layers={reference.state.layers}
635
+ activeLayersHandler={reference.activeLayersHandler}
636
+ urls={reference.cfgUrls}
637
+ loadingHandler={reference.loadingHandler}
638
+ hotspotDataHandler={reference.hotspotDataHandler}
639
+ hotspotData={reference.state.hotspotData}
640
+ mapLayersHandler={reference.mapLayersHandler}
641
+ bookmarkData={reference.state.bookmarkData}
642
+ bookmarkHandler={reference.bookmarkHandler}
643
+ prepackageChecked={reference.state.prepackageChecked}
644
+ prepackageHandler={reference.prepackageHandler}
645
+ uploadedFile={reference.state.uploadedFile}
646
+ uploadFileHandler={reference.uploadFileHandler}
647
+ uploadUrlServiceHandler={reference.uploadUrlServiceHandler}
648
+ wmsServiceUrl={reference.state.wmsServiceUrl}
649
+ onServiceChange={reference.serviceChangeHandler}
650
+ uploadFileErrorHandler={reference.uploadFileErrorHandler}
651
+ userID={user_id}
652
+ />
653
+ </>
654
+ )}
624
655
  </>
625
656
  );
626
657
  };
@@ -7,6 +7,9 @@ import useCartState from '@eeacms/volto-clms-utils/cart/useCartState';
7
7
  import { Modal, Popup } from 'semantic-ui-react';
8
8
  import AreaWidget from './AreaWidget';
9
9
  import TimesliderWidget from './TimesliderWidget';
10
+
11
+ export const USER_SERVICES_KEY = 'user_services_session';
12
+
10
13
  var WMSLayer,
11
14
  WMTSLayer,
12
15
  FeatureLayer,
@@ -404,6 +407,7 @@ class MenuWidget extends React.Component {
404
407
  this.compCfg = this.props.conf;
405
408
  this.map = this.props.map;
406
409
  this.view = this.props.view;
410
+ this.userID = this.props.userID;
407
411
  this.state = {
408
412
  showMapMenu: false,
409
413
  noServiceModal: false,
@@ -927,7 +931,7 @@ class MenuWidget extends React.Component {
927
931
  this.loadVisibility();
928
932
  this.handleRasterVectorLegend();
929
933
  this.map.when(() => {
930
- this.map.layers.on('change', (e) => {
934
+ this.map.layers.on('change', () => {
931
935
  if (!this.props.bookmarkData?.active) return;
932
936
 
933
937
  this.map.layers.removeAll();
@@ -1000,6 +1004,7 @@ class MenuWidget extends React.Component {
1000
1004
  const myServicesContainer = document.createElement('div');
1001
1005
  ReactDOM.render(myServicesComponent, myServicesContainer);
1002
1006
  this.container.current.appendChild(myServicesContainer.firstChild);
1007
+ this.loadUserServicesFromStorage();
1003
1008
  }
1004
1009
 
1005
1010
  setSliderTag(val) {
@@ -1958,10 +1963,18 @@ class MenuWidget extends React.Component {
1958
1963
  }
1959
1964
 
1960
1965
  async handleNewMapServiceLayer(viewService) {
1961
- // Check if the URL is already in state to prevent duplicates
1966
+ // First, properly normalize the URL for comparison
1967
+ const normalizedViewService = viewService.trim();
1968
+
1962
1969
  if (
1963
- this.state.wmsUserServiceLayers.some((layer) => layer.url === viewService)
1970
+ this.state.wmsUserServiceLayers.some(
1971
+ (layer) =>
1972
+ layer.url === normalizedViewService ||
1973
+ layer.ViewService === normalizedViewService,
1974
+ )
1964
1975
  ) {
1976
+ // Call the uploadFileErrorHandler to show the error popup
1977
+ this.props.uploadFileErrorHandler();
1965
1978
  return;
1966
1979
  }
1967
1980
 
@@ -2029,24 +2042,19 @@ class MenuWidget extends React.Component {
2029
2042
  // Create and add the new layer
2030
2043
  this.layers[LayerId] = new WMSLayer(layerObj);
2031
2044
 
2045
+ this.saveCheckedLayer(layerId);
2046
+
2032
2047
  // Update state to include the new layer, which will trigger componentDidUpdate
2033
2048
  this.setState((prevState) => {
2034
- return {
2035
- wmsUserServiceLayers: [
2036
- ...prevState.wmsUserServiceLayers,
2037
- this.layers[LayerId],
2038
- ],
2039
- };
2049
+ const updatedLayers = [
2050
+ ...prevState.wmsUserServiceLayers,
2051
+ this.layers[LayerId],
2052
+ ];
2053
+ this.saveUserServicesToStorage(updatedLayers);
2054
+ return { wmsUserServiceLayers: updatedLayers };
2040
2055
  });
2041
2056
 
2042
- this.props.onServiceAdded();
2043
-
2044
- // Add the layer to the map
2045
- const node = document.getElementById(LayerId);
2046
- if (node) {
2047
- node.checked = true;
2048
- this.toggleLayer(node);
2049
- }
2057
+ this.props.onServiceChange();
2050
2058
  } catch (error) {
2051
2059
  // Set a popup error message in here
2052
2060
  this.props.uploadFileErrorHandler();
@@ -2183,7 +2191,8 @@ class MenuWidget extends React.Component {
2183
2191
  removeLayer = null;
2184
2192
  }
2185
2193
 
2186
- // Update state to trigger componentDidUpdate
2194
+ this.props.onServiceChange();
2195
+
2187
2196
  this.setState((prevState) => {
2188
2197
  const layerExists = prevState.wmsUserServiceLayers.some(
2189
2198
  (layer) => layer.LayerId === elemId,
@@ -2193,16 +2202,95 @@ class MenuWidget extends React.Component {
2193
2202
  const newWmsUserServiceLayers = prevState.wmsUserServiceLayers.filter(
2194
2203
  (layer) => layer.LayerId !== elemId,
2195
2204
  );
2196
- return {
2197
- wmsUserServiceLayers: newWmsUserServiceLayers,
2198
- };
2205
+ this.saveUserServicesToStorage(newWmsUserServiceLayers);
2206
+ return { wmsUserServiceLayers: newWmsUserServiceLayers };
2199
2207
  }
2200
-
2201
- // If layer doesn't exist, return unchanged state to avoid issues
2202
2208
  return null;
2203
2209
  });
2204
2210
  }
2205
2211
 
2212
+ saveUserServicesToStorage(layers) {
2213
+ if (this.userID == null) return;
2214
+
2215
+ try {
2216
+ const layersToSave = layers.map((layer) => {
2217
+ // Create a simplified object for storage
2218
+ return {
2219
+ url: layer.url,
2220
+ featureInfoFormat: layer.featureInfoFormat,
2221
+ featureInfoUrl: layer.featureInfoUrl,
2222
+ title: layer.title,
2223
+ legendEnabled: layer.legendEnabled,
2224
+ sublayers: layer.sublayers?.items?.map((sublayer) => ({
2225
+ index: sublayer.index,
2226
+ name: sublayer.name,
2227
+ title: sublayer.title,
2228
+ popupEnabled: sublayer.popupEnabled,
2229
+ queryable: sublayer.queryable,
2230
+ visible: sublayer.visible,
2231
+ legendEnabled: sublayer.legendEnabled,
2232
+ legendUrl: sublayer.legendUrl,
2233
+ featureInfoUrl: sublayer.featureInfoUrl,
2234
+ })),
2235
+ ViewService: layer.ViewService,
2236
+ LayerId: layer.LayerId,
2237
+ };
2238
+ });
2239
+
2240
+ localStorage.setItem(
2241
+ USER_SERVICES_KEY + '_' + this.userID,
2242
+ JSON.stringify(layersToSave),
2243
+ );
2244
+ } catch (error) {}
2245
+ }
2246
+
2247
+ async loadUserServicesFromStorage() {
2248
+ if (this.userID != null) {
2249
+ try {
2250
+ const savedServices = JSON.parse(
2251
+ localStorage.getItem(USER_SERVICES_KEY + '_' + this.userID),
2252
+ );
2253
+
2254
+ if (savedServices && Array.isArray(savedServices)) {
2255
+ // Process saved services to recreate actual layer objects
2256
+ const recreatedLayers = await Promise.all(
2257
+ savedServices.map(async (serviceData) => {
2258
+ try {
2259
+ // Create a new WMSLayer with the saved properties
2260
+ const newLayer = new WMSLayer(serviceData);
2261
+ // Add to this.layers
2262
+ this.layers[serviceData.LayerId] = newLayer;
2263
+ return newLayer;
2264
+ } catch (error) {
2265
+ return null;
2266
+ }
2267
+ }),
2268
+ );
2269
+
2270
+ // Filter out any null values from failed recreations
2271
+ const validLayers = recreatedLayers.filter((layer) => layer !== null);
2272
+
2273
+ // Update state with recreated layers
2274
+ this.setState({ wmsUserServiceLayers: validLayers });
2275
+ // Get checked layers from session storage
2276
+ const checkedLayers =
2277
+ JSON.parse(sessionStorage.getItem('checkedLayers')) || [];
2278
+
2279
+ // For each valid layer that was previously checked, make it visible
2280
+ validLayers.forEach((layer) => {
2281
+ if (checkedLayers.includes(layer.LayerId)) {
2282
+ const node = document.getElementById(layer.LayerId);
2283
+ if (node) {
2284
+ node.checked = true;
2285
+ this.toggleLayer(node);
2286
+ }
2287
+ }
2288
+ });
2289
+ }
2290
+ } catch (error) {}
2291
+ }
2292
+ }
2293
+
2206
2294
  /**
2207
2295
  * Method to show/hide a layer. Update checkboxes from dataset and products
2208
2296
  * @param {*} elem Is the checkbox
@@ -4093,6 +4181,21 @@ class MenuWidget extends React.Component {
4093
4181
 
4094
4182
  if (prevState.wmsUserServiceLayers !== this.state.wmsUserServiceLayers) {
4095
4183
  this.createUserServices(this.state.wmsUserServiceLayers);
4184
+ setTimeout(() => {
4185
+ const checkedLayers =
4186
+ JSON.parse(sessionStorage.getItem('checkedLayers')) || [];
4187
+
4188
+ // For each valid layer that was previously checked, make it visible
4189
+ this.state.wmsUserServiceLayers.forEach((layer) => {
4190
+ if (checkedLayers.includes(layer.LayerId)) {
4191
+ const node = document.getElementById(layer.LayerId);
4192
+ if (node) {
4193
+ node.checked = true;
4194
+ this.toggleLayer(node);
4195
+ }
4196
+ }
4197
+ });
4198
+ }, 0);
4096
4199
  }
4097
4200
  if (
4098
4201
  this.state.wmsUserServiceLayers.length > 0 &&
@@ -4123,13 +4226,23 @@ class MenuWidget extends React.Component {
4123
4226
  }
4124
4227
  const latestLayer = JSON.parse(sessionStorage.getItem('TMSLayerObj'));
4125
4228
 
4126
- if (latestLayer) {
4229
+ if (latestLayer && BaseTileLayer) {
4127
4230
  this.view.when(() => {
4128
4231
  if (this.view.stationary) {
4129
4232
  const { layer, checkboxId, dataset } = latestLayer;
4130
4233
  this.processTMSLayer(checkboxId, layer, dataset);
4131
4234
  }
4132
4235
  });
4236
+ } else if (latestLayer) {
4237
+ // If we have a layer but BaseTileLayer isn't loaded yet, wait for it
4238
+ this.loader().then(() => {
4239
+ this.view.when(() => {
4240
+ if (this.view.stationary) {
4241
+ const { layer, checkboxId, dataset } = latestLayer;
4242
+ this.processTMSLayer(checkboxId, layer, dataset);
4243
+ }
4244
+ });
4245
+ });
4133
4246
  }
4134
4247
  this.setLegendOpacity();
4135
4248
  }
@@ -4558,132 +4671,83 @@ class MenuWidget extends React.Component {
4558
4671
  };
4559
4672
 
4560
4673
  loadComponentFilters() {
4561
- var checkList = document.getElementById('select-component');
4562
- checkList.getElementsByClassName('anchor')[0].onclick = function (evt) {
4563
- if (checkList.classList.contains('visible'))
4564
- checkList.classList.remove('visible');
4565
- else checkList.classList.add('visible');
4566
- };
4567
- let list = document.querySelector('.component-items');
4674
+ var selectedComponent = document.getElementById('select-component');
4675
+ selectedComponent.options.add(
4676
+ new Option('Select a component', 'default', false, false),
4677
+ );
4678
+ selectedComponent.options[0].disabled = true;
4679
+ var selectedProduct = document.getElementById('select-product');
4680
+ selectedProduct.options.add(
4681
+ new Option('Select a product', 'default', false, false),
4682
+ );
4683
+ selectedProduct.options[0].disabled = true;
4684
+ document
4685
+ .querySelector('.menu-family-filter')
4686
+ .setAttribute('style', 'display: none;');
4568
4687
  this.compCfg.forEach((element) => {
4569
- let inputNode = document.createElement('input');
4570
- let lavelNode = document.createElement('lavel');
4571
- inputNode.setAttribute('type', 'checkbox');
4572
- inputNode.classList.add('component_item');
4573
- inputNode.setAttribute('value', element.ComponentPosition);
4574
- lavelNode.innerText = element.ComponentTitle;
4575
- let listNode = document.createElement('li');
4576
- listNode.appendChild(inputNode);
4577
- listNode.appendChild(lavelNode);
4578
- list.appendChild(listNode);
4579
- inputNode.onclick = () => {
4580
- this.loadProductFilters();
4581
- this.menuSearch();
4582
- };
4688
+ selectedComponent.options.add(
4689
+ new Option(
4690
+ element.ComponentTitle,
4691
+ element.ComponentPosition,
4692
+ element.ComponentPosition,
4693
+ ),
4694
+ );
4583
4695
  });
4584
4696
  }
4585
4697
  loadProductFilters() {
4586
- var checkList = document.getElementById('select-product');
4587
- checkList.getElementsByClassName('anchor')[0].onclick = function (evt) {
4588
- if (checkList.classList.contains('visible'))
4589
- checkList.classList.remove('visible');
4590
- else checkList.classList.add('visible');
4591
- };
4592
- let list = document.querySelector('.product-items');
4593
- while (list.firstChild) {
4594
- list.removeChild(list.lastChild);
4595
- }
4596
-
4597
- let componentList = document.getElementsByClassName('component_item');
4598
- let componentFilter = [];
4599
- for (let m = 0; m < componentList.length; m++) {
4600
- if (componentList[m].checked) {
4601
- componentFilter.push(componentList[m].value);
4602
- }
4603
- }
4698
+ var selectedComponent = document.getElementById('select-component');
4699
+ var selectedProduct = document.getElementById('select-product');
4604
4700
  if (
4605
4701
  document.querySelector('.clear-filters') &&
4606
- componentFilter.length !== 0
4702
+ selectedComponent.value !== 'default'
4607
4703
  ) {
4608
4704
  document
4609
4705
  .querySelector('.clear-filters')
4610
4706
  .setAttribute('style', 'display: block;');
4611
4707
  }
4612
- componentFilter.forEach((component) => {
4613
- this.compCfg[component].Products.forEach((product) => {
4614
- let inputNode = document.createElement('input');
4615
- let lavelNode = document.createElement('lavel');
4616
- inputNode.setAttribute('type', 'checkbox');
4617
- inputNode.classList.add('product_item');
4618
- inputNode.setAttribute('value', product.ProductId);
4619
- lavelNode.innerText = product.ProductTitle;
4620
- let listNode = document.createElement('li');
4621
- listNode.appendChild(inputNode);
4622
- listNode.appendChild(lavelNode);
4623
- list.appendChild(listNode);
4624
- inputNode.onclick = () => {
4625
- this.loadFamilyFilters();
4626
- this.menuSearch();
4627
- };
4628
- });
4708
+ this.removeOptions(selectedProduct);
4709
+ selectedProduct.options.add(
4710
+ new Option('Select a product', 'default', false, false),
4711
+ );
4712
+ selectedProduct.options[0].disabled = true;
4713
+ this.compCfg.forEach((component) => {
4714
+ if (component.ComponentPosition.toString() === selectedComponent.value) {
4715
+ component.Products.forEach((product) => {
4716
+ selectedProduct.options.add(
4717
+ new Option(
4718
+ product.ProductTitle,
4719
+ product.ProductId,
4720
+ product.ProductId,
4721
+ ),
4722
+ );
4723
+ });
4724
+ }
4629
4725
  });
4726
+ let familyFilter = document.querySelector('.menu-family-filter');
4727
+ if (familyFilter) {
4728
+ familyFilter.setAttribute('style', 'display: none;');
4729
+ }
4630
4730
  }
4631
4731
  async loadFamilyFilters() {
4632
- // let tax = await this.getTaxonomy('collective.taxonomy.family');
4633
- // var checkList = document.getElementById('select-family');
4634
- // checkList.getElementsByClassName('anchor')[0].onclick = function(evt) {
4635
- // if (checkList.classList.contains('visible'))
4636
- // checkList.classList.remove('visible');
4637
- // else
4638
- // checkList.classList.add('visible');
4639
- // }
4640
- // let list = document.querySelector('.family-items');
4641
- // while (list.firstChild) {
4642
- // list.removeChild(list.lastChild);
4643
- // }
4644
- // let componentList = document.getElementsByClassName('component_item');
4645
- // let componentFilter = [];
4646
- // for (let m = 0; m < componentList.length; m++) {
4647
- // if (componentList[m].checked) {
4648
- // componentFilter.push(componentList[m].value)
4732
+ // var selectedFamily = document.getElementById('select-family');
4733
+ // var selectedProduct = document.getElementById('select-product');
4734
+ // this.removeOptions(selectedFamily);
4735
+ //let tax = await this.getTaxonomy('collective.taxonomy.family');
4736
+ //let hasFamily = false;
4737
+ // selectedFamily.options.add(
4738
+ // new Option('Select a family', 'default', false, false),
4739
+ // );
4740
+ //let text = selectedProduct.selectedOptions[0].text
4741
+ // tax.tree.forEach((element) => {
4742
+ // if (element.title === selectedProduct.selectedOptions[0].text) {
4743
+ // //hasFamily = true;
4744
+ // element.children.forEach((child) => {
4745
+ // selectedFamily.options.add(
4746
+ // new Option(child.title, child.key, child.key),
4747
+ // );
4748
+ // });
4649
4749
  // }
4650
- // }
4651
- // componentFilter.forEach(component => {
4652
- // this.compCfg[component].Products.forEach(product => {
4653
- // let inputNode = document.createElement('input');
4654
- // let lavelNode = document.createElement('lavel');
4655
- // inputNode.setAttribute('type','checkbox');
4656
- // inputNode.classList.add('product_item')
4657
- // inputNode.setAttribute('value', product.ProductId)
4658
- // lavelNode.innerText = product.ProductTitle;
4659
- // let listNode = document.createElement('li');
4660
- // listNode.appendChild(inputNode);
4661
- // listNode.appendChild(lavelNode);
4662
- // list.appendChild(listNode)
4663
- // inputNode.onclick= () => {
4664
- // this.loadFamilyFilters();
4665
- // this.menuSearch();
4666
- // };
4667
- // })
4668
4750
  // });
4669
- // // var selectedFamily = document.getElementById('select-family');
4670
- // // var selectedProduct = document.getElementById('select-product');
4671
- // // this.removeOptions(selectedFamily);
4672
- // let hasFamily = false;
4673
- // // selectedFamily.options.add(
4674
- // // new Option('Select a family', 'default', false, false),
4675
- // // );
4676
- // // let text = selectedProduct.selectedOptions[0].text
4677
- // // tax.tree.forEach((element) => {
4678
- // // if (element.title === selectedProduct.selectedOptions[0].text) {
4679
- // // //hasFamily = true;
4680
- // // element.children.forEach((child) => {
4681
- // // selectedFamily.options.add(
4682
- // // new Option(child.title, child.key, child.key),
4683
- // // );
4684
- // // });
4685
- // // }
4686
- // // });
4687
4751
  // let familyFilter = document.querySelector('.menu-family-filter');
4688
4752
  // if (familyFilter) {
4689
4753
  // if (!hasFamily) {
@@ -4695,8 +4759,8 @@ class MenuWidget extends React.Component {
4695
4759
  }
4696
4760
  async menuSearch() {
4697
4761
  let searchText;
4698
- let componentFilter = [];
4699
- let productFilter = [];
4762
+ let componentFilter;
4763
+ let productFilter;
4700
4764
  //let familyFilter;
4701
4765
  let result = false;
4702
4766
  if (document.querySelector('#menu-searchtext')) {
@@ -4705,20 +4769,10 @@ class MenuWidget extends React.Component {
4705
4769
  .value?.toUpperCase();
4706
4770
  }
4707
4771
  if (document.getElementById('select-component')) {
4708
- let componentList = document.getElementsByClassName('component_item');
4709
- for (let m = 0; m < componentList.length; m++) {
4710
- if (componentList[m].checked) {
4711
- componentFilter.push(componentList[m].value);
4712
- }
4713
- }
4772
+ componentFilter = document.getElementById('select-component').value;
4714
4773
  }
4715
4774
  if (document.getElementById('select-product')) {
4716
- let productList = document.getElementsByClassName('product_item');
4717
- for (let n = 0; n < productList.length; n++) {
4718
- if (productList[n].checked) {
4719
- productFilter.push(productList[n].value);
4720
- }
4721
- }
4775
+ productFilter = document.getElementById('select-product').value;
4722
4776
  }
4723
4777
  // if (document.getElementById('select-family')) {
4724
4778
  // familyFilter = document.getElementById('select-family').text;
@@ -4754,8 +4808,8 @@ class MenuWidget extends React.Component {
4754
4808
  }
4755
4809
  if (
4756
4810
  searchText === '' &&
4757
- componentFilter.length === 0 &&
4758
- productFilter.length === 0
4811
+ componentFilter === 'default' &&
4812
+ productFilter === 'default'
4759
4813
  ) {
4760
4814
  this.filtersApplied = false;
4761
4815
  componentFound = true;
@@ -4779,12 +4833,11 @@ class MenuWidget extends React.Component {
4779
4833
  } else if (
4780
4834
  datasetChecked ||
4781
4835
  (dataset?.DatasetTitle?.toUpperCase().includes(searchText) &&
4782
- (productFilter.includes(product.ProductId) ||
4783
- productFilter.length === 0) &&
4784
- (componentFilter.includes(
4785
- this.compCfg[index].ComponentPosition.toString(),
4786
- ) ||
4787
- componentFilter.length === 0))
4836
+ (product.ProductId === productFilter ||
4837
+ productFilter === 'default') &&
4838
+ (this.compCfg[index].ComponentPosition.toString() ===
4839
+ componentFilter ||
4840
+ componentFilter === 'default'))
4788
4841
  ) {
4789
4842
  this.filtersApplied = true;
4790
4843
  componentFound = true;
@@ -4851,13 +4904,22 @@ class MenuWidget extends React.Component {
4851
4904
  }
4852
4905
  }
4853
4906
  clearFilters() {
4854
- let componentList = document.getElementsByClassName('component_item');
4855
- for (let m = 0; m < componentList.length; m++) {
4856
- componentList[m].checked = false;
4907
+ if (document.getElementById('select-component')) {
4908
+ document.getElementById('select-component').value = 'default';
4909
+ }
4910
+ let selectedProduct = document.getElementById('select-product');
4911
+ if (selectedProduct) {
4912
+ this.removeOptions(selectedProduct);
4913
+ selectedProduct.options.add(
4914
+ new Option('Select a product', 'default', false, false),
4915
+ );
4857
4916
  }
4858
- let list = document.querySelector('.product-items');
4859
- while (list.firstChild) {
4860
- list.removeChild(list.lastChild);
4917
+ if (document.getElementById('select-family')) {
4918
+ document.getElementById('select-family').value = 'default';
4919
+ }
4920
+ let familyFilter = document.querySelector('.menu-family-filter');
4921
+ if (familyFilter) {
4922
+ familyFilter.setAttribute('style', 'display: none;');
4861
4923
  }
4862
4924
  if (document.querySelector('.clear-filters')) {
4863
4925
  document
@@ -5081,11 +5143,7 @@ class MenuWidget extends React.Component {
5081
5143
  <div className="filters-panel">
5082
5144
  <span className="menu-filter">
5083
5145
  Component
5084
- <div id="select-component" class="dropdown-check-list">
5085
- <span class="anchor">Select a Component</span>
5086
- <ul class="items component-items"></ul>
5087
- </div>
5088
- {/* <select
5146
+ <select
5089
5147
  id="select-component"
5090
5148
  class="esri-select filter-select"
5091
5149
  onBlur={() => {}}
@@ -5093,15 +5151,11 @@ class MenuWidget extends React.Component {
5093
5151
  this.loadProductFilters();
5094
5152
  this.menuSearch();
5095
5153
  }}
5096
- ></select> */}
5154
+ ></select>
5097
5155
  </span>
5098
5156
  <span className="menu-filter">
5099
5157
  Product groups
5100
- <div id="select-product" class="dropdown-check-list">
5101
- <span class="anchor">Select a Product</span>
5102
- <ul class="items product-items"></ul>
5103
- </div>
5104
- {/* <select
5158
+ <select
5105
5159
  id="select-product"
5106
5160
  class="esri-select filter-select"
5107
5161
  onBlur={() => {}}
@@ -5109,20 +5163,15 @@ class MenuWidget extends React.Component {
5109
5163
  this.loadFamilyFilters();
5110
5164
  this.menuSearch();
5111
5165
  }}
5112
- ></select> */}
5166
+ ></select>
5113
5167
  </span>
5114
- {/* <span className="menu-filter menu-family-filter">
5168
+ <span className="menu-filter menu-family-filter">
5115
5169
  Family
5116
- <div id="select-family" class="dropdown-check-list">
5117
- <span class="anchor">Select a Family</span>
5118
- <ul class="items family-items">
5119
- </ul>
5120
- </div>
5121
5170
  <select
5122
5171
  id="select-family"
5123
5172
  class="esri-select filter-select"
5124
- ></select>
5125
- </span> */}
5173
+ ></select>
5174
+ </span>
5126
5175
  </div>
5127
5176
  </div>
5128
5177
  </div>
@@ -27,6 +27,8 @@ class UploadWidget extends React.Component {
27
27
  this.mapviewer_config = this.props.mapviewer_config;
28
28
  this.fileInput = createRef();
29
29
  this.uploadUrlServiceHandler = this.props.uploadUrlServiceHandler;
30
+ this.uploadFileErrorHandler = this.props.uploadFileErrorHandler;
31
+ this.errorPopup = this.errorPopup.bind(this);
30
32
  }
31
33
 
32
34
  loader() {
@@ -139,17 +141,21 @@ class UploadWidget extends React.Component {
139
141
  wmsServiceUrl: '',
140
142
  });
141
143
  } else {
144
+ this.errorPopup();
145
+ }
146
+ };
147
+
148
+ errorPopup = () => {
149
+ this.setState({
150
+ showInfoPopup: true,
151
+ infoPopupType: 'uploadError',
152
+ });
153
+ setTimeout(() => {
142
154
  this.setState({
143
- showInfoPopup: true,
144
- infoPopupType: 'uploadError',
155
+ showInfoPopup: false,
156
+ infoPopupType: '',
145
157
  });
146
- setTimeout(() => {
147
- this.setState({
148
- showInfoPopup: false,
149
- infoPopupType: '',
150
- });
151
- }, 3000);
152
- }
158
+ }, 3000);
153
159
  };
154
160
 
155
161
  /**
@@ -171,6 +177,12 @@ class UploadWidget extends React.Component {
171
177
  });
172
178
  }
173
179
 
180
+ componentDidUpdate(prevProps) {
181
+ if (!prevProps.showErrorPopup && this.props.showErrorPopup) {
182
+ this.errorPopup();
183
+ }
184
+ }
185
+
174
186
  /**
175
187
  * This method renders the component
176
188
  * @returns jsx
@@ -1707,64 +1707,3 @@ div.map-container.popup-block {
1707
1707
  .filters-element.filter-logo.filters-header {
1708
1708
  justify-content: space-between;
1709
1709
  }
1710
-
1711
- .select-component {
1712
- height: 30px;
1713
- }
1714
-
1715
- .dropdown-check-list {
1716
- display: inline-block;
1717
- width: 280px;
1718
- }
1719
-
1720
- .dropdown-check-list .anchor {
1721
- position: relative;
1722
- display: inline-block;
1723
- width: 280px;
1724
- height: 22px;
1725
- padding: 0px 50px 5px 10px;
1726
- border: 1px solid #ccc;
1727
- cursor: pointer;
1728
- font-size: 15px;
1729
- }
1730
-
1731
- .dropdown-check-list .anchor:after {
1732
- position: absolute;
1733
- top: 20%;
1734
- right: 10px;
1735
- padding: 5px;
1736
- border-top: 2px solid black;
1737
- border-left: 2px solid black;
1738
- content: '';
1739
- -moz-transform: rotate(-135deg);
1740
- -ms-transform: rotate(-135deg);
1741
- -o-transform: rotate(-135deg);
1742
- -webkit-transform: rotate(-135deg);
1743
- transform: rotate(-135deg);
1744
- }
1745
-
1746
- .dropdown-check-list .anchor:active:after {
1747
- top: 21%;
1748
- right: 8px;
1749
- }
1750
-
1751
- .dropdown-check-list ul.items {
1752
- display: none;
1753
- padding: 2px;
1754
- border: 1px solid #ccc;
1755
- border-top: none;
1756
- margin: 0;
1757
- }
1758
-
1759
- .dropdown-check-list ul.items li {
1760
- font-size: 14px;
1761
- list-style: none;
1762
- }
1763
-
1764
- .dropdown-check-list.visible .anchor {
1765
- color: #a0b128;
1766
- }
1767
-
1768
- .dropdown-check-list.visible .items {
1769
- display: block;
1770
- }