@esri/solutions-components 0.7.31 → 0.7.32
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-flow_5.cjs.entry.js +94 -43
- package/dist/cjs/crowdsource-reporter.cjs.entry.js +35 -8
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/solutions-components.cjs.js +1 -1
- package/dist/collection/components/create-feature/create-feature.css +27 -0
- package/dist/collection/components/create-feature/create-feature.js +126 -43
- package/dist/collection/components/crowdsource-reporter/crowdsource-reporter.js +35 -8
- package/dist/collection/demos/create-feature.html +90 -0
- package/dist/components/create-feature2.js +96 -44
- package/dist/components/crowdsource-reporter.js +35 -8
- package/dist/esm/calcite-flow_5.entry.js +95 -44
- package/dist/esm/crowdsource-reporter.entry.js +35 -8
- package/dist/esm/loader.js +1 -1
- package/dist/esm/solutions-components.js +1 -1
- package/dist/solutions-components/demos/create-feature.html +90 -0
- package/dist/solutions-components/p-d5263cb9.entry.js +17 -0
- package/dist/solutions-components/p-ea17cefb.entry.js +6 -0
- package/dist/solutions-components/solutions-components.esm.js +1 -1
- package/dist/types/components/create-feature/create-feature.d.ts +21 -3
- package/dist/types/components/crowdsource-reporter/crowdsource-reporter.d.ts +18 -4
- package/dist/types/components.d.ts +13 -0
- package/dist/types/preact.d.ts +2 -1
- package/package.json +1 -1
- package/dist/solutions-components/p-b4e2cac4.entry.js +0 -17
- package/dist/solutions-components/p-bb6562ab.entry.js +0 -6
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
|
|
7
7
|
import { l as loadModules } from './loadModules.js';
|
|
8
|
-
import {
|
|
8
|
+
import { a as getAllLayers } from './mapViewUtils.js';
|
|
9
9
|
|
|
10
|
-
const createFeatureCss = ":host{display:block}.esri-editor__panel-toolbar{display:none !important}";
|
|
10
|
+
const createFeatureCss = ":host{display:block}.esri-editor__panel-toolbar{display:none !important}.esri-editor__update-actions{display:none !important}.esri-editor__panel-content{padding-block:0px !important}.esri-editor .esri-item-list__group__header{display:none !important}.esri-editor__panel-content__section .esri-widget__heading{display:none !important}.esri-editor .esri-item-list__filter-container--sticky{padding-block:0px !important;padding-inline:10px !important}";
|
|
11
11
|
|
|
12
12
|
const CreateFeature = /*@__PURE__*/ proxyCustomElement(class CreateFeature extends HTMLElement {
|
|
13
13
|
constructor() {
|
|
@@ -16,8 +16,10 @@ const CreateFeature = /*@__PURE__*/ proxyCustomElement(class CreateFeature exten
|
|
|
16
16
|
this.success = createEvent(this, "success", 7);
|
|
17
17
|
this.fail = createEvent(this, "fail", 7);
|
|
18
18
|
this.drawComplete = createEvent(this, "drawComplete", 7);
|
|
19
|
+
this.editingAttachment = createEvent(this, "editingAttachment", 7);
|
|
19
20
|
this.mapView = undefined;
|
|
20
21
|
this.selectedLayerId = undefined;
|
|
22
|
+
this.customizeSubmit = false;
|
|
21
23
|
}
|
|
22
24
|
//--------------------------------------------------------------------------
|
|
23
25
|
//
|
|
@@ -88,18 +90,8 @@ const CreateFeature = /*@__PURE__*/ proxyCustomElement(class CreateFeature exten
|
|
|
88
90
|
* Init Editor widget and starts the create workflow
|
|
89
91
|
*/
|
|
90
92
|
async init() {
|
|
91
|
-
if (this.mapView) {
|
|
92
|
-
|
|
93
|
-
await getLayerOrTable(this.mapView, this.selectedLayerId);
|
|
94
|
-
await this.createEditorWidget();
|
|
95
|
-
await this.startCreate();
|
|
96
|
-
this._editor.viewModel.featureFormViewModel.on('submit', this.submitted.bind(this));
|
|
97
|
-
setTimeout(() => {
|
|
98
|
-
var _a, _b;
|
|
99
|
-
this.el.querySelector('.esri-editor').querySelectorAll('calcite-flow-item')[1].shadowRoot.querySelector('calcite-panel').shadowRoot.querySelector('article').querySelector('header').setAttribute('style', 'display: none');
|
|
100
|
-
(_b = (_a = this.el.querySelector('.esri-editor').querySelectorAll('calcite-flow-item')[1].shadowRoot.querySelector('calcite-panel').shadowRoot.querySelector('article')) === null || _a === void 0 ? void 0 : _a.querySelector('footer')) === null || _b === void 0 ? void 0 : _b.setAttribute('style', 'display: none');
|
|
101
|
-
}, 700);
|
|
102
|
-
}
|
|
93
|
+
if (this.mapView && this.selectedLayerId) {
|
|
94
|
+
await this.createEditorWidget();
|
|
103
95
|
}
|
|
104
96
|
}
|
|
105
97
|
/**
|
|
@@ -108,10 +100,12 @@ const CreateFeature = /*@__PURE__*/ proxyCustomElement(class CreateFeature exten
|
|
|
108
100
|
* @protected
|
|
109
101
|
*/
|
|
110
102
|
async initModules() {
|
|
111
|
-
const [Editor] = await loadModules([
|
|
112
|
-
"esri/widgets/Editor"
|
|
103
|
+
const [Editor, reactiveUtils] = await loadModules([
|
|
104
|
+
"esri/widgets/Editor",
|
|
105
|
+
"esri/core/reactiveUtils"
|
|
113
106
|
]);
|
|
114
107
|
this.Editor = Editor;
|
|
108
|
+
this.reactiveUtils = reactiveUtils;
|
|
115
109
|
}
|
|
116
110
|
/**
|
|
117
111
|
* Display editor widget to create the new feature
|
|
@@ -121,51 +115,105 @@ const CreateFeature = /*@__PURE__*/ proxyCustomElement(class CreateFeature exten
|
|
|
121
115
|
if (this._editor) {
|
|
122
116
|
this._editor.destroy();
|
|
123
117
|
}
|
|
118
|
+
const layerInfos = [];
|
|
124
119
|
const container = document.createElement("div");
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
120
|
+
const allMapLayers = await getAllLayers(this.mapView);
|
|
121
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
122
|
+
allMapLayers.forEach(async (eachLayer) => {
|
|
123
|
+
layerInfos.push({
|
|
124
|
+
layer: eachLayer,
|
|
125
|
+
enabled: (eachLayer === null || eachLayer === void 0 ? void 0 : eachLayer.type) === "feature" && (eachLayer === null || eachLayer === void 0 ? void 0 : eachLayer.id) === this.selectedLayerId,
|
|
126
|
+
addEnabled: true,
|
|
127
|
+
updateEnabled: false,
|
|
128
|
+
deleteEnabled: false // default is true, set to false to disable the ability to delete features
|
|
129
|
+
});
|
|
130
|
+
});
|
|
129
131
|
this._editor = new this.Editor({
|
|
130
132
|
allowedWorkflows: "create-features",
|
|
131
133
|
view: this.mapView,
|
|
132
|
-
layerInfos:
|
|
134
|
+
layerInfos: layerInfos,
|
|
133
135
|
visibleElements: {
|
|
134
|
-
snappingControls: false
|
|
135
|
-
snappingControlsElements: {
|
|
136
|
-
featureEnabledToggle: false,
|
|
137
|
-
layerList: false,
|
|
138
|
-
enabledToggle: false
|
|
139
|
-
}
|
|
136
|
+
snappingControls: false
|
|
140
137
|
},
|
|
141
|
-
container
|
|
138
|
+
container
|
|
142
139
|
});
|
|
143
140
|
this.el.appendChild(container);
|
|
141
|
+
//Add handle to watch if attachments are added/edited
|
|
142
|
+
const attachmentHandle = this.reactiveUtils.watch(() => this._editor.viewModel.state, (state) => {
|
|
143
|
+
if (state === 'adding-attachment' || state === 'editing-attachment') {
|
|
144
|
+
this._addingAttachment = true;
|
|
145
|
+
this.editingAttachment.emit(true);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
if (this._addingAttachment) {
|
|
149
|
+
this.editingAttachment.emit(false);
|
|
150
|
+
this._addingAttachment = false;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
this._editor.viewModel.addHandles(attachmentHandle);
|
|
155
|
+
//Add handle to watch featureTemplatesViewModel ready state and then start the creation
|
|
156
|
+
const handle = this.reactiveUtils.watch(() => this._editor.viewModel.featureTemplatesViewModel.state, (state) => {
|
|
157
|
+
if (state === 'ready') {
|
|
158
|
+
void this.startCreate();
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
this._editor.viewModel.addHandles(handle);
|
|
144
162
|
}
|
|
145
163
|
/**
|
|
146
164
|
* Start creating the feature
|
|
147
165
|
* @protected
|
|
148
166
|
*/
|
|
149
167
|
async startCreate() {
|
|
150
|
-
var _a
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
168
|
+
var _a;
|
|
169
|
+
if ((_a = this._editor.viewModel.featureTemplatesViewModel.items) === null || _a === void 0 ? void 0 : _a.length) {
|
|
170
|
+
const items = this._editor.viewModel.featureTemplatesViewModel.items[0].get("items");
|
|
171
|
+
//once the feature template is selected handle the event for formSubmit and sketch complete
|
|
172
|
+
//also, hide the headers and footer in the editor as we will be showing our own submit and cancel button
|
|
173
|
+
this._editor.viewModel.featureTemplatesViewModel.on('select', () => {
|
|
174
|
+
setTimeout(() => {
|
|
175
|
+
//on form submit
|
|
176
|
+
this._editor.viewModel.featureFormViewModel.on('submit', this.submitted.bind(this));
|
|
177
|
+
//on sketch complete emit the event
|
|
178
|
+
this._editor.viewModel.sketchViewModel.on("create", (evt) => {
|
|
179
|
+
if (evt.state === "complete") {
|
|
180
|
+
this.drawComplete.emit();
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
this.hideEditorsElements();
|
|
184
|
+
}, 700);
|
|
185
|
+
this.hideEditorsElements();
|
|
166
186
|
});
|
|
187
|
+
//if only one feature template then directly start geometry creation for that
|
|
188
|
+
//else allow feature template selection to user
|
|
189
|
+
if (items.length === 1) {
|
|
190
|
+
this._editor.viewModel.featureTemplatesViewModel.select(items[0]);
|
|
191
|
+
}
|
|
192
|
+
//hides the header and footer elements in editor widget
|
|
193
|
+
this.hideEditorsElements();
|
|
167
194
|
}
|
|
168
195
|
}
|
|
196
|
+
/**
|
|
197
|
+
* Hides the elements of editor widget
|
|
198
|
+
* @protected
|
|
199
|
+
*/
|
|
200
|
+
hideEditorsElements() {
|
|
201
|
+
if (!this.customizeSubmit) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
setTimeout(() => {
|
|
205
|
+
var _a;
|
|
206
|
+
//hides the header and footer on the featureForm
|
|
207
|
+
(_a = this.el.querySelector('.esri-editor').querySelectorAll('calcite-flow-item')) === null || _a === void 0 ? void 0 : _a.forEach((flowItem) => {
|
|
208
|
+
var _a, _b, _c, _d, _e;
|
|
209
|
+
const article = (_c = (_b = (_a = flowItem.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('calcite-panel')) === null || _b === void 0 ? void 0 : _b.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('article');
|
|
210
|
+
//hide the header
|
|
211
|
+
(_d = article === null || article === void 0 ? void 0 : article.querySelector('header')) === null || _d === void 0 ? void 0 : _d.setAttribute('style', 'display: none');
|
|
212
|
+
//hide the footer
|
|
213
|
+
(_e = article === null || article === void 0 ? void 0 : article.querySelector('footer')) === null || _e === void 0 ? void 0 : _e.setAttribute('style', 'display: none');
|
|
214
|
+
});
|
|
215
|
+
}, 700);
|
|
216
|
+
}
|
|
169
217
|
/**
|
|
170
218
|
* On creation of feature emit the event that the feature is created
|
|
171
219
|
* @param evt feature submit event
|
|
@@ -173,9 +221,12 @@ const CreateFeature = /*@__PURE__*/ proxyCustomElement(class CreateFeature exten
|
|
|
173
221
|
*/
|
|
174
222
|
async submitted(evt) {
|
|
175
223
|
var _a;
|
|
224
|
+
//return if any attribute is invalid , focus will be shifted to the invalid attribute in feature form
|
|
176
225
|
if (evt.invalid.length) {
|
|
177
226
|
return;
|
|
178
227
|
}
|
|
228
|
+
//Submit only when valid attributes
|
|
229
|
+
//emit success or fail based on the result
|
|
179
230
|
if (evt.valid.length) {
|
|
180
231
|
try {
|
|
181
232
|
await this._editor.activeWorkflow.commit();
|
|
@@ -203,6 +254,7 @@ const CreateFeature = /*@__PURE__*/ proxyCustomElement(class CreateFeature exten
|
|
|
203
254
|
}, [0, "create-feature", {
|
|
204
255
|
"mapView": [16],
|
|
205
256
|
"selectedLayerId": [1, "selected-layer-id"],
|
|
257
|
+
"customizeSubmit": [4, "customize-submit"],
|
|
206
258
|
"close": [64],
|
|
207
259
|
"submit": [64]
|
|
208
260
|
}, undefined, {
|
|
@@ -110,6 +110,7 @@ const CrowdsourceReporter$1 = /*@__PURE__*/ proxyCustomElement(class Crowdsource
|
|
|
110
110
|
* @returns Promise when complete
|
|
111
111
|
*/
|
|
112
112
|
async componentWillLoad() {
|
|
113
|
+
this._urlParamsLoaded = false;
|
|
113
114
|
await this._initModules();
|
|
114
115
|
await this._getTranslations();
|
|
115
116
|
}
|
|
@@ -146,6 +147,11 @@ const CrowdsourceReporter$1 = /*@__PURE__*/ proxyCustomElement(class Crowdsource
|
|
|
146
147
|
setSelectedLayer(layerId, layerName) {
|
|
147
148
|
this._selectedLayerId = layerId;
|
|
148
149
|
this._selectedLayerName = layerName;
|
|
150
|
+
//show only current layer on map and hide other valid editable layers
|
|
151
|
+
//if layerId is empty then show all the layers on map
|
|
152
|
+
this._validLayers.forEach(layer => {
|
|
153
|
+
layer.set('visible', !layerId || (layer.id === layerId));
|
|
154
|
+
});
|
|
149
155
|
}
|
|
150
156
|
/**
|
|
151
157
|
* Get the reporter app functionality
|
|
@@ -202,15 +208,22 @@ const CrowdsourceReporter$1 = /*@__PURE__*/ proxyCustomElement(class Crowdsource
|
|
|
202
208
|
* @protected
|
|
203
209
|
*/
|
|
204
210
|
getFeatureCreateFlowItem() {
|
|
205
|
-
return (h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: this._selectedLayerName, onCalciteFlowItemBack: this.backFromCreateFeaturePanel.bind(this) }, this.isMobile && this.getActionToExpandCollapsePanel(), this._showSubmitCancelButton && h("div", { class: "width-full", slot: "footer" }, h("calcite-button", { appearance: "secondary", class: "footer-top-button footer-button", onClick: this.onSubmitButtonClick.bind(this), width: "full" }, this._translations.submit), h("calcite-button", { appearance: "outline", class: "footer-button", onClick: this.backFromCreateFeaturePanel.bind(this), width: "full" }, this._translations.cancel)), h("calcite-panel", { "full-height": true, "full-width": true }, h("calcite-notice", { class: "notice-msg", icon: "lightbulb", kind: "success", open: true }, h("div", { slot: "message" }, this._translations.featureEditFormInfoMsg)), h("create-feature", { mapView: this.mapView, onDrawComplete: this.showSubmitCancelButton.bind(this), onFail: this.createFeatureFailed.bind(this), onSuccess: this.
|
|
211
|
+
return (h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: this._selectedLayerName, onCalciteFlowItemBack: this.backFromCreateFeaturePanel.bind(this) }, this.isMobile && this.getActionToExpandCollapsePanel(), this._showSubmitCancelButton && h("div", { class: "width-full", slot: "footer" }, h("calcite-button", { appearance: "secondary", class: "footer-top-button footer-button", onClick: this.onSubmitButtonClick.bind(this), width: "full" }, this._translations.submit), h("calcite-button", { appearance: "outline", class: "footer-button", onClick: this.backFromCreateFeaturePanel.bind(this), width: "full" }, this._translations.cancel)), h("calcite-panel", { "full-height": true, "full-width": true }, h("calcite-notice", { class: "notice-msg", icon: "lightbulb", kind: "success", open: true }, h("div", { slot: "message" }, this._translations.featureEditFormInfoMsg)), h("create-feature", { customizeSubmit: true, mapView: this.mapView, onDrawComplete: this.onDrawComplete.bind(this), onEditingAttachment: this.showSubmitCancelButton.bind(this), onFail: this.createFeatureFailed.bind(this), onSuccess: this.onReportSubmitted.bind(this), ref: el => this._createFeature = el, selectedLayerId: this._selectedLayerId }))));
|
|
206
212
|
}
|
|
207
213
|
/**
|
|
208
214
|
* When drawing of incident location completed on map show the submit and cancel button
|
|
209
215
|
* @protected
|
|
210
216
|
*/
|
|
211
|
-
|
|
217
|
+
onDrawComplete() {
|
|
212
218
|
this._showSubmitCancelButton = true;
|
|
213
219
|
}
|
|
220
|
+
/**
|
|
221
|
+
* When Add attachment panel is enabled hide the submit and cancel button
|
|
222
|
+
* @protected
|
|
223
|
+
*/
|
|
224
|
+
showSubmitCancelButton(evt) {
|
|
225
|
+
this._showSubmitCancelButton = !evt.detail;
|
|
226
|
+
}
|
|
214
227
|
/**
|
|
215
228
|
* On back from create feature, call submit editor to destroy the Editor widget instance
|
|
216
229
|
* @protected
|
|
@@ -243,11 +256,22 @@ const CrowdsourceReporter$1 = /*@__PURE__*/ proxyCustomElement(class Crowdsource
|
|
|
243
256
|
* On submit report navigate to the layer list home page and refresh the layer list
|
|
244
257
|
* @protected
|
|
245
258
|
*/
|
|
246
|
-
|
|
259
|
+
onReportSubmitted() {
|
|
247
260
|
this._reportSubmitted = true;
|
|
261
|
+
this.navigateToHomePage();
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Navigates to layer-list
|
|
265
|
+
* @protected
|
|
266
|
+
*/
|
|
267
|
+
navigateToHomePage() {
|
|
268
|
+
if (this._createFeature) {
|
|
269
|
+
this._createFeature.close();
|
|
270
|
+
}
|
|
248
271
|
if (this._layerList) {
|
|
249
272
|
this._layerList.refresh();
|
|
250
273
|
}
|
|
274
|
+
this.setSelectedFeatures([]);
|
|
251
275
|
this._flowItems = ["layer-list"];
|
|
252
276
|
}
|
|
253
277
|
/**
|
|
@@ -293,7 +317,10 @@ const CrowdsourceReporter$1 = /*@__PURE__*/ proxyCustomElement(class Crowdsource
|
|
|
293
317
|
//update the has valid layer state
|
|
294
318
|
this._hasValidLayers = layersListed.length > 0;
|
|
295
319
|
//navigate to the feature details if URL params found
|
|
296
|
-
|
|
320
|
+
if (!this._urlParamsLoaded) {
|
|
321
|
+
this._urlParamsLoaded = true;
|
|
322
|
+
await this.loadFeatureFromURLParams();
|
|
323
|
+
}
|
|
297
324
|
}
|
|
298
325
|
/**On click of layer list item show feature list
|
|
299
326
|
* @param evt Event which has details of selected layerId and layerName
|
|
@@ -310,10 +337,10 @@ const CrowdsourceReporter$1 = /*@__PURE__*/ proxyCustomElement(class Crowdsource
|
|
|
310
337
|
backFromSelectedPanel() {
|
|
311
338
|
const updatedFlowItems = [...this._flowItems];
|
|
312
339
|
updatedFlowItems.pop();
|
|
313
|
-
//
|
|
340
|
+
//Back to layer list, and return as the flowItems will be reset in navigateToHomePage
|
|
314
341
|
if (updatedFlowItems.length === 1) {
|
|
315
|
-
this.
|
|
316
|
-
|
|
342
|
+
this.navigateToHomePage();
|
|
343
|
+
return;
|
|
317
344
|
}
|
|
318
345
|
this._flowItems = [...updatedFlowItems];
|
|
319
346
|
}
|
|
@@ -462,7 +489,6 @@ const CrowdsourceReporter$1 = /*@__PURE__*/ proxyCustomElement(class Crowdsource
|
|
|
462
489
|
}
|
|
463
490
|
/**
|
|
464
491
|
* Updates the share url for current selected feature
|
|
465
|
-
* @returns
|
|
466
492
|
* @protected
|
|
467
493
|
*/
|
|
468
494
|
_updateShareURL() {
|
|
@@ -491,6 +517,7 @@ const CrowdsourceReporter$1 = /*@__PURE__*/ proxyCustomElement(class Crowdsource
|
|
|
491
517
|
}
|
|
492
518
|
/**
|
|
493
519
|
* Navigates to selected features detail based on the URL params
|
|
520
|
+
* @protected
|
|
494
521
|
*/
|
|
495
522
|
async loadFeatureFromURLParams() {
|
|
496
523
|
if (this.layerId && this.objectId) {
|
|
@@ -12,7 +12,7 @@ import { c as connectLocalized, d as disconnectLocalized } from './locale-6107ef
|
|
|
12
12
|
import { c as connectMessages, s as setUpMessages, d as disconnectMessages, u as updateMessages } from './t9n-f16911e7.js';
|
|
13
13
|
import { S as SLOTS$1 } from './resources-649a0f91.js';
|
|
14
14
|
import { l as loadModules, g as getLocaleComponentStrings, f as formatNumber } from './locale-731e75a8.js';
|
|
15
|
-
import { g as getLayerOrTable, c as getFeatureLayerView, h as highlightFeatures, d as getMapLayerHash
|
|
15
|
+
import { a as getAllLayers, g as getLayerOrTable, c as getFeatureLayerView, h as highlightFeatures, d as getMapLayerHash } from './mapViewUtils-cf05e880.js';
|
|
16
16
|
import { P as PopupUtils } from './popupUtils-d75edf93.js';
|
|
17
17
|
import './guid-36c6c6a5.js';
|
|
18
18
|
import './resources-cdc36705.js';
|
|
@@ -335,7 +335,7 @@ const FlowItem = class {
|
|
|
335
335
|
};
|
|
336
336
|
FlowItem.style = flowItemCss;
|
|
337
337
|
|
|
338
|
-
const createFeatureCss = ":host{display:block}.esri-editor__panel-toolbar{display:none !important}";
|
|
338
|
+
const createFeatureCss = ":host{display:block}.esri-editor__panel-toolbar{display:none !important}.esri-editor__update-actions{display:none !important}.esri-editor__panel-content{padding-block:0px !important}.esri-editor .esri-item-list__group__header{display:none !important}.esri-editor__panel-content__section .esri-widget__heading{display:none !important}.esri-editor .esri-item-list__filter-container--sticky{padding-block:0px !important;padding-inline:10px !important}";
|
|
339
339
|
|
|
340
340
|
const CreateFeature = class {
|
|
341
341
|
constructor(hostRef) {
|
|
@@ -343,8 +343,10 @@ const CreateFeature = class {
|
|
|
343
343
|
this.success = createEvent(this, "success", 7);
|
|
344
344
|
this.fail = createEvent(this, "fail", 7);
|
|
345
345
|
this.drawComplete = createEvent(this, "drawComplete", 7);
|
|
346
|
+
this.editingAttachment = createEvent(this, "editingAttachment", 7);
|
|
346
347
|
this.mapView = undefined;
|
|
347
348
|
this.selectedLayerId = undefined;
|
|
349
|
+
this.customizeSubmit = false;
|
|
348
350
|
}
|
|
349
351
|
//--------------------------------------------------------------------------
|
|
350
352
|
//
|
|
@@ -415,18 +417,8 @@ const CreateFeature = class {
|
|
|
415
417
|
* Init Editor widget and starts the create workflow
|
|
416
418
|
*/
|
|
417
419
|
async init() {
|
|
418
|
-
if (this.mapView) {
|
|
419
|
-
|
|
420
|
-
await getLayerOrTable(this.mapView, this.selectedLayerId);
|
|
421
|
-
await this.createEditorWidget();
|
|
422
|
-
await this.startCreate();
|
|
423
|
-
this._editor.viewModel.featureFormViewModel.on('submit', this.submitted.bind(this));
|
|
424
|
-
setTimeout(() => {
|
|
425
|
-
var _a, _b;
|
|
426
|
-
this.el.querySelector('.esri-editor').querySelectorAll('calcite-flow-item')[1].shadowRoot.querySelector('calcite-panel').shadowRoot.querySelector('article').querySelector('header').setAttribute('style', 'display: none');
|
|
427
|
-
(_b = (_a = this.el.querySelector('.esri-editor').querySelectorAll('calcite-flow-item')[1].shadowRoot.querySelector('calcite-panel').shadowRoot.querySelector('article')) === null || _a === void 0 ? void 0 : _a.querySelector('footer')) === null || _b === void 0 ? void 0 : _b.setAttribute('style', 'display: none');
|
|
428
|
-
}, 700);
|
|
429
|
-
}
|
|
420
|
+
if (this.mapView && this.selectedLayerId) {
|
|
421
|
+
await this.createEditorWidget();
|
|
430
422
|
}
|
|
431
423
|
}
|
|
432
424
|
/**
|
|
@@ -435,10 +427,12 @@ const CreateFeature = class {
|
|
|
435
427
|
* @protected
|
|
436
428
|
*/
|
|
437
429
|
async initModules() {
|
|
438
|
-
const [Editor] = await loadModules([
|
|
439
|
-
"esri/widgets/Editor"
|
|
430
|
+
const [Editor, reactiveUtils] = await loadModules([
|
|
431
|
+
"esri/widgets/Editor",
|
|
432
|
+
"esri/core/reactiveUtils"
|
|
440
433
|
]);
|
|
441
434
|
this.Editor = Editor;
|
|
435
|
+
this.reactiveUtils = reactiveUtils;
|
|
442
436
|
}
|
|
443
437
|
/**
|
|
444
438
|
* Display editor widget to create the new feature
|
|
@@ -448,50 +442,104 @@ const CreateFeature = class {
|
|
|
448
442
|
if (this._editor) {
|
|
449
443
|
this._editor.destroy();
|
|
450
444
|
}
|
|
445
|
+
const layerInfos = [];
|
|
451
446
|
const container = document.createElement("div");
|
|
452
|
-
const
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
447
|
+
const allMapLayers = await getAllLayers(this.mapView);
|
|
448
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
449
|
+
allMapLayers.forEach(async (eachLayer) => {
|
|
450
|
+
layerInfos.push({
|
|
451
|
+
layer: eachLayer,
|
|
452
|
+
enabled: (eachLayer === null || eachLayer === void 0 ? void 0 : eachLayer.type) === "feature" && (eachLayer === null || eachLayer === void 0 ? void 0 : eachLayer.id) === this.selectedLayerId,
|
|
453
|
+
addEnabled: true,
|
|
454
|
+
updateEnabled: false,
|
|
455
|
+
deleteEnabled: false // default is true, set to false to disable the ability to delete features
|
|
456
|
+
});
|
|
457
|
+
});
|
|
456
458
|
this._editor = new this.Editor({
|
|
457
459
|
allowedWorkflows: "create-features",
|
|
458
460
|
view: this.mapView,
|
|
459
|
-
layerInfos:
|
|
461
|
+
layerInfos: layerInfos,
|
|
460
462
|
visibleElements: {
|
|
461
|
-
snappingControls: false
|
|
462
|
-
snappingControlsElements: {
|
|
463
|
-
featureEnabledToggle: false,
|
|
464
|
-
layerList: false,
|
|
465
|
-
enabledToggle: false
|
|
466
|
-
}
|
|
463
|
+
snappingControls: false
|
|
467
464
|
},
|
|
468
|
-
container
|
|
465
|
+
container
|
|
469
466
|
});
|
|
470
467
|
this.el.appendChild(container);
|
|
468
|
+
//Add handle to watch if attachments are added/edited
|
|
469
|
+
const attachmentHandle = this.reactiveUtils.watch(() => this._editor.viewModel.state, (state) => {
|
|
470
|
+
if (state === 'adding-attachment' || state === 'editing-attachment') {
|
|
471
|
+
this._addingAttachment = true;
|
|
472
|
+
this.editingAttachment.emit(true);
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
if (this._addingAttachment) {
|
|
476
|
+
this.editingAttachment.emit(false);
|
|
477
|
+
this._addingAttachment = false;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
});
|
|
481
|
+
this._editor.viewModel.addHandles(attachmentHandle);
|
|
482
|
+
//Add handle to watch featureTemplatesViewModel ready state and then start the creation
|
|
483
|
+
const handle = this.reactiveUtils.watch(() => this._editor.viewModel.featureTemplatesViewModel.state, (state) => {
|
|
484
|
+
if (state === 'ready') {
|
|
485
|
+
void this.startCreate();
|
|
486
|
+
}
|
|
487
|
+
});
|
|
488
|
+
this._editor.viewModel.addHandles(handle);
|
|
471
489
|
}
|
|
472
490
|
/**
|
|
473
491
|
* Start creating the feature
|
|
474
492
|
* @protected
|
|
475
493
|
*/
|
|
476
494
|
async startCreate() {
|
|
477
|
-
var _a
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
495
|
+
var _a;
|
|
496
|
+
if ((_a = this._editor.viewModel.featureTemplatesViewModel.items) === null || _a === void 0 ? void 0 : _a.length) {
|
|
497
|
+
const items = this._editor.viewModel.featureTemplatesViewModel.items[0].get("items");
|
|
498
|
+
//once the feature template is selected handle the event for formSubmit and sketch complete
|
|
499
|
+
//also, hide the headers and footer in the editor as we will be showing our own submit and cancel button
|
|
500
|
+
this._editor.viewModel.featureTemplatesViewModel.on('select', () => {
|
|
501
|
+
setTimeout(() => {
|
|
502
|
+
//on form submit
|
|
503
|
+
this._editor.viewModel.featureFormViewModel.on('submit', this.submitted.bind(this));
|
|
504
|
+
//on sketch complete emit the event
|
|
505
|
+
this._editor.viewModel.sketchViewModel.on("create", (evt) => {
|
|
506
|
+
if (evt.state === "complete") {
|
|
507
|
+
this.drawComplete.emit();
|
|
508
|
+
}
|
|
509
|
+
});
|
|
510
|
+
this.hideEditorsElements();
|
|
511
|
+
}, 700);
|
|
512
|
+
this.hideEditorsElements();
|
|
493
513
|
});
|
|
514
|
+
//if only one feature template then directly start geometry creation for that
|
|
515
|
+
//else allow feature template selection to user
|
|
516
|
+
if (items.length === 1) {
|
|
517
|
+
this._editor.viewModel.featureTemplatesViewModel.select(items[0]);
|
|
518
|
+
}
|
|
519
|
+
//hides the header and footer elements in editor widget
|
|
520
|
+
this.hideEditorsElements();
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Hides the elements of editor widget
|
|
525
|
+
* @protected
|
|
526
|
+
*/
|
|
527
|
+
hideEditorsElements() {
|
|
528
|
+
if (!this.customizeSubmit) {
|
|
529
|
+
return;
|
|
494
530
|
}
|
|
531
|
+
setTimeout(() => {
|
|
532
|
+
var _a;
|
|
533
|
+
//hides the header and footer on the featureForm
|
|
534
|
+
(_a = this.el.querySelector('.esri-editor').querySelectorAll('calcite-flow-item')) === null || _a === void 0 ? void 0 : _a.forEach((flowItem) => {
|
|
535
|
+
var _a, _b, _c, _d, _e;
|
|
536
|
+
const article = (_c = (_b = (_a = flowItem.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('calcite-panel')) === null || _b === void 0 ? void 0 : _b.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('article');
|
|
537
|
+
//hide the header
|
|
538
|
+
(_d = article === null || article === void 0 ? void 0 : article.querySelector('header')) === null || _d === void 0 ? void 0 : _d.setAttribute('style', 'display: none');
|
|
539
|
+
//hide the footer
|
|
540
|
+
(_e = article === null || article === void 0 ? void 0 : article.querySelector('footer')) === null || _e === void 0 ? void 0 : _e.setAttribute('style', 'display: none');
|
|
541
|
+
});
|
|
542
|
+
}, 700);
|
|
495
543
|
}
|
|
496
544
|
/**
|
|
497
545
|
* On creation of feature emit the event that the feature is created
|
|
@@ -500,9 +548,12 @@ const CreateFeature = class {
|
|
|
500
548
|
*/
|
|
501
549
|
async submitted(evt) {
|
|
502
550
|
var _a;
|
|
551
|
+
//return if any attribute is invalid , focus will be shifted to the invalid attribute in feature form
|
|
503
552
|
if (evt.invalid.length) {
|
|
504
553
|
return;
|
|
505
554
|
}
|
|
555
|
+
//Submit only when valid attributes
|
|
556
|
+
//emit success or fail based on the result
|
|
506
557
|
if (evt.valid.length) {
|
|
507
558
|
try {
|
|
508
559
|
await this._editor.activeWorkflow.commit();
|
|
@@ -79,6 +79,7 @@ const CrowdsourceReporter = class {
|
|
|
79
79
|
* @returns Promise when complete
|
|
80
80
|
*/
|
|
81
81
|
async componentWillLoad() {
|
|
82
|
+
this._urlParamsLoaded = false;
|
|
82
83
|
await this._initModules();
|
|
83
84
|
await this._getTranslations();
|
|
84
85
|
}
|
|
@@ -115,6 +116,11 @@ const CrowdsourceReporter = class {
|
|
|
115
116
|
setSelectedLayer(layerId, layerName) {
|
|
116
117
|
this._selectedLayerId = layerId;
|
|
117
118
|
this._selectedLayerName = layerName;
|
|
119
|
+
//show only current layer on map and hide other valid editable layers
|
|
120
|
+
//if layerId is empty then show all the layers on map
|
|
121
|
+
this._validLayers.forEach(layer => {
|
|
122
|
+
layer.set('visible', !layerId || (layer.id === layerId));
|
|
123
|
+
});
|
|
118
124
|
}
|
|
119
125
|
/**
|
|
120
126
|
* Get the reporter app functionality
|
|
@@ -171,15 +177,22 @@ const CrowdsourceReporter = class {
|
|
|
171
177
|
* @protected
|
|
172
178
|
*/
|
|
173
179
|
getFeatureCreateFlowItem() {
|
|
174
|
-
return (h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: this._selectedLayerName, onCalciteFlowItemBack: this.backFromCreateFeaturePanel.bind(this) }, this.isMobile && this.getActionToExpandCollapsePanel(), this._showSubmitCancelButton && h("div", { class: "width-full", slot: "footer" }, h("calcite-button", { appearance: "secondary", class: "footer-top-button footer-button", onClick: this.onSubmitButtonClick.bind(this), width: "full" }, this._translations.submit), h("calcite-button", { appearance: "outline", class: "footer-button", onClick: this.backFromCreateFeaturePanel.bind(this), width: "full" }, this._translations.cancel)), h("calcite-panel", { "full-height": true, "full-width": true }, h("calcite-notice", { class: "notice-msg", icon: "lightbulb", kind: "success", open: true }, h("div", { slot: "message" }, this._translations.featureEditFormInfoMsg)), h("create-feature", { mapView: this.mapView, onDrawComplete: this.showSubmitCancelButton.bind(this), onFail: this.createFeatureFailed.bind(this), onSuccess: this.
|
|
180
|
+
return (h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: this._selectedLayerName, onCalciteFlowItemBack: this.backFromCreateFeaturePanel.bind(this) }, this.isMobile && this.getActionToExpandCollapsePanel(), this._showSubmitCancelButton && h("div", { class: "width-full", slot: "footer" }, h("calcite-button", { appearance: "secondary", class: "footer-top-button footer-button", onClick: this.onSubmitButtonClick.bind(this), width: "full" }, this._translations.submit), h("calcite-button", { appearance: "outline", class: "footer-button", onClick: this.backFromCreateFeaturePanel.bind(this), width: "full" }, this._translations.cancel)), h("calcite-panel", { "full-height": true, "full-width": true }, h("calcite-notice", { class: "notice-msg", icon: "lightbulb", kind: "success", open: true }, h("div", { slot: "message" }, this._translations.featureEditFormInfoMsg)), h("create-feature", { customizeSubmit: true, mapView: this.mapView, onDrawComplete: this.onDrawComplete.bind(this), onEditingAttachment: this.showSubmitCancelButton.bind(this), onFail: this.createFeatureFailed.bind(this), onSuccess: this.onReportSubmitted.bind(this), ref: el => this._createFeature = el, selectedLayerId: this._selectedLayerId }))));
|
|
175
181
|
}
|
|
176
182
|
/**
|
|
177
183
|
* When drawing of incident location completed on map show the submit and cancel button
|
|
178
184
|
* @protected
|
|
179
185
|
*/
|
|
180
|
-
|
|
186
|
+
onDrawComplete() {
|
|
181
187
|
this._showSubmitCancelButton = true;
|
|
182
188
|
}
|
|
189
|
+
/**
|
|
190
|
+
* When Add attachment panel is enabled hide the submit and cancel button
|
|
191
|
+
* @protected
|
|
192
|
+
*/
|
|
193
|
+
showSubmitCancelButton(evt) {
|
|
194
|
+
this._showSubmitCancelButton = !evt.detail;
|
|
195
|
+
}
|
|
183
196
|
/**
|
|
184
197
|
* On back from create feature, call submit editor to destroy the Editor widget instance
|
|
185
198
|
* @protected
|
|
@@ -212,11 +225,22 @@ const CrowdsourceReporter = class {
|
|
|
212
225
|
* On submit report navigate to the layer list home page and refresh the layer list
|
|
213
226
|
* @protected
|
|
214
227
|
*/
|
|
215
|
-
|
|
228
|
+
onReportSubmitted() {
|
|
216
229
|
this._reportSubmitted = true;
|
|
230
|
+
this.navigateToHomePage();
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Navigates to layer-list
|
|
234
|
+
* @protected
|
|
235
|
+
*/
|
|
236
|
+
navigateToHomePage() {
|
|
237
|
+
if (this._createFeature) {
|
|
238
|
+
this._createFeature.close();
|
|
239
|
+
}
|
|
217
240
|
if (this._layerList) {
|
|
218
241
|
this._layerList.refresh();
|
|
219
242
|
}
|
|
243
|
+
this.setSelectedFeatures([]);
|
|
220
244
|
this._flowItems = ["layer-list"];
|
|
221
245
|
}
|
|
222
246
|
/**
|
|
@@ -262,7 +286,10 @@ const CrowdsourceReporter = class {
|
|
|
262
286
|
//update the has valid layer state
|
|
263
287
|
this._hasValidLayers = layersListed.length > 0;
|
|
264
288
|
//navigate to the feature details if URL params found
|
|
265
|
-
|
|
289
|
+
if (!this._urlParamsLoaded) {
|
|
290
|
+
this._urlParamsLoaded = true;
|
|
291
|
+
await this.loadFeatureFromURLParams();
|
|
292
|
+
}
|
|
266
293
|
}
|
|
267
294
|
/**On click of layer list item show feature list
|
|
268
295
|
* @param evt Event which has details of selected layerId and layerName
|
|
@@ -279,10 +306,10 @@ const CrowdsourceReporter = class {
|
|
|
279
306
|
backFromSelectedPanel() {
|
|
280
307
|
const updatedFlowItems = [...this._flowItems];
|
|
281
308
|
updatedFlowItems.pop();
|
|
282
|
-
//
|
|
309
|
+
//Back to layer list, and return as the flowItems will be reset in navigateToHomePage
|
|
283
310
|
if (updatedFlowItems.length === 1) {
|
|
284
|
-
this.
|
|
285
|
-
|
|
311
|
+
this.navigateToHomePage();
|
|
312
|
+
return;
|
|
286
313
|
}
|
|
287
314
|
this._flowItems = [...updatedFlowItems];
|
|
288
315
|
}
|
|
@@ -431,7 +458,6 @@ const CrowdsourceReporter = class {
|
|
|
431
458
|
}
|
|
432
459
|
/**
|
|
433
460
|
* Updates the share url for current selected feature
|
|
434
|
-
* @returns
|
|
435
461
|
* @protected
|
|
436
462
|
*/
|
|
437
463
|
_updateShareURL() {
|
|
@@ -460,6 +486,7 @@ const CrowdsourceReporter = class {
|
|
|
460
486
|
}
|
|
461
487
|
/**
|
|
462
488
|
* Navigates to selected features detail based on the URL params
|
|
489
|
+
* @protected
|
|
463
490
|
*/
|
|
464
491
|
async loadFeatureFromURLParams() {
|
|
465
492
|
if (this.layerId && this.objectId) {
|