@esri/solutions-components 0.10.6 → 0.10.8

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 (157) hide show
  1. package/dist/cjs/basemap-gallery_7.cjs.entry.js +24 -8
  2. package/dist/cjs/buffer-tools_3.cjs.entry.js +1 -1
  3. package/dist/cjs/calcite-combobox_3.cjs.entry.js +354 -967
  4. package/dist/cjs/calcite-graph_2.cjs.entry.js +1082 -0
  5. package/dist/cjs/calcite-shell-panel_14.cjs.entry.js +6 -6
  6. package/dist/cjs/calcite-tree_3.cjs.entry.js +1 -1
  7. package/dist/cjs/card-manager_3.cjs.entry.js +246 -18
  8. package/dist/cjs/crowdsource-manager.cjs.entry.js +169 -49
  9. package/dist/cjs/instant-apps-control-panel.cjs.entry.js +2 -1
  10. package/dist/cjs/instant-apps-time-filter.cjs.entry.js +40 -21
  11. package/dist/cjs/loader.cjs.js +1 -1
  12. package/dist/cjs/map-select-tools_3.cjs.entry.js +3 -3
  13. package/dist/cjs/pci-calculator.cjs.entry.js +1 -1
  14. package/dist/cjs/public-notification.cjs.entry.js +1 -1
  15. package/dist/cjs/refine-results-flow-item.cjs.entry.js +1 -1
  16. package/dist/cjs/share-item.cjs.entry.js +1 -1
  17. package/dist/cjs/solution-configuration.cjs.entry.js +3 -3
  18. package/dist/cjs/solution-contents_3.cjs.entry.js +3 -3
  19. package/dist/cjs/solutions-components.cjs.js +1 -1
  20. package/dist/cjs/spatial-ref.cjs.entry.js +1 -1
  21. package/dist/collection/assets/t9n/crowdsource-manager/resources.json +5 -1
  22. package/dist/collection/assets/t9n/crowdsource-manager/resources_en.json +5 -1
  23. package/dist/collection/assets/t9n/layer-table/resources.json +1 -0
  24. package/dist/collection/assets/t9n/layer-table/resources_en.json +1 -0
  25. package/dist/collection/assets/t9n/map-card/resources.json +6 -1
  26. package/dist/collection/assets/t9n/map-card/resources_en.json +6 -1
  27. package/dist/collection/components/card-manager/card-manager.js +34 -8
  28. package/dist/collection/components/crowdsource-manager/crowdsource-manager.js +173 -65
  29. package/dist/collection/components/layer-table/layer-table.js +175 -8
  30. package/dist/collection/components/map-card/map-card.css +4 -0
  31. package/dist/collection/components/map-card/map-card.js +368 -3
  32. package/dist/collection/components/map-draw-tools/map-draw-tools.js +1 -1
  33. package/dist/collection/components/map-fullscreen/map-fullscreen.js +1 -1
  34. package/dist/collection/components/map-layer-picker/map-layer-picker.js +9 -3
  35. package/dist/collection/components/map-legend/map-legend.js +1 -1
  36. package/dist/collection/components/map-picker/map-picker.css +8 -0
  37. package/dist/collection/components/map-picker/map-picker.js +74 -3
  38. package/dist/collection/components/map-search/map-search.js +1 -1
  39. package/dist/collection/components/map-select-tools/map-select-tools.js +1 -1
  40. package/dist/collection/components/map-tools/map-tools.js +1 -1
  41. package/dist/collection/components/pci-calculator/pci-calculator.js +1 -1
  42. package/dist/collection/components/pdf-download/pdf-download.js +1 -1
  43. package/dist/collection/components/public-notification/public-notification.js +1 -1
  44. package/dist/collection/components/refine-results-flow-item/refine-results-flow-item.js +1 -1
  45. package/dist/collection/components/refine-selection/refine-selection.js +1 -1
  46. package/dist/collection/components/share-item/share-item.js +1 -1
  47. package/dist/collection/components/solution-configuration/solution-configuration.js +3 -3
  48. package/dist/collection/components/solution-contents/solution-contents.js +1 -1
  49. package/dist/collection/components/solution-item/solution-item.js +1 -1
  50. package/dist/collection/components/solution-item-details/solution-item-details.js +1 -1
  51. package/dist/collection/components/solution-item-icon/solution-item-icon.js +1 -1
  52. package/dist/collection/components/solution-item-sharing/solution-item-sharing.js +1 -1
  53. package/dist/collection/components/solution-organization-variables/solution-organization-variables.js +1 -1
  54. package/dist/collection/components/solution-resource-item/solution-resource-item.js +1 -1
  55. package/dist/collection/components/solution-spatial-ref/solution-spatial-ref.js +1 -1
  56. package/dist/collection/components/solution-template-data/solution-template-data.js +1 -1
  57. package/dist/collection/components/solution-variables/solution-variables.js +1 -1
  58. package/dist/collection/components/spatial-ref/spatial-ref.js +1 -1
  59. package/dist/collection/demos/crowdsource-manager.html +1 -0
  60. package/dist/components/card-manager2.js +20 -8
  61. package/dist/components/crowdsource-manager.js +172 -53
  62. package/dist/components/instant-apps-control-panel.js +2 -1
  63. package/dist/components/instant-apps-time-filter.js +46 -23
  64. package/dist/components/layer-table2.js +72 -10
  65. package/dist/components/map-card2.js +288 -47
  66. package/dist/components/map-draw-tools2.js +1 -1
  67. package/dist/components/map-fullscreen2.js +1 -1
  68. package/dist/components/map-layer-picker2.js +9 -3
  69. package/dist/components/map-legend2.js +1 -1
  70. package/dist/components/map-picker2.js +24 -5
  71. package/dist/components/map-search2.js +1 -1
  72. package/dist/components/map-select-tools2.js +1 -1
  73. package/dist/components/map-tools2.js +1 -1
  74. package/dist/components/pci-calculator.js +1 -1
  75. package/dist/components/pdf-download2.js +1 -1
  76. package/dist/components/public-notification.js +1 -1
  77. package/dist/components/refine-results-flow-item.js +1 -1
  78. package/dist/components/refine-selection2.js +1 -1
  79. package/dist/components/share-item.js +1 -1
  80. package/dist/components/solution-configuration.js +3 -3
  81. package/dist/components/solution-contents2.js +1 -1
  82. package/dist/components/solution-item-details2.js +1 -1
  83. package/dist/components/solution-item-icon2.js +1 -1
  84. package/dist/components/solution-item-sharing2.js +1 -1
  85. package/dist/components/solution-item2.js +1 -1
  86. package/dist/components/solution-organization-variables2.js +1 -1
  87. package/dist/components/solution-resource-item2.js +1 -1
  88. package/dist/components/solution-spatial-ref2.js +1 -1
  89. package/dist/components/solution-template-data2.js +1 -1
  90. package/dist/components/solution-variables2.js +1 -1
  91. package/dist/components/spatial-ref.js +1 -1
  92. package/dist/esm/basemap-gallery_7.entry.js +24 -8
  93. package/dist/esm/buffer-tools_3.entry.js +1 -1
  94. package/dist/esm/calcite-combobox_3.entry.js +369 -982
  95. package/dist/esm/calcite-graph_2.entry.js +1077 -0
  96. package/dist/esm/calcite-shell-panel_14.entry.js +6 -6
  97. package/dist/esm/calcite-tree_3.entry.js +1 -1
  98. package/dist/esm/card-manager_3.entry.js +248 -20
  99. package/dist/esm/crowdsource-manager.entry.js +170 -50
  100. package/dist/esm/instant-apps-control-panel.entry.js +2 -1
  101. package/dist/esm/instant-apps-time-filter.entry.js +41 -22
  102. package/dist/esm/loader.js +1 -1
  103. package/dist/esm/map-select-tools_3.entry.js +3 -3
  104. package/dist/esm/pci-calculator.entry.js +1 -1
  105. package/dist/esm/public-notification.entry.js +1 -1
  106. package/dist/esm/refine-results-flow-item.entry.js +1 -1
  107. package/dist/esm/share-item.entry.js +1 -1
  108. package/dist/esm/solution-configuration.entry.js +3 -3
  109. package/dist/esm/solution-contents_3.entry.js +3 -3
  110. package/dist/esm/solutions-components.js +1 -1
  111. package/dist/esm/spatial-ref.entry.js +1 -1
  112. package/dist/solutions-components/assets/t9n/crowdsource-manager/resources.json +5 -1
  113. package/dist/solutions-components/assets/t9n/crowdsource-manager/resources_en.json +5 -1
  114. package/dist/solutions-components/assets/t9n/layer-table/resources.json +1 -0
  115. package/dist/solutions-components/assets/t9n/layer-table/resources_en.json +1 -0
  116. package/dist/solutions-components/assets/t9n/map-card/resources.json +6 -1
  117. package/dist/solutions-components/assets/t9n/map-card/resources_en.json +6 -1
  118. package/dist/solutions-components/demos/crowdsource-manager.html +1 -0
  119. package/dist/solutions-components/p-0abc1354.entry.js +6 -0
  120. package/dist/solutions-components/p-0f7b5d36.entry.js +6 -0
  121. package/dist/solutions-components/p-1867168b.entry.js +6 -0
  122. package/dist/solutions-components/{p-a9818be2.entry.js → p-20c465e9.entry.js} +1 -1
  123. package/dist/solutions-components/{p-db18bce8.entry.js → p-36b50b5b.entry.js} +1 -1
  124. package/dist/solutions-components/{p-85512ae3.entry.js → p-445213cf.entry.js} +1 -1
  125. package/dist/solutions-components/{p-d49f895d.entry.js → p-4a5f0a97.entry.js} +1 -1
  126. package/dist/solutions-components/{p-002c97df.entry.js → p-5d201016.entry.js} +1 -1
  127. package/dist/solutions-components/{p-b7cec3bd.entry.js → p-618bafec.entry.js} +1 -1
  128. package/dist/solutions-components/p-6a66d5a9.entry.js +6 -0
  129. package/dist/solutions-components/p-71a2d5b8.entry.js +6 -0
  130. package/dist/solutions-components/p-7a64b026.entry.js +17 -0
  131. package/dist/solutions-components/p-85c25564.entry.js +6 -0
  132. package/dist/solutions-components/{p-235bf02e.entry.js → p-913413c3.entry.js} +1 -1
  133. package/dist/solutions-components/p-9af1cb14.entry.js +6 -0
  134. package/dist/solutions-components/{p-49aa2929.entry.js → p-bebd4646.entry.js} +1 -1
  135. package/dist/solutions-components/{p-ab2adcaf.entry.js → p-cc092b22.entry.js} +1 -1
  136. package/dist/solutions-components/p-ce454f5a.entry.js +11 -0
  137. package/dist/solutions-components/solutions-components.esm.js +1 -1
  138. package/dist/types/components/card-manager/card-manager.d.ts +11 -0
  139. package/dist/types/components/crowdsource-manager/crowdsource-manager.d.ts +86 -20
  140. package/dist/types/components/layer-table/layer-table.d.ts +30 -0
  141. package/dist/types/components/map-card/map-card.d.ts +124 -0
  142. package/dist/types/components/map-layer-picker/map-layer-picker.d.ts +4 -0
  143. package/dist/types/components/map-picker/map-picker.d.ts +12 -0
  144. package/dist/types/components.d.ts +130 -0
  145. package/dist/types/preact.d.ts +4 -2
  146. package/package.json +2 -2
  147. package/dist/cjs/calcite-dropdown-group_2.cjs.entry.js +0 -453
  148. package/dist/esm/calcite-dropdown-group_2.entry.js +0 -448
  149. package/dist/solutions-components/p-129fd80e.entry.js +0 -6
  150. package/dist/solutions-components/p-3b426576.entry.js +0 -6
  151. package/dist/solutions-components/p-72b217f2.entry.js +0 -6
  152. package/dist/solutions-components/p-72f01088.entry.js +0 -6
  153. package/dist/solutions-components/p-8b999a2b.entry.js +0 -6
  154. package/dist/solutions-components/p-973ff7b2.entry.js +0 -23
  155. package/dist/solutions-components/p-a001f9c9.entry.js +0 -6
  156. package/dist/solutions-components/p-c683b3fe.entry.js +0 -6
  157. package/dist/solutions-components/p-e9d049bd.entry.js +0 -6
