@esri/solutions-components 0.7.30 → 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.
Files changed (62) hide show
  1. package/dist/assets/t9n/crowdsource-reporter/resources.json +7 -5
  2. package/dist/assets/t9n/crowdsource-reporter/resources_en.json +7 -5
  3. package/dist/assets/t9n/feature-list/resources.json +1 -1
  4. package/dist/assets/t9n/feature-list/resources_en.json +1 -1
  5. package/dist/assets/t9n/layer-list/resources.json +1 -1
  6. package/dist/assets/t9n/layer-list/resources_en.json +1 -1
  7. package/dist/cjs/{calcite-flow_4.cjs.entry.js → calcite-flow_5.cjs.entry.js} +286 -19
  8. package/dist/cjs/card-manager_3.cjs.entry.js +1 -1
  9. package/dist/cjs/crowdsource-reporter.cjs.entry.js +248 -32
  10. package/dist/cjs/{downloadUtils-83c6d3c3.js → downloadUtils-10e0de31.js} +2 -2
  11. package/dist/cjs/{index.es-bd1a93b2.js → index.es-72dc7ab9.js} +1 -1
  12. package/dist/cjs/loader.cjs.js +1 -1
  13. package/dist/cjs/map-select-tools_3.cjs.entry.js +1 -1
  14. package/dist/cjs/public-notification.cjs.entry.js +1 -1
  15. package/dist/cjs/solutions-components.cjs.js +1 -1
  16. package/dist/collection/collection-manifest.json +1 -0
  17. package/dist/collection/components/create-feature/create-feature.css +50 -0
  18. package/dist/collection/components/create-feature/create-feature.js +444 -0
  19. package/dist/collection/components/crowdsource-reporter/crowdsource-reporter.css +10 -1
  20. package/dist/collection/components/crowdsource-reporter/crowdsource-reporter.js +287 -33
  21. package/dist/collection/components/feature-list/feature-list.js +1 -0
  22. package/dist/collection/components/layer-list/layer-list.js +60 -16
  23. package/dist/collection/demos/create-feature.html +90 -0
  24. package/dist/collection/demos/crowdsource-reporter.html +26 -11
  25. package/dist/collection/utils/downloadUtils.js +1 -1
  26. package/dist/collection/utils/downloadUtils.ts +1 -1
  27. package/dist/components/create-feature.d.ts +11 -0
  28. package/dist/components/create-feature.js +11 -0
  29. package/dist/components/create-feature2.js +278 -0
  30. package/dist/components/crowdsource-reporter.js +324 -90
  31. package/dist/components/downloadUtils.js +1 -1
  32. package/dist/components/feature-list2.js +1 -0
  33. package/dist/components/layer-list2.js +38 -17
  34. package/dist/esm/{calcite-flow_4.entry.js → calcite-flow_5.entry.js} +286 -20
  35. package/dist/esm/card-manager_3.entry.js +1 -1
  36. package/dist/esm/crowdsource-reporter.entry.js +249 -33
  37. package/dist/esm/{downloadUtils-d070a467.js → downloadUtils-d297078f.js} +2 -2
  38. package/dist/esm/{index.es-d48535a2.js → index.es-3b4fa9d0.js} +1 -1
  39. package/dist/esm/loader.js +1 -1
  40. package/dist/esm/map-select-tools_3.entry.js +1 -1
  41. package/dist/esm/public-notification.entry.js +1 -1
  42. package/dist/esm/solutions-components.js +1 -1
  43. package/dist/solutions-components/demos/create-feature.html +90 -0
  44. package/dist/solutions-components/demos/crowdsource-reporter.html +26 -11
  45. package/dist/solutions-components/{p-f120ff40.entry.js → p-09ec8c8f.entry.js} +1 -1
  46. package/dist/solutions-components/{p-55b835a1.js → p-103c5318.js} +2 -2
  47. package/dist/solutions-components/{p-309cdea1.entry.js → p-57d49d15.entry.js} +1 -1
  48. package/dist/solutions-components/{p-b913a4fd.js → p-8ec25bf4.js} +1 -1
  49. package/dist/solutions-components/{p-f22ff57e.entry.js → p-921f21d5.entry.js} +1 -1
  50. package/dist/solutions-components/p-d5263cb9.entry.js +17 -0
  51. package/dist/solutions-components/p-ea17cefb.entry.js +6 -0
  52. package/dist/solutions-components/solutions-components.esm.js +1 -1
  53. package/dist/solutions-components/utils/downloadUtils.ts +1 -1
  54. package/dist/types/components/create-feature/create-feature.d.ts +125 -0
  55. package/dist/types/components/crowdsource-reporter/crowdsource-reporter.d.ts +146 -12
  56. package/dist/types/components/feature-list/feature-list.d.ts +1 -0
  57. package/dist/types/components/layer-list/layer-list.d.ts +6 -0
  58. package/dist/types/components.d.ts +102 -0
  59. package/dist/types/preact.d.ts +7 -0
  60. package/package.json +1 -1
  61. package/dist/solutions-components/p-2f162664.entry.js +0 -6
  62. package/dist/solutions-components/p-94ee3ef7.entry.js +0 -17
