@esri/solutions-components 0.7.8 → 0.7.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. package/dist/assets/t9n/layer-table/resources.json +1 -0
  2. package/dist/assets/t9n/layer-table/resources_en.json +1 -0
  3. package/dist/cjs/basemap-gallery_7.cjs.entry.js +1 -1
  4. package/dist/cjs/calcite-alert_3.cjs.entry.js +1 -1
  5. package/dist/cjs/calcite-combobox_6.cjs.entry.js +16 -7
  6. package/dist/cjs/card-manager_3.cjs.entry.js +176 -22
  7. package/dist/cjs/crowdsource-manager.cjs.entry.js +12 -1
  8. package/dist/cjs/{downloadUtils-95e4a5b2.js → downloadUtils-8f50633d.js} +2 -2
  9. package/dist/cjs/{index.es-a88403f8.js → index.es-140aa937.js} +2 -2
  10. package/dist/cjs/loader.cjs.js +1 -1
  11. package/dist/cjs/map-select-tools_3.cjs.entry.js +2 -2
  12. package/dist/cjs/{mapViewUtils-b7d9e71c.js → mapViewUtils-569e9644.js} +17 -0
  13. package/dist/cjs/public-notification.cjs.entry.js +2 -2
  14. package/dist/cjs/solutions-components.cjs.js +1 -1
  15. package/dist/collection/components/crowdsource-manager/crowdsource-manager.js +20 -2
  16. package/dist/collection/components/layer-table/layer-table.js +175 -21
  17. package/dist/collection/components/map-layer-picker/map-layer-picker.css +1 -0
  18. package/dist/collection/components/map-layer-picker/map-layer-picker.js +69 -5
  19. package/dist/collection/components/map-picker/map-picker.js +1 -1
  20. package/dist/collection/demos/crowdsource-manager.html +2 -2
  21. package/dist/collection/utils/interfaces.ts +5 -0
  22. package/dist/collection/utils/queryUtils.js +16 -0
  23. package/dist/collection/utils/queryUtils.ts +21 -0
  24. package/dist/components/crowdsource-manager.js +15 -3
  25. package/dist/components/layer-table2.js +175 -21
  26. package/dist/components/map-layer-picker2.js +17 -6
  27. package/dist/components/map-picker2.js +1 -1
  28. package/dist/components/map-select-tools2.js +1 -1
  29. package/dist/components/queryUtils.js +17 -1
  30. package/dist/components/refine-selection2.js +1 -1
  31. package/dist/esm/basemap-gallery_7.entry.js +1 -1
  32. package/dist/esm/calcite-alert_3.entry.js +1 -1
  33. package/dist/esm/calcite-combobox_6.entry.js +16 -7
  34. package/dist/esm/card-manager_3.entry.js +176 -22
  35. package/dist/esm/crowdsource-manager.entry.js +12 -1
  36. package/dist/esm/{downloadUtils-83dd2143.js → downloadUtils-9dee8bc0.js} +2 -2
  37. package/dist/esm/{index.es-0c98e2f3.js → index.es-54e86c8e.js} +2 -2
  38. package/dist/esm/loader.js +1 -1
  39. package/dist/esm/map-select-tools_3.entry.js +2 -2
  40. package/dist/esm/{mapViewUtils-3ff1c264.js → mapViewUtils-066602d5.js} +17 -1
  41. package/dist/esm/public-notification.entry.js +2 -2
  42. package/dist/esm/solutions-components.js +1 -1
  43. package/dist/solutions-components/demos/crowdsource-manager.html +2 -2
  44. package/dist/solutions-components/{p-546a3d3c.entry.js → p-13bfc206.entry.js} +2 -2
  45. package/dist/solutions-components/{p-d6050d57.js → p-1bdd64a0.js} +2 -2
  46. package/dist/solutions-components/{p-b7e2c75b.js → p-531d91d6.js} +1 -1
  47. package/dist/solutions-components/{p-dcd6e7b9.entry.js → p-6656c53e.entry.js} +1 -1
  48. package/dist/solutions-components/{p-a5d924a9.entry.js → p-683cded6.entry.js} +1 -1
  49. package/dist/solutions-components/{p-95ebc2e5.entry.js → p-c2b20b85.entry.js} +1 -1
  50. package/dist/solutions-components/p-c7ff24df.entry.js +6 -0
  51. package/dist/solutions-components/{p-b030a151.js → p-dfdb8411.js} +1 -1
  52. package/dist/solutions-components/p-f7870ec1.entry.js +6 -0
  53. package/dist/solutions-components/p-ffae568b.entry.js +6 -0
  54. package/dist/solutions-components/solutions-components.esm.js +1 -1
  55. package/dist/solutions-components/utils/interfaces.ts +5 -0
  56. package/dist/solutions-components/utils/queryUtils.ts +21 -0
  57. package/dist/types/components/crowdsource-manager/crowdsource-manager.d.ts +8 -0
  58. package/dist/types/components/layer-table/layer-table.d.ts +54 -1
  59. package/dist/types/components/map-layer-picker/map-layer-picker.d.ts +15 -1
  60. package/dist/types/components.d.ts +23 -2
  61. package/dist/types/preact.d.ts +2 -1
  62. package/dist/types/utils/interfaces.d.ts +4 -0
  63. package/dist/types/utils/queryUtils.d.ts +11 -0
  64. package/package.json +1 -1
  65. package/dist/solutions-components/p-1b9709ce.entry.js +0 -6
  66. package/dist/solutions-components/p-4f1c4004.entry.js +0 -6
  67. package/dist/solutions-components/p-c556ed60.entry.js +0 -6