@@ -22,7 +22,7 @@ const CrowdsourceManager = class {
22
22
  index.registerInstance(this, hostRef);
23
23
  this.showIntroductionWindow = index.createEvent(this, "showIntroductionWindow", 7);
24
24
  this.showCoverPage = index.createEvent(this, "showCoverPage", 7);
25
- this.appLayout = undefined;
25
+ this.appLayout = 'splitView';
26
26
  this.appProxies = undefined;
27
27
  this.basemapConfig = undefined;
28
28
  this.coverPageEnabled = undefined;
@@ -59,7 +59,6 @@ const CrowdsourceManager = class {
59
59
  this.theme = "light";
60
60
  this.zoomAndScrollToSelected = false;
61
61
  this.zoomToScale = undefined;
62
- this._expandPopup = false;
63
62
  this._hideFooter = false;
64
63
  this._hideTable = false;
65
64
  this._isMobile = false;
@@ -70,7 +69,7 @@ const CrowdsourceManager = class {
70
69
  this._mapView = undefined;
71
70
  this._panelOpen = true;
72
71
  this._numSelected = 0;
73
- this._tableOnly = false;
72
+ this._filterOpen = false;
74
73
  }
75
74
  get el() { return index.getElement(this); }
76
75
  //--------------------------------------------------------------------------
@@ -109,6 +108,18 @@ const CrowdsourceManager = class {
109
108
  * MapView.when is not fired when mapView is not currently visible
110
109
  */
111
110
  _shouldSetMapView = false;
111
+ /**
112
+ * LayerExpression[]: All layer expressions from the current filter config for the currently selected layer
113
+ */
114
+ _layerExpressions;
115
+ /**
116
+ * HTMLInstantAppsFilterListElement: Component from Instant Apps that supports interacting with the current filter config
117
+ */
118
+ _filterList;
119
+ /**
120
+ * boolean: True when app is directly rendered to map view layout
121
+ */
122
+ _isMapViewOnLoad = false;
112
123
  //--------------------------------------------------------------------------
113
124
  //
114
125
  // Watch handlers
@@ -125,7 +136,6 @@ const CrowdsourceManager = class {
125
136
  */
126
137
  hideMapOnLoadWatchHandler() {
127
138
  this.showHideMapPopupAndTable(this.hideMapOnLoad && !this._isMobile);
128
- this._expandPopup = this.hideMapOnLoad && !this._isMobile;
129
139
  }
130
140
  //--------------------------------------------------------------------------
131
141
  //
@@ -159,16 +169,6 @@ const CrowdsourceManager = class {
159
169
  this.showHideMapPopupAndTable(false);
160
170
  }
161
171
  }
162
- /**
163
- * Listen for idsFound event to be fired so we can know that all layer ids have been fetched
164
- */
165
- async idsFound(evt) {
166
- const ids = evt.detail;
167
- this._tableOnly = ids.tableIds.length > 0 && ids.layerIds.length === 0;
168
- if (this._tableOnly) {
169
- this._expandPopup = true;
170
- }
171
- }
172
172
  /**
173
173
  * Listen for layoutChanged event to be fired so we can adjust the layout
174
174
  */
@@ -184,14 +184,6 @@ const CrowdsourceManager = class {
184
184
  await this._setMapView();
185
185
  });
186
186
  }
187
- /**
188
- * Listen for beforeMapChanged and minimize the popup if it's expanded
189
- */
190
- async beforeMapChanged() {
191
- if (this._expandPopup) {
192
- this._shouldSetMapView = true;
193
- }
194
- }
195
187
  /**
196
188
  * Get the layer for the provided layer id
197
189
  */
@@ -200,13 +192,13 @@ const CrowdsourceManager = class {
200
192
  const layer = await mapViewUtils.getLayerOrTable(this._mapView, id);
201
193
  await layer.when(() => {
202
194
  this._layer = layer;
195
+ this._initLayerExpressions();
203
196
  });
204
197
  }
205
198
  /**
206
199
  * Update the state expandPopup when mapInfoChange event occurs
207
200
  */
208
201
  async mapInfoChange() {
209
- this._expandPopup = this.hideMapOnLoad && !this._isMobile;
210
202
  this._hideMapOnLoadHonored = false;
211
203
  }
212
204
  //--------------------------------------------------------------------------
@@ -229,7 +221,7 @@ const CrowdsourceManager = class {
229
221
  render() {
230
222
  // only avoid border when we have a header color that is not white
231
223
  const borderClass = this.popupHeaderColor && this.popupHeaderColor !== "#FFFFFF" ? "border-width-0" : "";
232
- return (index.h(index.Host, { key: 'f434a8e24b111a32774e9d5683c2446ba35b504b' }, index.h("calcite-shell", { key: '017843c77fa2c52f0d957760ac3f57808d11d59f', class: "position-relative" }, index.h("calcite-panel", { key: 'bd8eeec3a013583789b9e1b251fed34e5896171e', class: `width-full height-full ${borderClass}` }, this._getBody(this._layoutMode, this._panelOpen, this._hideTable)), this._getFooter())));
224
+ return (index.h(index.Host, { key: 'bbe12b471976652c32fc0cb6277fdfc4171b2cd6' }, index.h("calcite-shell", { key: '00b85d8e681f5ab021e6efb63b603e3d2442f63c', class: "position-relative" }, index.h("calcite-panel", { key: 'f1a37f06f3023bb1c63b40eeca739e942c301e63', class: `width-full height-full ${borderClass}` }, this._getBody(this._layoutMode, this._panelOpen, this._hideTable)), this._getFooter()), this._filterModal()));
233
225
  }
234
226
  /**
235
227
  * Called after each render
@@ -248,6 +240,12 @@ const CrowdsourceManager = class {
248
240
  */
249
241
  async componentDidLoad() {
250
242
  this._resizeObserver.observe(this.el);
243
+ // for backward compatibility if hidemaponload is true then render table layout as default
244
+ if (this.hideMapOnLoad) {
245
+ this.appLayout = 'tableView';
246
+ }
247
+ this._isMapViewOnLoad = this.appLayout === 'mapView';
248
+ this._setActiveLayout(this.appLayout);
251
249
  }
252
250
  //--------------------------------------------------------------------------
253
251
  //
@@ -265,6 +263,27 @@ const CrowdsourceManager = class {
265
263
  const deleteEnabled = this._layer?.editingEnabled && this._layer?.capabilities?.operations?.supportsDelete;
266
264
  return this._isMobile && hasSelectedFeatures && !this._hideFooter ? (index.h("div", { class: `width-100`, slot: "footer" }, index.h("div", { class: "display-flex padding-1-2" }, index.h("calcite-button", { appearance: "solid", id: "solutions-show", onClick: () => this.showHideMapPopupAndTable(true), width: "full" }, this._translations.view.replace("{{n}}", this._numSelected.toString())), deleteEnabled ? (index.h("delete-button", { class: "padding-inline-start-1 width-full", id: "solutions-delete", ids: this._layerTable.selectedIds, layer: this._layer })) : undefined))) : undefined;
267
265
  }
266
+ /**
267
+ * sets the active layout to render
268
+ * @param appLayout new app layout
269
+ *
270
+ * @protected
271
+ */
272
+ _setActiveLayout(appLayout) {
273
+ //When going to splitView layout the panel should be open
274
+ if (appLayout === 'splitView' && !this._panelOpen) {
275
+ this._toggleLayout();
276
+ }
277
+ //Move the map node based on the selected layout
278
+ //for mapView layout show map in full view and or all other layout show in the card view
279
+ //for tableView the map will be hidden using css
280
+ if (appLayout === 'mapView') {
281
+ this._showMapInFullView();
282
+ }
283
+ else {
284
+ this._showMapInCardView();
285
+ }
286
+ }
268
287
  /**
269
288
  * Get the icon name to use for the divider icon based on the current layout
270
289
  *
@@ -390,8 +409,11 @@ const CrowdsourceManager = class {
390
409
  * @protected
391
410
  */
392
411
  _getMapNode(panelOpen) {
393
- const mapContainerClass = this._layoutMode === interfaces.ELayoutMode.HORIZONTAL && (!this._isMobile || panelOpen) ? "" : "adjusted-height-50";
394
- return (index.h("div", { class: `${mapContainerClass} overflow-hidden` }, index.h("map-card", { appProxies: this.appProxies, basemapConfig: this.basemapConfig, class: "width-full", defaultWebmapId: this.defaultWebmap, enableBasemap: this.enableBasemap, enableFloorFilter: this.enableFloorFilter, enableFullscreen: this.enableFullscreen, enableHome: this.enableHome, enableLegend: this.enableLegend, enableSearch: this.enableSearch, enableSingleExpand: true, hidden: this._expandPopup && !this._isMobile, homeZoomIndex: 3, homeZoomPosition: "top-left", homeZoomToolsSize: "s", mapInfos: this.mapInfos?.filter(mapInfo => mapInfo.visible !== false), mapWidgetsIndex: 0, mapWidgetsPosition: "top-right", mapWidgetsSize: "m", stackTools: true, theme: this.theme, toolOrder: ["legend", "search", "fullscreen", "basemap", "floorfilter"] })));
412
+ const isMapLayout = this.appLayout === 'mapView';
413
+ const isTableLayout = this.appLayout === 'tableView';
414
+ const mapContainerClass = (isMapLayout || isTableLayout) ? "position-absolute-0" : this._layoutMode === interfaces.ELayoutMode.HORIZONTAL && (!this._isMobile || panelOpen) ? "" : "adjusted-height-50";
415
+ const hasMapAndLayer = this.defaultWebmap && this.defaultLayer;
416
+ return (index.h("div", { class: `${mapContainerClass} overflow-hidden`, id: "card-mapView" }, index.h("map-card", { appProxies: this.appProxies, basemapConfig: this.basemapConfig, class: "width-full", defaultLayerId: hasMapAndLayer ? this.defaultLayer : "", defaultWebmapId: this.defaultWebmap, enableBasemap: this.enableBasemap, enableFloorFilter: this.enableFloorFilter, enableFullscreen: this.enableFullscreen, enableHome: this.enableHome, enableLegend: this.enableLegend, enableSearch: this.enableSearch, enableSingleExpand: true, hidden: !this._isMobile && isTableLayout, homeZoomIndex: 3, homeZoomPosition: "top-left", homeZoomToolsSize: "s", isMapLayout: isMapLayout, isMobile: this._isMobile, mapInfo: this._mapInfo, mapInfos: this.mapInfos?.filter(mapInfo => mapInfo.visible !== false), mapWidgetsIndex: 0, mapWidgetsPosition: "top-right", mapWidgetsSize: "m", onToggleFilter: this._toggleFilter.bind(this), onlyShowUpdatableLayers: this.onlyShowUpdatableLayers, selectedFeaturesIds: this._layerTable?.selectedIds, selectedLayer: this._layer, stackTools: true, theme: this.theme, toolOrder: ["legend", "search", "fullscreen", "basemap", "floorfilter"], zoomToScale: this.zoomToScale })));
395
417
  }
396
418
  /**
397
419
  * Get the expand node for the popup information
@@ -400,11 +422,7 @@ const CrowdsourceManager = class {
400
422
  * @protected
401
423
  */
402
424
  _getPopupExpandNode() {
403
- const icon = this._expandPopup ? "chevrons-down" : "chevrons-up";
404
- const id = "expand-popup";
405
- const tooltip = this._expandPopup ? this._translations.collapsePopup : this._translations.expandPopup;
406
- const themeClass = this.theme === "dark" ? "calcite-mode-dark" : "calcite-mode-light";
407
- const popupNodeClass = !this._expandPopup ? "height-full" : this.mapInfos?.length === 1 || this._isMobile ? "position-absolute-0" : "position-absolute-50";
425
+ const popupNodeClass = "height-full";
408
426
  const headerClass = this._isMobile ? "display-none height-0" : "";
409
427
  const headerTheme = this.popupHeaderColor ? "" : !this._isMobile ? "calcite-mode-dark" : "calcite-mode-light";
410
428
  const containerClass = this._isMobile && this._hideTable ? "position-absolute-0 width-full height-full" : this._isMobile ? "display-none height-0" : "";
@@ -413,16 +431,7 @@ const CrowdsourceManager = class {
413
431
  '--calcite-color-foreground-2': this.popupHeaderHoverColor, /* background color that will be displayed on button when hovered */
414
432
  '--calcite-color-text-3': this.popupHeaderTextColor, /* font color that will be displayed on button */
415
433
  '--calcite-color-text-2': this.popupHeaderTextColor, /* font color that will be displayed on popup header text*/
416
- } }, index.h("calcite-panel", null, !this._isMobile ? (index.h("div", { class: `display-flex align-items-center ${headerClass}`, slot: "header-content" }, index.h("calcite-icon", { icon: "information", scale: "s" }), index.h("div", { class: "padding-inline-start-75" }, this._translations.information))) : undefined, index.h("calcite-action", { class: headerClass, disabled: this._tableOnly, icon: icon, id: id, onClick: () => this._togglePopup(), slot: "header-actions-end", text: "" }), !this._tableOnly ? index.h("calcite-tooltip", { class: themeClass, label: "", placement: "bottom", "reference-element": id }, index.h("span", null, tooltip)) : undefined, this._getCardNode())));
417
- }
418
- /**
419
- * Toggle the popup information
420
- *
421
- * @protected
422
- */
423
- _togglePopup() {
424
- this._expandPopup = !this._expandPopup;
425
- this._hideMapOnLoadHonored = true;
434
+ } }, index.h("calcite-panel", null, !this._isMobile ? (index.h("div", { class: `display-flex align-items-center ${headerClass}`, slot: "header-content" }, index.h("calcite-icon", { icon: "information", scale: "s" }), index.h("div", { class: "padding-inline-start-75" }, this._translations.information))) : undefined, this._getCardNode())));
426
435
  }
