@esri/solutions-components 0.7.30 → 0.7.32

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.
Files changed (62) hide show
  1. package/dist/assets/t9n/crowdsource-reporter/resources.json +7 -5
  2. package/dist/assets/t9n/crowdsource-reporter/resources_en.json +7 -5
  3. package/dist/assets/t9n/feature-list/resources.json +1 -1
  4. package/dist/assets/t9n/feature-list/resources_en.json +1 -1
  5. package/dist/assets/t9n/layer-list/resources.json +1 -1
  6. package/dist/assets/t9n/layer-list/resources_en.json +1 -1
  7. package/dist/cjs/{calcite-flow_4.cjs.entry.js → calcite-flow_5.cjs.entry.js} +286 -19
  8. package/dist/cjs/card-manager_3.cjs.entry.js +1 -1
  9. package/dist/cjs/crowdsource-reporter.cjs.entry.js +248 -32
  10. package/dist/cjs/{downloadUtils-83c6d3c3.js → downloadUtils-10e0de31.js} +2 -2
  11. package/dist/cjs/{index.es-bd1a93b2.js → index.es-72dc7ab9.js} +1 -1
  12. package/dist/cjs/loader.cjs.js +1 -1
  13. package/dist/cjs/map-select-tools_3.cjs.entry.js +1 -1
  14. package/dist/cjs/public-notification.cjs.entry.js +1 -1
  15. package/dist/cjs/solutions-components.cjs.js +1 -1
  16. package/dist/collection/collection-manifest.json +1 -0
  17. package/dist/collection/components/create-feature/create-feature.css +50 -0
  18. package/dist/collection/components/create-feature/create-feature.js +444 -0
  19. package/dist/collection/components/crowdsource-reporter/crowdsource-reporter.css +10 -1
  20. package/dist/collection/components/crowdsource-reporter/crowdsource-reporter.js +287 -33
  21. package/dist/collection/components/feature-list/feature-list.js +1 -0
  22. package/dist/collection/components/layer-list/layer-list.js +60 -16
  23. package/dist/collection/demos/create-feature.html +90 -0
  24. package/dist/collection/demos/crowdsource-reporter.html +26 -11
  25. package/dist/collection/utils/downloadUtils.js +1 -1
  26. package/dist/collection/utils/downloadUtils.ts +1 -1
  27. package/dist/components/create-feature.d.ts +11 -0
  28. package/dist/components/create-feature.js +11 -0
  29. package/dist/components/create-feature2.js +278 -0
  30. package/dist/components/crowdsource-reporter.js +324 -90
  31. package/dist/components/downloadUtils.js +1 -1
  32. package/dist/components/feature-list2.js +1 -0
  33. package/dist/components/layer-list2.js +38 -17
  34. package/dist/esm/{calcite-flow_4.entry.js → calcite-flow_5.entry.js} +286 -20
  35. package/dist/esm/card-manager_3.entry.js +1 -1
  36. package/dist/esm/crowdsource-reporter.entry.js +249 -33
  37. package/dist/esm/{downloadUtils-d070a467.js → downloadUtils-d297078f.js} +2 -2
  38. package/dist/esm/{index.es-d48535a2.js → index.es-3b4fa9d0.js} +1 -1
  39. package/dist/esm/loader.js +1 -1
  40. package/dist/esm/map-select-tools_3.entry.js +1 -1
  41. package/dist/esm/public-notification.entry.js +1 -1
  42. package/dist/esm/solutions-components.js +1 -1
  43. package/dist/solutions-components/demos/create-feature.html +90 -0
  44. package/dist/solutions-components/demos/crowdsource-reporter.html +26 -11
  45. package/dist/solutions-components/{p-f120ff40.entry.js → p-09ec8c8f.entry.js} +1 -1
  46. package/dist/solutions-components/{p-55b835a1.js → p-103c5318.js} +2 -2
  47. package/dist/solutions-components/{p-309cdea1.entry.js → p-57d49d15.entry.js} +1 -1
  48. package/dist/solutions-components/{p-b913a4fd.js → p-8ec25bf4.js} +1 -1
  49. package/dist/solutions-components/{p-f22ff57e.entry.js → p-921f21d5.entry.js} +1 -1
  50. package/dist/solutions-components/p-d5263cb9.entry.js +17 -0
  51. package/dist/solutions-components/p-ea17cefb.entry.js +6 -0
  52. package/dist/solutions-components/solutions-components.esm.js +1 -1
  53. package/dist/solutions-components/utils/downloadUtils.ts +1 -1
  54. package/dist/types/components/create-feature/create-feature.d.ts +125 -0
  55. package/dist/types/components/crowdsource-reporter/crowdsource-reporter.d.ts +146 -12
  56. package/dist/types/components/feature-list/feature-list.d.ts +1 -0
  57. package/dist/types/components/layer-list/layer-list.d.ts +6 -0
  58. package/dist/types/components.d.ts +102 -0
  59. package/dist/types/preact.d.ts +7 -0
  60. package/package.json +1 -1
  61. package/dist/solutions-components/p-2f162664.entry.js +0 -6
  62. package/dist/solutions-components/p-94ee3ef7.entry.js +0 -17
@@ -14,7 +14,7 @@ require('./esri-loader-a91c0ec1.js');
14
14
  require('./_commonjsHelpers-384729db.js');
15
15
  require('./interfaces-7cd0a48a.js');
16
16
 
