@esri/solutions-components 0.10.35 → 0.10.36

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. package/dist/cjs/basemap-gallery_7.cjs.entry.js +1 -0
  2. package/dist/cjs/calcite-alert_5.cjs.entry.js +3 -3
  3. package/dist/cjs/card-manager_3.cjs.entry.js +2 -2
  4. package/dist/cjs/crowdsource-manager.cjs.entry.js +25 -29
  5. package/dist/cjs/{downloadUtils-20637f89.js → downloadUtils-76bc7e30.js} +6 -5
  6. package/dist/cjs/feature-list.cjs.entry.js +3 -3
  7. package/dist/cjs/{index.es-a242cb45.js → index.es-8336efed.js} +2 -2
  8. package/dist/cjs/loader.cjs.js +1 -1
  9. package/dist/cjs/map-select-tools_3.cjs.entry.js +2 -2
  10. package/dist/cjs/{popupUtils-d477705b.js → popupUtils-bc762034.js} +1 -1
  11. package/dist/cjs/public-notification.cjs.entry.js +2 -2
  12. package/dist/cjs/solutions-components.cjs.js +1 -1
  13. package/dist/collection/components/crowdsource-manager/crowdsource-manager.js +27 -29
  14. package/dist/collection/components/map-legend/map-legend.js +1 -0
  15. package/dist/collection/utils/downloadUtils.js +5 -3
  16. package/dist/collection/utils/downloadUtils.ts +6 -3
  17. package/dist/collection/utils/test/downloadUtils.spec.tsx +10 -12
  18. package/dist/components/crowdsource-manager.js +26 -29
  19. package/dist/components/downloadUtils.js +5 -4
  20. package/dist/components/map-legend2.js +1 -0
  21. package/dist/esm/basemap-gallery_7.entry.js +1 -0
  22. package/dist/esm/calcite-alert_5.entry.js +3 -3
  23. package/dist/esm/card-manager_3.entry.js +2 -2
  24. package/dist/esm/crowdsource-manager.entry.js +25 -29
  25. package/dist/esm/{downloadUtils-e266e98d.js → downloadUtils-bc7a4ba1.js} +6 -5
  26. package/dist/esm/feature-list.entry.js +3 -3
  27. package/dist/esm/{index.es-c5f258e2.js → index.es-0d189a34.js} +2 -2
  28. package/dist/esm/loader.js +1 -1
  29. package/dist/esm/map-select-tools_3.entry.js +2 -2
  30. package/dist/esm/{popupUtils-4570096e.js → popupUtils-03dc398a.js} +1 -1
  31. package/dist/esm/public-notification.entry.js +2 -2
  32. package/dist/esm/solutions-components.js +1 -1
  33. package/dist/solutions-components/{p-cb3199f9.entry.js → p-04ab956c.entry.js} +1 -1
  34. package/dist/solutions-components/{p-a568af9f.js → p-6f606cdb.js} +1 -1
  35. package/dist/solutions-components/p-720de4db.entry.js +6 -0
  36. package/dist/solutions-components/p-97fe6ec5.entry.js +6 -0
  37. package/dist/solutions-components/{p-b4c49411.entry.js → p-9c4fef09.entry.js} +1 -1
  38. package/dist/solutions-components/{p-89046451.entry.js → p-aac0c89c.entry.js} +1 -1
  39. package/dist/solutions-components/p-cd482a33.js +21 -0
  40. package/dist/solutions-components/{p-b86b2664.entry.js → p-d2612c30.entry.js} +1 -1
  41. package/dist/solutions-components/{p-588adf13.entry.js → p-e345f9c4.entry.js} +1 -1
  42. package/dist/solutions-components/{p-46c8015c.js → p-ff9e28d1.js} +30 -30
  43. package/dist/solutions-components/solutions-components.esm.js +1 -1
  44. package/dist/solutions-components/utils/downloadUtils.ts +6 -3
  45. package/dist/solutions-components/utils/test/downloadUtils.spec.tsx +10 -12
  46. package/dist/types/components/crowdsource-manager/crowdsource-manager.d.ts +4 -7
  47. package/package.json +2 -1
  48. package/dist/solutions-components/p-2360802a.js +0 -21
  49. package/dist/solutions-components/p-5eb9a413.entry.js +0 -6
  50. package/dist/solutions-components/p-ecf642c2.entry.js +0 -6