@@ -0,0 +1,90 @@
1
+ <html>
2
+ <head>
3
+ <meta charset="utf-8" />
4
+ <meta
5
+ name="viewport"
6
+ content="initial-scale=1,maximum-scale=1,user-scalable=no"
7
+ />
8
+ <title>Create Feature</title>
9
+ <!--
10
+ | Copyright 2022 Esri
11
+ |
12
+ | Licensed under the Apache License, Version 2.0 (the "License");
13
+ | you may not use this file except in compliance with the License.
14
+ | You may obtain a copy of the License at
15
+ |
16
+ | http://www.apache.org/licenses/LICENSE-2.0
17
+ |
18
+ | Unless required by applicable law or agreed to in writing, software
19
+ | distributed under the License is distributed on an "AS IS" BASIS,
20
+ | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
+ | See the License for the specific language governing permissions and
22
+ | limitations under the License.
23
+ -->
24
+ <style>
25
+ #viewDiv {
26
+ padding: 0;
27
+ margin: 0;
28
+ height: 100%;
29
+ width: calc(100% - 402px);
30
+ }
31
+
32
+ .over-map {
33
+ position: absolute;
34
+ top: 0;
35
+ right: 0px;
36
+ background-color: var(--calcite-color-foreground-1);
37
+ }
38
+
39
+ .column {
40
+ width: 400px;
41
+ height: 100%;
42
+ border: 1px solid var(--calcite-color-border-2);
43
+ }
44
+
45
+ .column[dir="rtl"] {
46
+ float: left;
47
+ }
48
+
49
+ .full-height {
50
+ height: 100%;
51
+ }
52
+ </style>
53
+
54
+ <link rel="stylesheet" href="https://jsdev.arcgis.com/4.29/esri/themes/light/main.css" />
55
+ <link rel="stylesheet" href="https://webapps-cdn.esri.com/CDN/fonts/v1.4.1/fonts.css" />
56
+ <link rel="stylesheet" href="../solutions-components.css" type="text/css">
57
+ <link rel="stylesheet" type="text/css" href="https://js.arcgis.com/calcite-components/2.0.0/calcite.css" />
58
+
59
+ <script src="https://jsdev.arcgis.com/4.29/"></script>
60
+ <script type="module" src="../solutions-components.esm.js"></script>
61
+
62
+ <script>
63
+ require(["esri/WebMap", "esri/views/MapView"], (
64
+ WebMap,
65
+ MapView
66
+ ) => {
67
+ var webMap = new WebMap({
68
+ portalItem: {
69
+ id: "024e8a5e73a34c5aade9632d651c5750"
70
+ }
71
+ });
72
+ var view = new MapView({
73
+ container: "viewDiv",
74
+ map: webMap
75
+ });
76
+
77
+ view.when(function () {
78
+ const demo = document.getElementById("demo");
79
+ demo.mapView = view;
80
+ demo.selectedLayerId = 'SE_attch_7327';
81
+ })
82
+ });
83
+ </script>
84
+ </head>
85
+
86
+ <body>
87
+ <div id="viewDiv"></div>
88
+ <create-feature id="demo" class="over-map column full-height"></create-feature>
89
+ </body>
90
+ </html>
@@ -93,23 +93,38 @@
93
93
  const demo = document.getElementById("demo");