427
436
  /**
428
437
  * Get the card node
@@ -431,9 +440,11 @@ const CrowdsourceManager = class {
431
440
  * @protected
432
441
  */
433
442
  _getCardNode() {
434
- const cardManagerHeight = !this._expandPopup && !this._isMobile ? "height-50" : "height-full";
443
+ const isMapLayout = this.appLayout === 'mapView';
444
+ const isTableLayout = this.appLayout === 'tableView';
445
+ const cardManagerHeight = (isMapLayout || isTableLayout) ? "height-full" : !this._isMobile ? "height-50" : "height-full";
435
446
  const themeClass = this.theme === "dark" ? "calcite-mode-dark" : "calcite-mode-light";
436
- return (index.h("div", { class: `width-50 height-full ${themeClass}` }, index.h("card-manager", { class: `${cardManagerHeight} width-full`, enableEditGeometry: this?._mapInfo?.enableEditGeometry, isMobile: this._isMobile, mapView: this?._mapView, zoomAndScrollToSelected: this.zoomAndScrollToSelected })));
447
+ return (index.h("div", { class: `width-50 height-full ${themeClass}` }, index.h("card-manager", { class: `${cardManagerHeight} width-full`, enableEditGeometry: this?._mapInfo?.enableEditGeometry, isMobile: this._isMobile, layer: this._layer, mapView: this?._mapView, selectedFeaturesIds: this._layerTable?.selectedIds, zoomAndScrollToSelected: this.zoomAndScrollToSelected })));
437
448
  }