@@ -142,6 +142,22 @@ export class CrowdsourceManager {
142
142
  // Watch handlers
143
143
  //
144
144
  //--------------------------------------------------------------------------
145
+ /**
146
+ * Adjust layout based on current appLayout value
147
+ */
148
+ appLayoutWatchHandler(newAppLayout, oldAppLayout) {
149
+ if (newAppLayout !== oldAppLayout) {
150
+ this._setActiveLayout(newAppLayout);
151
+ // update the layer if table selected while switching to map view
152
+ if (this.appLayout === "mapView" && this._layer.isTable) {
153
+ void this._mapCard.updateLayer();
154
+ }
155
+ if (this._isMapViewOnLoad) {
156
+ void this._layerTable.refresh();
157
+ this._isMapViewOnLoad = false;
158
+ }
159
+ }
160
+ }
145
161
  /**
146
162
  * When true the map zoom tools will be available
147
163
  */
@@ -210,7 +226,7 @@ export class CrowdsourceManager {
210
226
  layer && await layer.when(() => {
211
227
  // on render if no layer is present and only one table is present in map and app is in map view layer then change it to split layout
212
228
  if (this._layerIds.length === 0 && this.appLayout === 'mapView' && layer.isTable) {
213
- this._changeLayout('splitView');
229
+ this.appLayout = "splitView";
214
230
  }
215
231
  this._layer = layer;
216
232
  this._initLayerExpressions();
@@ -243,7 +259,7 @@ export class CrowdsourceManager {
243
259
  render() {
244
260
  // only avoid border when we have a header color that is not white
245
261
  const borderClass = this.popupHeaderColor && this.popupHeaderColor !== "#FFFFFF" ? "border-width-0" : "";
246
- return (h(Host, { key: 'ddb8bb35d74ab89ffd62d7bd0468b5a757fa5ba1' }, h("calcite-shell", { key: '74d941a3b1d4149a57c88cea263a2fd7e2b4f840', class: "position-relative" }, h("calcite-panel", { key: '3ff44942eab43c6f3a1cd92c918c0e2bae3d500a', class: `width-full height-full ${borderClass}`, loading: this._isLoading }, this._getBody(this._layoutMode, this._panelOpen, this._hideTable)), this._getFooter()), this._filterModal()));
262
+ return (h(Host, { key: 'ace73bfa1aa7d460f1cba60d13e94c4f47f77bd0' }, h("calcite-shell", { key: 'f14e70be762bf236be566111b45e40a42f0997f7', class: "position-relative" }, h("calcite-panel", { key: '0dde9426295a780b6a12cd98513f655914c0dab5', class: `width-full height-full ${borderClass}`, loading: this._isLoading }, this._getBody(this._layoutMode, this._panelOpen, this._hideTable)), this._getFooter()), this._filterModal()));
247
263
  }
248
264
  /**
249
265
  * Called after each render
@@ -476,10 +492,9 @@ export class CrowdsourceManager {
476
492
  const cardManagerHeight = isTableLayout && this.mapInfos?.length > 1 ? "adjusted-height-100-51" : isMapLayout || isTableLayout ? "height-full" : (this._numSelected > 0 && !this._isMobile) ? "height-50" : !this._showInformationHeader ? "adjusted-height-50_25" : !this._isPortraitMobile ? "height-50" : "height-full";
477
493
  const themeClass = this.theme === "dark" ? "calcite-mode-dark" : "calcite-mode-light";
478
494
  return (h("div", { class: `width-50 height-full ${themeClass}` }, h("card-manager", { class: `${cardManagerHeight} width-full`, customInfoText: this.customInfoText, enableCreateFeatures: this._enableCreateFeatures && !this._isMobile, enableEditGeometry: this?._mapInfo?.enableEditGeometry, isMobile: this._isPortraitMobile, layer: this._layer, mapView: this?._mapView, onBackFromCreateWorkFlow: () => {
479
- this._changeLayout(this.appLayout);
480
495
  this._showInformationHeader = true;
481
496
  }, onCreateWorkFlowStarted: () => {
482
- this._changeLayout(this._layer.isTable ? "tableView" : "mapView");
497
+ this.appLayout = this._layer.isTable ? "tableView" : "mapView";
483
498
  this._showInformationHeader = false;
484
499
  }, onFeatureOrRecordSubmitted: () => void this._layerTable.refresh(), selectedFeaturesIds: this._layerTable?.selectedIds, selectingFeatureFromMap: this.appLayout === "mapView", zoomAndScrollToSelected: this.zoomAndScrollToSelected })));
485
500
  }
@@ -517,7 +532,7 @@ export class CrowdsourceManager {
517
532
  const icon = this._getDividerIcon(layoutMode, panelOpen);
518
533
  const tooltip = panelOpen ? this._translations.close : this._translations.open;
519
534
  const id = "toggle-layout";
520
- return (h(Fragment, null, h("calcite-action", { active: this.appLayout === 'splitView', class: "toggle-node", icon: "browser", id: "browser-action", onClick: () => { this._changeLayout('splitView'); }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "browser-action" }, h("span", null, this._translations.splitView)), h("calcite-action", { active: this.appLayout === 'tableView', class: "toggle-node", icon: "dock-left", id: "dock-left-action", onClick: () => { this._changeLayout('tableView'); }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "dock-left-action" }, h("span", null, this._translations.tableView)), h("calcite-action", { active: this.appLayout === 'mapView', class: "toggle-node", disabled: this._layerIds?.length === 0, icon: "browser-map", id: "browser-map-action", onClick: () => { this._changeLayout('mapView'); }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "browser-map-action" }, h("span", null, this._translations.mapView)), h("calcite-action", { class: "toggle-node", icon: icon, id: id, onClick: () => this._toggleLayout(), slot: "actions-end", text: "" }), h("calcite-tooltip", { placement: "bottom", "reference-element": id }, h("span", null, tooltip))));
535
+ return (h(Fragment, null, h("calcite-action", { active: this.appLayout === 'splitView', class: "toggle-node", icon: "browser", id: "browser-action", onClick: () => { this.appLayout = "splitView"; }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "browser-action" }, h("span", null, this._translations.splitView)), h("calcite-action", { active: this.appLayout === 'tableView', class: "toggle-node", icon: "dock-left", id: "dock-left-action", onClick: () => { this.appLayout = "tableView"; }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "dock-left-action" }, h("span", null, this._translations.tableView)), h("calcite-action", { active: this.appLayout === 'mapView', class: "toggle-node", disabled: this._layerIds?.length === 0, icon: "browser-map", id: "browser-map-action", onClick: () => { this.appLayout = "mapView"; }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "browser-map-action" }, h("span", null, this._translations.mapView)), h("calcite-action", { class: "toggle-node", icon: icon, id: id, onClick: () => this._toggleLayout(), slot: "actions-end", text: "" }), h("calcite-tooltip", { placement: "bottom", "reference-element": id }, h("span", null, tooltip))));
521
536
  }
522
537
  /**
523
538
  * Show filter component in modal
@@ -590,7 +605,7 @@ export class CrowdsourceManager {
590
605
  if (this._isMobile) {
591
606
  this.showHideMapPopupAndTable(!this._isMobile);
592
607
  this._isPortraitMobile = !!window.matchMedia("(orientation: portrait)").matches;
593
- this._changeLayout('splitView');
608
+ this.appLayout = "splitView";
594
609
  }
595
610
  else {
596
611
  this._isPortraitMobile = false;
@@ -606,34 +621,14 @@ export class CrowdsourceManager {
606
621
  _toggleLayout() {
607
622
  this._panelOpen = !this._panelOpen;
608
623
  }
609
- /**
610
- * Changes the layout mode
611
- * @param appLayout selected active app layout
612
- *
613
- * @protected
614
- */
615
- _changeLayout(appLayout) {
616
- if (this.appLayout !== appLayout) {
617
- this._setActiveLayout(appLayout);
618
- this.appLayout = appLayout;
619
- // update the layer if table selected while switching to map view
620
- if (this.appLayout === "mapView" && this._layer.isTable) {
621
- void this._mapCard.updateLayer();
622
- }
623
- if (this._isMapViewOnLoad) {
624
- void this._layerTable.refresh();
625
- this._isMapViewOnLoad = false;
626
- }
627
- }
628
- }
629
624
  /**
630
625
  * shows the map in card view
631
626
  *
632
627
  * @protected
633
628
  */
634
629
  _showMapInCardView() {
635
- if (this.appLayout === 'mapView') {
636
- const fullMapView = document.getElementById('full-map-view').childNodes[0];
630
+ if (this.appLayout !== "mapView") {
631
+ const fullMapView = document.getElementById('full-map-view')?.childNodes[0];
637
632
  const splitMapClass = document.getElementById('card-mapView');
638
633
  if (fullMapView) {
639
634
  splitMapClass.appendChild(fullMapView);
@@ -646,7 +641,7 @@ export class CrowdsourceManager {
646
641
  * @protected
647
642
  */
648
643
  _showMapInFullView() {
649
- const splitMap = document.getElementById('card-mapView').childNodes[0];
644
+ const splitMap = document.getElementById('card-mapView')?.childNodes[0];
650
645
  const fullMapViewClass = document.getElementById('full-map-view');
651
646
  if (splitMap) {
652
647
  fullMapViewClass.appendChild(splitMap);
@@ -1501,6 +1496,9 @@ export class CrowdsourceManager {
1501
1496
  static get elementRef() { return "el"; }
1502
1497
  static get watchers() {
1503
1498
  return [{
1499
+ "propName": "appLayout",
1500
+ "methodName": "appLayoutWatchHandler"
1501
+ }, {
1504
1502
  "propName": "enableZoom",
1505
1503
  "methodName": "enableZoomWatchHandler"
1506
1504
  }, {
@@ -122,6 +122,7 @@ export class MapLegend {
122
122
  if (!this.legendWidget) {
123
123
  this.legendWidget = new this.Legend({
124
124
  container: this._legendElement,
125
+ respectLayerDefinitionExpression: true,
125
126
  view
126
127
  });
127
128
  }
@@ -23,6 +23,7 @@ import { exportCSV } from "./csvUtils";
23
23
  import { exportPDF } from "./pdfUtils";
24
24
  import { loadModules } from "./loadModules";
25
25
  import { queryFeaturesByID } from "./queryUtils";
26
+ import { Sanitizer } from "@esri/arcgis-html-sanitizer";
26
27
  import * as common from "@esri/solution-common";
27
28
  const lineSeparatorChar = "|";
28
29
  import { queryRelated } from "@esri/arcgis-rest-feature-layer";
@@ -145,12 +146,13 @@ export function _cleanupLabel(labelText) {
145
146
  labelText = labelText.replace(/<\/p>/gi, "");
146
147
  // Replace \n with the line separator character
147
148
  labelText = labelText.replace(/\n/gi, "|");
148
- // Remove remaining HTML tags, replace 0xA0 that popup uses for spaces, and replace some char representations
149
+ // Remove tricky stuff
150
+ const sanitizer = new Sanitizer();
151
+ labelText = sanitizer.sanitize(labelText);
152
+ // Remove remaining HTML tags, replace 0xA0 that popup uses for spaces, and replace &nbsp;
149
153
  labelText = labelText
150
154
  .replace(/<[\s.]*[^<>]*\/?>/gi, "")
151
155
  .replace(/\xA0/gi, " ")
152
- .replace(/&lt;/gi, "<")
153
- .replace(/&gt;/gi, ">")
154
156
  .replace(/&nbsp;/gi, " ");
155
157
  // Trim each line
156
158
  labelText = labelText.replace(/\s*\|\s*/g, "|");
@@ -21,6 +21,7 @@ import { ILabel, exportPDF } from "./pdfUtils";
21
21
  import { loadModules } from "./loadModules";
22
22
  import { queryFeaturesByID } from "./queryUtils";
23
23
  import { IExportInfo, IExportInfos } from "../utils/interfaces";
24
+ import { Sanitizer } from "@esri/arcgis-html-sanitizer";
24
25
  import * as common from "@esri/solution-common";
25
26
 
26
27
  export { ILabel } from "./pdfUtils";
@@ -277,12 +278,14 @@ export function _cleanupLabel(
277
278
  // Replace \n with the line separator character
278
279
  labelText = labelText.replace(/\n/gi, "|");
279
280
 
280
- // Remove remaining HTML tags, replace 0xA0 that popup uses for spaces, and replace some char representations
281
+ // Remove tricky stuff
282
+ const sanitizer = new Sanitizer();
283
+ labelText = sanitizer.sanitize(labelText);
284
+
285
+ // Remove remaining HTML tags, replace 0xA0 that popup uses for spaces, and replace &nbsp;
281
286
  labelText = labelText
282
287
  .replace(/<[\s.]*[^<>]*\/?>/gi, "")
283
288
  .replace(/\xA0/gi, " ")
284
- .replace(/&lt;/gi, "<")
285
- .replace(/&gt;/gi, ">")
286
289
  .replace(/&nbsp;/gi, " ");
287
290
 
288
291
  // Trim each line
@@ -93,8 +93,16 @@ describe("downloadUtils", () => {
93
93
 
94
94
  it("handles some special characters", () => {
95
95
  const labelText =
96
- "<div style='text-align: left;'>&lt;{NAME}&gt;<br />{STREET}<br/>{CITY},&nbsp;{STATE}&nbsp;{ZIP}<br></div>";
97
- const expectedCleanedText = "<{NAME}>|{STREET}|{CITY}, {STATE} {ZIP}";
96
+ "<div style='text-align: left;'>&lt;{NAME}&gt;<br />{STREET}<br/>{CITY},&nbsp;{STATE}\xA0{ZIP}<br></div>";
97
+ const expectedCleanedText = "&lt;{NAME}&gt;|{STREET}|{CITY}, {STATE} {ZIP}";
98
+
99
+ const result: string = downloadUtils._cleanupLabel(labelText);
100
+ expect(result).toEqual(expectedCleanedText);
101
+ });
102
+
103
+ it("handles embedded script tag", () => {
104
+ const labelText = "<scrip<script>is removed</script>t>alert(123)</script>";
105
+ const expectedCleanedText = "&lt;scrip&lt;script&gt;is removed&lt;/script&gt;t&gt;alert(123)&lt;/script&gt;";
98
106
 
99
107
  const result: string = downloadUtils._cleanupLabel(labelText);
100
108
  expect(result).toEqual(expectedCleanedText);
@@ -188,16 +196,6 @@ describe("downloadUtils", () => {
188
196
  expect(result.format).toEqual(expectedLabelSpec);
189
197
  });
190
198
 
191
- it("handles some special characters", () => {
192
- const popupInfo =
193
- "<div style='text-align: left;'>&lt;{NAME}&gt;<br />{STREET}<br/>{CITY},&nbsp;{STATE}&nbsp;{ZIP}<br></div>";
194
- const expectedLabelSpec = "<{NAME}>|{STREET}|{CITY}, {STATE} {ZIP}";
195
-
196
- const result: downloadUtils.ILabelFormat = downloadUtils._convertPopupTextToLabelSpec(popupInfo);
197
- expect(result.type).toEqual("pattern");
198
- expect(result.format).toEqual(expectedLabelSpec);
199
- });
200
-
201
199
  });
202
200
 
203
201
  describe("_convertPopupArcadeToLabelSpec", () => {
@@ -190,6 +190,22 @@ const CrowdsourceManager$1 = /*@__PURE__*/ proxyCustomElement(class CrowdsourceM
190
190
  // Watch handlers
191
191
  //
192
192
  //--------------------------------------------------------------------------
193
+ /**
194
+ * Adjust layout based on current appLayout value
195
+ */
196
+ appLayoutWatchHandler(newAppLayout, oldAppLayout) {
197
+ if (newAppLayout !== oldAppLayout) {
198
+ this._setActiveLayout(newAppLayout);
199
+ // update the layer if table selected while switching to map view
200
+ if (this.appLayout === "mapView" && this._layer.isTable) {
201
+ void this._mapCard.updateLayer();
202
+ }
203
+ if (this._isMapViewOnLoad) {
204
+ void this._layerTable.refresh();
205
+ this._isMapViewOnLoad = false;
206
+ }
207
+ }
208
+ }
193
209
  /**
194
210
  * When true the map zoom tools will be available
195
211
  */
@@ -258,7 +274,7 @@ const CrowdsourceManager$1 = /*@__PURE__*/ proxyCustomElement(class CrowdsourceM
258
274
  layer && await layer.when(() => {
259
275
  // on render if no layer is present and only one table is present in map and app is in map view layer then change it to split layout
260
276
  if (this._layerIds.length === 0 && this.appLayout === 'mapView' && layer.isTable) {
261
- this._changeLayout('splitView');
277
+ this.appLayout = "splitView";
262
278
  }
263
279
  this._layer = layer;
264
280
  this._initLayerExpressions();
@@ -291,7 +307,7 @@ const CrowdsourceManager$1 = /*@__PURE__*/ proxyCustomElement(class CrowdsourceM
291
307
  render() {
292
308
  // only avoid border when we have a header color that is not white
293
309
  const borderClass = this.popupHeaderColor && this.popupHeaderColor !== "#FFFFFF" ? "border-width-0" : "";
294
- return (h(Host, { key: 'ddb8bb35d74ab89ffd62d7bd0468b5a757fa5ba1' }, h("calcite-shell", { key: '74d941a3b1d4149a57c88cea263a2fd7e2b4f840', class: "position-relative" }, h("calcite-panel", { key: '3ff44942eab43c6f3a1cd92c918c0e2bae3d500a', class: `width-full height-full ${borderClass}`, loading: this._isLoading }, this._getBody(this._layoutMode, this._panelOpen, this._hideTable)), this._getFooter()), this._filterModal()));
310
+ return (h(Host, { key: 'ace73bfa1aa7d460f1cba60d13e94c4f47f77bd0' }, h("calcite-shell", { key: 'f14e70be762bf236be566111b45e40a42f0997f7', class: "position-relative" }, h("calcite-panel", { key: '0dde9426295a780b6a12cd98513f655914c0dab5', class: `width-full height-full ${borderClass}`, loading: this._isLoading }, this._getBody(this._layoutMode, this._panelOpen, this._hideTable)), this._getFooter()), this._filterModal()));
295
311
  }
296
312
  /**
297
313
  * Called after each render
@@ -524,10 +540,9 @@ const CrowdsourceManager$1 = /*@__PURE__*/ proxyCustomElement(class CrowdsourceM
524
540
  const cardManagerHeight = isTableLayout && this.mapInfos?.length > 1 ? "adjusted-height-100-51" : isMapLayout || isTableLayout ? "height-full" : (this._numSelected > 0 && !this._isMobile) ? "height-50" : !this._showInformationHeader ? "adjusted-height-50_25" : !this._isPortraitMobile ? "height-50" : "height-full";
525
541
  const themeClass = this.theme === "dark" ? "calcite-mode-dark" : "calcite-mode-light";
526
542
  return (h("div", { class: `width-50 height-full ${themeClass}` }, h("card-manager", { class: `${cardManagerHeight} width-full`, customInfoText: this.customInfoText, enableCreateFeatures: this._enableCreateFeatures && !this._isMobile, enableEditGeometry: this?._mapInfo?.enableEditGeometry, isMobile: this._isPortraitMobile, layer: this._layer, mapView: this?._mapView, onBackFromCreateWorkFlow: () => {
527
- this._changeLayout(this.appLayout);
528
543
  this._showInformationHeader = true;
529
544
  }, onCreateWorkFlowStarted: () => {
530
- this._changeLayout(this._layer.isTable ? "tableView" : "mapView");
545
+ this.appLayout = this._layer.isTable ? "tableView" : "mapView";
531
546
  this._showInformationHeader = false;
532
547
  }, onFeatureOrRecordSubmitted: () => void this._layerTable.refresh(), selectedFeaturesIds: this._layerTable?.selectedIds, selectingFeatureFromMap: this.appLayout === "mapView", zoomAndScrollToSelected: this.zoomAndScrollToSelected })));
533
548
  }
@@ -565,7 +580,7 @@ const CrowdsourceManager$1 = /*@__PURE__*/ proxyCustomElement(class CrowdsourceM
565
580
  const icon = this._getDividerIcon(layoutMode, panelOpen);
566
581
  const tooltip = panelOpen ? this._translations.close : this._translations.open;
567
582
  const id = "toggle-layout";
568
- return (h(Fragment, null, h("calcite-action", { active: this.appLayout === 'splitView', class: "toggle-node", icon: "browser", id: "browser-action", onClick: () => { this._changeLayout('splitView'); }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "browser-action" }, h("span", null, this._translations.splitView)), h("calcite-action", { active: this.appLayout === 'tableView', class: "toggle-node", icon: "dock-left", id: "dock-left-action", onClick: () => { this._changeLayout('tableView'); }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "dock-left-action" }, h("span", null, this._translations.tableView)), h("calcite-action", { active: this.appLayout === 'mapView', class: "toggle-node", disabled: this._layerIds?.length === 0, icon: "browser-map", id: "browser-map-action", onClick: () => { this._changeLayout('mapView'); }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "browser-map-action" }, h("span", null, this._translations.mapView)), h("calcite-action", { class: "toggle-node", icon: icon, id: id, onClick: () => this._toggleLayout(), slot: "actions-end", text: "" }), h("calcite-tooltip", { placement: "bottom", "reference-element": id }, h("span", null, tooltip))));
583
+ return (h(Fragment, null, h("calcite-action", { active: this.appLayout === 'splitView', class: "toggle-node", icon: "browser", id: "browser-action", onClick: () => { this.appLayout = "splitView"; }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "browser-action" }, h("span", null, this._translations.splitView)), h("calcite-action", { active: this.appLayout === 'tableView', class: "toggle-node", icon: "dock-left", id: "dock-left-action", onClick: () => { this.appLayout = "tableView"; }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "dock-left-action" }, h("span", null, this._translations.tableView)), h("calcite-action", { active: this.appLayout === 'mapView', class: "toggle-node", disabled: this._layerIds?.length === 0, icon: "browser-map", id: "browser-map-action", onClick: () => { this.appLayout = "mapView"; }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "browser-map-action" }, h("span", null, this._translations.mapView)), h("calcite-action", { class: "toggle-node", icon: icon, id: id, onClick: () => this._toggleLayout(), slot: "actions-end", text: "" }), h("calcite-tooltip", { placement: "bottom", "reference-element": id }, h("span", null, tooltip))));
569
584
  }
570
585
  /**
571
586
  * Show filter component in modal
@@ -638,7 +653,7 @@ const CrowdsourceManager$1 = /*@__PURE__*/ proxyCustomElement(class CrowdsourceM
638
653
  if (this._isMobile) {
639
654
  this.showHideMapPopupAndTable(!this._isMobile);
640
655
  this._isPortraitMobile = !!window.matchMedia("(orientation: portrait)").matches;
641
- this._changeLayout('splitView');
656
+ this.appLayout = "splitView";
642
657
  }
643
658
  else {
644
659
  this._isPortraitMobile = false;
@@ -654,34 +669,14 @@ const CrowdsourceManager$1 = /*@__PURE__*/ proxyCustomElement(class CrowdsourceM
654
669
  _toggleLayout() {
655
670
  this._panelOpen = !this._panelOpen;
656
671
  }
657
- /**
658
- * Changes the layout mode
659
- * @param appLayout selected active app layout
660
- *
661
- * @protected
662
- */
663
- _changeLayout(appLayout) {
664
- if (this.appLayout !== appLayout) {
665
- this._setActiveLayout(appLayout);
666
- this.appLayout = appLayout;
667
- // update the layer if table selected while switching to map view
668
- if (this.appLayout === "mapView" && this._layer.isTable) {
669
- void this._mapCard.updateLayer();
670
- }
671
- if (this._isMapViewOnLoad) {
672
- void this._layerTable.refresh();
673
- this._isMapViewOnLoad = false;
674
- }
675
- }
676
- }
677
672
  /**
678
673
  * shows the map in card view
679
674
  *
680
675
  * @protected
681
676
  */
682
677
  _showMapInCardView() {
683
- if (this.appLayout === 'mapView') {
684
- const fullMapView = document.getElementById('full-map-view').childNodes[0];
678
+ if (this.appLayout !== "mapView") {
679
+ const fullMapView = document.getElementById('full-map-view')?.childNodes[0];
685
680
  const splitMapClass = document.getElementById('card-mapView');
686
681
  if (fullMapView) {
687
682
  splitMapClass.appendChild(fullMapView);
@@ -694,7 +689,7 @@ const CrowdsourceManager$1 = /*@__PURE__*/ proxyCustomElement(class CrowdsourceM
694
689
  * @protected
695
690
  */
696
691
  _showMapInFullView() {
697
- const splitMap = document.getElementById('card-mapView').childNodes[0];
692
+ const splitMap = document.getElementById('card-mapView')?.childNodes[0];
698
693
  const fullMapViewClass = document.getElementById('full-map-view');
699
694
  if (splitMap) {
700
695
  fullMapViewClass.appendChild(splitMap);
@@ -779,6 +774,7 @@ const CrowdsourceManager$1 = /*@__PURE__*/ proxyCustomElement(class CrowdsourceM
779
774
  this._translations = messages[0];
780
775
  }
781
776
  static get watchers() { return {
777
+ "appLayout": ["appLayoutWatchHandler"],
782
778
  "enableZoom": ["enableZoomWatchHandler"],
783
779
  "hideMapOnLoad": ["hideMapOnLoadWatchHandler"]
784
780
  }; }
@@ -839,6 +835,7 @@ const CrowdsourceManager$1 = /*@__PURE__*/ proxyCustomElement(class CrowdsourceM
839
835
  "_layerIds": [32],
840
836
  "_isLoading": [32]
841
837
  }, [[8, "featureSelectionChange", "featureSelectionChange"], [8, "popupClosed", "popupClosed"], [8, "layoutChanged", "layoutChanged"], [8, "mapChanged", "mapChanged"], [8, "layerSelectionChange", "layerSelectionChange"], [8, "idsFound", "idsFound"]], {
838
+ "appLayout": ["appLayoutWatchHandler"],
842
839
  "enableZoom": ["enableZoomWatchHandler"],
843
840
  "hideMapOnLoad": ["hideMapOnLoadWatchHandler"]
844
841
  }]);
@@ -7,8 +7,8 @@ import { g as getDefaultExportFromCjs } from './_commonjsHelpers.js';
7
7
  import { getAssetPath } from '@stencil/core/internal/client';
8
8
  import { l as loadModules } from './loadModules.js';
9
9
  import { q as queryFeaturesByID } from './queryUtils.js';
10
+ import { S as Sanitizer } from './index2.js';
10
11
  import './solution-resource.js';
11
- import './index2.js';
12
12
  import { _ as __assign$1, r as request, c as cleanUrl, g as getJson } from './restHelpersGet.js';
13
13
 
14
14
  /** @license
@@ -2541,12 +2541,13 @@ function _cleanupLabel(labelText) {
2541
2541
  labelText = labelText.replace(/<\/p>/gi, "");
2542
2542
  // Replace \n with the line separator character
2543
2543
  labelText = labelText.replace(/\n/gi, "|");
2544
- // Remove remaining HTML tags, replace 0xA0 that popup uses for spaces, and replace some char representations
2544
+ // Remove tricky stuff
2545
+ const sanitizer = new Sanitizer();
2546
+ labelText = sanitizer.sanitize(labelText);
2547
+ // Remove remaining HTML tags, replace 0xA0 that popup uses for spaces, and replace &nbsp;
2545
2548
  labelText = labelText
2546
2549
  .replace(/<[\s.]*[^<>]*\/?>/gi, "")
2547
2550
  .replace(/\xA0/gi, " ")
2548
- .replace(/&lt;/gi, "<")
2549
- .replace(/&gt;/gi, ">")
2550
2551
  .replace(/&nbsp;/gi, " ");
2551
2552
  // Trim each line
2552
2553
  labelText = labelText.replace(/\s*\|\s*/g, "|");
@@ -109,6 +109,7 @@ const MapLegend = /*@__PURE__*/ proxyCustomElement(class MapLegend extends HTMLE
109
109
  if (!this.legendWidget) {
110
110
  this.legendWidget = new this.Legend({
111
111
  container: this._legendElement,
112
+ respectLayerDefinitionExpression: true,
112
113
  view
113
114
  });
114
115
  }
@@ -587,6 +587,7 @@ const MapLegend = class {
587
587
  if (!this.legendWidget) {
588
588
  this.legendWidget = new this.Legend({
589
589
  container: this._legendElement,
590
+ respectLayerDefinitionExpression: true,
590
591
  view
591
592
  });
592
593
  }
@@ -15,7 +15,7 @@ import { u as updateHostInteraction, I as InteractiveContainer } from './interac
15
15
  import { S as SLOTS$2 } from './resources-35208c6c.js';
16
16
  import { l as loadModules, g as getLocaleComponentStrings } from './locale-0d06fca0.js';
17
17
  import { a as getAllLayers, g as getLayerOrTable } from './mapViewUtils-f54edae3.js';
18
- import { P as PopupUtils } from './popupUtils-4570096e.js';
18
+ import { P as PopupUtils } from './popupUtils-03dc398a.js';
19
19
  import './guid-b0fb1de3.js';
20
20
  import './resources-8e2ed936.js';
21
21
  import './browser-b67d8df6.js';
@@ -24,9 +24,9 @@ import './observers-c83631e8.js';
24
24
  import './esri-loader-c6842c6b.js';
25
25
  import './_commonjsHelpers-089957fe.js';
26
26
  import './interfaces-659e3836.js';
27
- import './downloadUtils-e266e98d.js';
28
- import './solution-resource-f5809979.js';
27
+ import './downloadUtils-bc7a4ba1.js';
29
28
  import './index-e14fade9.js';
29
+ import './solution-resource-f5809979.js';
30
30
  import './restHelpersGet-48113381.js';
31
31
 
32
32
  /*!
@@ -6,12 +6,12 @@
6
6
  import { r as registerInstance, c as createEvent, g as getElement, h, H as Host } from './index-904bc599.js';
7
7
  import { g as getLocaleComponentStrings, l as loadModules } from './locale-0d06fca0.js';
8
8
  import { g as getLayerOrTable, q as queryFeaturesByID, e as goToSelection, f as queryAllIds, i as queryAllOidsWithQueryFeatures, j as queryFeaturesByGlobalID, c as getFeatureLayerView } from './mapViewUtils-f54edae3.js';
9
- import { d as downloadCSV } from './downloadUtils-e266e98d.js';
9
+ import { d as downloadCSV } from './downloadUtils-bc7a4ba1.js';
10
10
  import './esri-loader-c6842c6b.js';
11
11
  import './_commonjsHelpers-089957fe.js';
12
12
  import './interfaces-659e3836.js';
13
- import './solution-resource-f5809979.js';
14
13
  import './index-e14fade9.js';
14
+ import './solution-resource-f5809979.js';
15
15
  import './restHelpersGet-48113381.js';
16
16
 
17
17
  const cardManagerCss = ":host{display:block !important}.display-flex{display:flex}.display-none{display:none}.w-100{width:100%}.padding-bottom-1{padding-bottom:1rem}.padding-1{padding:1rem}.position-relative{position:relative}.focus-margin{margin:1px 1px 0px 1px}.overflow-auto{overflow:auto}.height-full{height:100%}.position-static{position:static !important}.z-index-500{z-index:500 !important}card-manager{display:block}";
@@ -131,6 +131,22 @@ const CrowdsourceManager = class {
131
131
  // Watch handlers
132
132
  //
133
133
  //--------------------------------------------------------------------------
134
+ /**
135
+ * Adjust layout based on current appLayout value
136
+ */
137
+ appLayoutWatchHandler(newAppLayout, oldAppLayout) {
138
+ if (newAppLayout !== oldAppLayout) {
139
+ this._setActiveLayout(newAppLayout);
140
+ // update the layer if table selected while switching to map view
141
+ if (this.appLayout === "mapView" && this._layer.isTable) {
142
+ void this._mapCard.updateLayer();
143
+ }
144
+ if (this._isMapViewOnLoad) {
145
+ void this._layerTable.refresh();
146
+ this._isMapViewOnLoad = false;
147
+ }
148
+ }
149
+ }
134
150
  /**
135
151
  * When true the map zoom tools will be available
136
152
  */
@@ -199,7 +215,7 @@ const CrowdsourceManager = class {
199
215
  layer && await layer.when(() => {
200
216
  // on render if no layer is present and only one table is present in map and app is in map view layer then change it to split layout
201
217
  if (this._layerIds.length === 0 && this.appLayout === 'mapView' && layer.isTable) {
202
- this._changeLayout('splitView');
218
+ this.appLayout = "splitView";
203
219
  }
204
220
  this._layer = layer;
205
221
  this._initLayerExpressions();
@@ -232,7 +248,7 @@ const CrowdsourceManager = class {
232
248
  render() {
233
249
  // only avoid border when we have a header color that is not white
234
250
  const borderClass = this.popupHeaderColor && this.popupHeaderColor !== "#FFFFFF" ? "border-width-0" : "";
235
- return (h(Host, { key: 'ddb8bb35d74ab89ffd62d7bd0468b5a757fa5ba1' }, h("calcite-shell", { key: '74d941a3b1d4149a57c88cea263a2fd7e2b4f840', class: "position-relative" }, h("calcite-panel", { key: '3ff44942eab43c6f3a1cd92c918c0e2bae3d500a', class: `width-full height-full ${borderClass}`, loading: this._isLoading }, this._getBody(this._layoutMode, this._panelOpen, this._hideTable)), this._getFooter()), this._filterModal()));
251
+ return (h(Host, { key: 'ace73bfa1aa7d460f1cba60d13e94c4f47f77bd0' }, h("calcite-shell", { key: 'f14e70be762bf236be566111b45e40a42f0997f7', class: "position-relative" }, h("calcite-panel", { key: '0dde9426295a780b6a12cd98513f655914c0dab5', class: `width-full height-full ${borderClass}`, loading: this._isLoading }, this._getBody(this._layoutMode, this._panelOpen, this._hideTable)), this._getFooter()), this._filterModal()));
236
252
  }
237
253
  /**
238
254
  * Called after each render
@@ -465,10 +481,9 @@ const CrowdsourceManager = class {
465
481
  const cardManagerHeight = isTableLayout && this.mapInfos?.length > 1 ? "adjusted-height-100-51" : isMapLayout || isTableLayout ? "height-full" : (this._numSelected > 0 && !this._isMobile) ? "height-50" : !this._showInformationHeader ? "adjusted-height-50_25" : !this._isPortraitMobile ? "height-50" : "height-full";
466
482
  const themeClass = this.theme === "dark" ? "calcite-mode-dark" : "calcite-mode-light";
467
483
  return (h("div", { class: `width-50 height-full ${themeClass}` }, h("card-manager", { class: `${cardManagerHeight} width-full`, customInfoText: this.customInfoText, enableCreateFeatures: this._enableCreateFeatures && !this._isMobile, enableEditGeometry: this?._mapInfo?.enableEditGeometry, isMobile: this._isPortraitMobile, layer: this._layer, mapView: this?._mapView, onBackFromCreateWorkFlow: () => {
468
- this._changeLayout(this.appLayout);
469
484
  this._showInformationHeader = true;
470
485
  }, onCreateWorkFlowStarted: () => {
471
- this._changeLayout(this._layer.isTable ? "tableView" : "mapView");
486
+ this.appLayout = this._layer.isTable ? "tableView" : "mapView";
472
487
  this._showInformationHeader = false;
473
488
  }, onFeatureOrRecordSubmitted: () => void this._layerTable.refresh(), selectedFeaturesIds: this._layerTable?.selectedIds, selectingFeatureFromMap: this.appLayout === "mapView", zoomAndScrollToSelected: this.zoomAndScrollToSelected })));
474
489
  }
@@ -506,7 +521,7 @@ const CrowdsourceManager = class {
506
521
  const icon = this._getDividerIcon(layoutMode, panelOpen);
507
522
  const tooltip = panelOpen ? this._translations.close : this._translations.open;
508
523
  const id = "toggle-layout";
509
- return (h(Fragment, null, h("calcite-action", { active: this.appLayout === 'splitView', class: "toggle-node", icon: "browser", id: "browser-action", onClick: () => { this._changeLayout('splitView'); }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "browser-action" }, h("span", null, this._translations.splitView)), h("calcite-action", { active: this.appLayout === 'tableView', class: "toggle-node", icon: "dock-left", id: "dock-left-action", onClick: () => { this._changeLayout('tableView'); }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "dock-left-action" }, h("span", null, this._translations.tableView)), h("calcite-action", { active: this.appLayout === 'mapView', class: "toggle-node", disabled: this._layerIds?.length === 0, icon: "browser-map", id: "browser-map-action", onClick: () => { this._changeLayout('mapView'); }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "browser-map-action" }, h("span", null, this._translations.mapView)), h("calcite-action", { class: "toggle-node", icon: icon, id: id, onClick: () => this._toggleLayout(), slot: "actions-end", text: "" }), h("calcite-tooltip", { placement: "bottom", "reference-element": id }, h("span", null, tooltip))));
524
+ return (h(Fragment, null, h("calcite-action", { active: this.appLayout === 'splitView', class: "toggle-node", icon: "browser", id: "browser-action", onClick: () => { this.appLayout = "splitView"; }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "browser-action" }, h("span", null, this._translations.splitView)), h("calcite-action", { active: this.appLayout === 'tableView', class: "toggle-node", icon: "dock-left", id: "dock-left-action", onClick: () => { this.appLayout = "tableView"; }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "dock-left-action" }, h("span", null, this._translations.tableView)), h("calcite-action", { active: this.appLayout === 'mapView', class: "toggle-node", disabled: this._layerIds?.length === 0, icon: "browser-map", id: "browser-map-action", onClick: () => { this.appLayout = "mapView"; }, text: "" }), h("calcite-tooltip", { placement: "right", "reference-element": "browser-map-action" }, h("span", null, this._translations.mapView)), h("calcite-action", { class: "toggle-node", icon: icon, id: id, onClick: () => this._toggleLayout(), slot: "actions-end", text: "" }), h("calcite-tooltip", { placement: "bottom", "reference-element": id }, h("span", null, tooltip))));
510
525
  }
511
526
  /**
512
527
  * Show filter component in modal
@@ -579,7 +594,7 @@ const CrowdsourceManager = class {
579
594
  if (this._isMobile) {
580
595
  this.showHideMapPopupAndTable(!this._isMobile);
581
596
  this._isPortraitMobile = !!window.matchMedia("(orientation: portrait)").matches;
582
- this._changeLayout('splitView');
597
+ this.appLayout = "splitView";
583
598
  }
584
599
  else {
585
600
  this._isPortraitMobile = false;
@@ -595,34 +610,14 @@ const CrowdsourceManager = class {
595
610
  _toggleLayout() {
596
611
  this._panelOpen = !this._panelOpen;
597
612
  }
598
- /**
599
- * Changes the layout mode
600
- * @param appLayout selected active app layout
601
- *
602
- * @protected
603
- */
604
- _changeLayout(appLayout) {
605
- if (this.appLayout !== appLayout) {
606
- this._setActiveLayout(appLayout);
607
- this.appLayout = appLayout;
608
- // update the layer if table selected while switching to map view
609
- if (this.appLayout === "mapView" && this._layer.isTable) {
610
- void this._mapCard.updateLayer();
611
- }
612
- if (this._isMapViewOnLoad) {
613
- void this._layerTable.refresh();
614
- this._isMapViewOnLoad = false;
615
- }
616
- }
617
- }
618
613
  /**
619
614
  * shows the map in card view
620
615
  *
621
616
  * @protected
622
617
  */
623
618
  _showMapInCardView() {
624
- if (this.appLayout === 'mapView') {
625
- const fullMapView = document.getElementById('full-map-view').childNodes[0];
619
+ if (this.appLayout !== "mapView") {
620
+ const fullMapView = document.getElementById('full-map-view')?.childNodes[0];
626
621
  const splitMapClass = document.getElementById('card-mapView');
627
622
  if (fullMapView) {
628
623
  splitMapClass.appendChild(fullMapView);
@@ -635,7 +630,7 @@ const CrowdsourceManager = class {
635
630
  * @protected
636
631
  */
637
632
  _showMapInFullView() {
638
- const splitMap = document.getElementById('card-mapView').childNodes[0];
633
+ const splitMap = document.getElementById('card-mapView')?.childNodes[0];
639
634
  const fullMapViewClass = document.getElementById('full-map-view');
640
635
  if (splitMap) {
641
636
  fullMapViewClass.appendChild(splitMap);
@@ -720,6 +715,7 @@ const CrowdsourceManager = class {
720
715
  this._translations = messages[0];
721
716
  }
722
717
  static get watchers() { return {
718
+ "appLayout": ["appLayoutWatchHandler"],
723
719
  "enableZoom": ["enableZoomWatchHandler"],
724
720
  "hideMapOnLoad": ["hideMapOnLoadWatchHandler"]
725
721
  }; }