@esri/solutions-components 0.8.28 → 0.8.30

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. package/dist/cjs/basemap-gallery_7.cjs.entry.js +65 -31
  2. package/dist/cjs/calcite-alert_4.cjs.entry.js +3 -3
  3. package/dist/cjs/calcite-dropdown-group_2.cjs.entry.js +1 -1
  4. package/dist/cjs/calcite-flow_6.cjs.entry.js +1 -1
  5. package/dist/cjs/card-manager_3.cjs.entry.js +19 -19
  6. package/dist/cjs/crowdsource-manager.cjs.entry.js +1 -1
  7. package/dist/cjs/crowdsource-reporter.cjs.entry.js +1 -1
  8. package/dist/cjs/{downloadUtils-5349717a.js → downloadUtils-83bf79ba.js} +2 -2
  9. package/dist/cjs/feature-list.cjs.entry.js +3 -3
  10. package/dist/cjs/{index.es-aa69b58b.js → index.es-4e523f8b.js} +2 -2
  11. package/dist/cjs/loader.cjs.js +1 -1
  12. package/dist/cjs/map-select-tools_3.cjs.entry.js +2 -2
  13. package/dist/cjs/{mapViewUtils-6e46ba33.js → mapViewUtils-911698e5.js} +31 -17
  14. package/dist/cjs/{popupUtils-3e65296c.js → popupUtils-e3fa775b.js} +1 -1
  15. package/dist/cjs/public-notification.cjs.entry.js +2 -2
  16. package/dist/cjs/solutions-components.cjs.js +1 -1
  17. package/dist/collection/components/floor-filter/floor-filter.js +66 -30
  18. package/dist/collection/components/layer-table/layer-table.js +18 -18
  19. package/dist/collection/utils/queryUtils.js +30 -0
  20. package/dist/collection/utils/queryUtils.ts +41 -0
  21. package/dist/components/floor-filter2.js +67 -32
  22. package/dist/components/layer-table2.js +18 -18
  23. package/dist/components/queryUtils.js +31 -17
  24. package/dist/esm/basemap-gallery_7.entry.js +65 -31
  25. package/dist/esm/calcite-alert_4.entry.js +3 -3
  26. package/dist/esm/calcite-dropdown-group_2.entry.js +1 -1
  27. package/dist/esm/calcite-flow_6.entry.js +1 -1
  28. package/dist/esm/card-manager_3.entry.js +19 -19
  29. package/dist/esm/crowdsource-manager.entry.js +1 -1
  30. package/dist/esm/crowdsource-reporter.entry.js +1 -1
  31. package/dist/esm/{downloadUtils-5fa0d437.js → downloadUtils-571a502d.js} +2 -2
  32. package/dist/esm/feature-list.entry.js +3 -3
  33. package/dist/esm/{index.es-57c15c9b.js → index.es-2f9f04c5.js} +2 -2
  34. package/dist/esm/loader.js +1 -1
  35. package/dist/esm/map-select-tools_3.entry.js +2 -2
  36. package/dist/esm/{mapViewUtils-4618ddb8.js → mapViewUtils-b8deb4ae.js} +31 -17
  37. package/dist/esm/{popupUtils-650b6bba.js → popupUtils-17193415.js} +1 -1
  38. package/dist/esm/public-notification.entry.js +2 -2
  39. package/dist/esm/solutions-components.js +1 -1
  40. package/dist/solutions-components/{p-81747268.entry.js → p-061da95a.entry.js} +1 -1
  41. package/dist/solutions-components/{p-e1662e32.entry.js → p-16fb8296.entry.js} +1 -1
  42. package/dist/solutions-components/p-1bdf0ba0.entry.js +6 -0
  43. package/dist/solutions-components/{p-a1037b19.js → p-2e23ac2c.js} +1 -1
  44. package/dist/solutions-components/{p-66722851.entry.js → p-2f7bfd8d.entry.js} +1 -1
  45. package/dist/solutions-components/{p-bfdabb9d.entry.js → p-51d5532f.entry.js} +1 -1
  46. package/dist/solutions-components/{p-6f69de4d.js → p-52dba022.js} +2 -2
  47. package/dist/solutions-components/{p-24bf45b7.js → p-57eeed77.js} +1 -1
  48. package/dist/solutions-components/p-5aaa05ef.js +36 -0
  49. package/dist/solutions-components/{p-05b3a5d9.entry.js → p-61bf98bc.entry.js} +1 -1
  50. package/dist/solutions-components/p-a0616647.entry.js +6 -0
  51. package/dist/solutions-components/{p-296375d3.entry.js → p-bb90a138.entry.js} +1 -1
  52. package/dist/solutions-components/{p-6bd6624f.entry.js → p-bda54b12.entry.js} +1 -1
  53. package/dist/solutions-components/{p-cd694107.entry.js → p-c21a6940.entry.js} +1 -1
  54. package/dist/solutions-components/solutions-components.esm.js +1 -1
  55. package/dist/solutions-components/utils/queryUtils.ts +41 -0
  56. package/dist/types/components/floor-filter/floor-filter.d.ts +23 -1
  57. package/dist/types/utils/queryUtils.d.ts +16 -0
  58. package/package.json +1 -1
  59. package/dist/solutions-components/p-2a6db6e8.entry.js +0 -6
  60. package/dist/solutions-components/p-583e5dd0.js +0 -36
  61. package/dist/solutions-components/p-c3821586.entry.js +0 -6