17
- const crowdsourceReporterCss = ":host{display:block;--calcite-label-margin-bottom:0px;--solutions-theme-foreground-color:var(--calcite-color-foreground-1)}.width-full{width:100% !important}.width-0{width:0}.height-full{height:100% !important}.height-0{height:0}.overflow-hidden{overflow:hidden}.border{border:1px solid var(--calcite-color-border-3)}.error-msg{padding:10px}";
17
+ const crowdsourceReporterCss = ":host{display:block;--calcite-label-margin-bottom:0px;--solutions-theme-foreground-color:var(--calcite-color-foreground-1)}.width-full{width:100% !important}.width-0{width:0}.height-full{height:100% !important}.height-0{height:0}.overflow-hidden{overflow:hidden}.border{border:1px solid var(--calcite-color-border-3)}.notice-msg{padding:10px;width:calc(100% - 20px)}.footer-top-button{padding-bottom:7px}.footer-button{height:35px}";
18
18
 
19
19
  const CrowdsourceReporter = class {
20
20
  constructor(hostRef) {
@@ -30,6 +30,8 @@ const CrowdsourceReporter = class {
30
30
  this.layers = undefined;
31
31
  this.loginTitle = undefined;
32
32
  this.mapView = undefined;
33
+ this.layerId = undefined;
34
+ this.objectId = undefined;
33
35
  this.reportButtonText = undefined;
34
36
  this.reportsHeader = undefined;
35
37
  this.reportSubmittedMessage = undefined;
@@ -47,6 +49,9 @@ const CrowdsourceReporter = class {
47
49
  this._translations = undefined;
48
50
  this._hasValidLayers = false;
49
51
  this._selectedLayerName = undefined;
52
+ this._reportSubmitted = false;
53
+ this._showSubmitCancelButton = false;
54
+ this._featureCreationFailedErrorMsg = undefined;
50
55
  }
51
56
  //--------------------------------------------------------------------------
52
57
  //
@@ -78,6 +83,7 @@ const CrowdsourceReporter = class {
78
83
  * @returns Promise when complete
79
84
  */
80
85
  async componentWillLoad() {
86
+ this._urlParamsLoaded = false;
81
87
  await this._initModules();
82
88
  await this._getTranslations();
83
89
  }
@@ -85,7 +91,8 @@ const CrowdsourceReporter = class {
85
91
  * Renders the component.
86
92
  */
87
93
  render() {
88
- return (index.h(index.Host, null, index.h("div", null, index.h("calcite-shell", { "content-behind": true }, this._getReporter()))));
94
+ const themeClass = this.theme === "dark" ? "calcite-mode-dark" : "calcite-mode-light";
95
+ return (index.h(index.Host, null, this._reportSubmitted && index.h("calcite-alert", { "auto-close": true, class: themeClass, closable: true, icon: "check-circle", kind: "success", onCalciteAlertClose: () => { this._reportSubmitted = false; }, open: true, placement: "top" }, index.h("div", { slot: "title" }, this._translations.reportSubmit), index.h("div", { slot: "message" }, this._translations.submitMsg)), this._featureCreationFailedErrorMsg && index.h("calcite-alert", { "auto-close": true, class: themeClass, closable: true, icon: "x-octagon", kind: "danger", onCalciteAlertClose: () => { this._featureCreationFailedErrorMsg = ""; }, open: true, placement: "top" }, index.h("div", { slot: "title" }, this._translations.error), index.h("div", { slot: "message" }, this._featureCreationFailedErrorMsg)), index.h("div", null, index.h("calcite-shell", { "content-behind": true }, this._getReporter()))));
89
96
  }
90
97
  //--------------------------------------------------------------------------
91
98
  //
@@ -105,6 +112,20 @@ const CrowdsourceReporter = class {
105
112
  ]);
106
113
  this.reactiveUtils = reactiveUtils;
107
114
  }
115
+ /**
116
+ * Set the selected layer id and layer name
117
+ * @param layerId string layerId of the selected layer
118
+ * @param layerName string layerName of the selected layer
119
+ */
120
+ setSelectedLayer(layerId, layerName) {
121
+ this._selectedLayerId = layerId;
122
+ this._selectedLayerName = layerName;
123
+ //show only current layer on map and hide other valid editable layers
124
+ //if layerId is empty then show all the layers on map
125
+ this._validLayers.forEach(layer => {
126
+ layer.set('visible', !layerId || (layer.id === layerId));
127
+ });
128
+ }
108
129
  /**
109
130
  * Get the reporter app functionality
110
131
  * @protected
@@ -122,6 +143,12 @@ const CrowdsourceReporter = class {
122
143
  case "feature-details":
123
144
  renderLists.push(this.getFeatureDetailsFlowItem());
124
145
  break;
146
+ case "reporting-layer-list":
147
+ renderLists.push(this.getChooseCategoryFlowItem());
148
+ break;
149
+ case "feature-create":
150
+ renderLists.push(this.getFeatureCreateFlowItem());
151
+ break;
125
152
  }
126
153
  });
127
154
  const themeClass = this.theme === "dark" ? "calcite-mode-dark" : "calcite-mode-light";
@@ -138,34 +165,156 @@ const CrowdsourceReporter = class {
138
165
  return (index.h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: this.reportsHeader }, this._hasValidLayers &&
139
166
  index.h("calcite-action", { icon: "sort-ascending-arrow", slot: this.isMobile ? "header-menu-actions" : "header-actions-end", text: this._translations.sort, "text-enabled": this.isMobile }), this._hasValidLayers &&
140
167
  index.h("calcite-action", { icon: "filter", slot: this.isMobile ? "header-menu-actions" : "header-actions-end", text: this._translations.filter, "text-enabled": this.isMobile }), this.isMobile && this.getActionToExpandCollapsePanel(), this._hasValidLayers && this.enableNewReports &&
141
- index.h("calcite-button", { appearance: "secondary", slot: "footer", width: "full" }, this.reportButtonText), index.h("calcite-panel", { "full-height": true, "full-width": true }, index.h("layer-list", { class: "height-full", layers: this.layers, mapView: this.mapView, noLayerErrorMsg: this._translations.noLayerToDisplayErrorMsg, onLayerSelect: this.displayFeaturesList.bind(this), onLayersListLoaded: this.layerListLoaded.bind(this), showFeatureCount: true, showNextIcon: true }))));
168
+ index.h("calcite-button", { appearance: "secondary", onClick: this.navigateToChooseCategory.bind(this), slot: "footer", width: "full" }, this.reportButtonText), index.h("calcite-panel", { "full-height": true, "full-width": true }, index.h("layer-list", { class: "height-full", layers: this.layers, mapView: this.mapView, noLayerErrorMsg: this._translations.noLayerToDisplayErrorMsg, onLayerSelect: this.displayFeaturesList.bind(this), onLayersListLoaded: this.layerListLoaded.bind(this), ref: el => this._layerList = el, showFeatureCount: true, showNextIcon: true }))));
169
+ }
170
+ /**
171
+ * Get the layer list for creating a report
172
+ * @returns Choose category flow item
173
+ * @protected
174
+ */
175
+ getChooseCategoryFlowItem() {
176
+ return (index.h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: this._translations.createReportHeader, onCalciteFlowItemBack: this.backFromSelectedPanel.bind(this) }, this.isMobile && this.getActionToExpandCollapsePanel(), index.h("div", { class: "width-full", slot: "footer" }, index.h("calcite-button", { appearance: "secondary", class: "footer-top-button footer-button", disabled: !this._selectedLayerId, onClick: this.navigateToCreateFeature.bind(this), width: "full" }, this._translations.next), index.h("calcite-button", { appearance: "outline", class: "footer-button", onClick: this.backFromSelectedPanel.bind(this), width: "full" }, this._translations.cancel)), index.h("calcite-panel", { "full-height": true, "full-width": true }, index.h("calcite-notice", { class: "notice-msg", icon: "lightbulb", kind: "success", open: true }, index.h("div", { slot: "message" }, this._translations.chooseCategoryMsg)), index.h("layer-list", { class: "height-full", layers: this.layers, mapView: this.mapView, noLayerErrorMsg: this._translations.noLayerToDisplayErrorMsg, onLayerSelect: this.highlightSelectedLayer.bind(this), showFeatureCount: false, showNextIcon: false }))));
177
+ }
178
+ /**
179
+ * Get Feature create form of the selected feature layer
180
+ * @returns feature create form
181
+ * @protected
182
+ */
183
+ getFeatureCreateFlowItem() {
184
+ return (index.h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: this._selectedLayerName, onCalciteFlowItemBack: this.backFromCreateFeaturePanel.bind(this) }, this.isMobile && this.getActionToExpandCollapsePanel(), this._showSubmitCancelButton && index.h("div", { class: "width-full", slot: "footer" }, index.h("calcite-button", { appearance: "secondary", class: "footer-top-button footer-button", onClick: this.onSubmitButtonClick.bind(this), width: "full" }, this._translations.submit), index.h("calcite-button", { appearance: "outline", class: "footer-button", onClick: this.backFromCreateFeaturePanel.bind(this), width: "full" }, this._translations.cancel)), index.h("calcite-panel", { "full-height": true, "full-width": true }, index.h("calcite-notice", { class: "notice-msg", icon: "lightbulb", kind: "success", open: true }, index.h("div", { slot: "message" }, this._translations.featureEditFormInfoMsg)), index.h("create-feature", { customizeSubmit: true, mapView: this.mapView, onDrawComplete: this.onDrawComplete.bind(this), onEditingAttachment: this.showSubmitCancelButton.bind(this), onFail: this.createFeatureFailed.bind(this), onSuccess: this.onReportSubmitted.bind(this), ref: el => this._createFeature = el, selectedLayerId: this._selectedLayerId }))));
185
+ }
186
+ /**
187
+ * When drawing of incident location completed on map show the submit and cancel button
188
+ * @protected
189
+ */
190
+ onDrawComplete() {
191
+ this._showSubmitCancelButton = true;
192
+ }
193
+ /**
194
+ * When Add attachment panel is enabled hide the submit and cancel button
195
+ * @protected
196
+ */
197
+ showSubmitCancelButton(evt) {
198
+ this._showSubmitCancelButton = !evt.detail;
199
+ }
200
+ /**
201
+ * On back from create feature, call submit editor to destroy the Editor widget instance
202
+ * @protected
203
+ */
204
+ onSubmitButtonClick() {
205
+ if (this._createFeature) {
206
+ this._createFeature.submit();
207
+ }
208
+ }
209
+ /**
210
+ * On back from create feature, call close editor to destroy the Editor widget instance
211
+ * @protected
212
+ */
213
+ backFromCreateFeaturePanel() {
214
+ if (this._createFeature) {
215
+ this._createFeature.close();
216
+ }
217
+ this.backFromSelectedPanel();
218
+ }
219
+ /**
220
+ * On creating the feature is failed, show the error message
221
+ * @param evt Event which has feature failed message
222
+ * @protected
223
+ */
224
+ createFeatureFailed(evt) {
225
+ console.error(evt.detail);
226
+ this._featureCreationFailedErrorMsg = evt.detail.message;
227
+ }
228
+ /**
229
+ * On submit report navigate to the layer list home page and refresh the layer list
230
+ * @protected
231
+ */
232
+ onReportSubmitted() {
233
+ this._reportSubmitted = true;
234
+ this.navigateToHomePage();
235
+ }
236
+ /**
237
+ * Navigates to layer-list
238
+ * @protected
239
+ */
240
+ navigateToHomePage() {
241
+ if (this._createFeature) {
242
+ this._createFeature.close();
243
+ }
244
+ if (this._layerList) {
245
+ this._layerList.refresh();
246
+ }
247
+ this.setSelectedFeatures([]);
248
+ this._flowItems = ["layer-list"];
249
+ }
250
+ /**
251
+ * Update the selected layer id and name
252
+ * @param evt Event which has details of selected layerId and layerName
253
+ * @protected
254
+ */
255
+ highlightSelectedLayer(evt) {
256
+ this.setSelectedLayer(evt.detail.layerId, evt.detail.layerName);
257
+ }
258
+ /**
259
+ * On next button click open the feature create flow item
260
+ * @protected
261
+ */
262
+ async navigateToCreateFeature() {
263
+ this._showSubmitCancelButton = false;
264
+ this._flowItems = [...this._flowItems, "feature-create"];
265
+ }
266
+ /**
267
+ * On report an incident button click open the create a report panel with the layer list
268
+ * @protected
269
+ */
270
+ navigateToChooseCategory() {
271
+ this._flowItems = [...this._flowItems, "reporting-layer-list"];
142
272
  }