@@ -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, g as getLayerOrTable } from './mapViewUtils.js';
10
- import { b as queryAllIds, c as queryFeaturesByGlobalID } from './queryUtils.js';
10
+ import { b as queryFeatureIds, c as queryAllIds, d as queryFeaturesByGlobalID } from './queryUtils.js';
11
11
  import { d as downloadCSV } from './downloadUtils.js';
12
12
  import { d as defineCustomElement$C } from './action.js';
13
13
  import { d as defineCustomElement$B } from './action-bar.js';
@@ -59,6 +59,10 @@ const LayerTable = /*@__PURE__*/ proxyCustomElement(class LayerTable extends HTM
59
59
  * number[]: A list of all IDs for the current layer
60
60
  */
61
61
  this._allIds = [];
62
+ /**
63
+ * boolean: When true the ctrl key is currently pressed
64
+ */
65
+ this._ctrlIsPressed = false;
62
66
  /**
63
67
  * boolean: When true the default global id provided via url param has been honored and should now be ignored
64
68
  */
@@ -67,6 +71,14 @@ const LayerTable = /*@__PURE__*/ proxyCustomElement(class LayerTable extends HTM
67
71
  * boolean: When true the default OID provided via url param has been honored and should now be ignored
68
72
  */
69
73
  this._defaultOidHonored = false;
74
+ /**
75
+ * boolean: When true the shift key is currently pressed
76
+ */
77
+ this._shiftIsPressed = false;
78
+ /**
79
+ * boolean: When true any onChange handeling will be skipped
80
+ */
81
+ this._skipOnChange = false;
70
82
  /**
71
83
  * bool: When true the table is being sorted
72
84
  */
@@ -271,6 +283,8 @@ const LayerTable = /*@__PURE__*/ proxyCustomElement(class LayerTable extends HTM
271
283
  async componentDidLoad() {
272
284
  this._resizeObserver.observe(this._toolbar);
273
285
  document.onclick = (e) => this._handleDocumentClick(e);
286
+ document.onkeydown = (e) => this._handleKeyDown(e);
287
+ document.onkeyup = (e) => this._handleKeyUp(e);
274
288
  }
275
289
  /**
276
290
  * Called after the component is rendered
@@ -325,7 +339,7 @@ const LayerTable = /*@__PURE__*/ proxyCustomElement(class LayerTable extends HTM
325
339
  * @returns The dom node that contains the controls
326
340
  */
327
341
  _getActionBar() {
328
- return (h("calcite-action-bar", { expandDisabled: true, expanded: true, id: this._getId("bar"), layout: "horizontal" }, h("div", { class: "border-end", id: "solutions-map-layer-picker-container" }, h("map-layer-picker", { appearance: "transparent", defaultLayerId: this.defaultLayerId, mapView: this.mapView, onLayerSelectionChange: (evt) => this._layerSelectionChanged(evt), onlyShowUpdatableLayers: this.onlyShowUpdatableLayers, placeholderIcon: "layers", scale: "l", showSingleLayerAsLabel: true, showTables: true, type: "dropdown" })), this._getActions()));
342
+ return (h("calcite-action-bar", { expandDisabled: true, expanded: true, id: this._getId("bar"), layout: "horizontal" }, h("div", { class: "border-end", id: "solutions-map-layer-picker-container" }, h("map-layer-picker", { appearance: "transparent", defaultLayerId: this.defaultLayerId, display: "inline-flex", height: 50, mapView: this.mapView, onLayerSelectionChange: (evt) => this._layerSelectionChanged(evt), onlyShowUpdatableLayers: this.onlyShowUpdatableLayers, placeholderIcon: "layers", scale: "l", showSingleLayerAsLabel: true, showTables: true, type: "dropdown" })), this._getActions()));
329
343
  }
330
344
  /**
331
345
  * Get the actions that are used for various interactions with the table
@@ -750,18 +764,8 @@ const LayerTable = /*@__PURE__*/ proxyCustomElement(class LayerTable extends HTM
750
764
  this._initColumnsInfo();
751
765
  this._checkEditEnabled();
752
766
  await this._table.when(() => {
753
- this._table.highlightIds.on("change", () => {
754
- // https://github.com/Esri/solutions-components/issues/365
755
- this._selectedIndexes = this._table.highlightIds.toArray().reverse();
756
- if (this._showOnlySelected) {
757
- if (this._featuresSelected()) {
758
- this._table.filterBySelection();
759
- }
760
- else {
761
- this._toggleShowSelected();
762
- }
763
- }
764
- this.featureSelectionChange.emit(this._selectedIndexes);
767
+ this._table.highlightIds.on("change", (evt) => {
768
+ void this._handleOnChange(evt);
765
769
  });
766
770
  this.reactiveUtils.watch(() => this._table.activeSortOrders, (sortOrders) => {
767
771
  var _a, _b, _c, _d;
@@ -771,6 +775,93 @@ const LayerTable = /*@__PURE__*/ proxyCustomElement(class LayerTable extends HTM
771
775
  });
772
776
  }
773
777
  }
778
+ async _handleOnChange(evt) {
779
+ const ids = [...this._table.highlightIds.toArray()];
780
+ if (!this._skipOnChange) {
781
+ if (!this._ctrlIsPressed && !this._shiftIsPressed) {
782
+ if (this._selectedIndexes.length > 0) {
783
+ this._skipOnChange = true;
784
+ // only readd in specific case where we have multiple selected and then click one of the currently selected
785
+ const reAdd = this._selectedIndexes.length > 1 && evt.removed.length === 1;
786
+ const newIndexes = reAdd ? evt.removed : ids.filter(id => this._selectedIndexes.indexOf(id) < 0);
787
+ this._clearSelection();
788
+ this._selectedIndexes = [...newIndexes];
789
+ if (newIndexes.length > 0) {
790
+ this._table.highlightIds.add(newIndexes[0]);
791
+ }
792
+ }
793
+ else {
794
+ // https://github.com/Esri/solutions-components/issues/365
795
+ this._selectedIndexes = ids.reverse();
796
+ }
797
+ }
798
+ else if (this._ctrlIsPressed) {
799
+ this._selectedIndexes = ids.reverse();
800
+ }
801
+ else if (this._shiftIsPressed) {
802
+ this._skipOnChange = true;
803
+ this._previousCurrentId = this._currentId;
804
+ this._currentId = [...this._table.highlightIds.toArray()].reverse()[0];
805
+ if (this._previousCurrentId !== this._currentId) {
806
+ // query the layer based on current sort and filters then grab between the current id and previous id
807
+ const orderBy = this._table.activeSortOrders.reduce((prev, cur) => {
808
+ prev.push(`${cur.fieldName} ${cur.direction}`);
809
+ return prev;
810
+ }, []);
811
+ const oids = await queryFeatureIds(this._layer, this._layer.definitionExpression, orderBy);
812
+ let isBetween = false;
813
+ const _start = this._table.viewModel.getObjectIdIndex(this._previousCurrentId);
814
+ const _end = this._table.viewModel.getObjectIdIndex(this._currentId);
815
+ const startIndex = _start < _end ? _start : _end;
816
+ const endIndex = _end > _start ? _end : _start;
817
+ this._selectedIndexes = oids.reduce((prev, cur) => {
818
+ const id = cur;
819
+ const index = this._table.viewModel.getObjectIdIndex(id);
820
+ if ((id === this._currentId || id === this._previousCurrentId)) {
821
+ isBetween = !isBetween;
822
+ if (prev.indexOf(id) < 0) {
823
+ prev.push(id);
824
+ }
825
+ }
826
+ // The oids are sorted so after we have reached the start or end oid add all ids even if the index is -1.
827
+ // Index of -1 will occur for features between the start and and oid if
828
+ // you select a row then scroll faster than the FeatureTable loads the data to select the next id
829
+ if (isBetween && prev.indexOf(id) < 0) {
830
+ prev.push(id);
831
+ }
832
+ // Also add index based check.
833
+ // In some cases the FeatureTable and Layer query will have differences in how null/undefined field values are sorted
834
+ if ((this._selectedIndexes.indexOf(id) > -1 || (index >= startIndex && index <= endIndex)) && prev.indexOf(id) < 0 && index > -1) {
835
+ prev.push(id);
836
+ }
837
+ return prev;
838
+ }, []);
839
+ this._table.highlightIds.addMany(this._selectedIndexes.filter(i => ids.indexOf(i) < 0));
840
+ }
841
+ }
842
+ this._finishOnChange();
843
+ }
844
+ else {
845
+ this._skipOnChange = false;
846
+ }
847
+ this._currentId = [...this._table.highlightIds.toArray()].reverse()[0];
848
+ }
849
+ /**
850
+ * Handle any updates after a selection change has occured and emit the results
851
+ *
852
+ * @returns void
853
+ */
854
+ _finishOnChange() {
855
+ if (this._showOnlySelected) {
856
+ if (this._featuresSelected()) {
857
+ this._table.filterBySelection();
858
+ }
859
+ else {
860
+ this._toggleShowSelected();
861
+ }
862
+ }
863
+ this.featureSelectionChange.emit(this._selectedIndexes);
864
+ }
774
865
  /**
775
866
  * Reset basic table props
776
867
  *
@@ -906,6 +997,24 @@ const LayerTable = /*@__PURE__*/ proxyCustomElement(class LayerTable extends HTM
906
997
  }
907
998
  }
908
999
  }
1000
+ /**
1001
+ * Keep track of key down for ctrl and shift
1002
+ *
1003
+ * @returns void
1004
+ */
1005
+ _handleKeyDown(e) {
1006
+ this._ctrlIsPressed = e.ctrlKey;
1007
+ this._shiftIsPressed = e.shiftKey;
1008
+ }
1009
+ /**
1010
+ * Keep track of key up for ctrl and shift
1011
+ *
1012
+ * @returns void
1013
+ */
1014
+ _handleKeyUp(e) {
1015
+ this._ctrlIsPressed = e.ctrlKey;
1016
+ this._shiftIsPressed = e.shiftKey;
1017
+ }
909
1018
  /**
910
1019
  * Show filter component in modal
911
1020
  *
@@ -913,15 +1022,19 @@ const LayerTable = /*@__PURE__*/ proxyCustomElement(class LayerTable extends HTM
913
1022
  */
914
1023
  _filterModal() {
915
1024
  var _a, _b, _c;
916
- return (h("calcite-modal", { "aria-labelledby": "modal-title", kind: "brand", onCalciteModalClose: () => this._closeFilter(), open: this._filterOpen, widthScale: "s" }, h("div", { class: "display-flex align-center", id: "modal-title", slot: "header" }, (_b = (_a = this._translations) === null || _a === void 0 ? void 0 : _a.filter) === null || _b === void 0 ? void 0 : _b.replace("{{title}}", (_c = this._layer) === null || _c === void 0 ? void 0 : _c.title)), h("div", { slot: "content" }, h("instant-apps-filter-list", { autoUpdateUrl: false, closeBtn: true, closeBtnOnClick: () => this._closeFilter(), layerExpressions: this._layerExpressions, ref: (el) => this._filterList = el, view: this.mapView }))));
1025
+ return (h("calcite-modal", { "aria-labelledby": "modal-title", kind: "brand", onCalciteModalClose: async () => this._closeFilter(), open: this._filterOpen, widthScale: "s" }, h("div", { class: "display-flex align-center", id: "modal-title", slot: "header" }, (_b = (_a = this._translations) === null || _a === void 0 ? void 0 : _a.filter) === null || _b === void 0 ? void 0 : _b.replace("{{title}}", (_c = this._layer) === null || _c === void 0 ? void 0 : _c.title)), h("div", { slot: "content" }, h("instant-apps-filter-list", { autoUpdateUrl: false, closeBtn: true, closeBtnOnClick: async () => this._closeFilter(), layerExpressions: this._layerExpressions, ref: (el) => this._filterList = el, view: this.mapView }))));
917
1026
  }
918
1027
  /**
919
1028
  * Close the filter modal
920
1029
  *
921
1030
  * @returns void
922
1031
  */
923
- _closeFilter() {
924
- this._filterOpen = false;
1032
+ async _closeFilter() {
1033
+ if (this._filterOpen) {
1034
+ // reset allIds
1035
+ this._allIds = await queryAllIds(this._layer);
1036
+ this._filterOpen = false;
1037
+ }
925
1038
  }
926
1039
  /**
927
1040
  * Show delete confirmation message
@@ -994,8 +1107,10 @@ const LayerTable = /*@__PURE__*/ proxyCustomElement(class LayerTable extends HTM
994
1107
  _selectAll() {
995
1108
  const ids = this._allIds;
996
1109
  this._table.highlightIds.removeAll();
1110
+ this._skipOnChange = true;
997
1111
  this._table.highlightIds.addMany(ids);
998
1112
  this._selectedIndexes = ids;
1113
+ this._finishOnChange();
999
1114
  }
1000
1115
  /**
1001
1116
  * Toggle the show only selected flag
@@ -1037,9 +1152,9 @@ const LayerTable = /*@__PURE__*/ proxyCustomElement(class LayerTable extends HTM
1037
1152
  * @returns void
1038
1153
  */
1039
1154
  _initLayerExpressions() {
1040
- var _a;
1041
- const layerExpressions = (_a = this.mapInfo.filterConfig) === null || _a === void 0 ? void 0 : _a.layerExpressions;
1042
- this._layerExpressions = layerExpressions.filter((exp) => exp.id === this._layer.id);
1155
+ var _a, _b;
1156
+ const layerExpressions = (_b = (_a = this.mapInfo) === null || _a === void 0 ? void 0 : _a.filterConfig) === null || _b === void 0 ? void 0 : _b.layerExpressions;
1157
+ this._layerExpressions = layerExpressions ? layerExpressions.filter((exp) => exp.id === this._layer.id) : [];
1043
1158
  }
1044
1159
  /**
1045
1160
  * Select all rows that are not currently selectd
@@ -1055,8 +1170,10 @@ const LayerTable = /*@__PURE__*/ proxyCustomElement(class LayerTable extends HTM
1055
1170
  }
1056
1171
  return prev;
1057
1172
  }, []).sort((a, b) => a - b);
1173
+ this._skipOnChange = true;
1058
1174
  this._table.highlightIds.addMany(ids);
1059
1175
  this._selectedIndexes = ids;
1176
+ this._finishOnChange();
1060
1177
  }
1061
1178
  /**
1062
1179
  * Export all selected rows as CSV
@@ -1142,6 +1259,7 @@ const LayerTable = /*@__PURE__*/ proxyCustomElement(class LayerTable extends HTM
1142
1259
  fieldInfos.some(fieldInfo => {
1143
1260
  if (fieldInfo.name === columnTemplate.fieldName) {
1144
1261
  columnTemplate.label = fieldInfo.alias;
1262
+ columnTemplate.menuConfig = this._getMenuConfig(fieldInfo.name);
1145
1263
  return true;
1146
1264
  }
1147
1265
  });
@@ -1150,12 +1268,48 @@ const LayerTable = /*@__PURE__*/ proxyCustomElement(class LayerTable extends HTM
1150
1268
  return {
1151
1269
  type: "field",
1152
1270
  fieldName: fieldInfo.name,
1153
- label: fieldInfo.alias
1271
+ label: fieldInfo.alias,
1272
+ menuConfig: this._getMenuConfig(fieldInfo.name)
1154
1273
  };
1155
1274
  });
1156
1275
  }
1157
1276
  return columnTemplates;
1158
1277
  }
1278
+ /**
1279
+ * Get the menu config that adds the ability to hide the current column
1280
+ *
1281
+ * @returns void
1282
+ * @protected
1283
+ */
1284
+ _getMenuConfig(name) {
1285
+ return {
1286
+ items: [
1287
+ {
1288
+ label: this._translations.hideField,
1289
+ iconClass: "esri-icon-non-visible",
1290
+ autoCloseMenu: true,
1291
+ clickFunction: () => {
1292
+ this._handleHideClick(name);
1293
+ }
1294
+ }
1295
+ ]
1296
+ };
1297
+ }
1298
+ /**
1299
+ * Hide the table column for the provided name
1300
+ *
1301
+ * @returns void
1302
+ * @protected
1303
+ */
1304
+ _handleHideClick(name) {
1305
+ this._columnsInfo[name] = false;
1306
+ this._table.hideColumn(name);
1307
+ this._table.tableTemplate.columnTemplates.forEach((columnTemplate) => {
1308
+ if (columnTemplate.fieldName === name) {
1309
+ columnTemplate.visible = false;
1310
+ }
1311
+ });
1312
+ }
1159
1313
  /**
1160
1314
  * Fetches the component's translations
1161
1315
  *
@@ -23,12 +23,13 @@ import { d as defineCustomElement$3 } from './option.js';
23
23
  import { d as defineCustomElement$2 } from './select.js';
24
24
  import { d as defineCustomElement$1 } from './tooltip.js';
25
25
 
26
- const mapLayerPickerCss = ":host{display:block}.map-layer-picker-container{width:100%}.map-layer-picker{position:relative;width:100%;display:inline-block}.padding-bottom-1{padding-bottom:1rem}.layer-picker-dropdown{height:100%;width:100%}.max-width-350{max-width:350px}.height-100{height:100%}.disabled{cursor:default !important;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--calcite-opacity-disabled);pointer-events:none}.no-bottom-margin{--calcite-label-margin-bottom:0px}.layer-picker-label-container{align-items:center;display:inline-flex;height:100%;padding-inline-start:1rem;padding-inline-end:1rem}.padding-start-1{padding-inline-start:1rem}.cursor-default{cursor:default}";
26
+ const mapLayerPickerCss = ":host{display:block}.map-layer-picker-container{width:100%;align-items:center}.map-layer-picker{position:relative;width:100%;display:inline-block}.padding-bottom-1{padding-bottom:1rem}.layer-picker-dropdown{height:100%;width:100%}.max-width-350{max-width:350px}.height-100{height:100%}.disabled{cursor:default !important;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--calcite-opacity-disabled);pointer-events:none}.no-bottom-margin{--calcite-label-margin-bottom:0px}.layer-picker-label-container{align-items:center;display:inline-flex;height:100%;padding-inline-start:1rem;padding-inline-end:1rem}.padding-start-1{padding-inline-start:1rem}.cursor-default{cursor:default}";
27
27
 
28
28
  const MapLayerPicker = /*@__PURE__*/ proxyCustomElement(class MapLayerPicker extends HTMLElement {
29
29
  constructor() {
30
30
  super();
31
31
  this.__registerHost();
32
+ this.idsFound = createEvent(this, "idsFound", 7);
32
33
  this.noLayersFound = createEvent(this, "noLayersFound", 7);
33
34
  this.layerSelectionChange = createEvent(this, "layerSelectionChange", 7);
34
35
  //--------------------------------------------------------------------------
@@ -42,8 +43,10 @@ const MapLayerPicker = /*@__PURE__*/ proxyCustomElement(class MapLayerPicker ext
42
43
  this.defaultLayerHonored = false;
43
44
  this.appearance = "transparent";
44
45
  this.defaultLayerId = "";
46
+ this.display = "inline-block";
45
47
  this.enabledLayerIds = [];
46
48
  this.enabledTableIds = [];
49
+ this.height = undefined;
47
50
  this.mapView = undefined;
48
51
  this.onlyShowUpdatableLayers = undefined;
49
52
  this.placeholderIcon = "";
@@ -98,7 +101,9 @@ const MapLayerPicker = /*@__PURE__*/ proxyCustomElement(class MapLayerPicker ext
98
101
  */
99
102
  render() {
100
103
  const id = "map-layer-picker";
101
- return (h(Host, null, h("div", { class: "map-layer-picker-container" }, h("div", { class: "map-layer-picker" }, !this._hasValidLayers ? this._getInvalidPlaceholder() :
104
+ let style = this.height > 0 ? { "height": `${this.height.toString()}px` } : {};
105
+ style = Object.assign(Object.assign({}, style), { "display": this.display });
106
+ return (h(Host, null, h("div", { class: "map-layer-picker-container", style: style }, h("div", { class: "map-layer-picker", style: style }, !this._hasValidLayers ? this._getInvalidPlaceholder() :
102
107
  !this._hasMultipleLayers && this.showSingleLayerAsLabel ? this._getSingleLayerPlaceholder() :
103
108
  this.type === "combobox" ? this._getCombobox(id) :
104
109
  this.type === "select" ? this._getSelect(id) : this._getDropdown(id), h("calcite-tooltip", { label: "", placement: "bottom", "reference-element": id }, h("span", null, this._translations.switchLayer))))));
@@ -235,14 +240,18 @@ const MapLayerPicker = /*@__PURE__*/ proxyCustomElement(class MapLayerPicker ext
235
240
  async _setLayers() {
236
241
  if (this.mapView) {
237
242
  await this._initLayerTableHash();
238
- const mapLayerIds = this.onlyShowUpdatableLayers ?
243
+ const layerIds = this.onlyShowUpdatableLayers ?
239
244
  this._getEditableIds(this._layerNameHash) : Object.keys(this._layerNameHash);
240
- const mapTableIds = this.showTables ? this.onlyShowUpdatableLayers ?
245
+ const tableIds = this.showTables ? this.onlyShowUpdatableLayers ?
241
246
  this._getEditableIds(this._tableNameHash) : Object.keys(this._tableNameHash) : [];
242
247
  this.ids = [
243
- ...mapLayerIds.reverse().filter(n => { var _a; return ((_a = this.enabledLayerIds) === null || _a === void 0 ? void 0 : _a.length) > 0 ? this.enabledLayerIds.reverse().indexOf(n) > -1 : true; }),
244
- ...mapTableIds.reverse().filter(n => { var _a; return ((_a = this.enabledTableIds) === null || _a === void 0 ? void 0 : _a.length) > 0 ? this.enabledTableIds.reverse().indexOf(n) > -1 : true; }),
248
+ ...layerIds.reverse().filter(n => { var _a; return ((_a = this.enabledLayerIds) === null || _a === void 0 ? void 0 : _a.length) > 0 ? this.enabledLayerIds.reverse().indexOf(n) > -1 : true; }),
249
+ ...tableIds.reverse().filter(n => { var _a; return ((_a = this.enabledTableIds) === null || _a === void 0 ? void 0 : _a.length) > 0 ? this.enabledTableIds.reverse().indexOf(n) > -1 : true; }),
245
250
  ];
251
+ this.idsFound.emit({
252
+ layerIds,
253
+ tableIds
254
+ });
246
255
  }
247
256
  }
248
257
  /**
@@ -320,8 +329,10 @@ const MapLayerPicker = /*@__PURE__*/ proxyCustomElement(class MapLayerPicker ext
320
329
  }, [0, "map-layer-picker", {
321
330
  "appearance": [1],
322
331
  "defaultLayerId": [1, "default-layer-id"],
332
+ "display": [1],
323
333
  "enabledLayerIds": [16],
324
334
  "enabledTableIds": [16],
335
+ "height": [2],
325
336
  "mapView": [16],
326
337
  "onlyShowUpdatableLayers": [4, "only-show-updatable-layers"],
327
338
  "placeholderIcon": [1, "placeholder-icon"],
@@ -141,7 +141,7 @@ const MapPicker = /*@__PURE__*/ proxyCustomElement(class MapPicker extends HTMLE
141
141
  * @protected
142
142
  */
143
143
  _getMapNameList(show) {
144
- const listClass = show ? "map-list" : "display-none";
144
+ const listClass = show ? "map-list border-bottom-1" : "display-none";
145
145
  return (h("div", { class: listClass }, h("calcite-list", { id: "mapList", ref: (el) => this._list = el, selectionAppearance: "border", selectionMode: "single" }, this.mapInfos.map(mapInfo => {
146
146
  return (h("calcite-list-item", { label: mapInfo.name, onClick: () => this._webMapSelected(mapInfo), selected: mapInfo.id === this._loadedId, value: mapInfo.id }));
147
147
  }))));
@@ -6,7 +6,7 @@
6
6
  import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
7
7
  import { l as loadModules } from './loadModules.js';
8
8
  import { b as goToSelection, h as highlightFeatures, e as getFeatureLayerView } from './mapViewUtils.js';
9
- import { d as queryObjectIds, g as getQueryGeoms, e as queryFeaturesByGeometry } from './queryUtils.js';
9
+ import { e as queryObjectIds, g as getQueryGeoms, f as queryFeaturesByGeometry } from './queryUtils.js';
10
10
  import { E as EWorkflowType } from './interfaces.js';
11
11
  import { s as state } from './publicNotificationStore.js';
12
12
  import { a as getComponentClosestLanguage, g as getLocaleComponentStrings } from './locale.js';
@@ -122,6 +122,22 @@ async function queryFeaturesByGeometry(start, layer, geometry, featuresCollectio
122
122
  queryFeaturesByGeometry(start += num, layer, geometry, featuresCollection) :
123
123
  Promise.resolve(featuresCollection);
124
124
  }
125
+ /**
126
+ * Query the layer for feature ids that match the provided where clause.
127
+ * If no where clause is provided all features will be returned.
128
+ *
129
+ * @param layer the layer to retrieve features from
130
+ * @param where the where clause for the query
131
+ * @param orderBy any sort order to apply to the query
132
+ *
133
+ * @returns Promise with the ids from the layer that match the where and are sorted as defined by orderBy
134
+ */
135
+ async function queryFeatureIds(layer, where, orderBy) {
136
+ const query = layer.createQuery();
137
+ query.where = where ? where : "1=1";
138
+ query.orderByFields = orderBy;
139
+ return await layer.queryObjectIds(query);
140
+ }
125
141
  /**
126
142
  * Query the layer for the extent of features with the provided OIDs
127
143
  *
@@ -179,4 +195,4 @@ async function _intersectQuery(geometry, layer) {
179
195
  return layer.queryObjectIds(q);
180
196
  }
181
197
 
182
- export { queryExtent as a, queryAllIds as b, queryFeaturesByGlobalID as c, queryObjectIds as d, queryFeaturesByGeometry as e, getQueryGeoms as g, queryFeaturesByID as q };
198
+ export { queryExtent as a, queryFeatureIds as b, queryAllIds as c, queryFeaturesByGlobalID as d, queryObjectIds as e, queryFeaturesByGeometry as f, getQueryGeoms as g, queryFeaturesByID as q };
@@ -6,7 +6,7 @@
6
6
  import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
7
7
  import { e as ESelectionMode, b as EDrawMode, E as EWorkflowType } from './interfaces.js';
8
8
  import { e as getFeatureLayerView, f as getIdSets, i as highlightAllFeatures } from './mapViewUtils.js';
9
- import { e as queryFeaturesByGeometry } from './queryUtils.js';
9
+ import { f as queryFeaturesByGeometry } from './queryUtils.js';
10
10
  import { s as state } from './publicNotificationStore.js';
11
11
  import { g as getLocaleComponentStrings } from './locale.js';
12
12
  import { d as defineCustomElement$s } from './action.js';
@@ -521,7 +521,7 @@ const MapPicker = class {
521
521
  * @protected
522
522
  */
523
523
  _getMapNameList(show) {
524
- const listClass = show ? "map-list" : "display-none";
524
+ const listClass = show ? "map-list border-bottom-1" : "display-none";
525
525
  return (h("div", { class: listClass }, h("calcite-list", { id: "mapList", ref: (el) => this._list = el, selectionAppearance: "border", selectionMode: "single" }, this.mapInfos.map(mapInfo => {
526
526
  return (h("calcite-list-item", { label: mapInfo.name, onClick: () => this._webMapSelected(mapInfo), selected: mapInfo.id === this._loadedId, value: mapInfo.id }));
527
527
  }))));
@@ -13,7 +13,7 @@ import { c as connectMessages, s as setUpMessages, d as disconnectMessages, u as
13
13
  import { K as KindIcons } from './resources-6e00e0d1.js';
14
14
  import { l as loadModules } from './loadModules-cea493da.js';
15
15
  import { g as getLocaleComponentStrings } from './locale-834c52c6.js';
16
- import { l as getAllLayers } from './mapViewUtils-3ff1c264.js';
16
+ import { m as getAllLayers } from './mapViewUtils-066602d5.js';
17
17
  import './guid-36c6c6a5.js';
18
18
  import './resources-cdc36705.js';
19
19
  import './key-af303047.js';
@@ -22,7 +22,7 @@ import { d as debounce } from './debounce-229b1a22.js';
22
22
  import { c as connectConditionalSlotComponent, d as disconnectConditionalSlotComponent } from './conditionalSlot-1149b5cb.js';
23
23
  import { i as isActivationKey } from './key-af303047.js';
24
24
  import { g as getLocaleComponentStrings } from './locale-834c52c6.js';
25
- import { m as getMapLayerHash, n as getMapTableHash } from './mapViewUtils-3ff1c264.js';
25
+ import { n as getMapLayerHash, o as getMapTableHash } from './mapViewUtils-066602d5.js';
26
26
  import { s as state } from './publicNotificationStore-9362d7ae.js';
27
27
  import './resources-cdc36705.js';
28
28
  import './browser-b4c16201.js';
@@ -1895,11 +1895,12 @@ const DropdownItem = class {
1895
1895
  };
1896
1896
  DropdownItem.style = dropdownItemCss;
1897
1897
 
1898
- const mapLayerPickerCss = ":host{display:block}.map-layer-picker-container{width:100%}.map-layer-picker{position:relative;width:100%;display:inline-block}.padding-bottom-1{padding-bottom:1rem}.layer-picker-dropdown{height:100%;width:100%}.max-width-350{max-width:350px}.height-100{height:100%}.disabled{cursor:default !important;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--calcite-opacity-disabled);pointer-events:none}.no-bottom-margin{--calcite-label-margin-bottom:0px}.layer-picker-label-container{align-items:center;display:inline-flex;height:100%;padding-inline-start:1rem;padding-inline-end:1rem}.padding-start-1{padding-inline-start:1rem}.cursor-default{cursor:default}";
1898
+ const mapLayerPickerCss = ":host{display:block}.map-layer-picker-container{width:100%;align-items:center}.map-layer-picker{position:relative;width:100%;display:inline-block}.padding-bottom-1{padding-bottom:1rem}.layer-picker-dropdown{height:100%;width:100%}.max-width-350{max-width:350px}.height-100{height:100%}.disabled{cursor:default !important;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--calcite-opacity-disabled);pointer-events:none}.no-bottom-margin{--calcite-label-margin-bottom:0px}.layer-picker-label-container{align-items:center;display:inline-flex;height:100%;padding-inline-start:1rem;padding-inline-end:1rem}.padding-start-1{padding-inline-start:1rem}.cursor-default{cursor:default}";
1899
1899
 
1900
1900
  const MapLayerPicker = class {
1901
1901
  constructor(hostRef) {
1902
1902
  registerInstance(this, hostRef);
1903
+ this.idsFound = createEvent(this, "idsFound", 7);
1903
1904
  this.noLayersFound = createEvent(this, "noLayersFound", 7);
1904
1905
  this.layerSelectionChange = createEvent(this, "layerSelectionChange", 7);
1905
1906
  //--------------------------------------------------------------------------
@@ -1913,8 +1914,10 @@ const MapLayerPicker = class {
1913
1914
  this.defaultLayerHonored = false;
1914
1915
  this.appearance = "transparent";
1915
1916
  this.defaultLayerId = "";
1917
+ this.display = "inline-block";
1916
1918
  this.enabledLayerIds = [];
1917
1919
  this.enabledTableIds = [];
1920
+ this.height = undefined;
1918
1921
  this.mapView = undefined;
1919
1922
  this.onlyShowUpdatableLayers = undefined;
1920
1923
  this.placeholderIcon = "";
@@ -1969,7 +1972,9 @@ const MapLayerPicker = class {
1969
1972
  */
1970
1973
  render() {
1971
1974
  const id = "map-layer-picker";
1972
- return (h(Host, null, h("div", { class: "map-layer-picker-container" }, h("div", { class: "map-layer-picker" }, !this._hasValidLayers ? this._getInvalidPlaceholder() :
1975
+ let style = this.height > 0 ? { "height": `${this.height.toString()}px` } : {};
1976
+ style = Object.assign(Object.assign({}, style), { "display": this.display });
1977
+ return (h(Host, null, h("div", { class: "map-layer-picker-container", style: style }, h("div", { class: "map-layer-picker", style: style }, !this._hasValidLayers ? this._getInvalidPlaceholder() :
1973
1978
  !this._hasMultipleLayers && this.showSingleLayerAsLabel ? this._getSingleLayerPlaceholder() :
1974
1979
  this.type === "combobox" ? this._getCombobox(id) :
1975
1980
  this.type === "select" ? this._getSelect(id) : this._getDropdown(id), h("calcite-tooltip", { label: "", placement: "bottom", "reference-element": id }, h("span", null, this._translations.switchLayer))))));
@@ -2106,14 +2111,18 @@ const MapLayerPicker = class {
2106
2111
  async _setLayers() {
2107
2112
  if (this.mapView) {
2108
2113
  await this._initLayerTableHash();
2109
- const mapLayerIds = this.onlyShowUpdatableLayers ?
2114
+ const layerIds = this.onlyShowUpdatableLayers ?
2110
2115
  this._getEditableIds(this._layerNameHash) : Object.keys(this._layerNameHash);
2111
- const mapTableIds = this.showTables ? this.onlyShowUpdatableLayers ?
2116
+ const tableIds = this.showTables ? this.onlyShowUpdatableLayers ?
2112
2117
  this._getEditableIds(this._tableNameHash) : Object.keys(this._tableNameHash) : [];
2113
2118
  this.ids = [
2114
- ...mapLayerIds.reverse().filter(n => { var _a; return ((_a = this.enabledLayerIds) === null || _a === void 0 ? void 0 : _a.length) > 0 ? this.enabledLayerIds.reverse().indexOf(n) > -1 : true; }),
2115
- ...mapTableIds.reverse().filter(n => { var _a; return ((_a = this.enabledTableIds) === null || _a === void 0 ? void 0 : _a.length) > 0 ? this.enabledTableIds.reverse().indexOf(n) > -1 : true; }),
2119
+ ...layerIds.reverse().filter(n => { var _a; return ((_a = this.enabledLayerIds) === null || _a === void 0 ? void 0 : _a.length) > 0 ? this.enabledLayerIds.reverse().indexOf(n) > -1 : true; }),
2120
+ ...tableIds.reverse().filter(n => { var _a; return ((_a = this.enabledTableIds) === null || _a === void 0 ? void 0 : _a.length) > 0 ? this.enabledTableIds.reverse().indexOf(n) > -1 : true; }),
2116
2121
  ];
2122
+ this.idsFound.emit({
2123
+ layerIds,
2124
+ tableIds
2125
+ });
2117
2126
  }
2118
2127
  }
2119
2128
  /**