@esri/solutions-components 0.10.11 → 0.10.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. package/dist/cjs/calcite-alert_4.cjs.entry.js +1 -1
  2. package/dist/cjs/calcite-combobox_3.cjs.entry.js +5 -3
  3. package/dist/cjs/calcite-flow_6.cjs.entry.js +103 -7
  4. package/dist/cjs/crowdsource-reporter.cjs.entry.js +173 -43
  5. package/dist/cjs/feature-list.cjs.entry.js +110 -17
  6. package/dist/cjs/loader.cjs.js +1 -1
  7. package/dist/cjs/map-select-tools_3.cjs.entry.js +2 -1
  8. package/dist/cjs/{popupUtils-92e52dbf.js → popupUtils-47bd97e7.js} +1 -1
  9. package/dist/cjs/solutions-components.cjs.js +1 -1
  10. package/dist/collection/assets/t9n/crowdsource-reporter/resources.json +3 -1
  11. package/dist/collection/assets/t9n/crowdsource-reporter/resources_en.json +3 -1
  12. package/dist/collection/assets/t9n/feature-list/resources.json +3 -1
  13. package/dist/collection/assets/t9n/feature-list/resources_en.json +3 -1
  14. package/dist/collection/components/create-feature/create-feature.js +145 -2
  15. package/dist/collection/components/crowdsource-reporter/crowdsource-reporter.js +227 -43
  16. package/dist/collection/components/feature-list/feature-list.css +16 -1
  17. package/dist/collection/components/feature-list/feature-list.js +165 -15
  18. package/dist/collection/components/layer-list/layer-list.js +35 -6
  19. package/dist/collection/components/map-layer-picker/map-layer-picker.js +6 -4
  20. package/dist/collection/components/map-select-tools/map-select-tools.js +2 -1
  21. package/dist/collection/demos/crowdsource-reporter.html +2 -0
  22. package/dist/collection/utils/popupUtils.js +1 -1
  23. package/dist/collection/utils/popupUtils.ts +1 -1
  24. package/dist/components/create-feature2.js +91 -3
  25. package/dist/components/crowdsource-reporter.js +178 -45
  26. package/dist/components/feature-list2.js +152 -50
  27. package/dist/components/layer-list2.js +18 -6
  28. package/dist/components/map-layer-picker2.js +6 -4
  29. package/dist/components/map-select-tools2.js +2 -1
  30. package/dist/components/popupUtils.js +1 -1
  31. package/dist/esm/calcite-alert_4.entry.js +1 -1
  32. package/dist/esm/calcite-combobox_3.entry.js +6 -4
  33. package/dist/esm/calcite-flow_6.entry.js +104 -8
  34. package/dist/esm/crowdsource-reporter.entry.js +173 -43
  35. package/dist/esm/feature-list.entry.js +110 -17
  36. package/dist/esm/loader.js +1 -1
  37. package/dist/esm/map-select-tools_3.entry.js +2 -1
  38. package/dist/esm/{popupUtils-00c655fb.js → popupUtils-349a26e6.js} +1 -1
  39. package/dist/esm/solutions-components.js +1 -1
  40. package/dist/solutions-components/assets/t9n/crowdsource-reporter/resources.json +3 -1
  41. package/dist/solutions-components/assets/t9n/crowdsource-reporter/resources_en.json +3 -1
  42. package/dist/solutions-components/assets/t9n/feature-list/resources.json +3 -1
  43. package/dist/solutions-components/assets/t9n/feature-list/resources_en.json +3 -1
  44. package/dist/solutions-components/demos/crowdsource-reporter.html +2 -0
  45. package/dist/solutions-components/{p-1f40908b.entry.js → p-15622ace.entry.js} +2 -2
  46. package/dist/solutions-components/p-40e305b4.entry.js +17 -0
  47. package/dist/solutions-components/p-4d44410b.entry.js +6 -0
  48. package/dist/solutions-components/{p-900fee65.js → p-5a473f0d.js} +1 -1
  49. package/dist/solutions-components/p-9b83e593.entry.js +6 -0
  50. package/dist/solutions-components/p-abd3e579.entry.js +6 -0
  51. package/dist/solutions-components/{p-cde8d6e5.entry.js → p-f6bc95b3.entry.js} +1 -1
  52. package/dist/solutions-components/solutions-components.esm.js +1 -1
  53. package/dist/solutions-components/utils/popupUtils.ts +1 -1
  54. package/dist/types/components/create-feature/create-feature.d.ts +34 -0
  55. package/dist/types/components/crowdsource-reporter/crowdsource-reporter.d.ts +80 -21
  56. package/dist/types/components/feature-list/feature-list.d.ts +49 -7
  57. package/dist/types/components/layer-list/layer-list.d.ts +4 -0
  58. package/dist/types/components.d.ts +77 -0
  59. package/package.json +1 -1
  60. package/dist/solutions-components/p-058b77d7.entry.js +0 -6
  61. package/dist/solutions-components/p-064e43e0.entry.js +0 -6
  62. package/dist/solutions-components/p-2d1afda0.entry.js +0 -17
  63. package/dist/solutions-components/p-c9260b4c.entry.js +0 -6