143
273
  /**
144
274
  * When layer list is loaded, we will receive the list of layers, if its means we don't have any valid layer to be listed
145
275
  * @param evt Event which has list of layers
146
276
  * @protected
147
277
  */
148
- layerListLoaded(evt) {
278
+ async layerListLoaded(evt) {
149
279
  const layersListed = evt.detail;
150
- this.handleMapClick(layersListed);
280
+ //consider only the layers listed in the layer-list component
281
+ const allMapLayers = await mapViewUtils.getAllLayers(this.mapView);
282
+ this._validLayers = [];
283
+ allMapLayers.forEach((eachLayer) => {
284
+ if (layersListed.includes(eachLayer.id)) {
285
+ this._validLayers.push(eachLayer);
286
+ }
287
+ });
288
+ //handleMap click on layer list loaded
289
+ this.handleMapClick();
290
+ //update the has valid layer state
151
291
  this._hasValidLayers = layersListed.length > 0;
292
+ //navigate to the feature details if URL params found
293
+ if (!this._urlParamsLoaded) {
294
+ this._urlParamsLoaded = true;
295
+ await this.loadFeatureFromURLParams();
296
+ }
152
297
  }
153
298
  /**On click of layer list item show feature list
154
299
  * @param evt Event which has details of selected layerId and layerName
155
300
  * @protected
156
301
  */
157
302
  displayFeaturesList(evt) {
158
- this._selectedLayerId = evt.detail.layerId;
159
- this._selectedLayerName = evt.detail.layerName;
303
+ this.setSelectedLayer(evt.detail.layerId, evt.detail.layerName);
160
304
  this._flowItems = [...this._flowItems, "feature-list"];
161
305
  }
162
306
  /**
163
- * On back from feature list navigate to the Layer list panel
307
+ * On back from selected panel navigate to the previous panel
164
308
  * @protected
165
309
  */
166
- backFromFeatureList() {
310
+ backFromSelectedPanel() {
167
311
  const updatedFlowItems = [...this._flowItems];
168
312
  updatedFlowItems.pop();
313
+ //Back to layer list, and return as the flowItems will be reset in navigateToHomePage
314
+ if (updatedFlowItems.length === 1) {
315
+ this.navigateToHomePage();
316
+ return;
317
+ }
169
318
  this._flowItems = [...updatedFlowItems];
170
319
  }
171
320
  /**
@@ -181,7 +330,7 @@ const CrowdsourceReporter = class {
181
330
  * @param evt Event which has details of selected feature
182
331
  */
183
332
  async onFeatureSelectFromList(evt) {
184
- this._selectedFeature = [evt.detail];
333
+ this.setSelectedFeatures([evt.detail]);
185
334
  this._flowItems = [...this._flowItems, "feature-details"];
186
335
  }
187
336
  /**
@@ -192,26 +341,50 @@ const CrowdsourceReporter = class {
192
341
  * @protected
193
342
  */
194
343
  getFeatureListFlowItem(layerId, layerName) {
195
- return (index.h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: layerName, onCalciteFlowItemBack: this.backFromFeatureList.bind(this) }, index.h("calcite-action", { icon: "sort-ascending-arrow", slot: this.isMobile ? "header-menu-actions" : "header-actions-end", text: this._translations.sort, "text-enabled": this.isMobile }), index.h("calcite-action", { icon: "filter", slot: this.isMobile ? "header-menu-actions" : "header-actions-end", text: this._translations.filter, "text-enabled": this.isMobile }), this.isMobile && this.getActionToExpandCollapsePanel(), this.enableNewReports &&
196
- index.h("calcite-button", { appearance: "secondary", slot: "footer", width: "full" }, this.reportButtonText), index.h("calcite-panel", { "full-height": true }, index.h("feature-list", { class: "height-full", highlightOnMap: true, mapView: this.mapView, noFeaturesFoundMsg: this._translations.featureErrorMsg, onFeatureSelect: this.onFeatureSelectFromList.bind(this), pageSize: 30, selectedLayerId: layerId }))));
344
+ return (index.h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: layerName, onCalciteFlowItemBack: this.backFromSelectedPanel.bind(this) }, index.h("calcite-action", { icon: "sort-ascending-arrow", slot: this.isMobile ? "header-menu-actions" : "header-actions-end", text: this._translations.sort, "text-enabled": this.isMobile }), index.h("calcite-action", { icon: "filter", slot: this.isMobile ? "header-menu-actions" : "header-actions-end", text: this._translations.filter, "text-enabled": this.isMobile }), this.isMobile && this.getActionToExpandCollapsePanel(), this.enableNewReports &&
345
+ index.h("calcite-button", { appearance: "secondary", onClick: this.navigateToCreateFeature.bind(this), slot: "footer", width: "full" }, this.reportButtonText), index.h("calcite-panel", { "full-height": true }, index.h("feature-list", { class: "height-full", highlightOnMap: true, mapView: this.mapView, noFeaturesFoundMsg: this._translations.featureErrorMsg, onFeatureSelect: this.onFeatureSelectFromList.bind(this), pageSize: 30, selectedLayerId: layerId }))));
197
346
  }