438
449
  /**
439
450
  * Get the table node based for the current layout
@@ -445,11 +456,11 @@ const CrowdsourceManager = class {
445
456
  * @protected
446
457
  */
447
458
  _getTable(layoutMode, panelOpen, hideTable) {
448
- const tableClass = hideTable && this._isMobile ? "visibility-hidden" : "";
459
+ const isMapLayout = this.appLayout === 'mapView';
460
+ const isTableLayout = this.appLayout === 'tableView';
461
+ const tableClass = hideTable && this._isMobile ? "visibility-hidden" : isMapLayout ? "display-none" : "";
462
+ const mapClass = isMapLayout ? "height-full width-full" : "display-none";
449
463
  const tableSizeClass = this._getTableSizeClass(layoutMode, panelOpen);
450
- const icon = this._getDividerIcon(layoutMode, panelOpen);
451
- const tooltip = panelOpen ? this._translations.close : this._translations.open;
452
- const id = "toggle-layout";
453
464
  const toggleLayout = layoutMode === interfaces.ELayoutMode.HORIZONTAL ? "horizontal" : "vertical";
454
465
  const toggleSlot = layoutMode === interfaces.ELayoutMode.HORIZONTAL ? "header" : "panel-start";
455
466
  const hasMapAndLayer = this.defaultWebmap && this.defaultLayer;
@@ -457,10 +468,74 @@ const CrowdsourceManager = class {
457
468
  this.defaultGlobalId?.indexOf(",") > -1 ? this.defaultGlobalId.split(",") : [this.defaultGlobalId];
458
469
  const defaultOid = !this.defaultOid ? undefined :
459
470
  this.defaultOid?.indexOf(",") > -1 ? this.defaultOid.split(",").map(o => parseInt(o, 10)) : [parseInt(this.defaultOid, 10)];
460
- return (index.h("calcite-shell", { class: `${tableSizeClass} ${tableClass} border-bottom` }, !this._isMobile ? (index.h("calcite-action-bar", { class: "border-sides", expandDisabled: true, layout: toggleLayout, slot: toggleSlot }, index.h("calcite-action", { class: "toggle-node", icon: icon, id: id, onClick: () => this._toggleLayout(), text: "" }), index.h("calcite-tooltip", { label: tooltip, placement: "bottom", "reference-element": id }, index.h("span", null, tooltip)))) : undefined, index.h("div", { class: `width-full height-full position-relative` }, index.h("layer-table", { defaultGlobalId: hasMapAndLayer ? globalId : undefined, defaultLayerId: hasMapAndLayer ? this.defaultLayer : "", defaultOid: hasMapAndLayer && !globalId ? defaultOid : undefined, enableAutoRefresh: this.enableAutoRefresh, enableCSV: this.enableCSV, enableColumnReorder: this.enableColumnReorder, enableInlineEdit: this?._mapInfo?.enableInlineEdit, enableShare: this.enableShare, isMobile: this._isMobile, mapHidden: this._expandPopup, mapInfo: this._mapInfo, mapView: this?._mapView, onlyShowUpdatableLayers: this.onlyShowUpdatableLayers, ref: (el) => this._layerTable = el, shareIncludeEmbed: this.shareIncludeEmbed, shareIncludeSocial: this.shareIncludeSocial, showNewestFirst: this.showNewestFirst, zoomAndScrollToSelected: this.zoomAndScrollToSelected, zoomToScale: this.zoomToScale }))));
471
+ return (index.h("calcite-shell", { class: `${tableSizeClass} border-bottom` }, !this._isMobile ? (index.h("calcite-action-bar", { class: "border-sides", expandDisabled: true, layout: toggleLayout, slot: toggleSlot }, this.getActions(layoutMode, panelOpen))) : undefined, index.h("div", { class: `width-full height-full position-relative ${tableClass}` }, index.h("layer-table", { createFilterModal: false, defaultGlobalId: hasMapAndLayer ? globalId : undefined, defaultLayerId: hasMapAndLayer ? this.defaultLayer : "", defaultOid: hasMapAndLayer && !globalId ? defaultOid : undefined, enableAutoRefresh: this.enableAutoRefresh, enableCSV: this.enableCSV, enableColumnReorder: this.enableColumnReorder, enableInlineEdit: this?._mapInfo?.enableInlineEdit, enableShare: this.enableShare, isMobile: this._isMobile, mapHidden: isTableLayout, mapInfo: this._mapInfo, mapView: this?._mapView, onToggleFilter: this._toggleFilter.bind(this), onlyShowUpdatableLayers: this.onlyShowUpdatableLayers, ref: (el) => this._layerTable = el, shareIncludeEmbed: this.shareIncludeEmbed, shareIncludeSocial: this.shareIncludeSocial, showNewestFirst: this.showNewestFirst, zoomAndScrollToSelected: this.zoomAndScrollToSelected, zoomToScale: this.zoomToScale })), index.h("div", { class: mapClass, id: "full-map-view" })));
472
+ }
473
+ /**
474
+ * Returns the Actions for table's node
475
+ *
476
+ * @returns Node
477
+ * @protected
478
+ */
479
+ getActions(layoutMode, panelOpen) {
480
+ const icon = this._getDividerIcon(layoutMode, panelOpen);
481
+ const tooltip = panelOpen ? this._translations.close : this._translations.open;
482
+ const id = "toggle-layout";
483
+ return (index.h(index.Fragment, null, index.h("calcite-action", { active: this.appLayout === 'splitView', class: "toggle-node", icon: "browser", id: "browser-action", onClick: () => { this._changeLayout('splitView'); }, text: "" }), index.h("calcite-tooltip", { placement: "right", "reference-element": "browser-action" }, index.h("span", null, this._translations.splitView)), index.h("calcite-action", { active: this.appLayout === 'tableView', class: "toggle-node", icon: "dock-left", id: "dock-left-action", onClick: () => { this._changeLayout('tableView'); }, text: "" }), index.h("calcite-tooltip", { placement: "right", "reference-element": "dock-left-action" }, index.h("span", null, this._translations.tableView)), index.h("calcite-action", { active: this.appLayout === 'mapView', class: "toggle-node", icon: "browser-map", id: "browser-map-action", onClick: () => { this._changeLayout('mapView'); }, text: "" }), index.h("calcite-tooltip", { placement: "right", "reference-element": "browser-map-action" }, index.h("span", null, this._translations.mapView)), index.h("calcite-action", { class: "toggle-node", icon: icon, id: id, onClick: () => this._toggleLayout(), slot: "actions-end", text: "" }), index.h("calcite-tooltip", { placement: "bottom", "reference-element": id }, index.h("span", null, tooltip))));
484
+ }
485
+ /**
486
+ * Show filter component in modal
487
+ *
488
+ * @returns node to interact with any configured filters for the current layer
489
+ * @protected
490
+ */
491
+ _filterModal() {
492
+ return (index.h("calcite-modal", { "aria-labelledby": "modal-title", class: "modal", kind: "brand", onCalciteModalClose: () => void this._closeFilter(), open: this._filterOpen, widthScale: "s" }, index.h("div", { class: "display-flex align-center", id: "modal-title", slot: "header" }, this._translations?.filter?.replace("{{title}}", this._layer?.title)), index.h("div", { slot: "content" }, index.h("instant-apps-filter-list", { autoUpdateUrl: false, closeBtn: true, closeBtnOnClick: async () => this._closeFilter(), comboboxOverlayPositioning: "fixed", layerExpressions: this._layerExpressions, onFilterListReset: () => this._handleFilterListReset(), onFilterUpdate: () => void this._layerTable?.filterUpdate(), ref: (el) => this._filterList = el, view: this._mapView, zoomBtn: false }))));
493
+ }
494
+ /**
495
+ * Store any filters for the current layer.
496
+ * Should only occur on layer change
497
+ *
498
+ * @protected
499
+ */
500
+ _initLayerExpressions() {
501
+ const layerExpressions = this._mapInfo?.filterConfig?.layerExpressions;
502
+ this._layerExpressions = layerExpressions ? layerExpressions.filter((exp) => exp.id === this._layer?.id) : [];
503
+ this._filterList.layerExpressions = this._layerExpressions;
504
+ this._layerExpressions.filter(lyrExp => {
505
+ return lyrExp.expressions.filter(exp => exp.active).length > 0;
506
+ }).length > 0;
507
+ }
508
+ /**
509
+ * Toggle the filter modal
510
+ *
511
+ * @protected
512
+ */
513
+ _toggleFilter() {
514
+ this._filterOpen = !this._filterOpen;
515
+ }
516
+ /**
517
+ * Reset the filter active prop
518
+ *
519
+ * @protected
520
+ */
521
+ _handleFilterListReset() {
522
+ void this._layerTable.filterReset();
523
+ }
524
+ /**
525
+ * Close the filter modal
526
+ *
527
+ * @protected
528
+ */
529
+ async _closeFilter() {
530
+ if (this._filterOpen) {
531
+ this._filterOpen = false;
532
+ void this._layerTable.closeFilter();
533
+ }
461
534
  }
462
535
  /**
463
536
  * Update the component layout when its size changes
537
+ *
538
+ * @protected
464
539
  */
465
540
  _onResize() {
466
541
  const isMobile = this.el.offsetWidth < 1024;
@@ -477,22 +552,67 @@ const CrowdsourceManager = class {
477
552
  /**
478
553
  * Open/Close the appropriate panel.
479
554
  * The panel that is toggled is dependent upon the layout mode and if using classic grid or not
555
+ *
556
+ * @protected
480
557
  */
481
558
  _toggleLayout() {
482
559
  this._panelOpen = !this._panelOpen;
483
560
  }
561
+ /**
562
+ * Changes the layout mode
563
+ * @param appLayout selected active app layout
564
+ *
565
+ * @protected
566
+ */
567
+ _changeLayout(appLayout) {
568
+ if (this.appLayout !== appLayout) {
569
+ this._setActiveLayout(appLayout);
570
+ this.appLayout = appLayout;
571
+ if (this._isMapViewOnLoad) {
572
+ void this._layerTable.refresh();
573
+ this._isMapViewOnLoad = false;
574
+ }
575
+ }
576
+ }
577
+ /**
578
+ * shows the map in card view
579
+ *
580
+ * @protected
581
+ */
582
+ _showMapInCardView() {
583
+ if (this.appLayout === 'mapView') {
584
+ const fullMapView = document.getElementById('full-map-view').childNodes[0];
585
+ const splitMapClass = document.getElementById('card-mapView');
586
+ if (fullMapView) {
587
+ splitMapClass.appendChild(fullMapView);
588
+ }
589
+ }
590
+ }
591
+ /**
592
+ * Shows the map in full view
593
+ *
594
+ * @protected
595
+ */
596
+ _showMapInFullView() {
597
+ const splitMap = document.getElementById('card-mapView').childNodes[0];
598
+ const fullMapViewClass = document.getElementById('full-map-view');
599
+ if (splitMap) {
600
+ fullMapViewClass.appendChild(splitMap);
601
+ }
602
+ }
484
603
  /**
485
604
  * Show/Hide the map, popup, and table
486
605
  *
487
606
  * @param show when true the map, popup, and table will be displayed
607
+ * @protected
488
608
  */
489
609
  showHideMapPopupAndTable(show) {
490
- this._expandPopup = false;
491
610
  this._hideTable = show;
492
611
  this._hideFooter = show;
493
612
  }
494
613
  /**
495
614
  * Get the current map info (configuration details) when maps change
615
+ * @param id map changed id
496
616
  *
497
617
  * @returns IMapInfo for the provided id
498
618
  * @protected
@@ -72,9 +72,10 @@ const InstantAppsControlPanel = class {
72
72
  };
73
73
  }
74
74
  _getExpand(component) {
75
+ var _a;
75
76
  const { view } = this;
76
77
  const { content } = component;
77
- const expanded = false;
78
+ const expanded = (_a = component === null || component === void 0 ? void 0 : component.expanded) !== null && _a !== void 0 ? _a : false;
78
79
  return new this.Expand({ content, view, expanded, mode: MODE, group: GROUP });
79
80
  }
80
81
  _getComponentsNode() {
@@ -23,6 +23,8 @@ const { state, onChange } = index.createStore({
23
23
  timeInfoItems: [],
24
24
  selectedTimeInfoItem: null,
25
25
  loading: true,
26
+ timeSliderConfig: {},
27
+ autoPlay: false,
26
28
  });
27
29
 
28
30
  /*
@@ -241,8 +243,8 @@ class InstantAppsTimeFilterViewModel {
241
243
  'esri/core/Handles',
242
244
  'esri/core/reactiveUtils',
243
245
  'esri/widgets/TimeSlider',
244
- 'esri/TimeExtent',
245
- 'esri/TimeInterval',
246
+ 'esri/time/TimeExtent',
247
+ 'esri/time/TimeInterval',
246
248
  'esri/layers/support/FeatureFilter',
247
249
  'esri/layers/support/FeatureEffect',
248
250
  ]);
@@ -257,8 +259,11 @@ class InstantAppsTimeFilterViewModel {
257
259
  catch (_a) { }
258
260
  }
259
261
  async init(timeSliderRef) {
262
+ var _a, _b;
260
263
  if (timeSliderRef)
261
264
  timeSliderRef.innerHTML = '';
265
+ if (((_b = (_a = state === null || state === void 0 ? void 0 : state.timeSlider) === null || _a === void 0 ? void 0 : _a.viewModel) === null || _b === void 0 ? void 0 : _b.state) === 'playing')
266
+ state.timeSlider.stop();
262
267
  const { view, timeInfoConfigItems } = state;
263
268
  if (!view)
264
269
  return;
@@ -270,7 +275,7 @@ class InstantAppsTimeFilterViewModel {
270
275
  this.setupFilterModeWatcher();
271
276
  return Promise.resolve();
272
277
  }
273
- catch (_a) { }
278
+ catch (_c) { }
274
279
  }
275
280
  destroy() {
276
281
  var _a, _b;
@@ -315,6 +320,8 @@ class InstantAppsTimeFilterViewModel {
315
320
  state.selectedTimeInfoItem = initialTimeInfoItem;
316
321
  const config = this.getTimeSliderConfig(timeSliderRef);
317
322
  state.timeSlider = new TimeSlider(config);
323
+ if (state.autoPlay)
324
+ state.timeSlider.play();
318
325
  if (((_b = state.view) === null || _b === void 0 ? void 0 : _b.type) === '2d')
319
326
  this.initialize2DView();
320
327
  }
@@ -329,23 +336,16 @@ class InstantAppsTimeFilterViewModel {
329
336
  var _a;
330
337
  const [{ timeExtent, rangeStart, rangeEnd, unit }] = state.timeInfoItems;
331
338
  const { TimeExtent, TimeInterval } = this;
332
- return {
333
- container: timeSliderRef,
334
- fullTimeExtent: timeExtent,
335
- timeExtent: new TimeExtent({
339
+ const config = Object.assign({ container: timeSliderRef, fullTimeExtent: timeExtent, timeExtent: new TimeExtent({
336
340
  start: rangeStart,
337
341
  end: rangeEnd,
338
- }),
339
- mode: 'time-window',
340
- loop: true,
341
- stops: {
342
+ }), mode: 'time-window', stops: {
342
343
  interval: new TimeInterval({
343
344
  unit,
344
345
  value: 1,
345
346
  }),
346
- },
347
- view: ((_a = state.view) === null || _a === void 0 ? void 0 : _a.type) === '3d' ? state.view : null,
348
- };
347
+ }, view: ((_a = state.view) === null || _a === void 0 ? void 0 : _a.type) === '3d' ? state.view : null }, state.timeSliderConfig);
348
+ return config;
349
349
  }
350
350
  initialize2DView() {
351
351
  state.timeInfoItems.forEach(timeInfoItem => this.applyTimeExtent(timeInfoItem.layerView, new this.TimeExtent({ start: timeInfoItem.rangeStart, end: timeInfoItem.rangeEnd })));
@@ -452,6 +452,8 @@ const InstantAppsTimeFilter = class {
452
452
  this.timeInfoConfigItems = [];
453
453
  this.filterMode = undefined;
454
454
  this.view = undefined;
455
+ this.timeSliderConfig = undefined;
456
+ this.autoPlay = false;
455
457
  }
456
458
  async updateTimeInfoConfigItems() {
457
459
  state.timeInfoConfigItems = this.timeInfoConfigItems;
@@ -460,10 +462,28 @@ const InstantAppsTimeFilter = class {
460
462
  async updateFilterMode() {
461
463
  state.filterMode = this.filterMode;
462
464
  }
465
+ async updateTimeSliderConfig() {
466
+ state.timeSliderConfig = this.timeSliderConfig;
467
+ await viewModel.init(this.timeSliderRef);
468
+ }
469
+ async updateAutoPlay() {
470
+ state.autoPlay = this.autoPlay;
471
+ if (state.timeSlider) {
472
+ if (state.autoPlay) {
473
+ state.timeSlider.play();
474
+ }
475
+ else {
476
+ state.timeSlider.stop();
477
+ }
478
+ }
479
+ }
463
480
  async componentWillLoad() {
464
481
  try {
465
482
  state.view = this.view;
466
483
  state.timeInfoConfigItems = this.timeInfoConfigItems;
484
+ state.autoPlay = !!this.autoPlay;
485
+ if (this.timeSliderConfig)
486
+ state.timeSliderConfig = this.timeSliderConfig;
467
487
  if (this.filterMode)
468
488
  state.filterMode = this.filterMode;
469
489
  await locale.getMessages(this);
@@ -484,17 +504,14 @@ const InstantAppsTimeFilter = class {
484
504
  viewModel.destroy();
485
505
  }
486
506
  render() {
487
- return index$1.h(index$1.Host, { key: 'bf0887f83b19239ce1b81efad5c356c7edc05ba1' }, this._renderBase());
507
+ return index$1.h(index$1.Host, { key: '38a0569dba42d51846760bf75df36ee1c88d71b1' }, this._renderBase());
488
508
  }
489
509
  _renderBase() {
490
- return (index$1.h("div", { class: `${CSS.base}${this.view.type !== '2d' ? CSS.threeD : ''}` }, this._renderLoader(), this._renderMain()));
491
- }
492
- _renderMain() {
493
- return (index$1.h(index$1.Fragment, null, this.view.type === '2d' && this._renderTopEl(), index$1.h("div", { ref: (ref) => (this.timeSliderRef = ref) })));
510
+ return (index$1.h("div", { class: `${CSS.base}${this.view.type !== '2d' ? CSS.threeD : ''}` }, this._renderLoader(), this.view.type === '2d' && this._renderTopEl(), index$1.h("div", { key: "time-slider", ref: (ref) => (this.timeSliderRef = ref) })));
494
511
  }
495
512
  _renderLoader() {
496
513
  var _a, _b;
497
- return (state.loading && (index$1.h(index$1.Fragment, null, index$1.h("div", { class: CSS.background }), index$1.h("div", { class: CSS.loadingContainer }, index$1.h("calcite-loader", { scale: "m", label: (_a = this.messages) === null || _a === void 0 ? void 0 : _a.loading, text: (_b = this.messages) === null || _b === void 0 ? void 0 : _b.loading })))));
514
+ return (state.loading && (index$1.h("div", null, index$1.h("div", { class: CSS.background }), index$1.h("div", { class: CSS.loadingContainer }, index$1.h("calcite-loader", { scale: "m", label: (_a = this.messages) === null || _a === void 0 ? void 0 : _a.loading, text: (_b = this.messages) === null || _b === void 0 ? void 0 : _b.loading })))));
498
515
  }
499
516
  _renderTopEl() {
500
517
  const moreThanOneTimeLayer = this.timeInfoConfigItems.length > 1;
@@ -524,7 +541,9 @@ const InstantAppsTimeFilter = class {
524
541
  get el() { return index$1.getElement(this); }
525
542
  static get watchers() { return {
526
543
  "timeInfoConfigItems": ["updateTimeInfoConfigItems"],
527
- "filterMode": ["updateFilterMode"]
544
+ "filterMode": ["updateFilterMode"],
545
+ "timeSliderConfig": ["updateTimeSliderConfig"],
546
+ "autoPlay": ["updateAutoPlay"]
528
547
  }; }
529
548
  };
530
549
  InstantAppsTimeFilter.style = InstantAppsTimeFilterStyle0;