@@ -51,11 +51,13 @@ export class CrowdsourceReporter {
51
51
  this.searchConfiguration = undefined;
52
52
  this.showComments = undefined;
53
53
  this.showUserImageInCommentsList = false;
54
+ this.showFeatureSymbol = false;
55
+ this.showMyReportsOnly = false;
54
56
  this.theme = "light";
55
57
  this.zoomToScale = undefined;
58
+ this.floorLevel = undefined;
56
59
  this._featureCreationFailedErrorMsg = undefined;
57
60
  this._filterActive = false;
58
- this._filterOpen = false;
59
61
  this._flowItems = [];
60
62
  this._hasValidLayers = false;
61
63
  this._loadingFeatureDetails = undefined;
@@ -155,6 +157,11 @@ export class CrowdsourceReporter {
155
157
  * esri/core/reactiveUtils: https://developers.arcgis.com/javascript/latest/api-reference/esri-core-reactiveUtils.html
156
158
  */
157
159
  reactiveUtils;
160
+ /**
161
+ * "esri/layers/support/FeatureFilter": https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-support-FeatureFilter.html
162
+ * Esri FeatureFilter
163
+ */
164
+ FeatureFilter;
158
165
  /**
159
166
  * __esri.Graphic: The selected feature
160
167
  */
@@ -191,6 +198,22 @@ export class CrowdsourceReporter {
191
198
  * boolean: when true allow panel to show in full height
192
199
  */
193
200
  _showFullPanel;
201
+ /**
202
+ * string: The current floor expression
203
+ */
204
+ _floorExpression;
205
+ /**
206
+ * _esri.Element: form elements of the selected layer
207
+ */
208
+ _formElements = [];
209
+ /**
210
+ * string[]: URL params set by using filters.
211
+ */
212
+ _filterUrlParams;
213
+ /**
214
+ * FilterInitState: filter's init state
215
+ */
216
+ _filterInitState;
194
217
  //--------------------------------------------------------------------------
195
218
  //
196
219
  // Watch handlers
@@ -210,6 +233,30 @@ export class CrowdsourceReporter {
210
233
  await this.setMapView();
211
234
  });
212
235
  }
236
+ /**
237
+ * Called each time the floorLevel prop is changed.
238
+ */
239
+ async floorLevelWatchHandler() {
240
+ if (this._editableLayerIds) {
241
+ // updates all layer's defination expression when floorLevel is changed
242
+ // then refresh the components to update features
243
+ for (const layerId of this._editableLayerIds) {
244
+ const layer = await getLayerOrTable(this.mapView, layerId);
245
+ if (layer.floorInfo?.floorField) {
246
+ this._updateFloorDefinitionExpression(layer);
247
+ }
248
+ }
249
+ }
250
+ if (this._layerList) {
251
+ await this._layerList.refresh();
252
+ }
253
+ if (this._featureList) {
254
+ void this._featureList.refresh();
255
+ }
256
+ if (this._createFeature) {
257
+ void this._createFeature.refresh(this.floorLevel);
258
+ }
259
+ }
213
260
  //--------------------------------------------------------------------------
214
261
  //
215
262
  // Methods (public)
@@ -251,7 +298,7 @@ export class CrowdsourceReporter {
251
298
  */
252
299
  render() {
253
300
  const themeClass = this.theme === "dark" ? "calcite-mode-dark" : "calcite-mode-light";
254
- return (h(Host, { key: 'e4d2d075e2667ba3e396178e4b820658655813d3' }, this._reportSubmitted && h("calcite-alert", { key: '0cc4678edca8993e529aed1f328816f7ff00e565', "auto-close": true, class: themeClass + " report-submitted-msg", icon: "check-circle", kind: "success", label: "", onCalciteAlertClose: () => { this._reportSubmitted = false; }, open: true, placement: "top" }, h("div", { key: 'cb1bc1c8bed7db3d4535542e7cd6c42119fe1ac3', slot: "message" }, this.reportSubmittedMessage ? this.reportSubmittedMessage : this._translations.submitMsg)), this._featureCreationFailedErrorMsg && h("calcite-alert", { key: '83693e1946d2825cf57f6d8ae5ca5a21a0cc7bfc', "auto-close": true, class: themeClass, icon: "x-octagon", kind: "danger", label: "", onCalciteAlertClose: () => { this._featureCreationFailedErrorMsg = ""; }, open: true, placement: "top" }, h("div", { key: 'c8477c3bcbee4a71ba5169cf80895702bd2adf16', slot: "title" }, this._translations.error), h("div", { key: '30722d6036a5634269cd3e485c94e55a06d008a2', slot: "message" }, this._featureCreationFailedErrorMsg)), this._commentSubmitted && h("calcite-alert", { key: '373b8130788f65dd55106ea3be7fe17aecf80ebb', "auto-close": true, class: 'report-submitted ' + themeClass, icon: "check-circle", kind: "success", label: "", onCalciteAlertClose: () => { this._commentSubmitted = false; }, open: true, placement: "top" }, h("div", { key: '999471c510f95a9699fcb84307bd7daca608725a', slot: "message" }, this._translations.commentSubmittedMsg)), this._addingCommentFailed && h("calcite-alert", { key: '72accc95ed73545157141ae82b1be1ff0b407a26', "auto-close": true, class: themeClass, icon: "x-octagon", kind: "danger", label: "", onCalciteAlertClose: () => { this._addingCommentFailed = false; }, open: true, placement: "top" }, h("div", { key: 'b8beab27be23c9c7f3a9a4a0e839090e63ed9916', slot: "title" }, this._translations.error), h("div", { key: '60d4db0311c00b9bf4ccf56bed1c4d40e003d30d', slot: "message" }, this._translations.addingCommentFailedMsg)), h("div", { key: '4bcca25c6f33c79eeb013cb469dd4e650bc649fb' }, h("calcite-shell", { key: '5d68b182b17c9a09671f73ec477efd0bf5badcfb', "content-behind": true }, this._getReporter())), this.filterModal()));
301
+ return (h(Host, { key: '57ea463ae2d3eac3a23e63ed8702f5fde3743e09' }, this._reportSubmitted && h("calcite-alert", { key: '4082ad71fa4d6c3a01ec0ac6477e81b3d3bc40e1', "auto-close": true, class: themeClass + " report-submitted-msg", icon: "check-circle", kind: "success", label: "", onCalciteAlertClose: () => { this._reportSubmitted = false; }, open: true, placement: "top" }, h("div", { key: '9e042989b10a7d68347b7f34b9f31957ede3ca37', slot: "message" }, this.reportSubmittedMessage ? this.reportSubmittedMessage : this._translations.submitMsg)), this._featureCreationFailedErrorMsg && h("calcite-alert", { key: '573dc6a472b00191a1822c95ba0ee2192c486612', "auto-close": true, class: themeClass, icon: "x-octagon", kind: "danger", label: "", onCalciteAlertClose: () => { this._featureCreationFailedErrorMsg = ""; }, open: true, placement: "top" }, h("div", { key: 'f3799e01a09ccbeec651762833783d3200729f1b', slot: "title" }, this._translations.error), h("div", { key: 'cd80f9a2c8df9a4c7b5b517a9e98ce4622e230c2', slot: "message" }, this._featureCreationFailedErrorMsg)), this._commentSubmitted && h("calcite-alert", { key: '1137ce7794f36419d20a5b5d2d1f390e72713155', "auto-close": true, class: 'report-submitted ' + themeClass, icon: "check-circle", kind: "success", label: "", onCalciteAlertClose: () => { this._commentSubmitted = false; }, open: true, placement: "top" }, h("div", { key: '24a0604c3be1cab965c48ab46435c349a7d67f65', slot: "message" }, this._translations.commentSubmittedMsg)), this._addingCommentFailed && h("calcite-alert", { key: '86112e4c449e1061fa436822670dc93cb3bfe949', "auto-close": true, class: themeClass, icon: "x-octagon", kind: "danger", label: "", onCalciteAlertClose: () => { this._addingCommentFailed = false; }, open: true, placement: "top" }, h("div", { key: '94be8a14c1bf22127f8018dfe3a92304870ce70d', slot: "title" }, this._translations.error), h("div", { key: '6b30463e2ee941834fcad93e4cbe32e5a65d592d', slot: "message" }, this._translations.addingCommentFailedMsg)), h("div", { key: '9b928eab61af6ed84a0059dbc04c633c131f879b' }, h("calcite-shell", { key: 'e07ac5d7d6d8e8c8fd0001586448ab13733e2ed5', "content-behind": true }, this._getReporter()))));
255
302
  }
256
303
  //--------------------------------------------------------------------------
257
304
  //
@@ -266,10 +313,12 @@ export class CrowdsourceReporter {
266
313
  * @protected
267
314
  */
268
315
  async _initModules() {
269
- const [reactiveUtils] = await loadModules([
270
- "esri/core/reactiveUtils"
316
+ const [reactiveUtils, FeatureFilter] = await loadModules([
317
+ "esri/core/reactiveUtils",
318
+ "esri/layers/support/FeatureFilter"
271
319
  ]);
272
320
  this.reactiveUtils = reactiveUtils;
321
+ this.FeatureFilter = FeatureFilter;
273
322
  }
274
323
  /**
275
324
  * Set the selected layer id and layer name
@@ -308,6 +357,10 @@ export class CrowdsourceReporter {
308
357
  case "feature-list":
309
358
  renderLists.push(this.getFeatureListFlowItem(this._selectedLayerId, this._selectedLayerName));
310
359
  break;
360
+ case "filter-panel":
361
+ renderLists.push(this.getFilterPanel());
362
+ void this._restoreFilters();
363
+ break;
311
364
  case "feature-details":
312
365
  renderLists.push(this.getFeatureDetailsFlowItem());
313
366
  break;
@@ -330,32 +383,6 @@ export class CrowdsourceReporter {
330
383
  ? h("calcite-flow", null, renderLists?.length > 0 && renderLists)
331
384
  : h("calcite-loader", { label: "", scale: "m" })));
332
385
  }
333
- /**
334
- * Show filter component in modal
335
- * @returns node to interact with any configured filters for the current layer
336
- */
337
- filterModal() {
338
- //get layer expression for current selected layer
339
- const currentLayersExpressions = this.layerExpressions ? this.layerExpressions.filter((exp) => exp.id === this._selectedLayerId) : [];
340
- return (currentLayersExpressions.length > 0 &&
341
- h("calcite-modal", { "aria-labelledby": "modal-title", class: "modal", kind: "brand", onCalciteModalClose: () => void this._closeFilter(), open: this._filterOpen, widthScale: "s" }, h("div", { class: "display-flex align-center", id: "modal-title", slot: "header" }, this._translations?.filterLayerTitle?.replace("{{title}}", this._selectedLayerName)), h("div", { slot: "content" }, h("instant-apps-filter-list", { autoUpdateUrl: false, closeBtn: true, closeBtnOnClick: () => void this._closeFilter(), comboboxOverlayPositioning: "fixed", layerExpressions: currentLayersExpressions, onFilterListReset: () => this._handleFilterListReset(), onFilterUpdate: () => this._handleFilterUpdate(), ref: (el) => this._filterList = el, view: this.mapView, zoomBtn: false }))));
342
- }
343
- /**
344
- * Close the filter modal
345
- * @protected
346
- */
347
- _closeFilter() {
348
- if (this._filterOpen) {
349
- this._filterOpen = false;
350
- }
351
- }
352
- /**
353
- * When true the filter modal will be displayed
354
- * @protected
355
- */
356
- _toggleFilter() {
357
- this._filterOpen = !this._filterOpen;
358
- }
359
386
  /**
360
387
  * On sort option click update the sort field and sort order
361
388
  * @param sortField sort field
@@ -380,14 +407,27 @@ export class CrowdsourceReporter {
380
407
  h(Fragment, null, h("calcite-list-item", { label: this._translations.sortHighestVoted, onCalciteListItemSelect: () => { void this.sortOptionClick(this.reportingOptions[this._selectedLayerId].likeField, "desc", "sortHighestVoted"); }, selected: this._updatedSortOption === "sortHighestVoted", value: "sortHighestVoted" }), h("calcite-list-item", { label: this._translations.sortLowestVoted, onCalciteListItemSelect: () => { void this.sortOptionClick(this.reportingOptions[this._selectedLayerId].likeField, "asc", "sortLowestVoted"); }, selected: this._updatedSortOption === "sortLowestVoted", value: "sortLowestVoted" })))));
381
408
  }
382
409
  /**
383
- * Reset the filter active prop
410
+ * Restores the applied filters
411
+ * @protected
412
+ */
413
+ _restoreFilters() {
414
+ // call the restore function when instant-apps-filter-list is ready
415
+ setTimeout(() => {
416
+ const canRestoreFilter = this._filterList && this._filterUrlParams && this._filterInitState;
417
+ if (canRestoreFilter) {
418
+ void this._filterList.restoreFilters(this._filterUrlParams[0], this._filterInitState);
419
+ }
420
+ }, 200);
421
+ }
422
+ /**
423
+ * Reset the filter
384
424
  * @protected
385
425
  */
386
- _handleFilterListReset() {
387
- //on reset filter list reset the filter active state
426
+ async _handleFilterListReset() {
427
+ //on reset filter list reset the filter states
388
428
  this._filterActive = false;
389
- //reset the features list to reflect the applied filters
390
- void this._featureList.refresh();
429
+ this._filterUrlParams = null;
430
+ this._filterInitState = null;
391
431
  }
392
432
  /**
393
433
  * Check if the layers definitionExpression has been modified and update the feature list depending on the applied filters
@@ -397,8 +437,7 @@ export class CrowdsourceReporter {
397
437
  //if filter are applied the url params will be generated
398
438
  //set the filter active state based on the length of applied filters
399
439
  this._filterActive = this._filterList.urlParams.getAll('filter').length > 0;
400
- //reset the features list to reflect the applied filters
401
- void this._featureList.refresh();
440
+ this._filterUrlParams = this._filterList.urlParams.getAll('filter');
402
441
  }
403
442
  /**
404
443
  * Get the feature layer list
@@ -407,7 +446,7 @@ export class CrowdsourceReporter {
407
446
  */
408
447
  getLayerListFlowItem() {
409
448
  return (h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: this.reportsHeader }, this.isMobile && this.getActionToExpandCollapsePanel(), this._hasValidLayers && this.enableNewReports &&
410
- h("calcite-button", { appearance: "solid", onClick: this.navigateToChooseCategory.bind(this), slot: "footer", width: "full" }, this.reportButtonText ? this.reportButtonText : this._translations.createReportButtonText), h("calcite-panel", { "full-height": true, "full-width": true }, h("layer-list", { class: "height-full", layers: this._editableLayerIds?.length > 0 ? this._editableLayerIds : this._layers, mapView: this.mapView, onLayerSelect: this.displayFeaturesList.bind(this), onLayersListLoaded: this.layerListLoaded.bind(this), ref: el => this._layerList = el, showFeatureCount: true, showNextIcon: true }))));
449
+ h("calcite-button", { appearance: "solid", onClick: this.navigateToChooseCategory.bind(this), slot: "footer", width: "full" }, this.reportButtonText ? this.reportButtonText : this._translations.createReportButtonText), h("calcite-panel", { "full-height": true, "full-width": true }, h("layer-list", { applyLayerViewFilter: this.showMyReportsOnly, class: "height-full", layers: this._editableLayerIds?.length > 0 ? this._editableLayerIds : this._layers, mapView: this.mapView, onLayerSelect: this.displayFeaturesList.bind(this), onLayersListLoaded: this.layerListLoaded.bind(this), ref: el => this._layerList = el, showFeatureCount: true, showNextIcon: true }))));
411
450
  }
412
451
  /**
413
452
  * Get the layer list for creating a report
@@ -426,7 +465,7 @@ export class CrowdsourceReporter {
426
465
  * @protected
427
466
  */
428
467
  getFeatureCreateFlowItem() {
429
- return (h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: this._selectedLayerName, onCalciteFlowItemBack: this.backFromCreateFeaturePanel.bind(this) }, this._showSubmitCancelButton && h("div", { class: "width-full", slot: "footer" }, h("calcite-button", { appearance: "solid", class: "footer-top-button footer-button", onClick: this.onCreateFeatureSubmitButtonClick.bind(this), width: "full" }, this._translations.submit), h("calcite-button", { appearance: "outline", class: "footer-button", onClick: this.backFromCreateFeaturePanel.bind(this), width: "full" }, this._translations.cancel)), h("calcite-panel", { "full-height": true, "full-width": true }, h("div", { class: "progress-bar" }, h("calcite-progress", { type: "determinate", value: this._updatedProgressBarStatus })), h("calcite-notice", { class: "notice-msg", icon: "lightbulb", kind: "success", open: true }, h("div", { slot: "message" }, this._translations.featureEditFormInfoMsg)), h("create-feature", { customizeSubmit: true, isMobile: this.isMobile, mapView: this.mapView, onDrawComplete: this.onFormReady.bind(this), onEditingAttachment: this.showSubmitCancelButton.bind(this), onFail: this.createFeatureFailed.bind(this), onModeChanged: this.backFromCreateFeaturePanel.bind(this), onProgressStatus: this.updatedProgressStatus.bind(this), onSuccess: this.onReportSubmitted.bind(this), ref: el => this._createFeature = el, searchConfiguration: this.searchConfiguration, selectedLayerId: this._selectedLayerId }))));
468
+ return (h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: this._selectedLayerName, onCalciteFlowItemBack: this.backFromCreateFeaturePanel.bind(this) }, this._showSubmitCancelButton && h("div", { class: "width-full", slot: "footer" }, h("calcite-button", { appearance: "solid", class: "footer-top-button footer-button", onClick: this.onCreateFeatureSubmitButtonClick.bind(this), width: "full" }, this._translations.submit), h("calcite-button", { appearance: "outline", class: "footer-button", onClick: this.backFromCreateFeaturePanel.bind(this), width: "full" }, this._translations.cancel)), h("calcite-panel", { "full-height": true, "full-width": true }, h("div", { class: "progress-bar" }, h("calcite-progress", { type: "determinate", value: this._updatedProgressBarStatus })), h("calcite-notice", { class: "notice-msg", icon: "lightbulb", kind: "success", open: true }, h("div", { slot: "message" }, this._translations.featureEditFormInfoMsg)), h("create-feature", { customizeSubmit: true, floorLevel: this.floorLevel, formElements: this._formElements.find(elm => elm.id === this._selectedLayerId), isMobile: this.isMobile, mapView: this.mapView, onDrawComplete: this.onFormReady.bind(this), onEditingAttachment: this.showSubmitCancelButton.bind(this), onFail: this.createFeatureFailed.bind(this), onModeChanged: this.backFromCreateFeaturePanel.bind(this), onProgressStatus: this.updatedProgressStatus.bind(this), onSuccess: this.onReportSubmitted.bind(this), ref: el => this._createFeature = el, searchConfiguration: this.searchConfiguration, selectedLayerId: this._selectedLayerId }))));
430
469
  }