198
347
  /**
199
348
  * Returns the calcite-flow item for feature details
200
349
  * @returns Node
201
350
  */
202
351
  getFeatureDetailsFlowItem() {
203
- return (index.h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: this._selectedLayerName, onCalciteFlowItemBack: this.backFromFeatureList.bind(this) }, this.isMobile && this.getActionToExpandCollapsePanel(), index.h("calcite-action", { icon: "share", slot: "header-actions-end", text: this._translations.share }), index.h("calcite-panel", { "full-height": true }, index.h("info-card", { allowEditing: false, graphics: this._selectedFeature, isLoading: false, isMobile: false, mapView: this.mapView, onSelectionChanged: this.featureDetailsChanged.bind(this), zoomAndScrollToSelected: true }))));
352
+ return (index.h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: this._selectedLayerName, onCalciteFlowItemBack: this.backFromSelectedPanel.bind(this) }, this.isMobile && this.getActionToExpandCollapsePanel(), index.h("instant-apps-social-share", { autoUpdateShareUrl: false, embed: false, popoverButtonIconScale: "s", ref: el => this._shareNode = el, scale: "m", shareButtonColor: "neutral", shareButtonType: "action", slot: "header-actions-end", socialMedia: true, view: this.mapView }), index.h("calcite-panel", { "full-height": true }, index.h("info-card", { allowEditing: false, graphics: this._selectedFeature, isLoading: false, isMobile: false, mapView: this.mapView, onSelectionChanged: this.featureDetailsChanged.bind(this), zoomAndScrollToSelected: true }))));
353
+ }
354
+ /**
355
+ * Sets the selected features and updates the first feature as the current selected feature
356
+ * @param features Graphics array of the features selected
357
+ */
358
+ setSelectedFeatures(features) {
359
+ this._selectedFeature = features;
360
+ this.setCurrentFeature(this._selectedFeature.length ? this._selectedFeature[0] : null);
361
+ }
362
+ /**
363
+ * Set the object id of the current selected feature, and also updates the current selected layer details
364
+ * @param selectedFeature Graphic currently shown in feature details
365
+ */
366
+ setCurrentFeature(selectedFeature) {
367
+ if (selectedFeature && selectedFeature.layer) {
368
+ const layer = selectedFeature.layer;
369
+ this.setSelectedLayer(layer.id, layer.title);
370
+ this._currentFeatureId = selectedFeature.attributes[layer.objectIdField];
371
+ }
372
+ else {
373
+ this.setSelectedLayer('', '');
374
+ this._currentFeatureId = '';
375
+ }
376
+ this._updateShareURL();
204
377
  }
