@esri/solutions-components 0.10.12 → 0.10.13
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.
- package/dist/cjs/calcite-alert_4.cjs.entry.js +1 -1
- package/dist/cjs/calcite-flow_6.cjs.entry.js +103 -7
- package/dist/cjs/crowdsource-reporter.cjs.entry.js +173 -43
- package/dist/cjs/feature-list.cjs.entry.js +110 -17
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/{popupUtils-92e52dbf.js → popupUtils-47bd97e7.js} +1 -1
- package/dist/cjs/solutions-components.cjs.js +1 -1
- package/dist/collection/assets/t9n/crowdsource-reporter/resources.json +3 -1
- package/dist/collection/assets/t9n/crowdsource-reporter/resources_en.json +3 -1
- package/dist/collection/assets/t9n/feature-list/resources.json +3 -1
- package/dist/collection/assets/t9n/feature-list/resources_en.json +3 -1
- package/dist/collection/components/create-feature/create-feature.js +145 -2
- package/dist/collection/components/crowdsource-reporter/crowdsource-reporter.js +227 -43
- package/dist/collection/components/feature-list/feature-list.css +16 -1
- package/dist/collection/components/feature-list/feature-list.js +165 -15
- package/dist/collection/components/layer-list/layer-list.js +35 -6
- package/dist/collection/demos/crowdsource-reporter.html +2 -0
- package/dist/collection/utils/popupUtils.js +1 -1
- package/dist/collection/utils/popupUtils.ts +1 -1
- package/dist/components/create-feature2.js +91 -3
- package/dist/components/crowdsource-reporter.js +178 -45
- package/dist/components/feature-list2.js +152 -50
- package/dist/components/layer-list2.js +18 -6
- package/dist/components/popupUtils.js +1 -1
- package/dist/esm/calcite-alert_4.entry.js +1 -1
- package/dist/esm/calcite-flow_6.entry.js +104 -8
- package/dist/esm/crowdsource-reporter.entry.js +173 -43
- package/dist/esm/feature-list.entry.js +110 -17
- package/dist/esm/loader.js +1 -1
- package/dist/esm/{popupUtils-00c655fb.js → popupUtils-349a26e6.js} +1 -1
- package/dist/esm/solutions-components.js +1 -1
- package/dist/solutions-components/assets/t9n/crowdsource-reporter/resources.json +3 -1
- package/dist/solutions-components/assets/t9n/crowdsource-reporter/resources_en.json +3 -1
- package/dist/solutions-components/assets/t9n/feature-list/resources.json +3 -1
- package/dist/solutions-components/assets/t9n/feature-list/resources_en.json +3 -1
- package/dist/solutions-components/demos/crowdsource-reporter.html +2 -0
- package/dist/solutions-components/p-40e305b4.entry.js +17 -0
- package/dist/solutions-components/p-4d44410b.entry.js +6 -0
- package/dist/solutions-components/{p-900fee65.js → p-5a473f0d.js} +1 -1
- package/dist/solutions-components/p-9b83e593.entry.js +6 -0
- package/dist/solutions-components/{p-cde8d6e5.entry.js → p-f6bc95b3.entry.js} +1 -1
- package/dist/solutions-components/solutions-components.esm.js +1 -1
- package/dist/solutions-components/utils/popupUtils.ts +1 -1
- package/dist/types/components/create-feature/create-feature.d.ts +34 -0
- package/dist/types/components/crowdsource-reporter/crowdsource-reporter.d.ts +80 -21
- package/dist/types/components/feature-list/feature-list.d.ts +49 -7
- package/dist/types/components/layer-list/layer-list.d.ts +4 -0
- package/dist/types/components.d.ts +77 -0
- package/package.json +1 -1
- package/dist/solutions-components/p-064e43e0.entry.js +0 -6
- package/dist/solutions-components/p-2d1afda0.entry.js +0 -17
- package/dist/solutions-components/p-c9260b4c.entry.js +0 -6
@@ -37,6 +37,9 @@ export class FeatureList {
|
|
37
37
|
this.showInitialLoading = true;
|
38
38
|
this.showErrorWhenNoFeatures = true;
|
39
39
|
this.showUserImageInList = false;
|
40
|
+
this.showFeatureSymbol = false;
|
41
|
+
this.applyLayerViewFilter = false;
|
42
|
+
this.reportingOptions = undefined;
|
40
43
|
this._featureItems = [];
|
41
44
|
this._featuresCount = 0;
|
42
45
|
this._isLoading = false;
|
@@ -63,6 +66,11 @@ export class FeatureList {
|
|
63
66
|
* Esri config
|
64
67
|
*/
|
65
68
|
esriConfig;
|
69
|
+
/**
|
70
|
+
* "esri/symbols/support/symbolUtils": https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-support-symbolUtils.html
|
71
|
+
* Symbol utils
|
72
|
+
*/
|
73
|
+
symbolUtils;
|
66
74
|
/**
|
67
75
|
* IPopupUtils: To fetch the list label using popup titles
|
68
76
|
*/
|
@@ -79,6 +87,18 @@ export class FeatureList {
|
|
79
87
|
* HTMLCalcitePaginationElement: Calcite pagination element instance
|
80
88
|
*/
|
81
89
|
_pagination;
|
90
|
+
/**
|
91
|
+
* string[]: Valid field types for like
|
92
|
+
*/
|
93
|
+
_validFieldTypes = ["small-integer", "integer", "big-integer", "single", "long"];
|
94
|
+
/**
|
95
|
+
* string: Abbrivated like count of the feature
|
96
|
+
*/
|
97
|
+
_abbreviatedLikeCount;
|
98
|
+
/**
|
99
|
+
* boolean: When true configured like field is available in selected layer
|
100
|
+
*/
|
101
|
+
_likeFieldAvailable = false;
|
82
102
|
//--------------------------------------------------------------------------
|
83
103
|
//
|
84
104
|
// Watch handlers
|
@@ -152,9 +172,9 @@ export class FeatureList {
|
|
152
172
|
* Renders the component.
|
153
173
|
*/
|
154
174
|
render() {
|
155
|
-
return (h("calcite-panel", { key: '
|
156
|
-
h("calcite-notice", { key: '
|
157
|
-
h("div", { key: '
|
175
|
+
return (h("calcite-panel", { key: 'b84cbd9d8c0f4d9d84fe7a49d149b67e88e46c53', "full-height": true, "full-width": true }, this._isLoading && h("calcite-loader", { key: '91ee86a3223b55141206be0d3f20bca1b777e4db', label: "", scale: "m" }), this.showErrorWhenNoFeatures && this._featureItems.length === 0 && !this._isLoading &&
|
176
|
+
h("calcite-notice", { key: '3c3b4a35c45715a86bd17630e8f3f9b566592c27', class: "error-msg", icon: "feature-details", kind: "info", open: true }, h("div", { key: '63a35389ac64f66c706fa05e92fb8f1af8dd0b69', slot: "message" }, this.noFeaturesFoundMsg ? this.noFeaturesFoundMsg : this._translations.featureErrorMsg)), h("calcite-list", { key: 'a237f97a0d286af17cce837bfbdd3c0d868ea023', "selection-appearance": "border", "selection-mode": "none" }, !this._isLoading && this._featureItems.length > 0 && this._featureItems), this._featuresCount > this.pageSize &&
|
177
|
+
h("div", { key: '9cb166b5095167a2004e93217240bea6789e9039', class: "width-full", slot: "footer" }, h("calcite-pagination", { key: 'a413b26dd30fdc89be1d65ef06995604f1430a18', class: "pagination", "full-width": true, onCalcitePaginationChange: this.pageChanged.bind(this), "page-size": this.pageSize, ref: el => this._pagination = el, "start-item": "1", "total-items": this._featuresCount }))));
|
158
178
|
}
|
159
179
|
//--------------------------------------------------------------------------
|
160
180
|
//
|
@@ -162,23 +182,25 @@ export class FeatureList {
|
|
162
182
|
//
|
163
183
|
//--------------------------------------------------------------------------
|
164
184
|
/**
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
185
|
+
* Load esri javascript api modules
|
186
|
+
* @returns Promise resolving when function is done
|
187
|
+
* @protected
|
188
|
+
*/
|
169
189
|
async initModules() {
|
170
|
-
const [Color, esriConfig] = await loadModules([
|
190
|
+
const [Color, esriConfig, symbolUtils] = await loadModules([
|
171
191
|
"esri/Color",
|
172
192
|
"esri/config",
|
193
|
+
"esri/symbols/support/symbolUtils"
|
173
194
|
]);
|
174
195
|
this.Color = Color;
|
175
196
|
this.esriConfig = esriConfig;
|
197
|
+
this.symbolUtils = symbolUtils;
|
176
198
|
}
|
177
199
|
/**
|
178
200
|
* Return the where condition string considering the defined where clause and layer's definition expression
|
179
201
|
* @protected
|
180
202
|
*/
|
181
|
-
getWhereCondition() {
|
203
|
+
async getWhereCondition() {
|
182
204
|
//By Default load all the features
|
183
205
|
let whereClause = '1=1';
|
184
206
|
//if where clause is defined use it
|
@@ -189,6 +211,13 @@ export class FeatureList {
|
|
189
211
|
if (this._selectedLayer?.definitionExpression) {
|
190
212
|
whereClause = whereClause + ' AND ' + this._selectedLayer.definitionExpression;
|
191
213
|
}
|
214
|
+
// if layerview has any applied filter, use it
|
215
|
+
if (this.applyLayerViewFilter) {
|
216
|
+
const selectedLayerView = await getFeatureLayerView(this.mapView, this.selectedLayerId);
|
217
|
+
if (selectedLayerView?.filter?.where) {
|
218
|
+
whereClause = whereClause + ' AND ' + selectedLayerView.filter.where;
|
219
|
+
}
|
220
|
+
}
|
192
221
|
return whereClause;
|
193
222
|
}
|
194
223
|
/**
|
@@ -200,8 +229,9 @@ export class FeatureList {
|
|
200
229
|
void this._pagination?.goTo("start");
|
201
230
|
this._isLoading = this.showInitialLoading;
|
202
231
|
this._featureItems = await this.queryPage(0);
|
232
|
+
const whereCondition = await this.getWhereCondition();
|
203
233
|
const query = {
|
204
|
-
where:
|
234
|
+
where: whereCondition
|
205
235
|
};
|
206
236
|
this._featuresCount = await this._selectedLayer.queryFeatureCount(query);
|
207
237
|
this._isLoading = false;
|
@@ -287,12 +317,13 @@ export class FeatureList {
|
|
287
317
|
const featureLayer = this._selectedLayer;
|
288
318
|
const sortField = this.sortingInfo?.field ? this.sortingInfo.field : featureLayer.objectIdField;
|
289
319
|
const sortOrder = this.sortingInfo?.order ? this.sortingInfo.order : 'desc';
|
320
|
+
const whereCondition = await this.getWhereCondition();
|
290
321
|
const query = {
|
291
322
|
start: page,
|
292
323
|
num: this.pageSize,
|
293
324
|
outFields: ["*"],
|
294
325
|
returnGeometry: true,
|
295
|
-
where:
|
326
|
+
where: whereCondition,
|
296
327
|
outSpatialReference: this.mapView.spatialReference.toJSON()
|
297
328
|
};
|
298
329
|
//sort only when sort field and order is valid
|
@@ -310,10 +341,12 @@ export class FeatureList {
|
|
310
341
|
*/
|
311
342
|
async createFeatureItem(featureSet) {
|
312
343
|
const currentFeatures = featureSet?.features;
|
344
|
+
const showLikeCount = this.reportingOptions && this.reportingOptions[this.selectedLayerId].like;
|
313
345
|
const items = currentFeatures.map(async (feature) => {
|
314
346
|
const popupTitle = await this._popupUtils.getPopupTitle(feature, this.mapView.map);
|
315
347
|
//fetch the feature creator user info to show the creator user image
|
316
348
|
let userInfo;
|
349
|
+
let featureSymbol;
|
317
350
|
if (this.showUserImageInList) {
|
318
351
|
const creatorField = this._selectedLayer.editFieldsInfo?.creatorField.toLowerCase();
|
319
352
|
// if feature's creator field is present then only we can fetch the information of user
|
@@ -321,10 +354,37 @@ export class FeatureList {
|
|
321
354
|
userInfo = await this.getUserInformation(feature, creatorField);
|
322
355
|
}
|
323
356
|
}
|
324
|
-
|
357
|
+
if (this.showFeatureSymbol) {
|
358
|
+
featureSymbol = await this.getFeatureSymbol(feature);
|
359
|
+
}
|
360
|
+
if (showLikeCount) {
|
361
|
+
void this.getAbbreviatedLikeCount(feature);
|
362
|
+
}
|
363
|
+
return this.getFeatureItem(feature, popupTitle, featureSymbol, userInfo);
|
325
364
|
});
|
326
365
|
return Promise.all(items);
|
327
366
|
}
|
367
|
+
/**
|
368
|
+
* Displays the abbrivated like count on the feature list
|
369
|
+
* @param feature feature of the layer
|
370
|
+
* @protected
|
371
|
+
*/
|
372
|
+
getAbbreviatedLikeCount(feature) {
|
373
|
+
const selectedLayer = this._selectedLayer;
|
374
|
+
const likeField = this.reportingOptions[selectedLayer.id].likeField;
|
375
|
+
selectedLayer.fields.forEach((eachField) => {
|
376
|
+
if (this._validFieldTypes.indexOf(eachField.type) > -1) {
|
377
|
+
if (eachField.name === likeField && this.reportingOptions[selectedLayer.id].like) {
|
378
|
+
this._likeFieldAvailable = true;
|
379
|
+
let likes = feature.attributes[likeField] || 0;
|
380
|
+
if (likes > 999) {
|
381
|
+
likes = likes > 999999 ? this._translations.millionsAbbreviation.replace("{{abbreviated_value}}", Math.floor(likes / 1000000).toString()) : this._translations.thousandsAbbreviation.replace("{{abbreviated_value}}", Math.floor(likes / 1000).toString());
|
382
|
+
}
|
383
|
+
this._abbreviatedLikeCount = likes;
|
384
|
+
}
|
385
|
+
}
|
386
|
+
});
|
387
|
+
}
|
328
388
|
/**
|
329
389
|
* Get each feature item
|
330
390
|
* @param selectedFeature Each individual feature instance to be listed
|
@@ -332,15 +392,19 @@ export class FeatureList {
|
|
332
392
|
* @returns individual feature item to be rendered
|
333
393
|
* @protected
|
334
394
|
*/
|
335
|
-
getFeatureItem(selectedFeature, popupTitle, userInfo) {
|
395
|
+
getFeatureItem(selectedFeature, popupTitle, featureSymbol, userInfo) {
|
336
396
|
//get the object id value of the feature
|
337
397
|
const oId = selectedFeature.attributes[this._selectedLayer.objectIdField].toString();
|
338
398
|
//use object id if popupTitle is null or undefined
|
339
399
|
popupTitle = popupTitle ?? oId;
|
400
|
+
// get the formatted like count
|
401
|
+
const formattedLikeCount = Number(selectedFeature.attributes[this.reportingOptions?.[this._selectedLayer.id].likeField]).toLocaleString();
|
340
402
|
const popupTitleClass = this.textSize === 'small' ? 'feature-list-popup-title-small' : 'feature-list-popup-title';
|
341
|
-
const popupTitlePaddingClass = this.showUserImageInList ? 'feature-list-popup-title-padding-reduced' : 'feature-list-popup-title-padding';
|
403
|
+
const popupTitlePaddingClass = this.showUserImageInList || this.showFeatureSymbol ? 'feature-list-popup-title-padding-reduced' : 'feature-list-popup-title-padding';
|
342
404
|
return (h("calcite-list-item", { onCalciteListItemSelect: (e) => { void this.featureClicked(e, selectedFeature); }, onMouseLeave: () => { void this.clearHighlights(); }, onMouseOver: () => { void this.onFeatureHover(selectedFeature); }, value: oId }, this.showUserImageInList &&
|
343
|
-
h("calcite-avatar", { class: 'profile-img', "full-name": userInfo?.fullName, id: userInfo?.id, scale: "m", slot: "content-start", thumbnail: userInfo?.userProfileUrl, username: userInfo?.username }),
|
405
|
+
h("calcite-avatar", { class: 'profile-img', "full-name": userInfo?.fullName, id: userInfo?.id, scale: "m", slot: "content-start", thumbnail: userInfo?.userProfileUrl, username: userInfo?.username }), this.showFeatureSymbol &&
|
406
|
+
h("div", { class: 'feature-symbol', ref: (el) => el && el.appendChild(featureSymbol), slot: "content-start" }), h("div", { class: `${popupTitleClass} ${popupTitlePaddingClass}`, slot: "content-start" }, popupTitle), this._likeFieldAvailable &&
|
407
|
+
h("div", { class: "like-container", id: oId.concat("like"), slot: "content-end" }, h("span", null, this._abbreviatedLikeCount), h("calcite-icon", { icon: "thumbs-up", scale: 's' }), h("calcite-tooltip", { "reference-element": oId.concat("like") }, formattedLikeCount)), h("calcite-icon", { flipRtl: true, icon: "chevron-right", scale: "s", slot: "content-end" })));
|
344
408
|
}
|
345
409
|
/**
|
346
410
|
*
|
@@ -367,6 +431,35 @@ export class FeatureList {
|
|
367
431
|
userInfo.userProfileUrl = userProfileUrl;
|
368
432
|
return userInfo;
|
369
433
|
}
|
434
|
+
/**
|
435
|
+
* Creates a feature symbology
|
436
|
+
* @param feature Each individual feature
|
437
|
+
* @returns Feature symbology
|
438
|
+
* @protected
|
439
|
+
*/
|
440
|
+
async getFeatureSymbol(feature) {
|
441
|
+
const nodeHtml = document.createElement('div');
|
442
|
+
await this.symbolUtils.getDisplayedSymbol(feature).then(async (symbol) => {
|
443
|
+
symbol && await this.symbolUtils?.renderPreviewHTML(symbol, {
|
444
|
+
node: nodeHtml
|
445
|
+
});
|
446
|
+
if (nodeHtml.children?.length) {
|
447
|
+
const imgOrSvgElm = nodeHtml.children[0];
|
448
|
+
if (imgOrSvgElm) {
|
449
|
+
const height = Number(imgOrSvgElm.getAttribute('height'));
|
450
|
+
const width = Number(imgOrSvgElm.getAttribute('width'));
|
451
|
+
if (width > 30) {
|
452
|
+
imgOrSvgElm.setAttribute('width', '30');
|
453
|
+
}
|
454
|
+
else if (width < 19) {
|
455
|
+
imgOrSvgElm.setAttribute('width', '20');
|
456
|
+
}
|
457
|
+
imgOrSvgElm.setAttribute('viewBox', `0 0 ${width} ${height}`);
|
458
|
+
}
|
459
|
+
}
|
460
|
+
});
|
461
|
+
return nodeHtml;
|
462
|
+
}
|
370
463
|
/**
|
371
464
|
* Fetches the component's translations
|
372
465
|
* @returns Promise when complete
|
@@ -606,6 +699,63 @@ export class FeatureList {
|
|
606
699
|
"attribute": "show-user-image-in-list",
|
607
700
|
"reflect": false,
|
608
701
|
"defaultValue": "false"
|
702
|
+
},
|
703
|
+
"showFeatureSymbol": {
|
704
|
+
"type": "boolean",
|
705
|
+
"mutable": false,
|
706
|
+
"complexType": {
|
707
|
+
"original": "boolean",
|
708
|
+
"resolved": "boolean",
|
709
|
+
"references": {}
|
710
|
+
},
|
711
|
+
"required": false,
|
712
|
+
"optional": true,
|
713
|
+
"docs": {
|
714
|
+
"tags": [],
|
715
|
+
"text": "boolean: If true display's feature symbol on each feature item"
|
716
|
+
},
|
717
|
+
"attribute": "show-feature-symbol",
|
718
|
+
"reflect": false,
|
719
|
+
"defaultValue": "false"
|
720
|
+
},
|
721
|
+
"applyLayerViewFilter": {
|
722
|
+
"type": "boolean",
|
723
|
+
"mutable": false,
|
724
|
+
"complexType": {
|
725
|
+
"original": "boolean",
|
726
|
+
"resolved": "boolean",
|
727
|
+
"references": {}
|
728
|
+
},
|
729
|
+
"required": false,
|
730
|
+
"optional": true,
|
731
|
+
"docs": {
|
732
|
+
"tags": [],
|
733
|
+
"text": "boolean: If true will consider the FeatureFilter applied on the layerview"
|
734
|
+
},
|
735
|
+
"attribute": "apply-layer-view-filter",
|
736
|
+
"reflect": false,
|
737
|
+
"defaultValue": "false"
|
738
|
+
},
|
739
|
+
"reportingOptions": {
|
740
|
+
"type": "unknown",
|
741
|
+
"mutable": false,
|
742
|
+
"complexType": {
|
743
|
+
"original": "IReportingOptions",
|
744
|
+
"resolved": "IReportingOptions",
|
745
|
+
"references": {
|
746
|
+
"IReportingOptions": {
|
747
|
+
"location": "import",
|
748
|
+
"path": "../../utils/interfaces",
|
749
|
+
"id": "src/utils/interfaces.ts::IReportingOptions"
|
750
|
+
}
|
751
|
+
}
|
752
|
+
},
|
753
|
+
"required": false,
|
754
|
+
"optional": false,
|
755
|
+
"docs": {
|
756
|
+
"tags": [],
|
757
|
+
"text": "IReportingOptions: Key options for reporting"
|
758
|
+
}
|
609
759
|
}
|
610
760
|
};
|
611
761
|
}
|
@@ -19,7 +19,7 @@
|
|
19
19
|
* limitations under the License.
|
20
20
|
*/
|
21
21
|
import { h, Fragment } from "@stencil/core";
|
22
|
-
import { getAllLayers, getMapLayerHash } from "../../utils/mapViewUtils";
|
22
|
+
import { getAllLayers, getFeatureLayerView, getMapLayerHash } from "../../utils/mapViewUtils";
|
23
23
|
import { getLocaleComponentStrings } from "../../utils/locale";
|
24
24
|
import { formatNumber } from "../../utils/languageUtil";
|
25
25
|
export class LayerList {
|
@@ -28,6 +28,7 @@ export class LayerList {
|
|
28
28
|
this.layers = undefined;
|
29
29
|
this.showFeatureCount = true;
|
30
30
|
this.showNextIcon = false;
|
31
|
+
this.applyLayerViewFilter = false;
|
31
32
|
this._noLayersToDisplay = false;
|
32
33
|
this._mapLayerIds = [];
|
33
34
|
this._isLoading = false;
|
@@ -103,9 +104,9 @@ export class LayerList {
|
|
103
104
|
* Renders the component.
|
104
105
|
*/
|
105
106
|
render() {
|
106
|
-
return (h(Fragment, { key: '
|
107
|
-
h("calcite-notice", { key: '
|
108
|
-
h("calcite-list", { key: '
|
107
|
+
return (h(Fragment, { key: '19f68b9a5d0b6c85832544e4281e1c4a1707ba86' }, this._isLoading && h("calcite-loader", { key: 'c908f311165f8f520f267a0dcde0bd954863ba6b', label: "", scale: "m" }), !this._isLoading && this.mapView && this._noLayersToDisplay &&
|
108
|
+
h("calcite-notice", { key: '56dfb252f998333ed6a671cccddd5683f08ad63d', class: "error-msg", icon: "layers-reference", kind: "danger", open: true }, h("div", { key: 'a27ad45ac2b1984152af5a80da36583f7c375be6', slot: "title" }, this._translations.error), h("div", { key: 'a9466cb560b6ee2c72ebd18130ce21371f9e7cdf', slot: "message" }, this._translations.noLayerToDisplayErrorMsg)), !this._isLoading && this.mapView &&
|
109
|
+
h("calcite-list", { key: '40e54ba92d2f48a97dd0987808f4b7fdefd266bb', "selection-appearance": "border", "selection-mode": "none" }, this.renderLayerList())));
|
109
110
|
}
|
110
111
|
//--------------------------------------------------------------------------
|
111
112
|
//
|
@@ -132,10 +133,20 @@ export class LayerList {
|
|
132
133
|
this._layerItemsHash = await getMapLayerHash(this.mapView, true);
|
133
134
|
const allMapLayers = await getAllLayers(this.mapView);
|
134
135
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
135
|
-
|
136
|
+
for (const eachLayer of allMapLayers) {
|
136
137
|
if (eachLayer?.type === "feature") {
|
137
138
|
if (this.showFeatureCount) {
|
138
139
|
const q = eachLayer.createQuery();
|
140
|
+
//if layer has definitionExpression append it to the where clause
|
141
|
+
if (eachLayer?.definitionExpression) {
|
142
|
+
q.where = q.where + ' AND ' + eachLayer.definitionExpression;
|
143
|
+
}
|
144
|
+
if (this.applyLayerViewFilter) {
|
145
|
+
const featureLayerView = await getFeatureLayerView(this.mapView, eachLayer.id);
|
146
|
+
if (featureLayerView?.filter?.where) {
|
147
|
+
q.where = q.where ? q.where + ' AND ' + featureLayerView.filter.where : featureLayerView.filter.where;
|
148
|
+
}
|
149
|
+
}
|
139
150
|
const result = eachLayer.queryFeatureCount(q);
|
140
151
|
def.push(result);
|
141
152
|
void result.then(async (resCount) => {
|
@@ -148,7 +159,7 @@ export class LayerList {
|
|
148
159
|
});
|
149
160
|
}
|
150
161
|
}
|
151
|
-
}
|
162
|
+
}
|
152
163
|
await Promise.all(def).then(() => {
|
153
164
|
const editableLayerIds = this.getLayersToBeShownInList(this._layerItemsHash);
|
154
165
|
this._mapLayerIds = editableLayerIds.reverse();
|
@@ -302,6 +313,24 @@ export class LayerList {
|
|
302
313
|
"attribute": "show-next-icon",
|
303
314
|
"reflect": false,
|
304
315
|
"defaultValue": "false"
|
316
|
+
},
|
317
|
+
"applyLayerViewFilter": {
|
318
|
+
"type": "boolean",
|
319
|
+
"mutable": false,
|
320
|
+
"complexType": {
|
321
|
+
"original": "boolean",
|
322
|
+
"resolved": "boolean",
|
323
|
+
"references": {}
|
324
|
+
},
|
325
|
+
"required": false,
|
326
|
+
"optional": true,
|
327
|
+
"docs": {
|
328
|
+
"tags": [],
|
329
|
+
"text": "boolean: If true will consider the FeatureFilter applied on the layerview"
|
330
|
+
},
|
331
|
+
"attribute": "apply-layer-view-filter",
|
332
|
+
"reflect": false,
|
333
|
+
"defaultValue": "false"
|
305
334
|
}
|
306
335
|
};
|
307
336
|
}
|
@@ -71,7 +71,7 @@ export class PopupUtils {
|
|
71
71
|
}
|
72
72
|
}
|
73
73
|
//Format field values
|
74
|
-
if (layer.popupTemplate
|
74
|
+
if (layer.popupTemplate?.fieldInfos) {
|
75
75
|
layer.fields.forEach((field) => {
|
76
76
|
const attributeValue = graphic.attributes[field.name];
|
77
77
|
//get the field info from popupTemplate
|
@@ -73,7 +73,7 @@ export class PopupUtils {
|
|
73
73
|
}
|
74
74
|
}
|
75
75
|
//Format field values
|
76
|
-
if (layer.popupTemplate
|
76
|
+
if (layer.popupTemplate?.fieldInfos) {
|
77
77
|
layer.fields.forEach((field) => {
|
78
78
|
const attributeValue = graphic.attributes[field.name];
|
79
79
|
//get the field info from popupTemplate
|
@@ -26,6 +26,8 @@ const CreateFeature = /*@__PURE__*/ proxyCustomElement(class CreateFeature exten
|
|
26
26
|
this.customizeSubmit = false;
|
27
27
|
this.searchConfiguration = undefined;
|
28
28
|
this.isMobile = undefined;
|
29
|
+
this.floorLevel = undefined;
|
30
|
+
this.formElements = undefined;
|
29
31
|
this._editorLoading = false;
|
30
32
|
this._showSearchWidget = undefined;
|
31
33
|
}
|
@@ -40,6 +42,20 @@ const CreateFeature = /*@__PURE__*/ proxyCustomElement(class CreateFeature exten
|
|
40
42
|
* The Editor constructor
|
41
43
|
*/
|
42
44
|
Editor;
|
45
|
+
/**
|
46
|
+
* esri/form/ExpressionInfo: https://developers.arcgis.com/javascript/latest/api-reference/esri-form-ExpressionInfo.html
|
47
|
+
* The ExpressionInfo constructor
|
48
|
+
*/
|
49
|
+
ExpressionInfo;
|
50
|
+
/**
|
51
|
+
* esri/form/elements/FieldElement: https://developers.arcgis.com/javascript/latest/api-reference/esri-form-elements-FieldElement.html
|
52
|
+
* The FieldElement constructor
|
53
|
+
*/
|
54
|
+
FieldElement;
|
55
|
+
/**
|
56
|
+
* esri/form/FormTemplate: https://developers.arcgis.com/javascript/latest/api-reference/esri-form-FormTemplate.html
|
57
|
+
*/
|
58
|
+
FormTemplate;
|
43
59
|
/**
|
44
60
|
* esri/widgets/Editor: https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor.html
|
45
61
|
* The Editor instance
|
@@ -145,6 +161,15 @@ const CreateFeature = /*@__PURE__*/ proxyCustomElement(class CreateFeature exten
|
|
145
161
|
this._editor.viewModel.featureFormViewModel.submit();
|
146
162
|
}
|
147
163
|
}
|
164
|
+
/**
|
165
|
+
* refresh the feature form
|
166
|
+
* @returns Promise that resolves when the operation is complete
|
167
|
+
*/
|
168
|
+
async refresh(floorLevel) {
|
169
|
+
if (this._editor) {
|
170
|
+
void this._setFloorLevel(floorLevel);
|
171
|
+
}
|
172
|
+
}
|
148
173
|
//--------------------------------------------------------------------------
|
149
174
|
//
|
150
175
|
// Events (public)
|
@@ -200,7 +225,7 @@ const CreateFeature = /*@__PURE__*/ proxyCustomElement(class CreateFeature exten
|
|
200
225
|
const loaderClass = this._editorLoading ? "" : "display-none";
|
201
226
|
const featureFormClass = this._editorLoading ? "display-none" : "";
|
202
227
|
const mobileMapClass = this.isMobile ? "show-map" : "display-none";
|
203
|
-
return (h(Fragment, { key: '
|
228
|
+
return (h(Fragment, { key: '47d29e529402482acf3811c37c0cd5a426ed40ed' }, h("calcite-loader", { key: '283b2c6a0f1722c9a8d955e11390e65e6041b247', class: loaderClass, label: "", scale: "s" }), h("div", { key: 'bb596467d5da22882932259db6a9e8029717850b', class: featureFormClass, id: "feature-form" }), h("div", { key: 'c3887f5c5aa92efdcf588da4918933dadb87937f', class: `search-widget ${showSearchWidget} ${featureFormClass}`, id: "search-widget-ref" }), h("div", { key: '566069a6202053468a3cf7a221feb071491eabb4', class: `${mobileMapClass}`, ref: (el) => { this._mapViewContainer = el; } })));
|
204
229
|
}
|
205
230
|
//--------------------------------------------------------------------------
|
206
231
|
//
|
@@ -223,15 +248,21 @@ const CreateFeature = /*@__PURE__*/ proxyCustomElement(class CreateFeature exten
|
|
223
248
|
* @protected
|
224
249
|
*/
|
225
250
|
async initModules() {
|
226
|
-
const [Editor, reactiveUtils, Search, MapView] = await loadModules([
|
251
|
+
const [Editor, reactiveUtils, Search, ExpressionInfo, FieldElement, FormTemplate, MapView] = await loadModules([
|
227
252
|
"esri/widgets/Editor",
|
228
253
|
"esri/core/reactiveUtils",
|
229
254
|
"esri/widgets/Search",
|
255
|
+
"esri/form/ExpressionInfo",
|
256
|
+
"esri/form/elements/FieldElement",
|
257
|
+
"esri/form/FormTemplate",
|
230
258
|
"esri/views/MapView"
|
231
259
|
]);
|
232
260
|
this.Editor = Editor;
|
233
261
|
this.reactiveUtils = reactiveUtils;
|
234
262
|
this.Search = Search;
|
263
|
+
this.ExpressionInfo = ExpressionInfo;
|
264
|
+
this.FieldElement = FieldElement;
|
265
|
+
this.FormTemplate = FormTemplate;
|
235
266
|
this.MapView = MapView;
|
236
267
|
}
|
237
268
|
/**
|
@@ -322,6 +353,7 @@ const CreateFeature = /*@__PURE__*/ proxyCustomElement(class CreateFeature exten
|
|
322
353
|
const formHandle = this.reactiveUtils.watch(() => this._editor.viewModel.featureFormViewModel?.state, (state) => {
|
323
354
|
if (state === 'ready') {
|
324
355
|
this._mapViewContainer?.classList?.replace("show-map", "hide-map");
|
356
|
+
void this._setFloorLevel(this.floorLevel);
|
325
357
|
this._showSearchWidget = false;
|
326
358
|
this.progressStatus.emit(1);
|
327
359
|
this.drawComplete.emit();
|
@@ -466,6 +498,59 @@ const CreateFeature = /*@__PURE__*/ proxyCustomElement(class CreateFeature exten
|
|
466
498
|
}
|
467
499
|
return searchConfiguration;
|
468
500
|
}
|
501
|
+
/**
|
502
|
+
* Add the floor level value to form
|
503
|
+
* @param level selected floor level
|
504
|
+
*
|
505
|
+
* @protected
|
506
|
+
*/
|
507
|
+
async _setFloorLevel(level) {
|
508
|
+
if (!level) {
|
509
|
+
return;
|
510
|
+
}
|
511
|
+
const layer = await getLayerOrTable(this._updatedMapView, this.selectedLayerId);
|
512
|
+
if (layer?.floorInfo?.floorField) {
|
513
|
+
const layerField = layer.fields.find((field) => field.name === layer.floorInfo.floorField);
|
514
|
+
// if layer field is present and form template is not present only then we can set value of floorfield into feature form otherwise create a mannual formtemplate to add the floorfeild element
|
515
|
+
if (layerField && !layer?.formTemplate) {
|
516
|
+
this._editor.viewModel.featureFormViewModel.setValue(layerField.name, level);
|
517
|
+
layerField.editable = false;
|
518
|
+
}
|
519
|
+
else if (layer.formTemplate && this.formElements) {
|
520
|
+
const floorInfoExpression = new this.ExpressionInfo({
|
521
|
+
expression: `"${level}"`,
|
522
|
+
name: "floor-info-test",
|
523
|
+
title: "Floor Info",
|
524
|
+
returnType: "string"
|
525
|
+
});
|
526
|
+
const levelIdFieldElement = new this.FieldElement({
|
527
|
+
label: layer.floorInfo.floorField,
|
528
|
+
editableExpression: 'false',
|
529
|
+
fieldName: layer.floorInfo.floorField,
|
530
|
+
input: {
|
531
|
+
type: "text-box",
|
532
|
+
maxLength: 50,
|
533
|
+
minLength: 0
|
534
|
+
},
|
535
|
+
valueExpression: floorInfoExpression.name
|
536
|
+
});
|
537
|
+
this._updatedMapView.map.editableLayers.forEach((layer) => {
|
538
|
+
const orgElements = this.formElements.orgElements;
|
539
|
+
const orgExpressionInfos = this.formElements.orgExpressionInfos;
|
540
|
+
const elements = [...orgElements];
|
541
|
+
elements.push(levelIdFieldElement);
|
542
|
+
// Creating formtemplate
|
543
|
+
const floorInfoTemplate = new this.FormTemplate({
|
544
|
+
title: layer.formTemplate.title,
|
545
|
+
description: layer.formTemplate.description,
|
546
|
+
elements,
|
547
|
+
expressionInfos: [floorInfoExpression].concat(orgExpressionInfos)
|
548
|
+
});
|
549
|
+
layer.formTemplate = floorInfoTemplate;
|
550
|
+
});
|
551
|
+
}
|
552
|
+
}
|
553
|
+
}
|
469
554
|
/**
|
470
555
|
* Hides the elements of editor widget
|
471
556
|
* @protected
|
@@ -537,10 +622,13 @@ const CreateFeature = /*@__PURE__*/ proxyCustomElement(class CreateFeature exten
|
|
537
622
|
"customizeSubmit": [4, "customize-submit"],
|
538
623
|
"searchConfiguration": [16],
|
539
624
|
"isMobile": [4, "is-mobile"],
|
625
|
+
"floorLevel": [1, "floor-level"],
|
626
|
+
"formElements": [8, "form-elements"],
|
540
627
|
"_editorLoading": [32],
|
541
628
|
"_showSearchWidget": [32],
|
542
629
|
"close": [64],
|
543
|
-
"submit": [64]
|
630
|
+
"submit": [64],
|
631
|
+
"refresh": [64]
|
544
632
|
}, undefined, {
|
545
633
|
"mapView": ["mapViewWatchHandler"],
|
546
634
|
"isMobile": ["isMobileHandler"],
|