431
470
  /**
432
471
  * Update the progress bar status when editor panel changes
@@ -563,8 +602,10 @@ export class CrowdsourceReporter {
563
602
  */
564
603
  async navigateToCreateFeature(evt) {
565
604
  if (evt.detail.layerId && evt.detail.layerName) {
566
- void this.setSelectedLayer(evt.detail.layerId, evt.detail.layerName);
605
+ await this.setSelectedLayer(evt.detail.layerId, evt.detail.layerName);
567
606
  }
607
+ // get the form template elements to pass in create-feature to create a LEVELID field in feature-form
608
+ this._getFormElements();
568
609
  this._showSubmitCancelButton = false;
569
610
  this.updatePanelState(false, true);
570
611
  this._flowItems = [...this._flowItems, "feature-create"];
@@ -621,6 +662,15 @@ export class CrowdsourceReporter {
621
662
  void this.setSelectedLayer(evt.detail.layerId, evt.detail.layerName);
622
663
  this._flowItems = [...this._flowItems, "feature-list"];
623
664
  }
665
+ /**
666
+ * On back from filter panel get the filter's init state
667
+ * @protected
668
+ */
669
+ async backFromFilterPanel() {
670
+ this._filterInitState = await this._filterList.getFilterInitState();
671
+ void this._featureList.refresh();
672
+ this.backFromSelectedPanel();
673
+ }
624
674
  /**
625
675
  * On back from selected panel navigate to the previous panel
626
676
  * @protected
@@ -638,6 +688,10 @@ export class CrowdsourceReporter {
638
688
  (updatedFlowItems[0] === 'feature-list' || updatedFlowItems[updatedFlowItems.length - 2] === 'feature-list'))) {
639
689
  this.updatePanelState(this._sidePanelCollapsed, false);
640
690
  }
691
+ // Coming back from feature details refresh the feature list to update the like count
692
+ if (this.reportingOptions && this.reportingOptions[this._selectedLayerId]?.like && updatedFlowItems[updatedFlowItems.length - 1] === 'feature-details') {
693
+ void this._featureList.refresh();
694
+ }
641
695
  updatedFlowItems.pop();
642
696
  //Back to layer list, and return as the flowItems will be reset in navigateToHomePage
643
697
  if (updatedFlowItems.length === 1 && updatedFlowItems[0] === 'layer-list') {
@@ -725,8 +779,19 @@ export class CrowdsourceReporter {
725
779
  const layerExpressions = this.layerExpressions?.filter((exp) => exp.id === this._selectedLayerId);
726
780
  const canCreateReports = this._getLayersConfig(this._selectedLayerId)?.reporting && this._layerItemsHash[this._selectedLayerId].supportsAdd;
727
781
  const showFilterIcon = layerExpressions?.length > 0;
728
- return (h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: layerName, loading: this._showLoadingIndicator, onCalciteFlowItemBack: this.backFromSelectedPanel.bind(this) }, this._toggleSort(), h("calcite-action", { icon: "sort-ascending-arrow", id: "sort-popover", slot: "header-actions-end", text: this._translations.sort, title: this._translations.sort }), showFilterIcon && h("calcite-action", { icon: "filter", indicator: this._filterActive, onClick: this._toggleFilter.bind(this), slot: "header-actions-end", text: this._translations.filter, title: this._translations.filter }), this.isMobile && this.getActionToExpandCollapsePanel(), this.enableNewReports && canCreateReports &&
729
- h("calcite-button", { appearance: "solid", onClick: this.navigateToCreateFeature.bind(this), slot: "footer", width: "full" }, this.reportButtonText ? this.reportButtonText : this._translations.createReportButtonText), h("calcite-panel", { "full-height": true }, h("feature-list", { class: "height-full", highlightOnHover: true, mapView: this.mapView, noFeaturesFoundMsg: this._translations.featureErrorMsg, onFeatureSelect: this.onFeatureSelectFromList.bind(this), pageSize: 30, ref: el => this._featureList = el, selectedLayerId: layerId, sortingInfo: this._updatedSorting }))));
782
+ return (h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: layerName, loading: this._showLoadingIndicator, onCalciteFlowItemBack: this.backFromSelectedPanel.bind(this) }, this._toggleSort(), h("calcite-action", { icon: "sort-ascending-arrow", id: "sort-popover", slot: "header-actions-end", text: this._translations.sort, title: this._translations.sort }), showFilterIcon && h("calcite-action", { icon: "filter", indicator: this._filterActive, onClick: () => { this._flowItems = [...this._flowItems, "filter-panel"]; }, slot: "header-actions-end", text: this._translations.filter, title: this._translations.filter }), this.isMobile && this.getActionToExpandCollapsePanel(), this.enableNewReports && canCreateReports &&
783
+ h("calcite-button", { appearance: "solid", onClick: this.navigateToCreateFeature.bind(this), slot: "footer", width: "full" }, this.reportButtonText ? this.reportButtonText : this._translations.createReportButtonText), h("calcite-panel", { "full-height": true }, h("feature-list", { applyLayerViewFilter: this.showMyReportsOnly, class: "height-full", highlightOnHover: true, mapView: this.mapView, noFeaturesFoundMsg: this._translations.featureErrorMsg, onFeatureSelect: this.onFeatureSelectFromList.bind(this), pageSize: 30, ref: el => this._featureList = el, reportingOptions: this.reportingOptions, selectedLayerId: layerId, showFeatureSymbol: this.showFeatureSymbol, sortingInfo: this._updatedSorting }))));
784
+ }
785
+ /**
786
+ * Get Filter page for apllying filter
787
+ * @param layerId Layer id
788
+ * @param layerName Layer name
789
+ * @returns feature list node
790
+ * @protected
791
+ */
792
+ getFilterPanel() {
793
+ const currentLayersExpressions = this.layerExpressions ? this.layerExpressions.filter((exp) => exp.id === this._selectedLayerId) : [];
794
+ return (h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: this._translations?.filterLayerTitle?.replace("{{title}}", this._selectedLayerName), loading: this._showLoadingIndicator, onCalciteFlowItemBack: this.backFromFilterPanel.bind(this) }, this.isMobile && this.getActionToExpandCollapsePanel(), h("div", { class: "width-full", slot: "footer" }, h("div", { class: "width-full", slot: "footer" }, h("calcite-button", { appearance: "solid", class: "footer-top-button footer-button", onClick: () => { void this._filterList?.forceReset(); }, width: "full" }, this._translations.resetFilter), h("calcite-button", { appearance: "outline", class: "footer-button", onClick: this.backFromFilterPanel.bind(this), width: "full" }, this._translations.close))), h("calcite-panel", { "full-height": true }, h("instant-apps-filter-list", { autoUpdateUrl: false, closeBtnOnClick: () => undefined, comboboxOverlayPositioning: "fixed", layerExpressions: currentLayersExpressions, onFilterListReset: () => this._handleFilterListReset(), onFilterUpdate: () => this._handleFilterUpdate(), ref: (el) => this._filterList = el, resetFiltersOnDisconnect: false, view: this.mapView, zoomBtn: false }))));
730
795
  }