205
378
  /**
206
379
  * On Feature details change update the Layer title and the current selected layer id
207
380
  * @param evt Event hold the details of current feature graphic in the info-card
208
381
  */
209
382
  featureDetailsChanged(evt) {
210
- this._selectedLayerId = evt.detail[0].layer.id;
211
- this._selectedLayerName = evt.detail[0].layer.title;
383
+ this.setCurrentFeature(evt.detail[0]);
212
384
  }
213
385
  /**
214
386
  * Returns the action button to Expand/Collapse side panel in mobile mode
387
+ * @protected
215
388
  */
216
389
  getActionToExpandCollapsePanel() {
217
390
  return (index.h("calcite-action", { icon: this._sidePanelCollapsed ? "chevrons-up" : "chevrons-down", onClick: this.toggleSidePanel.bind(this), slot: "header-actions-end", text: this._sidePanelCollapsed ? this._translations.expand : this._translations.collapse }));
@@ -235,36 +408,26 @@ const CrowdsourceReporter = class {
235
408
  * Handle map click event
236
409
  * @param layers Array of layerIds
237
410
  *
238
- * @protected
411
+ * @protected
239
412
  */
240
- handleMapClick(layers) {
413
+ handleMapClick() {
241
414
  if (this._mapClickHandle) {
242
415
  this._mapClickHandle.remove();
243
416
  }
244
- this._mapClickHandle = this.reactiveUtils.on(() => this.mapView, "click", (event) => {
245
- void this.onMapClick(event, layers);
246
- });
417
+ this._mapClickHandle = this.reactiveUtils.on(() => this.mapView, "click", this.onMapClick.bind(this));
247
418
  }
248
419
  /**
249
420
  * On map click do hitTest and get the clicked graphics of valid layers and show feature details
250
- * @param event
251
- * @param layers
421
+ * @param event IMapClick map click event details
252
422
  *
253
423
  * @protected
254
424
  */
255
- async onMapClick(event, layers) {
425
+ async onMapClick(event) {
256
426
  //disable map popup
257
427
  this.mapView.popupEnabled = false;
258
428
  // only include graphics from valid layers listed in the layer list widget
259
- const allMapLayers = await mapViewUtils.getAllLayers(this.mapView);
260
- const validLayers = [];
261
- allMapLayers.forEach((eachLayer) => {
262
- if (layers.includes(eachLayer.id)) {
263
- validLayers.push(eachLayer);
264
- }
265
- });
266
429
  const opts = {
267
- include: validLayers
430
+ include: this._validLayers
268
431
  };
269
432
  // Perform a hitTest on the View
270
433
  const hitTest = await this.mapView.hitTest(event, opts);
@@ -277,7 +440,7 @@ const CrowdsourceReporter = class {
277
440
  }
278
441
  });
279
442
  //update the selectedFeature
280
- this._selectedFeature = clickedGraphics;
443
+ this.setSelectedFeatures(clickedGraphics);
281
444
  //if featureDetails not open then add it to the list else just reInit flowItems which will update details with newly selected features
282
445
  // eslint-disable-next-line unicorn/prefer-ternary
283
446
  if (this._flowItems.length && this._flowItems[this._flowItems.length - 1] !== "feature-details") {
@@ -297,6 +460,59 @@ const CrowdsourceReporter = class {
297
460
  const messages = await locale.getLocaleComponentStrings(this.el);
298
461
  this._translations = messages[0];
299
462
  }
463
+ /**
464
+ * Updates the share url for current selected feature
465
+ * @protected
466
+ */
467
+ _updateShareURL() {
468
+ var _a, _b;
469
+ const url = (_a = this._shareNode) === null || _a === void 0 ? void 0 : _a.shareUrl;
470
+ if (!url) {
471
+ return;
472
+ }
473
+ const urlObj = new URL(url);
474
+ //set the selected layers id
475
+ if (this._selectedLayerId) {
476
+ urlObj.searchParams.set("layerid", this._selectedLayerId);
477
+ }
478
+ else {
479
+ urlObj.searchParams.delete("layerid");
480
+ }
481
+ //Set the selected features objectid
482
+ if ((_b = this._selectedFeature) === null || _b === void 0 ? void 0 : _b.length) {
483
+ urlObj.searchParams.set("oid", this._currentFeatureId);
484
+ }
485
+ else {
486
+ urlObj.searchParams.delete("oid");
487
+ }
488
+ //update the url in share component
489
+ this._shareNode.shareUrl = urlObj.href;
490
+ }
491
+ /**
492
+ * Navigates to selected features detail based on the URL params
493
+ * @protected
494
+ */
495
+ async loadFeatureFromURLParams() {
496
+ if (this.layerId && this.objectId) {
497
+ const layer = await mapViewUtils.getLayerOrTable(this.mapView, this.layerId);
498
+ if (layer) {
499
+ // only query if we have some ids...query with no ids will result in all features being returned
500
+ const featureSet = await mapViewUtils.queryFeaturesByID([Number(this.objectId)], layer, [], false, this.mapView.spatialReference);
501
+ if (featureSet.length) {
502
+ //update the selectedFeature
503
+ this._selectedFeature = featureSet;
504
+ //if featureDetails not open then add it to the list else just reInit flowItems which will update details with newly selected features
505
+ // eslint-disable-next-line unicorn/prefer-ternary
506
+ if (this._flowItems.length && this._flowItems[this._flowItems.length - 1] !== "feature-details") {
507
+ this._flowItems = [...this._flowItems, "feature-details"];
508
+ }
509
+ else {
510
+ this._flowItems = [...this._flowItems];
511
+ }
512
+ }
513
+ }
514
+ }
515
+ }
300
516
  get el() { return index.getElement(this); }
301
517
  static get watchers() { return {
302
518
  "isMobile": ["isMobileWatchHandler"],
@@ -1510,7 +1510,7 @@ function(t){var e=function(t){for(var e=t.length,r=new Uint8Array(e),n=0;n<e;n++
1510
1510
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1511
1511
  * ====================================================================
1512
1512
  */
1513
- function(t){function e(){return (n.canvg?Promise.resolve(n.canvg):Promise.resolve().then(function () { return require('./index.es-bd1a93b2.js'); })).catch((function(t){return Promise.reject(new Error("Could not load canvg: "+t))})).then((function(t){return t.default?t.default:t}))}E.API.addSvgAsImage=function(t,r,n,i,o,s,c,u){if(isNaN(r)||isNaN(n))throw a.error("jsPDF.addSvgAsImage: Invalid coordinates",arguments),new Error("Invalid coordinates passed to jsPDF.addSvgAsImage");if(isNaN(i)||isNaN(o))throw a.error("jsPDF.addSvgAsImage: Invalid measurements",arguments),new Error("Invalid measurements (width and/or height) passed to jsPDF.addSvgAsImage");var h=document.createElement("canvas");h.width=i,h.height=o;var l=h.getContext("2d");l.fillStyle="#fff",l.fillRect(0,0,h.width,h.height);var f={ignoreMouse:!0,ignoreAnimation:!0,ignoreDimensions:!0},d=this;return e().then((function(e){return e.fromString(l,t,f)}),(function(){return Promise.reject(new Error("Could not load canvg."))})).then((function(t){return t.render(f)})).then((function(){d.addImage(h.toDataURL("image/jpeg",1),r,n,i,o,c,u);}))};}(),E.API.putTotalPages=function(t){var e,r=0;parseInt(this.internal.getFont().id.substr(1),10)<15?(e=new RegExp(t,"g"),r=this.internal.getNumberOfPages()):(e=new RegExp(this.pdfEscape16(t,this.internal.getFont()),"g"),r=this.pdfEscape16(this.internal.getNumberOfPages()+"",this.internal.getFont()));for(var n=1;n<=this.internal.getNumberOfPages();n++)for(var i=0;i<this.internal.pages[n].length;i++)this.internal.pages[n][i]=this.internal.pages[n][i].replace(e,r);return this},E.API.viewerPreferences=function(e,r){var n;e=e||{},r=r||!1;var i,a,o,s={HideToolbar:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},HideMenubar:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},HideWindowUI:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},FitWindow:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},CenterWindow:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},DisplayDocTitle:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.4},NonFullScreenPageMode:{defaultValue:"UseNone",value:"UseNone",type:"name",explicitSet:!1,valueSet:["UseNone","UseOutlines","UseThumbs","UseOC"],pdfVersion:1.3},Direction:{defaultValue:"L2R",value:"L2R",type:"name",explicitSet:!1,valueSet:["L2R","R2L"],pdfVersion:1.3},ViewArea:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},ViewClip:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},PrintArea:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},PrintClip:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},PrintScaling:{defaultValue:"AppDefault",value:"AppDefault",type:"name",explicitSet:!1,valueSet:["AppDefault","None"],pdfVersion:1.6},Duplex:{defaultValue:"",value:"none",type:"name",explicitSet:!1,valueSet:["Simplex","DuplexFlipShortEdge","DuplexFlipLongEdge","none"],pdfVersion:1.7},PickTrayByPDFSize:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.7},PrintPageRange:{defaultValue:"",value:"",type:"array",explicitSet:!1,valueSet:null,pdfVersion:1.7},NumCopies:{defaultValue:1,value:1,type:"integer",explicitSet:!1,valueSet:null,pdfVersion:1.7}},c=Object.keys(s),u=[],h=0,l=0,f=0;function d(t,e){var r,n=!1;for(r=0;r<t.length;r+=1)t[r]===e&&(n=!0);return n}if(void 0===this.internal.viewerpreferences&&(this.internal.viewerpreferences={},this.internal.viewerpreferences.configuration=JSON.parse(JSON.stringify(s)),this.internal.viewerpreferences.isSubscribed=!1),n=this.internal.viewerpreferences.configuration,"reset"===e||!0===r){var p=c.length;for(f=0;f<p;f+=1)n[c[f]].value=n[c[f]].defaultValue,n[c[f]].explicitSet=!1;}if("object"===t(e))for(a in e)if(o=e[a],d(c,a)&&void 0!==o){if("boolean"===n[a].type&&"boolean"==typeof o)n[a].value=o;else if("name"===n[a].type&&d(n[a].valueSet,o))n[a].value=o;else if("integer"===n[a].type&&Number.isInteger(o))n[a].value=o;else if("array"===n[a].type){for(h=0;h<o.length;h+=1)if(i=!0,1===o[h].length&&"number"==typeof o[h][0])u.push(String(o[h]-1));else if(o[h].length>1){for(l=0;l<o[h].length;l+=1)"number"!=typeof o[h][l]&&(i=!1);!0===i&&u.push([o[h][0]-1,o[h][1]-1].join(" "));}n[a].value="["+u.join(" ")+"]";}else n[a].value=n[a].defaultValue;n[a].explicitSet=!0;}return !1===this.internal.viewerpreferences.isSubscribed&&(this.internal.events.subscribe("putCatalog",(function(){var t,e=[];for(t in n)!0===n[t].explicitSet&&("name"===n[t].type?e.push("/"+t+" /"+n[t].value):e.push("/"+t+" "+n[t].value));0!==e.length&&this.internal.write("/ViewerPreferences\n<<\n"+e.join("\n")+"\n>>");})),this.internal.viewerpreferences.isSubscribed=!0),this.internal.viewerpreferences.configuration=n,this},
1513
+ function(t){function e(){return (n.canvg?Promise.resolve(n.canvg):Promise.resolve().then(function () { return require('./index.es-72dc7ab9.js'); })).catch((function(t){return Promise.reject(new Error("Could not load canvg: "+t))})).then((function(t){return t.default?t.default:t}))}E.API.addSvgAsImage=function(t,r,n,i,o,s,c,u){if(isNaN(r)||isNaN(n))throw a.error("jsPDF.addSvgAsImage: Invalid coordinates",arguments),new Error("Invalid coordinates passed to jsPDF.addSvgAsImage");if(isNaN(i)||isNaN(o))throw a.error("jsPDF.addSvgAsImage: Invalid measurements",arguments),new Error("Invalid measurements (width and/or height) passed to jsPDF.addSvgAsImage");var h=document.createElement("canvas");h.width=i,h.height=o;var l=h.getContext("2d");l.fillStyle="#fff",l.fillRect(0,0,h.width,h.height);var f={ignoreMouse:!0,ignoreAnimation:!0,ignoreDimensions:!0},d=this;return e().then((function(e){return e.fromString(l,t,f)}),(function(){return Promise.reject(new Error("Could not load canvg."))})).then((function(t){return t.render(f)})).then((function(){d.addImage(h.toDataURL("image/jpeg",1),r,n,i,o,c,u);}))};}(),E.API.putTotalPages=function(t){var e,r=0;parseInt(this.internal.getFont().id.substr(1),10)<15?(e=new RegExp(t,"g"),r=this.internal.getNumberOfPages()):(e=new RegExp(this.pdfEscape16(t,this.internal.getFont()),"g"),r=this.pdfEscape16(this.internal.getNumberOfPages()+"",this.internal.getFont()));for(var n=1;n<=this.internal.getNumberOfPages();n++)for(var i=0;i<this.internal.pages[n].length;i++)this.internal.pages[n][i]=this.internal.pages[n][i].replace(e,r);return this},E.API.viewerPreferences=function(e,r){var n;e=e||{},r=r||!1;var i,a,o,s={HideToolbar:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},HideMenubar:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},HideWindowUI:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},FitWindow:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},CenterWindow:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},DisplayDocTitle:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.4},NonFullScreenPageMode:{defaultValue:"UseNone",value:"UseNone",type:"name",explicitSet:!1,valueSet:["UseNone","UseOutlines","UseThumbs","UseOC"],pdfVersion:1.3},Direction:{defaultValue:"L2R",value:"L2R",type:"name",explicitSet:!1,valueSet:["L2R","R2L"],pdfVersion:1.3},ViewArea:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},ViewClip:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},PrintArea:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},PrintClip:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},PrintScaling:{defaultValue:"AppDefault",value:"AppDefault",type:"name",explicitSet:!1,valueSet:["AppDefault","None"],pdfVersion:1.6},Duplex:{defaultValue:"",value:"none",type:"name",explicitSet:!1,valueSet:["Simplex","DuplexFlipShortEdge","DuplexFlipLongEdge","none"],pdfVersion:1.7},PickTrayByPDFSize:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.7},PrintPageRange:{defaultValue:"",value:"",type:"array",explicitSet:!1,valueSet:null,pdfVersion:1.7},NumCopies:{defaultValue:1,value:1,type:"integer",explicitSet:!1,valueSet:null,pdfVersion:1.7}},c=Object.keys(s),u=[],h=0,l=0,f=0;function d(t,e){var r,n=!1;for(r=0;r<t.length;r+=1)t[r]===e&&(n=!0);return n}if(void 0===this.internal.viewerpreferences&&(this.internal.viewerpreferences={},this.internal.viewerpreferences.configuration=JSON.parse(JSON.stringify(s)),this.internal.viewerpreferences.isSubscribed=!1),n=this.internal.viewerpreferences.configuration,"reset"===e||!0===r){var p=c.length;for(f=0;f<p;f+=1)n[c[f]].value=n[c[f]].defaultValue,n[c[f]].explicitSet=!1;}if("object"===t(e))for(a in e)if(o=e[a],d(c,a)&&void 0!==o){if("boolean"===n[a].type&&"boolean"==typeof o)n[a].value=o;else if("name"===n[a].type&&d(n[a].valueSet,o))n[a].value=o;else if("integer"===n[a].type&&Number.isInteger(o))n[a].value=o;else if("array"===n[a].type){for(h=0;h<o.length;h+=1)if(i=!0,1===o[h].length&&"number"==typeof o[h][0])u.push(String(o[h]-1));else if(o[h].length>1){for(l=0;l<o[h].length;l+=1)"number"!=typeof o[h][l]&&(i=!1);!0===i&&u.push([o[h][0]-1,o[h][1]-1].join(" "));}n[a].value="["+u.join(" ")+"]";}else n[a].value=n[a].defaultValue;n[a].explicitSet=!0;}return !1===this.internal.viewerpreferences.isSubscribed&&(this.internal.events.subscribe("putCatalog",(function(){var t,e=[];for(t in n)!0===n[t].explicitSet&&("name"===n[t].type?e.push("/"+t+" /"+n[t].value):e.push("/"+t+" "+n[t].value));0!==e.length&&this.internal.write("/ViewerPreferences\n<<\n"+e.join("\n")+"\n>>");})),this.internal.viewerpreferences.isSubscribed=!0),this.internal.viewerpreferences.configuration=n,this},
1514
1514
  /** ====================================================================
1515
1515
  * @license
1516
1516
  * jsPDF XMP metadata plugin
@@ -2861,7 +2861,7 @@ function _prepareAttributeValue(attributeValue, attributeType, attributeDomain,
2861
2861
  if (attributeDomain && attributeDomain.type === "coded-value") {
2862
2862
  // "coded-value" domain field
2863
2863
  const value = attributeDomain.getName(attributeValue);
2864
- return value.toString();
2864
+ return value === null || value === void 0 ? void 0 : value.toString();
2865
2865
  }
2866
2866
  else {
2867
2867
  // Non-domain field or unsupported domain type
@@ -6,7 +6,7 @@
6
6
  'use strict';
7
7
 
8
8
  const _commonjsHelpers = require('./_commonjsHelpers-384729db.js');
9
- const downloadUtils = require('./downloadUtils-83c6d3c3.js');
9
+ const downloadUtils = require('./downloadUtils-10e0de31.js');
10
10
  require('./index-b8a649fc.js');
11
11
  require('./locale-a476e15d.js');
12
12
  require('./esri-loader-a91c0ec1.js');