@esri/solutions-components 0.7.30 → 0.7.32

Sign up to get free protection for your applications and to get access to all the features.
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');