@esri/solutions-components 0.7.31 → 0.7.32

Sign up to get free protection for your applications and to get access to all the features.
@@ -339,7 +339,7 @@ const FlowItem = class {
339
339
  };
340
340
  FlowItem.style = flowItemCss;
341
341
 
342
- const createFeatureCss = ":host{display:block}.esri-editor__panel-toolbar{display:none !important}";
342
+ 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}";
343
343
 
344
344
  const CreateFeature = class {
345
345
  constructor(hostRef) {
@@ -347,8 +347,10 @@ const CreateFeature = class {
347
347
  this.success = index.createEvent(this, "success", 7);
348
348
  this.fail = index.createEvent(this, "fail", 7);
349
349
  this.drawComplete = index.createEvent(this, "drawComplete", 7);
350
+ this.editingAttachment = index.createEvent(this, "editingAttachment", 7);
350
351
  this.mapView = undefined;
351
352
  this.selectedLayerId = undefined;
353
+ this.customizeSubmit = false;
352
354
  }
353
355
  //--------------------------------------------------------------------------
354
356
  //
@@ -419,18 +421,8 @@ const CreateFeature = class {
419
421
  * Init Editor widget and starts the create workflow
420
422
  */
421
423
  async init() {
422
- if (this.mapView) {
423
- if (this.mapView && this.selectedLayerId) {
424
- await mapViewUtils.getLayerOrTable(this.mapView, this.selectedLayerId);
425
- await this.createEditorWidget();
426
- await this.startCreate();
427
- this._editor.viewModel.featureFormViewModel.on('submit', this.submitted.bind(this));
428
- setTimeout(() => {
429
- var _a, _b;
430
- this.el.querySelector('.esri-editor').querySelectorAll('calcite-flow-item')[1].shadowRoot.querySelector('calcite-panel').shadowRoot.querySelector('article').querySelector('header').setAttribute('style', 'display: none');
431
- (_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');
432
- }, 700);
433
- }
424
+ if (this.mapView && this.selectedLayerId) {
425
+ await this.createEditorWidget();
434
426
  }
435
427
  }
436
428
  /**
@@ -439,10 +431,12 @@ const CreateFeature = class {
439
431
  * @protected
440
432
  */
441
433
  async initModules() {
442
- const [Editor] = await locale$1.loadModules([
443
- "esri/widgets/Editor"
434
+ const [Editor, reactiveUtils] = await locale$1.loadModules([
435
+ "esri/widgets/Editor",
436
+ "esri/core/reactiveUtils"
444
437
  ]);
445
438
  this.Editor = Editor;
439
+ this.reactiveUtils = reactiveUtils;
446
440
  }
447
441
  /**
448
442
  * Display editor widget to create the new feature
@@ -452,50 +446,104 @@ const CreateFeature = class {
452
446
  if (this._editor) {
453
447
  this._editor.destroy();
454
448
  }
449
+ const layerInfos = [];
455
450
  const container = document.createElement("div");
456
- const layer = await mapViewUtils.getLayerOrTable(this.mapView, this.selectedLayerId);
457
- const selectedLayer = {
458
- layer: layer
459
- };
451
+ const allMapLayers = await mapViewUtils.getAllLayers(this.mapView);
452
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
453
+ allMapLayers.forEach(async (eachLayer) => {
454
+ layerInfos.push({
455
+ layer: eachLayer,
456
+ enabled: (eachLayer === null || eachLayer === void 0 ? void 0 : eachLayer.type) === "feature" && (eachLayer === null || eachLayer === void 0 ? void 0 : eachLayer.id) === this.selectedLayerId,
457
+ addEnabled: true,
458
+ updateEnabled: false,
459
+ deleteEnabled: false // default is true, set to false to disable the ability to delete features
460
+ });
461
+ });
460
462
  this._editor = new this.Editor({
461
463
  allowedWorkflows: "create-features",
462
464
  view: this.mapView,
463
- layerInfos: [selectedLayer],
465
+ layerInfos: layerInfos,
464
466
  visibleElements: {
465
- snappingControls: false,
466
- snappingControlsElements: {
467
- featureEnabledToggle: false,
468
- layerList: false,
469
- enabledToggle: false
470
- }
467
+ snappingControls: false
471
468
  },
472
- container,
469
+ container
473
470
  });
474
471
  this.el.appendChild(container);
472
+ //Add handle to watch if attachments are added/edited
473
+ const attachmentHandle = this.reactiveUtils.watch(() => this._editor.viewModel.state, (state) => {
474
+ if (state === 'adding-attachment' || state === 'editing-attachment') {
475
+ this._addingAttachment = true;
476
+ this.editingAttachment.emit(true);
477
+ }
478
+ else {
479
+ if (this._addingAttachment) {
480
+ this.editingAttachment.emit(false);
481
+ this._addingAttachment = false;
482
+ }
483
+ }
484
+ });
485
+ this._editor.viewModel.addHandles(attachmentHandle);
486
+ //Add handle to watch featureTemplatesViewModel ready state and then start the creation
487
+ const handle = this.reactiveUtils.watch(() => this._editor.viewModel.featureTemplatesViewModel.state, (state) => {
488
+ if (state === 'ready') {
489
+ void this.startCreate();
490
+ }
491
+ });
492
+ this._editor.viewModel.addHandles(handle);
475
493
  }
476
494
  /**
477
495
  * Start creating the feature
478
496
  * @protected
479
497
  */
480
498
  async startCreate() {
481
- var _a, _b;
482
- const layer = await mapViewUtils.getLayerOrTable(this.mapView, this.selectedLayerId);
483
- if (layer) {
484
- let template = layer.templates && layer.templates.length ? layer.templates[0] : {};
485
- if (((_a = layer.sourceJSON) === null || _a === void 0 ? void 0 : _a.types.length) && ((_b = layer.sourceJSON.types[0].templates) === null || _b === void 0 ? void 0 : _b.length)) {
486
- template = layer.sourceJSON.types[0].templates[0];
487
- }
488
- const creationInfo = {
489
- layer: layer,
490
- template: template
491
- };
492
- await this._editor.startCreateFeaturesWorkflowAtFeatureCreation(creationInfo);
493
- this._editor.viewModel.sketchViewModel.on("create", (evt) => {
494
- if (evt.state === "complete") {
495
- this.drawComplete.emit();
496
- }
499
+ var _a;
500
+ if ((_a = this._editor.viewModel.featureTemplatesViewModel.items) === null || _a === void 0 ? void 0 : _a.length) {
501
+ const items = this._editor.viewModel.featureTemplatesViewModel.items[0].get("items");
502
+ //once the feature template is selected handle the event for formSubmit and sketch complete
503
+ //also, hide the headers and footer in the editor as we will be showing our own submit and cancel button
504
+ this._editor.viewModel.featureTemplatesViewModel.on('select', () => {
505
+ setTimeout(() => {
506
+ //on form submit
507
+ this._editor.viewModel.featureFormViewModel.on('submit', this.submitted.bind(this));
508
+ //on sketch complete emit the event
509
+ this._editor.viewModel.sketchViewModel.on("create", (evt) => {
510
+ if (evt.state === "complete") {
511
+ this.drawComplete.emit();
512
+ }
513
+ });
514
+ this.hideEditorsElements();
515
+ }, 700);
516
+ this.hideEditorsElements();
497
517
  });
518
+ //if only one feature template then directly start geometry creation for that
519
+ //else allow feature template selection to user
520
+ if (items.length === 1) {
521
+ this._editor.viewModel.featureTemplatesViewModel.select(items[0]);
522
+ }
523
+ //hides the header and footer elements in editor widget
524
+ this.hideEditorsElements();
525
+ }
526
+ }
527
+ /**
528
+ * Hides the elements of editor widget
529
+ * @protected
530
+ */
531
+ hideEditorsElements() {
532
+ if (!this.customizeSubmit) {
533
+ return;
498
534
  }
535
+ setTimeout(() => {
536
+ var _a;
537
+ //hides the header and footer on the featureForm
538
+ (_a = this.el.querySelector('.esri-editor').querySelectorAll('calcite-flow-item')) === null || _a === void 0 ? void 0 : _a.forEach((flowItem) => {
539
+ var _a, _b, _c, _d, _e;
540
+ 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');
541
+ //hide the header
542
+ (_d = article === null || article === void 0 ? void 0 : article.querySelector('header')) === null || _d === void 0 ? void 0 : _d.setAttribute('style', 'display: none');
543
+ //hide the footer
544
+ (_e = article === null || article === void 0 ? void 0 : article.querySelector('footer')) === null || _e === void 0 ? void 0 : _e.setAttribute('style', 'display: none');
545
+ });
546
+ }, 700);
499
547
  }
500
548
  /**
501
549
  * On creation of feature emit the event that the feature is created
@@ -504,9 +552,12 @@ const CreateFeature = class {
504
552
  */
505
553
  async submitted(evt) {
506
554
  var _a;
555
+ //return if any attribute is invalid , focus will be shifted to the invalid attribute in feature form
507
556
  if (evt.invalid.length) {
508
557
  return;
509
558
  }
559
+ //Submit only when valid attributes
560
+ //emit success or fail based on the result
510
561
  if (evt.valid.length) {
511
562
  try {
512
563
  await this._editor.activeWorkflow.commit();
@@ -83,6 +83,7 @@ const CrowdsourceReporter = class {
83
83
  * @returns Promise when complete
84
84
  */
85
85
  async componentWillLoad() {
86
+ this._urlParamsLoaded = false;
86
87
  await this._initModules();
87
88
  await this._getTranslations();
88
89
  }
@@ -119,6 +120,11 @@ const CrowdsourceReporter = class {
119
120
  setSelectedLayer(layerId, layerName) {
120
121
  this._selectedLayerId = layerId;
121
122
  this._selectedLayerName = layerName;
123
+ //show only current layer on map and hide other valid editable layers
124
+ //if layerId is empty then show all the layers on map
125
+ this._validLayers.forEach(layer => {
126
+ layer.set('visible', !layerId || (layer.id === layerId));
127
+ });
122
128
  }
123
129
  /**
124
130
  * Get the reporter app functionality
@@ -175,15 +181,22 @@ const CrowdsourceReporter = class {
175
181
  * @protected
176
182
  */
177
183
  getFeatureCreateFlowItem() {
178
- return (index.h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: this._selectedLayerName, onCalciteFlowItemBack: this.backFromCreateFeaturePanel.bind(this) }, this.isMobile && this.getActionToExpandCollapsePanel(), this._showSubmitCancelButton && index.h("div", { class: "width-full", slot: "footer" }, index.h("calcite-button", { appearance: "secondary", class: "footer-top-button footer-button", onClick: this.onSubmitButtonClick.bind(this), width: "full" }, this._translations.submit), index.h("calcite-button", { appearance: "outline", class: "footer-button", onClick: this.backFromCreateFeaturePanel.bind(this), width: "full" }, this._translations.cancel)), index.h("calcite-panel", { "full-height": true, "full-width": true }, index.h("calcite-notice", { class: "notice-msg", icon: "lightbulb", kind: "success", open: true }, index.h("div", { slot: "message" }, this._translations.featureEditFormInfoMsg)), index.h("create-feature", { mapView: this.mapView, onDrawComplete: this.showSubmitCancelButton.bind(this), onFail: this.createFeatureFailed.bind(this), onSuccess: this.navigateHomePage.bind(this), ref: el => this._createFeature = el, selectedLayerId: this._selectedLayerId }))));
184
+ return (index.h("calcite-flow-item", { collapsed: this.isMobile && this._sidePanelCollapsed, heading: this._selectedLayerName, onCalciteFlowItemBack: this.backFromCreateFeaturePanel.bind(this) }, this.isMobile && this.getActionToExpandCollapsePanel(), this._showSubmitCancelButton && index.h("div", { class: "width-full", slot: "footer" }, index.h("calcite-button", { appearance: "secondary", class: "footer-top-button footer-button", onClick: this.onSubmitButtonClick.bind(this), width: "full" }, this._translations.submit), index.h("calcite-button", { appearance: "outline", class: "footer-button", onClick: this.backFromCreateFeaturePanel.bind(this), width: "full" }, this._translations.cancel)), index.h("calcite-panel", { "full-height": true, "full-width": true }, index.h("calcite-notice", { class: "notice-msg", icon: "lightbulb", kind: "success", open: true }, index.h("div", { slot: "message" }, this._translations.featureEditFormInfoMsg)), index.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 }))));
179
185
  }
180
186
  /**
181
187
  * When drawing of incident location completed on map show the submit and cancel button
182
188
  * @protected
183
189
  */
184
- showSubmitCancelButton() {
190
+ onDrawComplete() {
185
191
  this._showSubmitCancelButton = true;
186
192
  }
193
+ /**
194
+ * When Add attachment panel is enabled hide the submit and cancel button
195
+ * @protected
196
+ */
197
+ showSubmitCancelButton(evt) {
198
+ this._showSubmitCancelButton = !evt.detail;
199
+ }
187
200
  /**
188
201
  * On back from create feature, call submit editor to destroy the Editor widget instance
189
202
  * @protected
@@ -216,11 +229,22 @@ const CrowdsourceReporter = class {
216
229
  * On submit report navigate to the layer list home page and refresh the layer list
217
230
  * @protected
218
231
  */
219
- navigateHomePage() {
232
+ onReportSubmitted() {
220
233
  this._reportSubmitted = true;
234
+ this.navigateToHomePage();
235
+ }
236
+ /**
237
+ * Navigates to layer-list
238
+ * @protected
239
+ */
240
+ navigateToHomePage() {
241
+ if (this._createFeature) {
242
+ this._createFeature.close();
243
+ }
221
244
  if (this._layerList) {
222
245
  this._layerList.refresh();
223
246
  }
247
+ this.setSelectedFeatures([]);
224
248
  this._flowItems = ["layer-list"];
225
249
  }
226
250
  /**
@@ -266,7 +290,10 @@ const CrowdsourceReporter = class {
266
290
  //update the has valid layer state
267
291
  this._hasValidLayers = layersListed.length > 0;
268
292
  //navigate to the feature details if URL params found
269
- await this.loadFeatureFromURLParams();
293
+ if (!this._urlParamsLoaded) {
294
+ this._urlParamsLoaded = true;
295
+ await this.loadFeatureFromURLParams();
296
+ }
270
297
  }
271
298
  /**On click of layer list item show feature list
272
299
  * @param evt Event which has details of selected layerId and layerName
@@ -283,10 +310,10 @@ const CrowdsourceReporter = class {
283
310
  backFromSelectedPanel() {
284
311
  const updatedFlowItems = [...this._flowItems];
285
312
  updatedFlowItems.pop();
286
- //clear the selected layer and feature when back to layer list
313
+ //Back to layer list, and return as the flowItems will be reset in navigateToHomePage
287
314
  if (updatedFlowItems.length === 1) {
288
- this.setSelectedLayer('', '');
289
- this.setSelectedFeatures([]);
315
+ this.navigateToHomePage();
316
+ return;
290
317
  }
291
318
  this._flowItems = [...updatedFlowItems];
292
319
  }
@@ -435,7 +462,6 @@ const CrowdsourceReporter = class {
435
462
  }
436
463
  /**
437
464
  * Updates the share url for current selected feature
438
- * @returns
439
465
  * @protected
440
466
  */
441
467
  _updateShareURL() {
@@ -464,6 +490,7 @@ const CrowdsourceReporter = class {
464
490
  }
465
491
  /**
466
492
  * Navigates to selected features detail based on the URL params
493
+ * @protected
467
494
  */
468
495
  async loadFeatureFromURLParams() {
469
496
  if (this.layerId && this.objectId) {