npm-dropdown-package 1.0.0

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.
@@ -0,0 +1,8 @@
1
+ import FeatureLayer from "@arcgis/core/layers/FeatureLayer";
2
+ declare class GenerateDropdownData {
3
+ featureLayers: [FeatureLayer, FeatureLayer?] | any;
4
+ fieldNames: [string, string?, string?] | any;
5
+ constructor(featureLayers: any, fieldNames: any);
6
+ dropDownQuery: () => Promise<any>;
7
+ }
8
+ export default GenerateDropdownData;
package/build/index.js ADDED
@@ -0,0 +1,401 @@
1
+ class GenerateDropdownData {
2
+ constructor(featureLayers, fieldNames) {
3
+ // Define method
4
+ this.dropDownQuery = async () => {
5
+ // ################### One Feature Layer ################### //
6
+ if (this.featureLayers.length === 1) {
7
+ // One dropdown (= one field):-----------------------
8
+ if (this.fieldNames[1] === undefined &&
9
+ this.fieldNames[2] === undefined) {
10
+ var query11 = this.featureLayers[0].createQuery();
11
+ query11.outFields = ["*"];
12
+ query11.orderByFields = [this.fieldNames[0]];
13
+ query11.groupByFieldsForStatistics = [this.fieldNames[0]];
14
+ const pairQ = this.featureLayers[0]
15
+ .queryFeatures(query11)
16
+ .then((response) => {
17
+ var stats = response.features;
18
+ const values = stats.map((result, index) => {
19
+ const attributes = result.attributes;
20
+ const field1 = attributes[this.fieldNames[0]];
21
+ return Object.assign({
22
+ field1: field1,
23
+ });
24
+ });
25
+ // 1. Get a pair
26
+ const pair = values.filter((val, index) => values.findIndex((item) => item.field1 === val.field1) ===
27
+ index);
28
+ return pair;
29
+ });
30
+ const pairs = await pairQ;
31
+ // 2. Unique falues for field1
32
+ const uniqueField1 = pairs
33
+ .map((item) => item.field1)
34
+ .filter((field1, index, emp) => emp.indexOf(field1) === index);
35
+ // 3. Compile for all the fields:
36
+ const field1Array = uniqueField1.map((field1, index) => {
37
+ return Object.assign({
38
+ field1: field1, // field1 = cp
39
+ });
40
+ });
41
+ return field1Array;
42
+ // Two dropdowns (= two fields):-----------------------
43
+ }
44
+ else if (this.fieldNames[2] === undefined) {
45
+ var query12 = this.featureLayers[0].createQuery();
46
+ query12.outFields = [this.fieldNames[0], this.fieldNames[1]];
47
+ query12.orderByFields = [this.fieldNames[0], this.fieldNames[1]];
48
+ query12.groupByFieldsForStatistics = [
49
+ this.fieldNames[0],
50
+ this.fieldNames[1],
51
+ ];
52
+ const pairQ = this.featureLayers[0]
53
+ .queryFeatures(query12)
54
+ .then((response) => {
55
+ var stats = response.features;
56
+ const values = stats.map((result, index) => {
57
+ const attributes = result.attributes;
58
+ const field1 = attributes[this.fieldNames[0]];
59
+ const field2 = attributes[this.fieldNames[1]];
60
+ return Object.assign({
61
+ field1: field1,
62
+ field2: field2,
63
+ });
64
+ });
65
+ // 1. Get a pair
66
+ const pair = values.filter((val, index) => values.findIndex((item) => item.field1 === val.field1 && item.field2 === val.field2) === index);
67
+ return pair;
68
+ });
69
+ const pairs = await pairQ;
70
+ // 2. Unique falues for field1
71
+ const uniqueField1 = pairs
72
+ .map((item) => item.field1)
73
+ .filter((field1, index, emp) => emp.indexOf(field1) === index);
74
+ // 3. Compile for all the fields:
75
+ const field1Array = uniqueField1.map((field1, index) => {
76
+ const filterField1 = pairs.filter((emp) => emp.field1 === field1);
77
+ const uniqueField2 = filterField1
78
+ .map((item) => item.field2)
79
+ .filter((field2, index, emp) => emp.indexOf(field2) === index);
80
+ // 3.2. Unique values for field3 corresponding to field1 and field2
81
+ // eslint-disable-next-line array-callback-return
82
+ const field2Array = uniqueField2.map((field2, index) => {
83
+ return Object.assign({
84
+ name: field2,
85
+ });
86
+ });
87
+ return Object.assign({
88
+ field1: field1, // field1 = cp
89
+ field2: field2Array, // field2 = company
90
+ });
91
+ });
92
+ return field1Array;
93
+ // Three dropdowns (= three fields):-----------------------
94
+ }
95
+ else {
96
+ // 1. Pairs for 1st feature layer
97
+ var query13 = this.featureLayers[0].createQuery();
98
+ query13.outFields = [this.fieldNames[0], this.fieldNames[1]];
99
+ query13.orderByFields = [this.fieldNames[0], this.fieldNames[1]];
100
+ query13.groupByFieldsForStatistics = [
101
+ this.fieldNames[0],
102
+ this.fieldNames[1],
103
+ ];
104
+ query13.where = `${this.fieldNames[0]} IS NOT NULL`;
105
+ const pairQ = this.featureLayers[0]
106
+ .queryFeatures(query13)
107
+ .then((response) => {
108
+ var stats = response.features;
109
+ const values = stats.map((result, index) => {
110
+ const attributes = result.attributes;
111
+ const field1 = attributes[this.fieldNames[0]];
112
+ const field2 = attributes[this.fieldNames[1]];
113
+ const field3 = attributes[this.fieldNames[2]];
114
+ return Object.assign({
115
+ field1: field1,
116
+ field2: field2,
117
+ field3: field3,
118
+ });
119
+ });
120
+ // 1. Get a pair
121
+ const pair = values.filter((val, index) => values.findIndex((item) => item.field1 === val.field1 &&
122
+ item.field2 === val.field2 &&
123
+ item.field3 === val.field3) === index);
124
+ return pair;
125
+ });
126
+ const pairs = await pairQ;
127
+ // 2. Unique falues for field1
128
+ const uniqueField1 = pairs
129
+ .map((item) => item.field1)
130
+ .filter((field1, index, emp) => emp.indexOf(field1) === index);
131
+ // 3. Compile for all the fields:
132
+ const field1Array = uniqueField1.map((field1, index) => {
133
+ const filterField1 = pairs.filter((emp) => emp.field1 === field1);
134
+ const uniqueField2 = filterField1
135
+ .map((item) => item.field2)
136
+ .filter((field2, index, emp) => emp.indexOf(field2) === index);
137
+ // 3.2. Unique values for field3 corresponding to field1 and field2
138
+ // eslint-disable-next-line array-callback-return
139
+ const field2Array = uniqueField2.map((field2, index) => {
140
+ const filterField2 = pairs.filter((emp) => emp.field1 === field1 && emp.field2 === field2);
141
+ const uniqueField3 = filterField2
142
+ .map((item) => item.field3)
143
+ .filter((field3, index, emp) => emp.indexOf(field3) === index);
144
+ // eslint-disable-next-line array-callback-return
145
+ const field3Array = uniqueField3.map((field3, index) => {
146
+ return Object.assign({
147
+ name: field3, // field3 = typeName (name?)
148
+ });
149
+ });
150
+ return Object.assign({
151
+ name: field2,
152
+ field3: field3Array, // field3 = type
153
+ });
154
+ });
155
+ return Object.assign({
156
+ field1: field1, // field1 = cp
157
+ field2: field2Array, // field2 = company
158
+ });
159
+ });
160
+ return field1Array;
161
+ }
162
+ //
163
+ //
164
+ //
165
+ //
166
+ // ################### Two Feature Layers ################### //
167
+ }
168
+ else {
169
+ // One dropdown (= one field):-----------------------
170
+ if (this.fieldNames[1] === undefined &&
171
+ this.fieldNames[2] === undefined) {
172
+ var query21p = this.featureLayers[0].createQuery();
173
+ query21p.outFields = ["*"];
174
+ query21p.orderByFields = [this.fieldNames[0]];
175
+ query21p.groupByFieldsForStatistics = [this.fieldNames[0]];
176
+ const pairQ = this.featureLayers[0]
177
+ .queryFeatures(query21p)
178
+ .then((response) => {
179
+ var stats = response.features;
180
+ const values = stats.map((result, index) => {
181
+ const attributes = result.attributes;
182
+ const field1 = attributes[this.fieldNames[0]];
183
+ return Object.assign({
184
+ field1: field1,
185
+ });
186
+ });
187
+ // 1. Get a pair
188
+ const pair = values.filter((val, index) => values.findIndex((item) => item.field1 === val.field1) ===
189
+ index);
190
+ return pair;
191
+ });
192
+ // 2. Pairs for 2nd feature layer
193
+ var query21l = this.featureLayers[1].createQuery();
194
+ query21l.outFields = ["*"];
195
+ const pairQ2 = this.featureLayers[1]
196
+ .queryFeatures(query21l)
197
+ .then((response) => {
198
+ var stats = response.features;
199
+ const values = stats.map((result, index) => {
200
+ const attributes = result.attributes;
201
+ const field1 = attributes[this.fieldNames[0]];
202
+ return Object.assign({
203
+ field1: field1,
204
+ });
205
+ });
206
+ // 1. Get a pair
207
+ const pair = values.filter((val, index) => values.findIndex((item) => item.field1 === val.field1) ===
208
+ index);
209
+ return pair;
210
+ });
211
+ // 3. Concatenate two pairs
212
+ const pair1 = await pairQ;
213
+ const pair2 = await pairQ2;
214
+ const pairs = pair1.concat(pair2);
215
+ // 2. Unique falues for field1
216
+ const uniqueField1 = pairs
217
+ .map((item) => item.field1)
218
+ .filter((field1, index, emp) => emp.indexOf(field1) === index);
219
+ // 3. Compile for all the fields:
220
+ const field1Array = uniqueField1.map((field1, index) => {
221
+ return Object.assign({
222
+ field1: field1, // field1 = cp
223
+ });
224
+ });
225
+ return field1Array;
226
+ // Two dropdowns (= two fields):-----------------------
227
+ }
228
+ else if (this.fieldNames[2] === undefined) {
229
+ var query22p = this.featureLayers[0].createQuery();
230
+ query22p.outFields = ["*"];
231
+ query22p.orderByFields = [this.fieldNames[0], this.fieldNames[1]];
232
+ query22p.groupByFieldsForStatistics = [
233
+ this.fieldNames[0],
234
+ this.fieldNames[1],
235
+ ];
236
+ const pairQ = this.featureLayers[0]
237
+ .queryFeatures(query22p)
238
+ .then((response) => {
239
+ var stats = response.features;
240
+ const values = stats.map((result, index) => {
241
+ const attributes = result.attributes;
242
+ const field1 = attributes[this.fieldNames[0]];
243
+ const field2 = attributes[this.fieldNames[1]];
244
+ return Object.assign({
245
+ field1: field1,
246
+ field2: field2,
247
+ });
248
+ });
249
+ // 1. Get a pair
250
+ const pair = values.filter((val, index) => values.findIndex((item) => item.field1 === val.field1 && item.field2 === val.field2) === index);
251
+ return pair;
252
+ });
253
+ // 2. Pairs for 2nd feature layer
254
+ var query22l = this.featureLayers[1].createQuery();
255
+ query22l.outFields = ["*"];
256
+ const pairQ2 = this.featureLayers[1]
257
+ .queryFeatures(query22l)
258
+ .then((response) => {
259
+ var stats = response.features;
260
+ const values = stats.map((result, index) => {
261
+ const attributes = result.attributes;
262
+ const field1 = attributes[this.fieldNames[0]];
263
+ const field2 = attributes[this.fieldNames[1]];
264
+ return Object.assign({
265
+ field1: field1,
266
+ field2: field2,
267
+ });
268
+ });
269
+ // 1. Get a pair
270
+ const pair = values.filter((val, index) => values.findIndex((item) => item.field1 === val.field1 && item.field2 === val.field2) === index);
271
+ return pair;
272
+ });
273
+ // 3. Concatenate two pairs
274
+ const pair1 = await pairQ;
275
+ const pair2 = await pairQ2;
276
+ const pairs = pair1.concat(pair2);
277
+ // 2. Unique falues for field1
278
+ const uniqueField1 = pairs
279
+ .map((item) => item.field1)
280
+ .filter((field1, index, emp) => emp.indexOf(field1) === index);
281
+ // 3. Compile for all the fields:
282
+ const field1Array = uniqueField1.map((field1, index) => {
283
+ const filterField1 = pairs.filter((emp) => emp.field1 === field1);
284
+ const uniqueField2 = filterField1
285
+ .map((item) => item.field2)
286
+ .filter((field2, index, emp) => emp.indexOf(field2) === index);
287
+ // 3.2. Unique values for field3 corresponding to field1 and field2
288
+ // eslint-disable-next-line array-callback-return
289
+ const field2Array = uniqueField2.map((field2, index) => {
290
+ return Object.assign({
291
+ name: field2,
292
+ });
293
+ });
294
+ return Object.assign({
295
+ field1: field1, // field1 = cp
296
+ field2: field2Array, // field2 = company
297
+ });
298
+ });
299
+ return field1Array;
300
+ // Three dropdowns (= three fields):-----------------------
301
+ }
302
+ else {
303
+ // 1. Pairs for 1st feature layer
304
+ var query23p = this.featureLayers[0].createQuery();
305
+ query23p.outFields = ["*"];
306
+ query23p.orderByFields = [this.fieldNames[0], this.fieldNames[1]];
307
+ query23p.groupByFieldsForStatistics = [
308
+ this.fieldNames[0],
309
+ this.fieldNames[1],
310
+ ];
311
+ const pairQ = this.featureLayers[0]
312
+ .queryFeatures(query23p)
313
+ .then((response) => {
314
+ var stats = response.features;
315
+ const values = stats.map((result, index) => {
316
+ const attributes = result.attributes;
317
+ const field1 = attributes[this.fieldNames[0]];
318
+ const field2 = attributes[this.fieldNames[1]];
319
+ const field3 = attributes[this.fieldNames[2]];
320
+ return Object.assign({
321
+ field1: field1,
322
+ field2: field2,
323
+ field3: field3,
324
+ });
325
+ });
326
+ // 1. Get a pair
327
+ const pair = values.filter((val, index) => values.findIndex((item) => item.field1 === val.field1 &&
328
+ item.field2 === val.field2 &&
329
+ item.field3 === val.field3) === index);
330
+ return pair;
331
+ });
332
+ // 2. Pairs for 2nd feature layer
333
+ var query23l = this.featureLayers[1].createQuery();
334
+ query23l.outFields = ["*"];
335
+ const pairQ2 = this.featureLayers[1]
336
+ .queryFeatures(query23l)
337
+ .then((response) => {
338
+ var stats = response.features;
339
+ const values = stats.map((result, index) => {
340
+ const attributes = result.attributes;
341
+ const field1 = attributes[this.fieldNames[0]];
342
+ const field2 = attributes[this.fieldNames[1]];
343
+ const field3 = attributes[this.fieldNames[2]];
344
+ return Object.assign({
345
+ field1: field1,
346
+ field2: field2,
347
+ field3: field3,
348
+ });
349
+ });
350
+ // 1. Get a pair
351
+ const pair = values.filter((val, index) => values.findIndex((item) => item.field1 === val.field1 &&
352
+ item.field2 === val.field2 &&
353
+ item.field3 === val.field3) === index);
354
+ return pair;
355
+ });
356
+ // 3. Concatenate two pairs
357
+ const pair1 = await pairQ;
358
+ const pair2 = await pairQ2;
359
+ const pairs = pair1.concat(pair2);
360
+ // 2. Unique falues for field1
361
+ const uniqueField1 = pairs
362
+ .map((item) => item.field1)
363
+ .filter((field1, index, emp) => emp.indexOf(field1) === index);
364
+ // 3. Compile for all the fields:
365
+ const field1Array = uniqueField1.map((field1, index) => {
366
+ const filterField1 = pairs.filter((emp) => emp.field1 === field1);
367
+ const uniqueField2 = filterField1
368
+ .map((item) => item.field2)
369
+ .filter((field2, index, emp) => emp.indexOf(field2) === index);
370
+ // 3.2. Unique values for field3 corresponding to field1 and field2
371
+ // eslint-disable-next-line array-callback-return
372
+ const field2Array = uniqueField2.map((field2, index) => {
373
+ const filterField2 = pairs.filter((emp) => emp.field1 === field1 && emp.field2 === field2);
374
+ const uniqueField3 = filterField2
375
+ .map((item) => item.field3)
376
+ .filter((field3, index, emp) => emp.indexOf(field3) === index);
377
+ // eslint-disable-next-line array-callback-return
378
+ const field3Array = uniqueField3.map((field3, index) => {
379
+ return Object.assign({
380
+ name: field3, // field3 = typeName (name?)
381
+ });
382
+ });
383
+ return Object.assign({
384
+ name: field2,
385
+ field3: field3Array, // field3 = type
386
+ });
387
+ });
388
+ return Object.assign({
389
+ field1: field1, // field1 = cp
390
+ field2: field2Array, // field2 = company
391
+ });
392
+ });
393
+ return field1Array;
394
+ }
395
+ }
396
+ }; // end of dropdown method
397
+ this.featureLayers = featureLayers;
398
+ this.fieldNames = fieldNames;
399
+ }
400
+ }
401
+ export default GenerateDropdownData;
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "npm-dropdown-package",
3
+ "version": "1.0.0",
4
+ "description": "A package to create an object-array using feature layers hosted in Portal for ArcGIS for react-select dropdown",
5
+ "main": "build/index.js",
6
+ "types": "build/index.d.ts",
7
+ "scripts": {
8
+ "build": "npx tsc",
9
+ "test": "echo \"Error: no test specified\" && exit 1"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/railway-sector/npm-dropdown-package.git"
14
+ },
15
+ "keywords": [
16
+ "dropdown",
17
+ "react-select"
18
+ ],
19
+ "author": "Eiji Matsuzaki",
20
+ "license": "ISC",
21
+ "bugs": {
22
+ "url": "https://github.com/railway-sector/npm-dropdown-package/issues"
23
+ },
24
+ "homepage": "https://github.com/railway-sector/npm-dropdown-package#readme",
25
+ "devDependencies": {
26
+ "typescript": "^5.9.3"
27
+ },
28
+
29
+ "peerDependencies": {
30
+ "@arcgis/core": "^4.34.6"
31
+ }
32
+ }
package/src/index.ts ADDED
@@ -0,0 +1,547 @@
1
+ import FeatureLayer from "@arcgis/core/layers/FeatureLayer";
2
+
3
+ class GenerateDropdownData {
4
+ featureLayers: [FeatureLayer, FeatureLayer?] | any;
5
+ fieldNames: [string, string?, string?] | any;
6
+
7
+ constructor(featureLayers: any, fieldNames: any) {
8
+ this.featureLayers = featureLayers;
9
+ this.fieldNames = fieldNames;
10
+ }
11
+
12
+ // Define method
13
+ dropDownQuery = async () => {
14
+ // ################### One Feature Layer ################### //
15
+ if (this.featureLayers.length === 1) {
16
+ // One dropdown (= one field):-----------------------
17
+ if (
18
+ this.fieldNames[1] === undefined &&
19
+ this.fieldNames[2] === undefined
20
+ ) {
21
+ var query11 = this.featureLayers[0].createQuery();
22
+ query11.outFields = ["*"];
23
+ query11.orderByFields = [this.fieldNames[0]];
24
+ query11.groupByFieldsForStatistics = [this.fieldNames[0]];
25
+
26
+ const pairQ: any = this.featureLayers[0]
27
+ .queryFeatures(query11)
28
+ .then((response: any) => {
29
+ var stats = response.features;
30
+ const values = stats.map((result: any, index: any) => {
31
+ const attributes = result.attributes;
32
+ const field1 = attributes[this.fieldNames[0]];
33
+ return Object.assign({
34
+ field1: field1,
35
+ });
36
+ });
37
+
38
+ // 1. Get a pair
39
+ const pair = values.filter(
40
+ (val: any, index: any) =>
41
+ values.findIndex((item: any) => item.field1 === val.field1) ===
42
+ index
43
+ );
44
+ return pair;
45
+ });
46
+
47
+ const pairs = await pairQ;
48
+
49
+ // 2. Unique falues for field1
50
+ const uniqueField1 = pairs
51
+ .map((item: any) => item.field1)
52
+ .filter(
53
+ (field1: any, index: any, emp: any) => emp.indexOf(field1) === index
54
+ );
55
+
56
+ // 3. Compile for all the fields:
57
+ const field1Array = uniqueField1.map((field1: any, index: number) => {
58
+ return Object.assign({
59
+ field1: field1, // field1 = cp
60
+ });
61
+ });
62
+ return field1Array;
63
+
64
+ // Two dropdowns (= two fields):-----------------------
65
+ } else if (this.fieldNames[2] === undefined) {
66
+ var query12 = this.featureLayers[0].createQuery();
67
+ query12.outFields = [this.fieldNames[0], this.fieldNames[1]];
68
+ query12.orderByFields = [this.fieldNames[0], this.fieldNames[1]];
69
+ query12.groupByFieldsForStatistics = [
70
+ this.fieldNames[0],
71
+ this.fieldNames[1],
72
+ ];
73
+
74
+ const pairQ: any = this.featureLayers[0]
75
+ .queryFeatures(query12)
76
+ .then((response: any) => {
77
+ var stats = response.features;
78
+ const values = stats.map((result: any, index: any) => {
79
+ const attributes = result.attributes;
80
+ const field1 = attributes[this.fieldNames[0]];
81
+ const field2 = attributes[this.fieldNames[1]];
82
+ return Object.assign({
83
+ field1: field1,
84
+ field2: field2,
85
+ });
86
+ });
87
+
88
+ // 1. Get a pair
89
+ const pair = values.filter(
90
+ (val: any, index: any) =>
91
+ values.findIndex(
92
+ (item: any) =>
93
+ item.field1 === val.field1 && item.field2 === val.field2
94
+ ) === index
95
+ );
96
+ return pair;
97
+ });
98
+
99
+ const pairs = await pairQ;
100
+
101
+ // 2. Unique falues for field1
102
+ const uniqueField1 = pairs
103
+ .map((item: any) => item.field1)
104
+ .filter(
105
+ (field1: any, index: any, emp: any) => emp.indexOf(field1) === index
106
+ );
107
+
108
+ // 3. Compile for all the fields:
109
+ const field1Array = uniqueField1.map((field1: any, index: number) => {
110
+ const filterField1 = pairs.filter(
111
+ (emp: any) => emp.field1 === field1
112
+ );
113
+ const uniqueField2 = filterField1
114
+ .map((item: any) => item.field2)
115
+ .filter(
116
+ (field2: any, index: any, emp: any) =>
117
+ emp.indexOf(field2) === index
118
+ );
119
+
120
+ // 3.2. Unique values for field3 corresponding to field1 and field2
121
+ // eslint-disable-next-line array-callback-return
122
+ const field2Array = uniqueField2.map((field2: any, index: any) => {
123
+ return Object.assign({
124
+ name: field2,
125
+ });
126
+ });
127
+ return Object.assign({
128
+ field1: field1, // field1 = cp
129
+ field2: field2Array, // field2 = company
130
+ });
131
+ });
132
+ return field1Array;
133
+
134
+ // Three dropdowns (= three fields):-----------------------
135
+ } else {
136
+ // 1. Pairs for 1st feature layer
137
+ var query13 = this.featureLayers[0].createQuery();
138
+ query13.outFields = [this.fieldNames[0], this.fieldNames[1]];
139
+ query13.orderByFields = [this.fieldNames[0], this.fieldNames[1]];
140
+ query13.groupByFieldsForStatistics = [
141
+ this.fieldNames[0],
142
+ this.fieldNames[1],
143
+ ];
144
+ query13.where = `${this.fieldNames[0]} IS NOT NULL`;
145
+
146
+ const pairQ: any = this.featureLayers[0]
147
+ .queryFeatures(query13)
148
+ .then((response: any) => {
149
+ var stats = response.features;
150
+ const values = stats.map((result: any, index: any) => {
151
+ const attributes = result.attributes;
152
+ const field1 = attributes[this.fieldNames[0]];
153
+ const field2 = attributes[this.fieldNames[1]];
154
+ const field3 = attributes[this.fieldNames[2]];
155
+ return Object.assign({
156
+ field1: field1,
157
+ field2: field2,
158
+ field3: field3,
159
+ });
160
+ });
161
+
162
+ // 1. Get a pair
163
+ const pair = values.filter(
164
+ (val: any, index: any) =>
165
+ values.findIndex(
166
+ (item: any) =>
167
+ item.field1 === val.field1 &&
168
+ item.field2 === val.field2 &&
169
+ item.field3 === val.field3
170
+ ) === index
171
+ );
172
+ return pair;
173
+ });
174
+
175
+ const pairs = await pairQ;
176
+
177
+ // 2. Unique falues for field1
178
+ const uniqueField1 = pairs
179
+ .map((item: any) => item.field1)
180
+ .filter(
181
+ (field1: any, index: any, emp: any) => emp.indexOf(field1) === index
182
+ );
183
+
184
+ // 3. Compile for all the fields:
185
+ const field1Array = uniqueField1.map((field1: any, index: number) => {
186
+ const filterField1 = pairs.filter(
187
+ (emp: any) => emp.field1 === field1
188
+ );
189
+ const uniqueField2 = filterField1
190
+ .map((item: any) => item.field2)
191
+ .filter(
192
+ (field2: any, index: any, emp: any) =>
193
+ emp.indexOf(field2) === index
194
+ );
195
+
196
+ // 3.2. Unique values for field3 corresponding to field1 and field2
197
+ // eslint-disable-next-line array-callback-return
198
+ const field2Array = uniqueField2.map((field2: any, index: any) => {
199
+ const filterField2 = pairs.filter(
200
+ (emp: any) => emp.field1 === field1 && emp.field2 === field2
201
+ );
202
+
203
+ const uniqueField3 = filterField2
204
+ .map((item: any) => item.field3)
205
+ .filter(
206
+ (field3: any, index: any, emp: any) =>
207
+ emp.indexOf(field3) === index
208
+ );
209
+
210
+ // eslint-disable-next-line array-callback-return
211
+ const field3Array = uniqueField3.map((field3: any, index: any) => {
212
+ return Object.assign({
213
+ name: field3, // field3 = typeName (name?)
214
+ });
215
+ });
216
+
217
+ return Object.assign({
218
+ name: field2,
219
+ field3: field3Array, // field3 = type
220
+ });
221
+ });
222
+ return Object.assign({
223
+ field1: field1, // field1 = cp
224
+ field2: field2Array, // field2 = company
225
+ });
226
+ });
227
+ return field1Array;
228
+ }
229
+ //
230
+ //
231
+ //
232
+ //
233
+ // ################### Two Feature Layers ################### //
234
+ } else {
235
+ // One dropdown (= one field):-----------------------
236
+ if (
237
+ this.fieldNames[1] === undefined &&
238
+ this.fieldNames[2] === undefined
239
+ ) {
240
+ var query21p = this.featureLayers[0].createQuery();
241
+ query21p.outFields = ["*"];
242
+ query21p.orderByFields = [this.fieldNames[0]];
243
+ query21p.groupByFieldsForStatistics = [this.fieldNames[0]];
244
+
245
+ const pairQ: any = this.featureLayers[0]
246
+ .queryFeatures(query21p)
247
+ .then((response: any) => {
248
+ var stats = response.features;
249
+ const values = stats.map((result: any, index: any) => {
250
+ const attributes = result.attributes;
251
+ const field1 = attributes[this.fieldNames[0]];
252
+ return Object.assign({
253
+ field1: field1,
254
+ });
255
+ });
256
+
257
+ // 1. Get a pair
258
+ const pair = values.filter(
259
+ (val: any, index: any) =>
260
+ values.findIndex((item: any) => item.field1 === val.field1) ===
261
+ index
262
+ );
263
+ return pair;
264
+ });
265
+
266
+ // 2. Pairs for 2nd feature layer
267
+ var query21l = this.featureLayers[1].createQuery();
268
+ query21l.outFields = ["*"];
269
+
270
+ const pairQ2: any = this.featureLayers[1]
271
+ .queryFeatures(query21l)
272
+ .then((response: any) => {
273
+ var stats = response.features;
274
+ const values = stats.map((result: any, index: any) => {
275
+ const attributes = result.attributes;
276
+ const field1 = attributes[this.fieldNames[0]];
277
+ return Object.assign({
278
+ field1: field1,
279
+ });
280
+ });
281
+
282
+ // 1. Get a pair
283
+ const pair = values.filter(
284
+ (val: any, index: any) =>
285
+ values.findIndex((item: any) => item.field1 === val.field1) ===
286
+ index
287
+ );
288
+ return pair;
289
+ });
290
+
291
+ // 3. Concatenate two pairs
292
+ const pair1 = await pairQ;
293
+ const pair2 = await pairQ2;
294
+ const pairs = pair1.concat(pair2);
295
+
296
+ // 2. Unique falues for field1
297
+ const uniqueField1 = pairs
298
+ .map((item: any) => item.field1)
299
+ .filter(
300
+ (field1: any, index: any, emp: any) => emp.indexOf(field1) === index
301
+ );
302
+
303
+ // 3. Compile for all the fields:
304
+ const field1Array = uniqueField1.map((field1: any, index: number) => {
305
+ return Object.assign({
306
+ field1: field1, // field1 = cp
307
+ });
308
+ });
309
+ return field1Array;
310
+
311
+ // Two dropdowns (= two fields):-----------------------
312
+ } else if (this.fieldNames[2] === undefined) {
313
+ var query22p = this.featureLayers[0].createQuery();
314
+ query22p.outFields = ["*"];
315
+ query22p.orderByFields = [this.fieldNames[0], this.fieldNames[1]];
316
+ query22p.groupByFieldsForStatistics = [
317
+ this.fieldNames[0],
318
+ this.fieldNames[1],
319
+ ];
320
+
321
+ const pairQ: any = this.featureLayers[0]
322
+ .queryFeatures(query22p)
323
+ .then((response: any) => {
324
+ var stats = response.features;
325
+ const values = stats.map((result: any, index: any) => {
326
+ const attributes = result.attributes;
327
+ const field1 = attributes[this.fieldNames[0]];
328
+ const field2 = attributes[this.fieldNames[1]];
329
+ return Object.assign({
330
+ field1: field1,
331
+ field2: field2,
332
+ });
333
+ });
334
+
335
+ // 1. Get a pair
336
+ const pair = values.filter(
337
+ (val: any, index: any) =>
338
+ values.findIndex(
339
+ (item: any) =>
340
+ item.field1 === val.field1 && item.field2 === val.field2
341
+ ) === index
342
+ );
343
+ return pair;
344
+ });
345
+
346
+ // 2. Pairs for 2nd feature layer
347
+ var query22l = this.featureLayers[1].createQuery();
348
+ query22l.outFields = ["*"];
349
+
350
+ const pairQ2: any = this.featureLayers[1]
351
+ .queryFeatures(query22l)
352
+ .then((response: any) => {
353
+ var stats = response.features;
354
+ const values = stats.map((result: any, index: any) => {
355
+ const attributes = result.attributes;
356
+ const field1 = attributes[this.fieldNames[0]];
357
+ const field2 = attributes[this.fieldNames[1]];
358
+ return Object.assign({
359
+ field1: field1,
360
+ field2: field2,
361
+ });
362
+ });
363
+
364
+ // 1. Get a pair
365
+ const pair = values.filter(
366
+ (val: any, index: any) =>
367
+ values.findIndex(
368
+ (item: any) =>
369
+ item.field1 === val.field1 && item.field2 === val.field2
370
+ ) === index
371
+ );
372
+ return pair;
373
+ });
374
+
375
+ // 3. Concatenate two pairs
376
+ const pair1 = await pairQ;
377
+ const pair2 = await pairQ2;
378
+ const pairs = pair1.concat(pair2);
379
+
380
+ // 2. Unique falues for field1
381
+ const uniqueField1 = pairs
382
+ .map((item: any) => item.field1)
383
+ .filter(
384
+ (field1: any, index: any, emp: any) => emp.indexOf(field1) === index
385
+ );
386
+
387
+ // 3. Compile for all the fields:
388
+ const field1Array = uniqueField1.map((field1: any, index: number) => {
389
+ const filterField1 = pairs.filter(
390
+ (emp: any) => emp.field1 === field1
391
+ );
392
+ const uniqueField2 = filterField1
393
+ .map((item: any) => item.field2)
394
+ .filter(
395
+ (field2: any, index: any, emp: any) =>
396
+ emp.indexOf(field2) === index
397
+ );
398
+
399
+ // 3.2. Unique values for field3 corresponding to field1 and field2
400
+ // eslint-disable-next-line array-callback-return
401
+ const field2Array = uniqueField2.map((field2: any, index: any) => {
402
+ return Object.assign({
403
+ name: field2,
404
+ });
405
+ });
406
+ return Object.assign({
407
+ field1: field1, // field1 = cp
408
+ field2: field2Array, // field2 = company
409
+ });
410
+ });
411
+ return field1Array;
412
+
413
+ // Three dropdowns (= three fields):-----------------------
414
+ } else {
415
+ // 1. Pairs for 1st feature layer
416
+ var query23p = this.featureLayers[0].createQuery();
417
+ query23p.outFields = ["*"];
418
+ query23p.orderByFields = [this.fieldNames[0], this.fieldNames[1]];
419
+ query23p.groupByFieldsForStatistics = [
420
+ this.fieldNames[0],
421
+ this.fieldNames[1],
422
+ ];
423
+
424
+ const pairQ: any = this.featureLayers[0]
425
+ .queryFeatures(query23p)
426
+ .then((response: any) => {
427
+ var stats = response.features;
428
+ const values = stats.map((result: any, index: any) => {
429
+ const attributes = result.attributes;
430
+ const field1 = attributes[this.fieldNames[0]];
431
+ const field2 = attributes[this.fieldNames[1]];
432
+ const field3 = attributes[this.fieldNames[2]];
433
+ return Object.assign({
434
+ field1: field1,
435
+ field2: field2,
436
+ field3: field3,
437
+ });
438
+ });
439
+
440
+ // 1. Get a pair
441
+ const pair = values.filter(
442
+ (val: any, index: any) =>
443
+ values.findIndex(
444
+ (item: any) =>
445
+ item.field1 === val.field1 &&
446
+ item.field2 === val.field2 &&
447
+ item.field3 === val.field3
448
+ ) === index
449
+ );
450
+ return pair;
451
+ });
452
+
453
+ // 2. Pairs for 2nd feature layer
454
+ var query23l = this.featureLayers[1].createQuery();
455
+ query23l.outFields = ["*"];
456
+
457
+ const pairQ2: any = this.featureLayers[1]
458
+ .queryFeatures(query23l)
459
+ .then((response: any) => {
460
+ var stats = response.features;
461
+ const values = stats.map((result: any, index: any) => {
462
+ const attributes = result.attributes;
463
+ const field1 = attributes[this.fieldNames[0]];
464
+ const field2 = attributes[this.fieldNames[1]];
465
+ const field3 = attributes[this.fieldNames[2]];
466
+ return Object.assign({
467
+ field1: field1,
468
+ field2: field2,
469
+ field3: field3,
470
+ });
471
+ });
472
+
473
+ // 1. Get a pair
474
+ const pair = values.filter(
475
+ (val: any, index: any) =>
476
+ values.findIndex(
477
+ (item: any) =>
478
+ item.field1 === val.field1 &&
479
+ item.field2 === val.field2 &&
480
+ item.field3 === val.field3
481
+ ) === index
482
+ );
483
+ return pair;
484
+ });
485
+
486
+ // 3. Concatenate two pairs
487
+ const pair1 = await pairQ;
488
+ const pair2 = await pairQ2;
489
+ const pairs = pair1.concat(pair2);
490
+
491
+ // 2. Unique falues for field1
492
+ const uniqueField1 = pairs
493
+ .map((item: any) => item.field1)
494
+ .filter(
495
+ (field1: any, index: any, emp: any) => emp.indexOf(field1) === index
496
+ );
497
+
498
+ // 3. Compile for all the fields:
499
+ const field1Array = uniqueField1.map((field1: any, index: number) => {
500
+ const filterField1 = pairs.filter(
501
+ (emp: any) => emp.field1 === field1
502
+ );
503
+ const uniqueField2 = filterField1
504
+ .map((item: any) => item.field2)
505
+ .filter(
506
+ (field2: any, index: any, emp: any) =>
507
+ emp.indexOf(field2) === index
508
+ );
509
+
510
+ // 3.2. Unique values for field3 corresponding to field1 and field2
511
+ // eslint-disable-next-line array-callback-return
512
+ const field2Array = uniqueField2.map((field2: any, index: any) => {
513
+ const filterField2 = pairs.filter(
514
+ (emp: any) => emp.field1 === field1 && emp.field2 === field2
515
+ );
516
+
517
+ const uniqueField3 = filterField2
518
+ .map((item: any) => item.field3)
519
+ .filter(
520
+ (field3: any, index: any, emp: any) =>
521
+ emp.indexOf(field3) === index
522
+ );
523
+
524
+ // eslint-disable-next-line array-callback-return
525
+ const field3Array = uniqueField3.map((field3: any, index: any) => {
526
+ return Object.assign({
527
+ name: field3, // field3 = typeName (name?)
528
+ });
529
+ });
530
+
531
+ return Object.assign({
532
+ name: field2,
533
+ field3: field3Array, // field3 = type
534
+ });
535
+ });
536
+ return Object.assign({
537
+ field1: field1, // field1 = cp
538
+ field2: field2Array, // field2 = company
539
+ });
540
+ });
541
+ return field1Array;
542
+ }
543
+ }
544
+ }; // end of dropdown method
545
+ }
546
+
547
+ export default GenerateDropdownData;
package/tsconfig.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "compilerOptions": {
3
+ "outDir": "./build", // Or your preferred output directory
4
+ "rootDir": "./src", // Or the directory containing your source .ts files
5
+ "target": "esnext",
6
+ "module": "esnext",
7
+ "declaration": true, // Essential for generating .d.ts files
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "forceConsistentCasingInFileNames": true,
12
+ "moduleResolution": "node",
13
+ "experimentalDecorators": true,
14
+ "useDefineForClassFields": false
15
+ },
16
+ "include": ["src/**/*.ts"], // Or the path to your source .ts files
17
+ "exclude": ["node_modules", "build"] // Or your output directory
18
+ }