94
94
  let custom = null;
95
95
  let portal;
96
- //Support webmap and portal URL parameter
97
- var vars = window.location.search.substring(1).split("&");
98
- vars.forEach((param) => {
99
- let vals = param.split("=");
100
- const v = vals[1];
101
- switch (vals[0]) {
96
+ let locale = 'en'
97
+ //Support webmap, portal and locale URL parameter
98
+ //Also, set search params to reporter component - layerId, objectId, center, level etc.
99
+ let urlObj = new URL(window.location)
100
+ for (const [key, value] of urlObj.searchParams.entries()) {
101
+ switch (key) {
102
102
  case "webmap":
103
103
  custom = {
104
- id: v
104
+ id: value
105
105
  };
106
106
  break;
107
107
  case "portal":
108
- portal = v;
109
- default:
108
+ portal = value;
109
+ break;
110
+ case "locale":
111
+ locale = value;
112
+ break;
113
+ case 'layerid':
114
+ demo.layerId = value;
115
+ break;
116
+ case 'oid':
117
+ demo.objectId = value;
118
+ case 'center' || 'level':
119
+ demo[key] = value;
110
120
  break;
111
121
  }
112
- });
122
+ }
123
+
124
+ // Set the locale before the JSAPI loads
125
+ esriConfig.locale = locale;
126
+ demo.lang = locale;
127
+
113
128
  //update the portalUrl if found in urlParams
114
129
  //esriConfig.portalUrl = "https://solutions.mapsdevext.arcgis.com";
115
130
  if (portal) {
@@ -117,7 +132,6 @@
117
132
  }
118
133
 
119
134
  let portalItem = {
120
- //id: "b5bdcb1e5d684dd3b21a2d44b8e4f928"
121
135
  //id: "f8c4d99deb3c483cac296cc261e18a25", //blank no layers
122
136
  //id: "a7e880f7afbb471991d43c8c4f1438ac" // Se mapping
123
137
  //id: "c720e337ff814fe4a83bc244c46f8e43" //15 Layers
@@ -125,6 +139,7 @@
125
139
  //id: "dda88d905a6748a5ab46bea5be795f33" // screening layers
126
140
  id: "b5bdcb1e5d684dd3b21a2d44b8e4f928" //Popup content
127
141
  //id: "d399ec39959a4aac8617ae4f05dd6785" //Arcade
142
+ //id: "024e8a5e73a34c5aade9632d651c5750" //Attachments
128
143
  }
129
144
  const webMap = new WebMap({
130
145
  portalItem: custom ?? portalItem
@@ -540,7 +540,7 @@ export function _prepareAttributeValue(attributeValue, attributeType, attributeD
540
540
  if (attributeDomain && attributeDomain.type === "coded-value") {
541
541
  // "coded-value" domain field
542
542
  const value = attributeDomain.getName(attributeValue);
543
- return value.toString();
543
+ return value === null || value === void 0 ? void 0 : value.toString();
544
544
  }
545
545
  else {
546
546
  // Non-domain field or unsupported domain type
@@ -769,7 +769,7 @@ export function _prepareAttributeValue(
769
769
  if (attributeDomain && (attributeDomain as __esri.CodedValueDomain).type === "coded-value") {
770
770
  // "coded-value" domain field
771
771
  const value = (attributeDomain as __esri.CodedValueDomain).getName(attributeValue);
772
- return value.toString();
772
+ return value?.toString();
773
773
  } else {
774
774
  // Non-domain field or unsupported domain type
775
775
  let value = attributeValue;
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface CreateFeature extends Components.CreateFeature, HTMLElement {}
4
+ export const CreateFeature: {
5
+ prototype: CreateFeature;
6
+ new (): CreateFeature;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1,11 @@
1
+ /*!
2
+ * Copyright 2022 Esri
3
+ * Licensed under the Apache License, Version 2.0
4
+ * http://www.apache.org/licenses/LICENSE-2.0
5
+ */
6
+ import { C as CreateFeature$1, d as defineCustomElement$1 } from './create-feature2.js';
7
+
8
+ const CreateFeature = CreateFeature$1;
9
+ const defineCustomElement = defineCustomElement$1;
10
+
11
+ export { CreateFeature, defineCustomElement };
@@ -0,0 +1,278 @@
1
+ /*!
2
+ * Copyright 2022 Esri
3
+ * Licensed under the Apache License, Version 2.0
4
+ * http://www.apache.org/licenses/LICENSE-2.0
5
+ */
6
+ import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
7
+ import { l as loadModules } from './loadModules.js';
8
+ import { a as getAllLayers } from './mapViewUtils.js';
9
+
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
+
12
+ const CreateFeature = /*@__PURE__*/ proxyCustomElement(class CreateFeature extends HTMLElement {
13
+ constructor() {
14
+ super();
15
+ this.__registerHost();
16
+ this.success = createEvent(this, "success", 7);
17
+ this.fail = createEvent(this, "fail", 7);
18
+ this.drawComplete = createEvent(this, "drawComplete", 7);
19
+ this.editingAttachment = createEvent(this, "editingAttachment", 7);
20
+ this.mapView = undefined;
21
+ this.selectedLayerId = undefined;
22
+ this.customizeSubmit = false;
23
+ }
24
+ //--------------------------------------------------------------------------
25
+ //
26
+ // Watch handlers
27
+ //
28
+ //--------------------------------------------------------------------------
29
+ /**
30
+ * Called each time the mapView prop is changed.
31
+ */
32
+ async mapViewWatchHandler() {
33
+ await this.mapView.when(async () => {
34
+ await this.init();
35
+ });
36
+ }
37
+ //--------------------------------------------------------------------------
38
+ //
39
+ // Methods (public)
40
+ //
41
+ //--------------------------------------------------------------------------
42
+ /**
43
+ * Destroy the Editor widget instance
44
+ * @returns Promise that resolves when the operation is complete
45
+ */
46
+ async close() {
47
+ if (this._editor) {
48
+ this._editor.destroy();
49
+ }
50
+ }
51
+ /**
52
+ * Submit the created feature
53
+ * @returns Promise that resolves when the operation is complete
54
+ */
55
+ async submit() {
56
+ if (this._editor) {
57
+ this._editor.viewModel.featureFormViewModel.submit();
58
+ }
59
+ }
60
+ //--------------------------------------------------------------------------
61
+ //
62
+ // Functions (lifecycle)
63
+ //
64
+ //--------------------------------------------------------------------------
65
+ /**
66
+ * StencilJS: Called once just after the component is first connected to the DOM.
67
+ * @returns Promise when complete
68
+ */
69
+ async componentWillLoad() {
70
+ await this.initModules();
71
+ }
72
+ /**
73
+ * StencilJS: Called once just after the component is fully loaded and the first render() occurs.
74
+ */
75
+ async componentDidLoad() {
76
+ await this.init();
77
+ }
78
+ /**
79
+ * Renders the component.
80
+ */
81
+ render() {
82
+ return (h(Host, { id: "feature-form" }));
83
+ }
84
+ //--------------------------------------------------------------------------
85
+ //
86
+ // Functions (protected)
87
+ //
88
+ //--------------------------------------------------------------------------
89
+ /**
90
+ * Init Editor widget and starts the create workflow
91
+ */
92
+ async init() {
93
+ if (this.mapView && this.selectedLayerId) {
94
+ await this.createEditorWidget();
95
+ }
96
+ }
97
+ /**
98
+ * Load esri javascript api modules
99
+ * @returns Promise resolving when function is done
100
+ * @protected
101
+ */
102
+ async initModules() {
103
+ const [Editor, reactiveUtils] = await loadModules([
104
+ "esri/widgets/Editor",
105
+ "esri/core/reactiveUtils"
106
+ ]);
107
+ this.Editor = Editor;
108
+ this.reactiveUtils = reactiveUtils;
109
+ }
110
+ /**
111
+ * Display editor widget to create the new feature
112
+ * @protected
113
+ */
114
+ async createEditorWidget() {
115
+ if (this._editor) {
116
+ this._editor.destroy();
117
+ }
118
+ const layerInfos = [];
119
+ const container = document.createElement("div");
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
+ });
131
+ this._editor = new this.Editor({
132
+ allowedWorkflows: "create-features",
133
+ view: this.mapView,
134
+ layerInfos: layerInfos,
135
+ visibleElements: {
136
+ snappingControls: false
137
+ },
138
+ container
139
+ });
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);
162
+ }
163
+ /**
164
+ * Start creating the feature
165
+ * @protected
166
+ */
167
+ async startCreate() {
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();
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();
194
+ }
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
+ }
217
+ /**
218
+ * On creation of feature emit the event that the feature is created
219
+ * @param evt feature submit event
220
+ * @protected
221
+ */
222
+ async submitted(evt) {
223
+ var _a;
224
+ //return if any attribute is invalid , focus will be shifted to the invalid attribute in feature form
225
+ if (evt.invalid.length) {
226
+ return;
227
+ }
228
+ //Submit only when valid attributes
229
+ //emit success or fail based on the result
230
+ if (evt.valid.length) {
231
+ try {
232
+ await this._editor.activeWorkflow.commit();
233
+ //throw errors if any failures
234
+ if ((_a = this._editor.viewModel.failures) === null || _a === void 0 ? void 0 : _a.length) {
235
+ this._editor.viewModel.failures.some((failure) => {
236
+ if (failure.error) {
237
+ throw (failure.error);
238
+ }
239
+ });
240
+ }
241
+ }
242
+ catch (e) {
243
+ this.fail.emit(e);
244
+ return;
245
+ }
246
+ this.success.emit();
247
+ }
248
+ }
249
+ get el() { return this; }
250
+ static get watchers() { return {
251
+ "mapView": ["mapViewWatchHandler"]
252
+ }; }
253
+ static get style() { return createFeatureCss; }
254
+ }, [0, "create-feature", {
255
+ "mapView": [16],
256
+ "selectedLayerId": [1, "selected-layer-id"],
257
+ "customizeSubmit": [4, "customize-submit"],
258
+ "close": [64],
259
+ "submit": [64]
260
+ }, undefined, {
261
+ "mapView": ["mapViewWatchHandler"]
262
+ }]);
263
+ function defineCustomElement() {
264
+ if (typeof customElements === "undefined") {
265
+ return;
266
+ }
267
+ const components = ["create-feature"];
268
+ components.forEach(tagName => { switch (tagName) {
269
+ case "create-feature":
270
+ if (!customElements.get(tagName)) {
271
+ customElements.define(tagName, CreateFeature);
272
+ }
273
+ break;
274
+ } });
275
+ }
276
+ defineCustomElement();
277
+
278
+ export { CreateFeature as C, defineCustomElement as d };