731
796
  /**
732
797
  * Returns the calcite-flow item for feature details
@@ -830,6 +895,8 @@ export class CrowdsourceReporter {
830
895
  */
831
896
  async setMapView() {
832
897
  await this.getLayersToShowInList();
898
+ // filter/update the feature(s) if any filter/condition is already applied
899
+ await this._updateFeatures();
833
900
  // if only one valid layer is present then directly render features list
834
901
  if (this._editableLayerIds?.length === 1) {
835
902
  await this.renderFeaturesList();
@@ -931,6 +998,39 @@ export class CrowdsourceReporter {
931
998
  const messages = await getLocaleComponentStrings(this.el);
932
999
  this._translations = messages[0];
933
1000
  }
1001
+ /**
1002
+ * Applies a definition expression when floor field and level are available
1003
+ *
1004
+ * @returns boolean
1005
+ * @protected
1006
+ */
1007
+ _updateFloorDefinitionExpression(layer) {
1008
+ const floorField = layer.floorInfo.floorField;
1009
+ // update the layer defination expression
1010
+ const floorExp = `${floorField} = '${this.floorLevel}'`;
1011
+ const defExp = layer.definitionExpression;
1012
+ layer.definitionExpression = defExp?.indexOf(this._floorExpression) > -1 ?
1013
+ defExp.replace(this._floorExpression, floorExp) : floorExp;
1014
+ this._floorExpression = floorExp;
1015
+ }
1016
+ /**
1017
+ * Gets the form template elements
1018
+ * @protected
1019
+ */
1020
+ _getFormElements() {
1021
+ const layer = this._selectedLayer;
1022
+ const floorField = layer?.floorInfo?.floorField;
1023
+ if (floorField && this.floorLevel && layer?.formTemplate) {
1024
+ const formElement = this._formElements.find((elm) => elm.id === layer.id);
1025
+ if (this._formElements.length === 0 || !formElement) {
1026
+ this._formElements.push({
1027
+ id: layer.id,
1028
+ orgElements: layer.formTemplate.elements,
1029
+ orgExpressionInfos: layer.formTemplate.expressionInfos
1030
+ });
1031
+ }
1032
+ }
1033
+ }
934
1034
  /**
935
1035
  * Returns the ids of all OR configured layers that support edits with the update capability
936
1036
  * @param hash each layer item details
@@ -948,6 +1048,35 @@ export class CrowdsourceReporter {
948
1048
  return prev;
949
1049
  }, []);
950
1050
  }
1051
+ /**
1052
+ * updates the features for layer/feature list
1053
+ * @protected
1054
+ */
1055
+ async _updateFeatures() {
1056
+ for (const eachLayerId of this._editableLayerIds) {
1057
+ const featureLayerView = await getFeatureLayerView(this.mapView, eachLayerId);
1058
+ // In case of show my features add filter for Featurelayerview
1059
+ await this._showMyFeaturesOnly(featureLayerView);
1060
+ const floorField = featureLayerView.layer?.floorInfo?.floorField;
1061
+ if (floorField && this.floorLevel) {
1062
+ // Update the layer's defination as per selected floor level from map for all editable layers
1063
+ this._updateFloorDefinitionExpression(featureLayerView.layer);
1064
+ }
1065
+ }
1066
+ }
1067
+ /**
1068
+ * Show only loggedIn user's features
1069
+ * @protected
1070
+ */
1071
+ async _showMyFeaturesOnly(featureLayerView) {
1072
+ const loggedInUserName = this.mapView.map.portalItem.portal?.credential?.userId;
1073
+ if (loggedInUserName) {
1074
+ const creatorField = featureLayerView.layer.editFieldsInfo?.creatorField.toLowerCase();
1075
+ featureLayerView.filter = this.showMyReportsOnly && creatorField ? new this.FeatureFilter({
1076
+ where: creatorField + "='" + loggedInUserName + "'"
1077
+ }) : null;
1078
+ }
1079
+ }
951
1080
  /**
952
1081
  * Creates the list of layers to be listed in layer list
953
1082
  * @protected
@@ -1514,6 +1643,42 @@ export class CrowdsourceReporter {
1514
1643
  "reflect": false,
1515
1644
  "defaultValue": "false"
1516
1645
  },
1646
+ "showFeatureSymbol": {
1647
+ "type": "boolean",
1648
+ "mutable": false,
1649
+ "complexType": {
1650
+ "original": "boolean",
1651
+ "resolved": "boolean",
1652
+ "references": {}
1653
+ },
1654
+ "required": false,
1655
+ "optional": false,
1656
+ "docs": {
1657
+ "tags": [],
1658
+ "text": "boolean: When true the feature symbology of the feature will shown in the features list"
1659
+ },
1660
+ "attribute": "show-feature-symbol",
1661
+ "reflect": false,
1662
+ "defaultValue": "false"
1663
+ },
1664
+ "showMyReportsOnly": {
1665
+ "type": "boolean",
1666
+ "mutable": false,
1667
+ "complexType": {
1668
+ "original": "boolean",
1669
+ "resolved": "boolean",
1670
+ "references": {}
1671
+ },
1672
+ "required": false,
1673
+ "optional": true,
1674
+ "docs": {
1675
+ "tags": [],
1676
+ "text": "boolean: To show only those features which are created by the logged in user"
1677
+ },
1678
+ "attribute": "show-my-reports-only",
1679
+ "reflect": false,
1680
+ "defaultValue": "false"
1681
+ },
1517
1682
  "theme": {
1518
1683
  "type": "string",
1519
1684
  "mutable": false,
@@ -1554,6 +1719,23 @@ export class CrowdsourceReporter {
1554
1719
  },
1555
1720
  "attribute": "zoom-to-scale",
1556
1721
  "reflect": false
1722
+ },
1723
+ "floorLevel": {
1724
+ "type": "string",
1725
+ "mutable": false,
1726
+ "complexType": {
1727
+ "original": "string",
1728
+ "resolved": "string",
1729
+ "references": {}
1730
+ },
1731
+ "required": false,
1732
+ "optional": false,
1733
+ "docs": {
1734
+ "tags": [],
1735
+ "text": "string: selected floor level"
1736
+ },
1737
+ "attribute": "floor-level",
1738
+ "reflect": false
1557
1739
  }
1558
1740
  };
1559
1741
  }
@@ -1561,7 +1743,6 @@ export class CrowdsourceReporter {
1561
1743
  return {
1562
1744
  "_featureCreationFailedErrorMsg": {},
1563
1745
  "_filterActive": {},
1564
- "_filterOpen": {},
1565
1746
  "_flowItems": {},
1566
1747
  "_hasValidLayers": {},
1567
1748
  "_loadingFeatureDetails": {},
@@ -1605,6 +1786,9 @@ export class CrowdsourceReporter {
1605
1786
  }, {
1606
1787
  "propName": "mapView",
1607
1788
  "methodName": "mapViewWatchHandler"
1789
+ }, {
1790
+ "propName": "floorLevel",
1791
+ "methodName": "floorLevelWatchHandler"
1608
1792
  }];
1609
1793
  }
1610
1794
  }
@@ -53,4 +53,19 @@
53
53
  .profile-img {
54
54
  margin: 0 0.75rem;
55
55
  min-width: 32px;
56
- }
56
+ }
57
+
58
+ .like-container {
59
+ display: flex;
60
+ align-items: center;
61
+ gap: 5px;
62
+ color: gray !important;
63
+ font-style: italic;
64
+ }
65
+
66
+ .feature-symbol {
67
+ padding: 3px 10px;
68
+ min-width: 30px;
69
+ display: flex;
70
+ justify-content: center;
71
+ }