@@ -31,19 +31,22 @@ export class FloorFilter {
31
31
  // Watch handlers
32
32
  //
33
33
  //--------------------------------------------------------------------------
34
+ /**
35
+ * Watch for changes to the mapView and re-init the floor filter
36
+ */
34
37
  async mapViewWatchHandler() {
35
- const webMap = this.mapView.map;
36
- await webMap.when(() => {
37
- if (this.floorFilterWidget) {
38
- this.floorFilterWidget.destroy();
39
- this.floorFilterWidget = undefined;
40
- }
41
- if (this._floorFilterElement) {
42
- this._floorFilterElement.remove();
43
- this._floorFilterElement = document.createElement("div");
44
- }
45
- this._initFloorFilter(this.mapView, webMap);
46
- });
38
+ await this._initFloorFilter(this.mapView);
39
+ }
40
+ /**
41
+ * Watch for changes to the enabled property and re-init or destroy the floor filter
42
+ */
43
+ async enabledWatchHandler() {
44
+ if (this.enabled) {
45
+ await this._initFloorFilter(this.mapView);
46
+ }
47
+ else if (!this.enabled) {
48
+ this._destroyWidget();
49
+ }
47
50
  }
48
51
  //--------------------------------------------------------------------------
49
52
  //
@@ -56,8 +59,11 @@ export class FloorFilter {
56
59
  async componentWillLoad() {
57
60
  return this._initModules();
58
61
  }
62
+ /**
63
+ * Renders the component.
64
+ */
59
65
  render() {
60
- return (h(Host, { key: '98769446b20d8a9432b571b5653abbc6613bdfe5' }, h("div", { key: '6606a2593fec1885fc02b07a168bdea43e7f864a', ref: (el) => { this._floorFilterElement = el; } })));
66
+ return (h(Host, { key: 'c80a8d46fb48f3789d9fa09c2400faad49e2e236' }, h("div", { key: '82919a3ba061a17c8aeaa0d2f6f4f13bc428b519', ref: (el) => { this._floorFilterElement = el; } })));
61
67
  }
62
68
  //--------------------------------------------------------------------------
63
69
  //
@@ -79,27 +85,54 @@ export class FloorFilter {
79
85
  this.FloorFilter = FloorFilter;
80
86
  this.reactiveUtils = reactiveUtils;
81
87
  }
88
+ /**
89
+ * Destroy the widget and remove the containing element if it exists
90
+ *
91
+ * @protected
92
+ */
93
+ _destroyWidget() {
94
+ if (this.floorFilterWidget) {
95
+ this.floorFilterWidget.destroy();
96
+ this.floorFilterWidget = undefined;
97
+ }
98
+ if (this._floorFilterElement) {
99
+ this._floorFilterElement.remove();
100
+ }
101
+ }
102
+ /**
103
+ * Destroy the widget and remove the containing element then re-create the container element
104
+ *
105
+ * @protected
106
+ */
107
+ _initContainer() {
108
+ this._destroyWidget();
109
+ this._floorFilterElement = document.createElement("div");
110
+ }
82
111
  /**
83
112
  * Initialize the floor filter or reset the current view if it already exists
84
113
  */
85
- _initFloorFilter(view, webMap) {
86
- var _a, _b, _c;
114
+ async _initFloorFilter(view) {
115
+ const webMap = view === null || view === void 0 ? void 0 : view.map;
87
116
  if (view && this.enabled && this.FloorFilter && (webMap === null || webMap === void 0 ? void 0 : webMap.floorInfo)) {
88
- this.floorFilterWidget = new this.FloorFilter({
89
- container: this._floorFilterElement,
90
- view
91
- });
92
- (_a = this._facilityHandle) === null || _a === void 0 ? void 0 : _a.remove();
93
- this._facilityHandle = this.reactiveUtils.watch(() => this.floorFilterWidget.facility, (facility) => {
94
- this.facilityChanged.emit(facility);
95
- });
96
- (_b = this._levelHandle) === null || _b === void 0 ? void 0 : _b.remove();
97
- this._levelHandle = this.reactiveUtils.watch(() => this.floorFilterWidget.level, (level) => {
98
- this.levelChanged.emit(level);
99
- });
100
- (_c = this._siteHandle) === null || _c === void 0 ? void 0 : _c.remove();
101
- this._siteHandle = this.reactiveUtils.watch(() => this.floorFilterWidget.site, (site) => {
102
- this.siteChanged.emit(site);
117
+ this._initContainer();
118
+ await webMap.when(() => {
119
+ var _a, _b, _c;
120
+ this.floorFilterWidget = new this.FloorFilter({
121
+ container: this._floorFilterElement,
122
+ view
123
+ });
124
+ (_a = this._facilityHandle) === null || _a === void 0 ? void 0 : _a.remove();
125
+ this._facilityHandle = this.reactiveUtils.watch(() => this.floorFilterWidget.facility, (facility) => {
126
+ this.facilityChanged.emit(facility);
127
+ });
128
+ (_b = this._levelHandle) === null || _b === void 0 ? void 0 : _b.remove();
129
+ this._levelHandle = this.reactiveUtils.watch(() => this.floorFilterWidget.level, (level) => {
130
+ this.levelChanged.emit(level);
131
+ });
132
+ (_c = this._siteHandle) === null || _c === void 0 ? void 0 : _c.remove();
133
+ this._siteHandle = this.reactiveUtils.watch(() => this.floorFilterWidget.site, (site) => {
134
+ this.siteChanged.emit(site);
135
+ });
103
136
  });
104
137
  }
105
138
  }
@@ -229,6 +262,9 @@ export class FloorFilter {
229
262
  return [{
230
263
  "propName": "mapView",
231
264
  "methodName": "mapViewWatchHandler"
265
+ }, {
266
+ "propName": "enabled",
267
+ "methodName": "enabledWatchHandler"
232
268
  }];
233
269
  }
234
270
  }
@@ -22,7 +22,7 @@ import { Host, h } from "@stencil/core";
22
22
  import { loadModules } from "../../utils/loadModules";
23
23
  import { getLocaleComponentStrings } from "../../utils/locale";
24
24
  import { getFeatureLayerView, getLayerOrTable, goToSelection } from "../../utils/mapViewUtils";
25
- import { queryAllIds, queryFeatureIds, queryFeaturesByGlobalID } from "../../utils/queryUtils";
25
+ import { queryAllIds, queryAllOidsWithQueryFeatures, queryFeaturesByGlobalID } from "../../utils/queryUtils";
26
26
  import * as downloadUtils from "../../utils/downloadUtils";
27
27
  import "@esri/instant-apps-components/dist/components/instant-apps-social-share";
28
28
  export class LayerTable {
@@ -216,6 +216,10 @@ export class LayerTable {
216
216
  if (this._selectAllActive && this.selectedIds.length !== this._allIds.length) {
217
217
  this._selectAllActive = false;
218
218
  }
219
+ if (this.selectedIds.length > 0) {
220
+ this._table.rowHighlightIds.removeAll();
221
+ this._table.rowHighlightIds.add(this.selectedIds[0]);
222
+ }
219
223
  }
220
224
  /**
221
225
  * Scroll and zoom to the selected feature from the Features widget.
@@ -315,7 +319,7 @@ export class LayerTable {
315
319
  const selected = this.selectedIds.length.toString();
316
320
  const tableHeightClass = this.isMobile ? "height-full" : "height-full-adjusted";
317
321
  this._validateActiveActions();
318
- return (h(Host, { key: 'd2e67c4d6676ede2d0094bfca008dfca12fb59b3' }, h("calcite-shell", { key: '62f1c76bbffcae878e4e3f3342c37bf3bbd865ca' }, this._getTableControlRow("header"), h("div", { key: '4efd17a2485f990984f61f2d8c8b45d3d096d428', class: `width-full ${tableHeightClass}` }, h("calcite-panel", { key: '443481322720ab22e9e2bddac98802a25ef87982', class: "height-full width-full" }, h("calcite-loader", { key: '445bb39ac5c33d470a52f10dd1c481fdaf38443d', class: loadingClass, label: this._translations.fetchingData, scale: "l" }), h("div", { key: '4f1ba294ece2f5b05030a1c3cdc48d6ff46ed5d4', class: tableNodeClass, ref: this.onTableNodeCreate })), !this.isMobile ? (h("div", { class: "bottom-left text-color height-19" }, this._translations.recordsSelected
322
+ return (h(Host, { key: '928286a8e4d1159b56b2aa4384f0d6eed38c9e76' }, h("calcite-shell", { key: '7c9b98056ee867df54ebfd31fee6f046f5152f64' }, this._getTableControlRow("header"), h("div", { key: 'b1a9a9cca100c7bef335afd5b6c7d7384ca7536c', class: `width-full ${tableHeightClass}` }, h("calcite-panel", { key: 'ceeead9900f43c94f46c8c94698ae17f3ae558b7', class: "height-full width-full" }, h("calcite-loader", { key: '7bf3c9ba21daa27dd387ba5413b6f6e982e1f10d', class: loadingClass, label: this._translations.fetchingData, scale: "l" }), h("div", { key: '7d0440047453a45fe1688ad373ab2463fe7479ba', class: tableNodeClass, ref: this.onTableNodeCreate })), !this.isMobile ? (h("div", { class: "bottom-left text-color height-19" }, this._translations.recordsSelected
319
323
  .replace("{{total}}", total)
320
324
  .replace("{{selected}}", selected))) : undefined)), this._filterModal()));
321
325
  }
@@ -916,43 +920,38 @@ export class LayerTable {
916
920
  else if (this._shiftIsPressed) {
917
921
  this._skipOnChange = true;
918
922
  this._previousCurrentId = this._currentId;
919
- this._currentId = [...this._table.highlightIds.toArray()].reverse()[0];
920
- if (this._previousCurrentId !== this._currentId) {
923
+ this._currentId = [...ids].reverse()[0];
924
+ if (ids.length === 1) {
925
+ this._skipOnChange = false;
926
+ }
927
+ else if (this._previousCurrentId !== this._currentId) {
921
928
  // query the layer based on current sort and filters then grab between the current id and previous id
922
929
  const orderBy = this._table.activeSortOrders.reduce((prev, cur) => {
923
930
  prev.push(`${cur.fieldName} ${cur.direction}`);
924
931
  return prev;
925
932
  }, []);
926
- const oids = await queryFeatureIds(this._layer, this._layer.definitionExpression, orderBy);
933
+ const oids = await queryAllOidsWithQueryFeatures(0, this._layer, [], orderBy);
927
934
  let isBetween = false;
928
935
  const _start = this._table.viewModel.getObjectIdIndex(this._previousCurrentId);
929
936
  const _end = this._table.viewModel.getObjectIdIndex(this._currentId);
930
937
  const startIndex = _start < _end ? _start : _end;
931
938
  const endIndex = _end > _start ? _end : _start;
932
939
  this._skipOnChange = startIndex + 1 !== endIndex;
933
- const selectedIds = oids.reduce((prev, cur) => {
940
+ const idsInRange = oids.reduce((prev, cur) => {
934
941
  const id = cur;
935
- const index = this._table.viewModel.getObjectIdIndex(id);
936
942
  if ((id === this._currentId || id === this._previousCurrentId)) {
937
943
  isBetween = !isBetween;
938
944
  if (prev.indexOf(id) < 0) {
939
945
  prev.push(id);
940
946
  }
941
947
  }
942
- // The oids are sorted so after we have reached the start or end oid add all ids even if the index is -1.
943
- // Index of -1 will occur for features between the start and and oid if
944
- // you select a row then scroll faster than the FeatureTable loads the data to select the next id
945
- if (isBetween && prev.indexOf(id) < 0) {
946
- prev.push(id);
947
- }
948
- // Also add index based check.
949
- // In some cases the FeatureTable and Layer query will have differences in how null/undefined field values are sorted
950
- if ((this.selectedIds.indexOf(id) > -1 || (index >= startIndex && index <= endIndex)) && prev.indexOf(id) < 0 && index > -1) {
948
+ else if (isBetween && prev.indexOf(id) < 0) {
951
949
  prev.push(id);
952
950
  }
953
951
  return prev;
954
952
  }, []);
955
- this.selectedIds = _start < _end ? selectedIds.reverse() : selectedIds;
953
+ const selectedIds = _start < _end ? idsInRange.reverse() : idsInRange;
954
+ this.selectedIds = [...new Set([...selectedIds, ...this.selectedIds])];
956
955
  this._table.highlightIds.addMany(this.selectedIds.filter(i => ids.indexOf(i) < 0));
957
956
  }
958
957
  }
@@ -1294,9 +1293,10 @@ export class LayerTable {
1294
1293
  * Clears the selected indexes
1295
1294
  */
1296
1295
  _clearSelection() {
1297
- var _a;
1296
+ var _a, _b;
1298
1297
  this.selectedIds = [];
1299
1298
  (_a = this._table) === null || _a === void 0 ? void 0 : _a.highlightIds.removeAll();
1299
+ (_b = this._table) === null || _b === void 0 ? void 0 : _b.rowHighlightIds.removeAll();
1300
1300
  this._finishOnChange();
1301
1301
  }
1302
1302
  /**
@@ -40,6 +40,36 @@ export async function queryAllFeatures(start, layer, graphics) {
40
40
  queryAllFeatures(start += num, layer, graphics) :
41
41
  Promise.resolve(graphics);
42
42
  }
43
+ /**
44
+ * Query the layer for all OIDs valid for any definition expressions applied to the layer.
45
+ *
46
+ * This query allows OIDs to be returned in the same order as shown in the FeatureTable.
47
+ * FeatureLayer.queryObjectIds can return OIDs in a different order.
48
+ *
49
+ * @param start zero-based index indicating where to begin retrieving features
50
+ * @param layer the layer to retrieve features from
51
+ * @param graphics stores the features
52
+ * @param orderBy One or more field names used to order the query results.
53
+ * Specify ASC (ascending) or DESC (descending) after the field name to control the order.
54
+ * The default order is ASC.
55
+ *
56
+ * @returns Promise with the OIDs sorted based on any orderBy definitions
57
+ */
58
+ export async function queryAllOidsWithQueryFeatures(start, layer, graphics, orderBy) {
59
+ const num = layer.capabilities.query.maxRecordCount;
60
+ const query = layer.createQuery();
61
+ query.start = start;
62
+ query.num = num;
63
+ query.returnGeometry = false;
64
+ query.orderByFields = orderBy;
65
+ query.outFields = [layer.objectIdField];
66
+ query.where = layer.definitionExpression || "1=1";
67
+ const result = await layer.queryFeatures(query);
68
+ graphics = graphics.concat(result.features);
69
+ return result.exceededTransferLimit ?
70
+ queryAllOidsWithQueryFeatures(start += num, layer, graphics, orderBy) :
71
+ Promise.resolve(graphics.map(g => g.attributes[layer.objectIdField]));
72
+ }
43
73
  /**
44
74
  * Query the layer for all IDs
45
75
  *
@@ -48,6 +48,47 @@ export async function queryAllFeatures(
48
48
  Promise.resolve(graphics);
49
49
  }
50
50
 
51
+ /**
52
+ * Query the layer for all OIDs valid for any definition expressions applied to the layer.
53
+ *
54
+ * This query allows OIDs to be returned in the same order as shown in the FeatureTable.
55
+ * FeatureLayer.queryObjectIds can return OIDs in a different order.
56
+ *
57
+ * @param start zero-based index indicating where to begin retrieving features
58
+ * @param layer the layer to retrieve features from
59
+ * @param graphics stores the features
60
+ * @param orderBy One or more field names used to order the query results.
61
+ * Specify ASC (ascending) or DESC (descending) after the field name to control the order.
62
+ * The default order is ASC.
63
+ *
64
+ * @returns Promise with the OIDs sorted based on any orderBy definitions
65
+ */
66
+ export async function queryAllOidsWithQueryFeatures(
67
+ start: number,
68
+ layer: __esri.FeatureLayer,
69
+ graphics: __esri.Graphic[],
70
+ orderBy?: string[]
71
+ ): Promise<number[]> {
72
+ const num = layer.capabilities.query.maxRecordCount;
73
+ const query = layer.createQuery();
74
+ query.start = start;
75
+ query.num = num;
76
+ query.returnGeometry = false;
77
+ query.orderByFields = orderBy;
78
+ query.outFields = [layer.objectIdField];
79
+ query.where = layer.definitionExpression || "1=1";
80
+
81
+ const result = await layer.queryFeatures(query);
82
+
83
+ graphics = graphics.concat(
84
+ result.features
85
+ );
86
+
87
+ return result.exceededTransferLimit ?
88
+ queryAllOidsWithQueryFeatures(start += num, layer, graphics, orderBy) :
89
+ Promise.resolve(graphics.map(g => g.attributes[layer.objectIdField]));
90
+ }
91
+
51
92
  /**
52
93
  * Query the layer for all IDs
53
94
  *
@@ -26,19 +26,22 @@ const FloorFilter = /*@__PURE__*/ proxyCustomElement(class FloorFilter extends H
26
26
  // Watch handlers
27
27
  //
28
28
  //--------------------------------------------------------------------------
29
+ /**
30
+ * Watch for changes to the mapView and re-init the floor filter
31
+ */
29
32
  async mapViewWatchHandler() {
30
- const webMap = this.mapView.map;
31
- await webMap.when(() => {
32
- if (this.floorFilterWidget) {
33
- this.floorFilterWidget.destroy();
34
- this.floorFilterWidget = undefined;
35
- }
36
- if (this._floorFilterElement) {
37
- this._floorFilterElement.remove();
38
- this._floorFilterElement = document.createElement("div");
39
- }
40
- this._initFloorFilter(this.mapView, webMap);
41
- });
33
+ await this._initFloorFilter(this.mapView);
34
+ }
35
+ /**
36
+ * Watch for changes to the enabled property and re-init or destroy the floor filter
37
+ */
38
+ async enabledWatchHandler() {
39
+ if (this.enabled) {
40
+ await this._initFloorFilter(this.mapView);
41
+ }
42
+ else if (!this.enabled) {
43
+ this._destroyWidget();
44
+ }
42
45
  }
43
46
  //--------------------------------------------------------------------------
44
47
  //
@@ -51,8 +54,11 @@ const FloorFilter = /*@__PURE__*/ proxyCustomElement(class FloorFilter extends H
51
54
  async componentWillLoad() {
52
55
  return this._initModules();
53
56
  }
57
+ /**
58
+ * Renders the component.
59
+ */
54
60
  render() {
55
- return (h(Host, { key: '98769446b20d8a9432b571b5653abbc6613bdfe5' }, h("div", { key: '6606a2593fec1885fc02b07a168bdea43e7f864a', ref: (el) => { this._floorFilterElement = el; } })));
61
+ return (h(Host, { key: 'c80a8d46fb48f3789d9fa09c2400faad49e2e236' }, h("div", { key: '82919a3ba061a17c8aeaa0d2f6f4f13bc428b519', ref: (el) => { this._floorFilterElement = el; } })));
56
62
  }
57
63
  //--------------------------------------------------------------------------
58
64
  //
@@ -74,33 +80,61 @@ const FloorFilter = /*@__PURE__*/ proxyCustomElement(class FloorFilter extends H
74
80
  this.FloorFilter = FloorFilter;
75
81
  this.reactiveUtils = reactiveUtils;
76
82
  }
83
+ /**
84
+ * Destroy the widget and remove the containing element if it exists
85
+ *
86
+ * @protected
87
+ */
88
+ _destroyWidget() {
89
+ if (this.floorFilterWidget) {
90
+ this.floorFilterWidget.destroy();
91
+ this.floorFilterWidget = undefined;
92
+ }
93
+ if (this._floorFilterElement) {
94
+ this._floorFilterElement.remove();
95
+ }
96
+ }
97
+ /**
98
+ * Destroy the widget and remove the containing element then re-create the container element
99
+ *
100
+ * @protected
101
+ */
102
+ _initContainer() {
103
+ this._destroyWidget();
104
+ this._floorFilterElement = document.createElement("div");
105
+ }
77
106
  /**
78
107
  * Initialize the floor filter or reset the current view if it already exists
79
108
  */
80
- _initFloorFilter(view, webMap) {
81
- var _a, _b, _c;
109
+ async _initFloorFilter(view) {
110
+ const webMap = view === null || view === void 0 ? void 0 : view.map;
82
111
  if (view && this.enabled && this.FloorFilter && (webMap === null || webMap === void 0 ? void 0 : webMap.floorInfo)) {
83
- this.floorFilterWidget = new this.FloorFilter({
84
- container: this._floorFilterElement,
85
- view
86
- });
87
- (_a = this._facilityHandle) === null || _a === void 0 ? void 0 : _a.remove();
88
- this._facilityHandle = this.reactiveUtils.watch(() => this.floorFilterWidget.facility, (facility) => {
89
- this.facilityChanged.emit(facility);
90
- });
91
- (_b = this._levelHandle) === null || _b === void 0 ? void 0 : _b.remove();
92
- this._levelHandle = this.reactiveUtils.watch(() => this.floorFilterWidget.level, (level) => {
93
- this.levelChanged.emit(level);
94
- });
95
- (_c = this._siteHandle) === null || _c === void 0 ? void 0 : _c.remove();
96
- this._siteHandle = this.reactiveUtils.watch(() => this.floorFilterWidget.site, (site) => {
97
- this.siteChanged.emit(site);
112
+ this._initContainer();
113
+ await webMap.when(() => {
114
+ var _a, _b, _c;
115
+ this.floorFilterWidget = new this.FloorFilter({
116
+ container: this._floorFilterElement,
117
+ view
118
+ });
119
+ (_a = this._facilityHandle) === null || _a === void 0 ? void 0 : _a.remove();
120
+ this._facilityHandle = this.reactiveUtils.watch(() => this.floorFilterWidget.facility, (facility) => {
121
+ this.facilityChanged.emit(facility);
122
+ });
123
+ (_b = this._levelHandle) === null || _b === void 0 ? void 0 : _b.remove();
124
+ this._levelHandle = this.reactiveUtils.watch(() => this.floorFilterWidget.level, (level) => {
125
+ this.levelChanged.emit(level);
126
+ });
127
+ (_c = this._siteHandle) === null || _c === void 0 ? void 0 : _c.remove();
128
+ this._siteHandle = this.reactiveUtils.watch(() => this.floorFilterWidget.site, (site) => {
129
+ this.siteChanged.emit(site);
130
+ });
98
131
  });
99
132
  }
100
133
  }
101
134
  get el() { return this; }
102
135
  static get watchers() { return {
103
- "mapView": ["mapViewWatchHandler"]
136
+ "mapView": ["mapViewWatchHandler"],
137
+ "enabled": ["enabledWatchHandler"]
104
138
  }; }
105
139
  static get style() { return FloorFilterStyle0; }
106
140
  }, [1, "floor-filter", {
@@ -108,7 +142,8 @@ const FloorFilter = /*@__PURE__*/ proxyCustomElement(class FloorFilter extends H
108
142
  "floorFilterWidget": [16],
109
143
  "mapView": [16]
110
144
  }, undefined, {
111
- "mapView": ["mapViewWatchHandler"]
145
+ "mapView": ["mapViewWatchHandler"],
146
+ "enabled": ["enabledWatchHandler"]
112
147
  }]);
113
148
  function defineCustomElement() {
114
149
  if (typeof customElements === "undefined") {
@@ -7,7 +7,7 @@ import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/
7
7
  import { l as loadModules } from './loadModules.js';
8
8
  import { g as getLocaleComponentStrings } from './locale.js';
9
9
  import { b as goToSelection, c as getFeatureLayerView, g as getLayerOrTable } from './mapViewUtils.js';
10
- import { b as queryAllIds, c as queryFeatureIds, d as queryFeaturesByGlobalID } from './queryUtils.js';
10
+ import { b as queryAllIds, c as queryAllOidsWithQueryFeatures, d as queryFeaturesByGlobalID } from './queryUtils.js';
11
11
  import { d as downloadCSV } from './downloadUtils.js';
12
12
  import { d as defineCustomElement$D } from './action.js';
13
13
  import { d as defineCustomElement$C } from './action-bar.js';
@@ -246,6 +246,10 @@ const LayerTable = /*@__PURE__*/ proxyCustomElement(class LayerTable extends HTM
246
246
  if (this._selectAllActive && this.selectedIds.length !== this._allIds.length) {
247
247
  this._selectAllActive = false;
248
248
  }
249
+ if (this.selectedIds.length > 0) {
250
+ this._table.rowHighlightIds.removeAll();
251
+ this._table.rowHighlightIds.add(this.selectedIds[0]);
252
+ }
249
253
  }
250
254
  /**
251
255
  * Scroll and zoom to the selected feature from the Features widget.
@@ -345,7 +349,7 @@ const LayerTable = /*@__PURE__*/ proxyCustomElement(class LayerTable extends HTM
345
349
  const selected = this.selectedIds.length.toString();
346
350
  const tableHeightClass = this.isMobile ? "height-full" : "height-full-adjusted";
347
351
  this._validateActiveActions();
348
- return (h(Host, { key: 'd2e67c4d6676ede2d0094bfca008dfca12fb59b3' }, h("calcite-shell", { key: '62f1c76bbffcae878e4e3f3342c37bf3bbd865ca' }, this._getTableControlRow("header"), h("div", { key: '4efd17a2485f990984f61f2d8c8b45d3d096d428', class: `width-full ${tableHeightClass}` }, h("calcite-panel", { key: '443481322720ab22e9e2bddac98802a25ef87982', class: "height-full width-full" }, h("calcite-loader", { key: '445bb39ac5c33d470a52f10dd1c481fdaf38443d', class: loadingClass, label: this._translations.fetchingData, scale: "l" }), h("div", { key: '4f1ba294ece2f5b05030a1c3cdc48d6ff46ed5d4', class: tableNodeClass, ref: this.onTableNodeCreate })), !this.isMobile ? (h("div", { class: "bottom-left text-color height-19" }, this._translations.recordsSelected
352
+ return (h(Host, { key: '928286a8e4d1159b56b2aa4384f0d6eed38c9e76' }, h("calcite-shell", { key: '7c9b98056ee867df54ebfd31fee6f046f5152f64' }, this._getTableControlRow("header"), h("div", { key: 'b1a9a9cca100c7bef335afd5b6c7d7384ca7536c', class: `width-full ${tableHeightClass}` }, h("calcite-panel", { key: 'ceeead9900f43c94f46c8c94698ae17f3ae558b7', class: "height-full width-full" }, h("calcite-loader", { key: '7bf3c9ba21daa27dd387ba5413b6f6e982e1f10d', class: loadingClass, label: this._translations.fetchingData, scale: "l" }), h("div", { key: '7d0440047453a45fe1688ad373ab2463fe7479ba', class: tableNodeClass, ref: this.onTableNodeCreate })), !this.isMobile ? (h("div", { class: "bottom-left text-color height-19" }, this._translations.recordsSelected
349
353
  .replace("{{total}}", total)
350
354
  .replace("{{selected}}", selected))) : undefined)), this._filterModal()));
351
355
  }
@@ -946,43 +950,38 @@ const LayerTable = /*@__PURE__*/ proxyCustomElement(class LayerTable extends HTM
946
950
  else if (this._shiftIsPressed) {
947
951
  this._skipOnChange = true;
948
952
  this._previousCurrentId = this._currentId;
949
- this._currentId = [...this._table.highlightIds.toArray()].reverse()[0];
950
- if (this._previousCurrentId !== this._currentId) {
953
+ this._currentId = [...ids].reverse()[0];
954
+ if (ids.length === 1) {
955
+ this._skipOnChange = false;
956
+ }
957
+ else if (this._previousCurrentId !== this._currentId) {
951
958
  // query the layer based on current sort and filters then grab between the current id and previous id
952
959
  const orderBy = this._table.activeSortOrders.reduce((prev, cur) => {
953
960
  prev.push(`${cur.fieldName} ${cur.direction}`);
954
961
  return prev;
955
962
  }, []);
956
- const oids = await queryFeatureIds(this._layer, this._layer.definitionExpression, orderBy);
963
+ const oids = await queryAllOidsWithQueryFeatures(0, this._layer, [], orderBy);
957
964
  let isBetween = false;
958
965
  const _start = this._table.viewModel.getObjectIdIndex(this._previousCurrentId);
959
966
  const _end = this._table.viewModel.getObjectIdIndex(this._currentId);
960
967
  const startIndex = _start < _end ? _start : _end;
961
968
  const endIndex = _end > _start ? _end : _start;
962
969
  this._skipOnChange = startIndex + 1 !== endIndex;
963
- const selectedIds = oids.reduce((prev, cur) => {
970
+ const idsInRange = oids.reduce((prev, cur) => {
964
971
  const id = cur;
965
- const index = this._table.viewModel.getObjectIdIndex(id);
966
972
  if ((id === this._currentId || id === this._previousCurrentId)) {
967
973
  isBetween = !isBetween;
968
974
  if (prev.indexOf(id) < 0) {
969
975
  prev.push(id);
970
976
  }
971
977
  }
972
- // The oids are sorted so after we have reached the start or end oid add all ids even if the index is -1.
973
- // Index of -1 will occur for features between the start and and oid if
974
- // you select a row then scroll faster than the FeatureTable loads the data to select the next id
975
- if (isBetween && prev.indexOf(id) < 0) {
976
- prev.push(id);
977
- }
978
- // Also add index based check.
979
- // In some cases the FeatureTable and Layer query will have differences in how null/undefined field values are sorted
980
- if ((this.selectedIds.indexOf(id) > -1 || (index >= startIndex && index <= endIndex)) && prev.indexOf(id) < 0 && index > -1) {
978
+ else if (isBetween && prev.indexOf(id) < 0) {
981
979
  prev.push(id);
982
980
  }
983
981
  return prev;
984
982
  }, []);
985
- this.selectedIds = _start < _end ? selectedIds.reverse() : selectedIds;
983
+ const selectedIds = _start < _end ? idsInRange.reverse() : idsInRange;
984
+ this.selectedIds = [...new Set([...selectedIds, ...this.selectedIds])];
986
985
  this._table.highlightIds.addMany(this.selectedIds.filter(i => ids.indexOf(i) < 0));
987
986
  }
988
987
  }
@@ -1324,9 +1323,10 @@ const LayerTable = /*@__PURE__*/ proxyCustomElement(class LayerTable extends HTM
1324
1323
  * Clears the selected indexes
1325
1324
  */
1326
1325
  _clearSelection() {
1327
- var _a;
1326
+ var _a, _b;
1328
1327
  this.selectedIds = [];
1329
1328
  (_a = this._table) === null || _a === void 0 ? void 0 : _a.highlightIds.removeAll();
1329
+ (_b = this._table) === null || _b === void 0 ? void 0 : _b.rowHighlightIds.removeAll();
1330
1330
  this._finishOnChange();
1331
1331
  }
1332
1332
  /**
@@ -18,6 +18,36 @@
18
18
  * See the License for the specific language governing permissions and
19
19
  * limitations under the License.
20
20
  */
21
+ /**
22
+ * Query the layer for all OIDs valid for any definition expressions applied to the layer.
23
+ *
24
+ * This query allows OIDs to be returned in the same order as shown in the FeatureTable.
25
+ * FeatureLayer.queryObjectIds can return OIDs in a different order.
26
+ *
27
+ * @param start zero-based index indicating where to begin retrieving features
28
+ * @param layer the layer to retrieve features from
29
+ * @param graphics stores the features
30
+ * @param orderBy One or more field names used to order the query results.
31
+ * Specify ASC (ascending) or DESC (descending) after the field name to control the order.
32
+ * The default order is ASC.
33
+ *
34
+ * @returns Promise with the OIDs sorted based on any orderBy definitions
35
+ */
36
+ async function queryAllOidsWithQueryFeatures(start, layer, graphics, orderBy) {
37
+ const num = layer.capabilities.query.maxRecordCount;
38
+ const query = layer.createQuery();
39
+ query.start = start;
40
+ query.num = num;
41
+ query.returnGeometry = false;
42
+ query.orderByFields = orderBy;
43
+ query.outFields = [layer.objectIdField];
44
+ query.where = layer.definitionExpression || "1=1";
45
+ const result = await layer.queryFeatures(query);
46
+ graphics = graphics.concat(result.features);
47
+ return result.exceededTransferLimit ?
48
+ queryAllOidsWithQueryFeatures(start += num, layer, graphics, orderBy) :
49
+ Promise.resolve(graphics.map(g => g.attributes[layer.objectIdField]));
50
+ }
21
51
  /**
22
52
  * Query the layer for all IDs
23
53
  *
@@ -125,22 +155,6 @@ async function queryFeaturesByGeometry(start, layer, geometry, featuresCollectio
125
155
  queryFeaturesByGeometry(start += num, layer, geometry, featuresCollection) :
126
156
  Promise.resolve(featuresCollection);
127
157
  }
128
- /**
129
- * Query the layer for feature ids that match the provided where clause.
130
- * If no where clause is provided all features will be returned.
131
- *
132
- * @param layer the layer to retrieve features from
133
- * @param where the where clause for the query
134
- * @param orderBy any sort order to apply to the query
135
- *
136
- * @returns Promise with the ids from the layer that match the where and are sorted as defined by orderBy
137
- */
138
- async function queryFeatureIds(layer, where, orderBy) {
139
- const query = layer.createQuery();
140
- query.where = where ? where : "1=1";
141
- query.orderByFields = orderBy;
142
- return await layer.queryObjectIds(query);
143
- }
144
158
  /**
145
159
  * Query the layer for the extent of features with the provided OIDs
146
160
  *
@@ -198,4 +212,4 @@ async function _intersectQuery(geometry, layer) {
198
212
  return layer.queryObjectIds(q);
199
213
  }
200
214
 
201
- export { queryExtent as a, queryAllIds as b, queryFeatureIds as c, queryFeaturesByGlobalID as d, queryObjectIds as e, queryFeaturesByGeometry as f, getQueryGeoms as g, queryFeaturesByID as q };
215
+ export { queryExtent as a, queryAllIds as b, queryAllOidsWithQueryFeatures as c, queryFeaturesByGlobalID as d, queryObjectIds as e, queryFeaturesByGeometry as f, getQueryGeoms as g, queryFeaturesByID as q };