@cdc/map 4.22.10 → 4.23.1
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/495.js +3 -0
- package/dist/703.js +1 -0
- package/dist/856.js +3 -0
- package/dist/cdcmap.js +724 -120
- package/examples/bubble-us.json +362 -362
- package/examples/bubble-world.json +426 -426
- package/examples/city-state.json +434 -0
- package/examples/example-city-state.json +202 -25
- package/package.json +3 -4
- package/src/CdcMap.js +249 -423
- package/src/components/BubbleList.js +198 -240
- package/src/components/CityList.js +50 -97
- package/src/components/CountyMap.js +511 -600
- package/src/components/DataTable.js +223 -230
- package/src/components/EditorPanel.js +2395 -2551
- package/src/components/Filters.js +114 -0
- package/src/components/Geo.js +4 -14
- package/src/components/Modal.js +13 -23
- package/src/components/NavigationMenu.js +43 -39
- package/src/components/Sidebar.js +77 -93
- package/src/components/SingleStateMap.js +95 -151
- package/src/components/UsaMap.js +165 -214
- package/src/components/UsaRegionMap.js +122 -160
- package/src/components/WorldMap.js +96 -179
- package/src/components/ZoomableGroup.js +6 -26
- package/src/context.js +5 -0
- package/src/data/initial-state.js +20 -15
- package/src/data/supported-geos.js +3201 -3175
- package/src/hooks/useActiveElement.js +13 -13
- package/src/hooks/useColorPalette.ts +66 -74
- package/src/hooks/useZoomPan.js +22 -23
- package/src/index.html +32 -29
- package/src/scss/datatable.scss +1 -2
- package/src/scss/filters.scss +42 -0
- package/src/scss/main.scss +4 -3
- package/src/scss/sidebar.scss +22 -0
- package/examples/private/atsdr.json +0 -439
- package/examples/private/atsdr_new.json +0 -436
- package/examples/private/bubble.json +0 -285
- package/examples/private/city-state.json +0 -428
- package/examples/private/cty-issue.json +0 -42768
- package/examples/private/default-usa.json +0 -460
- package/examples/private/default-world-data.json +0 -1444
- package/examples/private/default.json +0 -968
- package/examples/private/legend-issue.json +0 -1
- package/examples/private/map-rounding-error.json +0 -42759
- package/examples/private/map.csv +0 -60
- package/examples/private/mdx.json +0 -210
- package/examples/private/monkeypox.json +0 -376
- package/examples/private/regions.json +0 -52
- package/examples/private/valid-data-map.csv +0 -59
- package/examples/private/wcmsrd-13881-data.json +0 -2858
- package/examples/private/wcmsrd-13881.json +0 -5823
- package/examples/private/wcmsrd-14492-data.json +0 -292
- package/examples/private/wcmsrd-14492.json +0 -114
- package/examples/private/wcmsrd-test.json +0 -268
- package/examples/private/world.json +0 -1580
- package/examples/private/worldmap.json +0 -1490
|
@@ -1,1875 +1,1779 @@
|
|
|
1
|
-
import React, { useState, useEffect, useCallback, memo } from 'react'
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
} from '
|
|
9
|
-
import
|
|
10
|
-
|
|
11
|
-
import
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
import
|
|
15
|
-
import
|
|
16
|
-
|
|
17
|
-
import
|
|
18
|
-
import
|
|
19
|
-
|
|
20
|
-
import
|
|
21
|
-
|
|
22
|
-
import
|
|
23
|
-
import AlabamaGraphic from '@cdc/core/assets/icon-map-alabama.svg';
|
|
24
|
-
import worldDefaultConfig from '../../examples/default-world.json';
|
|
25
|
-
import usaDefaultConfig from '../../examples/default-usa.json';
|
|
26
|
-
import countyDefaultConfig from '../../examples/default-county.json';
|
|
27
|
-
|
|
28
|
-
import InputToggle from '@cdc/core/components/inputs/InputToggle';
|
|
1
|
+
import React, { useState, useEffect, useCallback, memo } from 'react'
|
|
2
|
+
import { Accordion, AccordionItem, AccordionItemHeading, AccordionItemPanel, AccordionItemButton } from 'react-accessible-accordion'
|
|
3
|
+
import ReactTooltip from 'react-tooltip'
|
|
4
|
+
import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd'
|
|
5
|
+
import { useDebounce } from 'use-debounce'
|
|
6
|
+
|
|
7
|
+
import colorPalettes from '@cdc/core/data/colorPalettes'
|
|
8
|
+
import { supportedStatesFipsCodes } from '../data/supported-geos'
|
|
9
|
+
import { useColorPalette } from '../hooks/useColorPalette'
|
|
10
|
+
|
|
11
|
+
import ErrorBoundary from '@cdc/core/components/ErrorBoundary'
|
|
12
|
+
import Waiting from '@cdc/core/components/Waiting'
|
|
13
|
+
|
|
14
|
+
import UsaGraphic from '@cdc/core/assets/icon-map-usa.svg'
|
|
15
|
+
import UsaRegionGraphic from '@cdc/core/assets/usa-region-graphic.svg'
|
|
16
|
+
import WorldGraphic from '@cdc/core/assets/icon-map-world.svg'
|
|
17
|
+
import AlabamaGraphic from '@cdc/core/assets/icon-map-alabama.svg'
|
|
18
|
+
import worldDefaultConfig from '../../examples/default-world.json'
|
|
19
|
+
import usaDefaultConfig from '../../examples/default-usa.json'
|
|
20
|
+
import countyDefaultConfig from '../../examples/default-county.json'
|
|
21
|
+
|
|
22
|
+
import InputToggle from '@cdc/core/components/inputs/InputToggle'
|
|
29
23
|
import Tooltip from '@cdc/core/components/ui/Tooltip'
|
|
30
24
|
import Icon from '@cdc/core/components/ui/Icon'
|
|
31
25
|
|
|
32
|
-
import AdvancedEditor from '@cdc/core/components/AdvancedEditor'
|
|
26
|
+
import AdvancedEditor from '@cdc/core/components/AdvancedEditor'
|
|
33
27
|
|
|
34
|
-
const ReactTags = require('react-tag-autocomplete')
|
|
35
|
-
|
|
36
|
-
const TextField = ({
|
|
37
|
-
label,
|
|
38
|
-
section = null,
|
|
39
|
-
subsection = null,
|
|
40
|
-
fieldName,
|
|
41
|
-
updateField,
|
|
42
|
-
value: stateValue,
|
|
43
|
-
type = 'input',
|
|
44
|
-
tooltip,
|
|
45
|
-
...attributes
|
|
46
|
-
}) => {
|
|
47
|
-
const [value, setValue] = useState(stateValue);
|
|
48
|
-
|
|
49
|
-
const [debouncedValue] = useDebounce(value, 500);
|
|
50
|
-
|
|
51
|
-
useEffect(() => {
|
|
52
|
-
if ('string' === typeof debouncedValue && stateValue !== debouncedValue) {
|
|
53
|
-
updateField(section, subsection, fieldName, debouncedValue);
|
|
54
|
-
}
|
|
55
|
-
}, [debouncedValue]);
|
|
56
|
-
|
|
57
|
-
let name = subsection ? `${section}-${subsection}-${fieldName}` : `${section}-${subsection}-${fieldName}`;
|
|
58
|
-
|
|
59
|
-
const onChange = (e) => setValue(e.target.value);
|
|
28
|
+
const ReactTags = require('react-tag-autocomplete') // Future: Lazy
|
|
60
29
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if ('textarea' === type) {
|
|
64
|
-
formElement = <textarea name={name} onChange={onChange} {...attributes} value={value}></textarea>;
|
|
65
|
-
}
|
|
30
|
+
const TextField = ({ label, section = null, subsection = null, fieldName, updateField, value: stateValue, type = 'input', tooltip, ...attributes }) => {
|
|
31
|
+
const [value, setValue] = useState(stateValue)
|
|
66
32
|
|
|
67
|
-
|
|
68
|
-
formElement = <input type='number' name={name} onChange={onChange} {...attributes} value={value} />;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return (
|
|
72
|
-
<label>
|
|
73
|
-
<span className='edit-label column-heading'>
|
|
74
|
-
{label}{tooltip}
|
|
75
|
-
</span>
|
|
76
|
-
{formElement}
|
|
77
|
-
</label>
|
|
78
|
-
);
|
|
79
|
-
};
|
|
33
|
+
const [debouncedValue] = useDebounce(value, 500)
|
|
80
34
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
if ('string' === typeof debouncedValue && stateValue !== debouncedValue) {
|
|
37
|
+
updateField(section, subsection, fieldName, debouncedValue)
|
|
38
|
+
}
|
|
39
|
+
}, [debouncedValue])
|
|
40
|
+
|
|
41
|
+
let name = subsection ? `${section}-${subsection}-${fieldName}` : `${section}-${subsection}-${fieldName}`
|
|
42
|
+
|
|
43
|
+
const onChange = e => setValue(e.target.value)
|
|
44
|
+
|
|
45
|
+
let formElement = <input type='text' name={name} onChange={onChange} {...attributes} value={value} />
|
|
46
|
+
|
|
47
|
+
if ('textarea' === type) {
|
|
48
|
+
formElement = <textarea name={name} onChange={onChange} {...attributes} value={value}></textarea>
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if ('number' === type) {
|
|
52
|
+
formElement = <input type='number' name={name} onChange={onChange} {...attributes} value={value} />
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<label>
|
|
57
|
+
<span className='edit-label column-heading'>
|
|
58
|
+
{label}
|
|
59
|
+
{tooltip}
|
|
60
|
+
</span>
|
|
61
|
+
{formElement}
|
|
62
|
+
</label>
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const EditorPanel = props => {
|
|
67
|
+
const { state, columnsInData = [], loadConfig, setState, isDashboard, setParentConfig, setRuntimeFilters, runtimeFilters, runtimeLegend } = props
|
|
68
|
+
|
|
69
|
+
const { general, columns, legend, dataTable, tooltips } = state
|
|
70
|
+
|
|
71
|
+
const [requiredColumns, setRequiredColumns] = useState(null) // Simple state so we know if we need more information before parsing the map
|
|
72
|
+
|
|
73
|
+
const [configTextboxValue, setConfigTextbox] = useState({})
|
|
74
|
+
|
|
75
|
+
const [loadedDefault, setLoadedDefault] = useState(false)
|
|
76
|
+
|
|
77
|
+
const [displayPanel, setDisplayPanel] = useState(true)
|
|
78
|
+
|
|
79
|
+
const [advancedToggle, setAdvancedToggle] = useState(false)
|
|
80
|
+
|
|
81
|
+
const [activeFilterValueForDescription, setActiveFilterValueForDescription] = useState([0, 0])
|
|
82
|
+
|
|
83
|
+
const { filteredPallets, filteredQualitative, isPaletteReversed, paletteName } = useColorPalette(colorPalettes, state)
|
|
84
|
+
|
|
85
|
+
const headerColors = ['theme-blue', 'theme-purple', 'theme-brown', 'theme-teal', 'theme-pink', 'theme-orange', 'theme-slate', 'theme-indigo', 'theme-cyan', 'theme-green', 'theme-amber']
|
|
86
|
+
|
|
87
|
+
const categoryMove = (idx1, idx2) => {
|
|
88
|
+
let categoryValuesOrder = [...state.legend.categoryValuesOrder]
|
|
89
|
+
|
|
90
|
+
let [movedItem] = categoryValuesOrder.splice(idx1, 1)
|
|
91
|
+
|
|
92
|
+
categoryValuesOrder.splice(idx2, 0, movedItem)
|
|
93
|
+
|
|
94
|
+
setState({
|
|
95
|
+
...state,
|
|
96
|
+
legend: {
|
|
97
|
+
...state.legend,
|
|
98
|
+
categoryValuesOrder
|
|
99
|
+
}
|
|
100
|
+
})
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const handleFilterOrder = (idx1, idx2, filterIndex, filter) => {
|
|
104
|
+
let filterOrder = filter.values
|
|
105
|
+
let [movedItem] = filterOrder.splice(idx1, 1)
|
|
106
|
+
filterOrder.splice(idx2, 0, movedItem)
|
|
107
|
+
let filters = [...runtimeFilters]
|
|
108
|
+
let filterItem = { ...runtimeFilters[filterIndex] }
|
|
109
|
+
filterItem.active = filter.values[0]
|
|
110
|
+
filterItem.values = filterOrder
|
|
111
|
+
filterItem.order = 'cust'
|
|
112
|
+
filters[filterIndex] = filterItem
|
|
113
|
+
|
|
114
|
+
setState({
|
|
115
|
+
...state,
|
|
116
|
+
filters
|
|
117
|
+
})
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const DynamicDesc = ({ label, fieldName, value: stateValue, type = 'input', ...attributes }) => {
|
|
121
|
+
const [value, setValue] = useState(stateValue)
|
|
122
|
+
|
|
123
|
+
const [debouncedValue] = useDebounce(value, 500)
|
|
124
|
+
|
|
125
|
+
useEffect(() => {
|
|
126
|
+
if ('string' === typeof debouncedValue && stateValue !== debouncedValue) {
|
|
127
|
+
handleEditorChanges('changeLegendDescription', [String(activeFilterValueForDescription), debouncedValue])
|
|
128
|
+
}
|
|
129
|
+
}, [debouncedValue])
|
|
130
|
+
|
|
131
|
+
const onChange = e => setValue(e.target.value)
|
|
132
|
+
|
|
133
|
+
return <textarea onChange={onChange} {...attributes} value={value}></textarea>
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const handleEditorChanges = async (property, value) => {
|
|
137
|
+
switch (property) {
|
|
138
|
+
// change these to be more generic.
|
|
139
|
+
// updateVisualPropertyValue
|
|
140
|
+
// updateGeneralPropertyValue, etc.
|
|
141
|
+
case 'showBubbleZeros':
|
|
142
|
+
setState({
|
|
143
|
+
...state,
|
|
144
|
+
visual: {
|
|
145
|
+
...state.visual,
|
|
146
|
+
showBubbleZeros: value
|
|
147
|
+
}
|
|
148
|
+
})
|
|
149
|
+
break
|
|
150
|
+
|
|
151
|
+
case 'showEqualNumber':
|
|
152
|
+
setState({
|
|
153
|
+
...state,
|
|
154
|
+
general: {
|
|
155
|
+
...state.general,
|
|
156
|
+
equalNumberOptIn: value
|
|
157
|
+
}
|
|
158
|
+
})
|
|
159
|
+
break
|
|
160
|
+
|
|
161
|
+
case 'hideGeoColumnInTooltip':
|
|
162
|
+
setState({
|
|
163
|
+
...state,
|
|
164
|
+
general: {
|
|
165
|
+
...state.general,
|
|
166
|
+
[property]: value
|
|
167
|
+
}
|
|
168
|
+
})
|
|
169
|
+
break
|
|
170
|
+
|
|
171
|
+
case 'toggleDataUrl':
|
|
172
|
+
setState({
|
|
173
|
+
...state,
|
|
174
|
+
table: {
|
|
175
|
+
...state.table,
|
|
176
|
+
showDownloadUrl: value
|
|
177
|
+
}
|
|
178
|
+
})
|
|
179
|
+
break
|
|
180
|
+
|
|
181
|
+
case 'toggleExtraBubbleBorder':
|
|
182
|
+
setState({
|
|
183
|
+
...state,
|
|
184
|
+
visual: {
|
|
185
|
+
...state.visual,
|
|
186
|
+
extraBubbleBorder: value
|
|
187
|
+
}
|
|
188
|
+
})
|
|
189
|
+
break
|
|
190
|
+
case 'allowMapZoom':
|
|
191
|
+
setState({
|
|
192
|
+
...state,
|
|
193
|
+
general: {
|
|
194
|
+
...state.general,
|
|
195
|
+
allowMapZoom: value
|
|
196
|
+
}
|
|
197
|
+
})
|
|
198
|
+
break
|
|
199
|
+
case 'hideGeoColumnInTooltip':
|
|
200
|
+
setState({
|
|
201
|
+
...state,
|
|
202
|
+
[property]: value
|
|
203
|
+
})
|
|
204
|
+
break
|
|
205
|
+
case 'hidePrimaryColumnInTooltip':
|
|
206
|
+
setState({
|
|
207
|
+
...state,
|
|
208
|
+
general: {
|
|
209
|
+
...state.general,
|
|
210
|
+
[property]: value
|
|
211
|
+
}
|
|
212
|
+
})
|
|
213
|
+
break
|
|
214
|
+
case 'showTitle':
|
|
215
|
+
setState({
|
|
216
|
+
...state,
|
|
217
|
+
general: {
|
|
218
|
+
...state.general,
|
|
219
|
+
showTitle: value
|
|
220
|
+
}
|
|
221
|
+
})
|
|
222
|
+
break
|
|
223
|
+
case 'showSidebar':
|
|
224
|
+
setState({
|
|
225
|
+
...state,
|
|
226
|
+
general: {
|
|
227
|
+
...state.general,
|
|
228
|
+
showSidebar: value
|
|
229
|
+
}
|
|
230
|
+
})
|
|
231
|
+
break
|
|
232
|
+
case 'fullBorder':
|
|
233
|
+
setState({
|
|
234
|
+
...state,
|
|
235
|
+
general: {
|
|
236
|
+
...state.general,
|
|
237
|
+
fullBorder: value
|
|
238
|
+
}
|
|
239
|
+
})
|
|
240
|
+
break
|
|
241
|
+
case 'expandDataTable':
|
|
242
|
+
setState({
|
|
243
|
+
...state,
|
|
244
|
+
general: {
|
|
245
|
+
...state.general,
|
|
246
|
+
expandDataTable: value
|
|
247
|
+
}
|
|
248
|
+
})
|
|
249
|
+
break
|
|
250
|
+
case 'color':
|
|
251
|
+
setState({
|
|
252
|
+
...state,
|
|
253
|
+
color: value
|
|
254
|
+
})
|
|
255
|
+
break
|
|
256
|
+
case 'sidebarPosition':
|
|
257
|
+
setState({
|
|
258
|
+
...state,
|
|
259
|
+
legend: {
|
|
260
|
+
...state.legend,
|
|
261
|
+
position: value
|
|
262
|
+
}
|
|
263
|
+
})
|
|
264
|
+
break
|
|
265
|
+
case 'handleCityStyle':
|
|
266
|
+
setState({
|
|
267
|
+
...state,
|
|
268
|
+
visual: {
|
|
269
|
+
cityStyle: value
|
|
270
|
+
}
|
|
271
|
+
})
|
|
272
|
+
break
|
|
273
|
+
case 'geoBorderColor':
|
|
274
|
+
setState({
|
|
275
|
+
...state,
|
|
276
|
+
general: {
|
|
277
|
+
...state.general,
|
|
278
|
+
geoBorderColor: value
|
|
279
|
+
}
|
|
280
|
+
})
|
|
281
|
+
break
|
|
282
|
+
case 'headerColor':
|
|
283
|
+
setState({
|
|
284
|
+
...state,
|
|
285
|
+
general: {
|
|
286
|
+
...state.general,
|
|
287
|
+
headerColor: value
|
|
288
|
+
}
|
|
289
|
+
})
|
|
290
|
+
break
|
|
291
|
+
case 'navigateColumn':
|
|
292
|
+
setState({
|
|
293
|
+
...state,
|
|
294
|
+
columns: {
|
|
295
|
+
...state.columns,
|
|
296
|
+
navigate: {
|
|
297
|
+
...state.columns.navigate,
|
|
298
|
+
name: value
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
})
|
|
302
|
+
break
|
|
303
|
+
case 'legendDescription':
|
|
304
|
+
setState({
|
|
305
|
+
...state,
|
|
306
|
+
legend: {
|
|
307
|
+
...state.legend,
|
|
308
|
+
description: value
|
|
309
|
+
}
|
|
310
|
+
})
|
|
311
|
+
break
|
|
312
|
+
case 'legendType':
|
|
313
|
+
let testForType = Number(typeof state.data[0][state.columns.primary.name])
|
|
314
|
+
let hasValue = state.data[0][state.columns.primary.name]
|
|
315
|
+
let messages = []
|
|
316
|
+
|
|
317
|
+
if (!hasValue) {
|
|
318
|
+
messages.push(`There appears to be values missing for data in the primary column ${state.columns.primary.name}`)
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
if (testForType === 'string' && isNaN(testForType) && value !== 'category') {
|
|
322
|
+
messages.push('Error with legend. Primary columns that are text must use a categorical legend type. Try changing the legend type to DEV-12345categorical.')
|
|
323
|
+
} else {
|
|
324
|
+
messages = []
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
setState({
|
|
328
|
+
...state,
|
|
329
|
+
legend: {
|
|
330
|
+
...state.legend,
|
|
331
|
+
type: value
|
|
332
|
+
},
|
|
333
|
+
runtime: {
|
|
334
|
+
...state.runtime,
|
|
335
|
+
editorErrorMessage: messages
|
|
336
|
+
}
|
|
337
|
+
})
|
|
338
|
+
break
|
|
339
|
+
case 'legendNumber':
|
|
340
|
+
setState({
|
|
341
|
+
...state,
|
|
342
|
+
legend: {
|
|
343
|
+
...state.legend,
|
|
344
|
+
numberOfItems: parseInt(value)
|
|
345
|
+
}
|
|
346
|
+
})
|
|
347
|
+
break
|
|
348
|
+
case 'changeActiveFilterValue':
|
|
349
|
+
const arrVal = value.split(',')
|
|
350
|
+
|
|
351
|
+
setActiveFilterValueForDescription(arrVal)
|
|
352
|
+
break
|
|
353
|
+
case 'unifiedLegend':
|
|
354
|
+
setState({
|
|
355
|
+
...state,
|
|
356
|
+
legend: {
|
|
357
|
+
...state.legend,
|
|
358
|
+
unified: value
|
|
359
|
+
}
|
|
360
|
+
})
|
|
361
|
+
break
|
|
362
|
+
case 'separateZero':
|
|
363
|
+
setState({
|
|
364
|
+
...state,
|
|
365
|
+
legend: {
|
|
366
|
+
...state.legend,
|
|
367
|
+
separateZero: value
|
|
368
|
+
}
|
|
369
|
+
})
|
|
370
|
+
break
|
|
371
|
+
case 'toggleDownloadButton':
|
|
372
|
+
setState({
|
|
373
|
+
...state,
|
|
374
|
+
general: {
|
|
375
|
+
...state.general,
|
|
376
|
+
showDownloadButton: !state.general.showDownloadButton
|
|
377
|
+
}
|
|
378
|
+
})
|
|
379
|
+
break
|
|
380
|
+
case 'toggleDownloadImgButton':
|
|
381
|
+
setState({
|
|
382
|
+
...state,
|
|
383
|
+
general: {
|
|
384
|
+
...state.general,
|
|
385
|
+
showDownloadImgButton: !state.general.showDownloadImgButton
|
|
386
|
+
}
|
|
387
|
+
})
|
|
388
|
+
break
|
|
389
|
+
case 'toggleDownloadPdfButton':
|
|
390
|
+
setState({
|
|
391
|
+
...state,
|
|
392
|
+
general: {
|
|
393
|
+
...state.general,
|
|
394
|
+
showDownloadPdfButton: !state.general.showDownloadPdfButton
|
|
395
|
+
}
|
|
396
|
+
})
|
|
397
|
+
break
|
|
398
|
+
case 'displayAsHex':
|
|
399
|
+
setState({
|
|
400
|
+
...state,
|
|
401
|
+
general: {
|
|
402
|
+
...state.general,
|
|
403
|
+
displayAsHex: value
|
|
404
|
+
}
|
|
405
|
+
})
|
|
406
|
+
break
|
|
407
|
+
case 'editorMapType':
|
|
408
|
+
switch (value) {
|
|
409
|
+
case 'us-geocode':
|
|
410
|
+
setState({
|
|
411
|
+
...state,
|
|
412
|
+
general: {
|
|
413
|
+
...state.general,
|
|
414
|
+
type: value
|
|
415
|
+
}
|
|
416
|
+
})
|
|
417
|
+
break
|
|
418
|
+
case 'data':
|
|
419
|
+
setState({
|
|
420
|
+
...state,
|
|
421
|
+
general: {
|
|
422
|
+
...state.general,
|
|
423
|
+
showSidebar: true,
|
|
424
|
+
type: 'data'
|
|
425
|
+
}
|
|
426
|
+
})
|
|
427
|
+
break
|
|
428
|
+
case 'navigation':
|
|
429
|
+
setState({
|
|
430
|
+
...state,
|
|
431
|
+
general: {
|
|
432
|
+
...state.general,
|
|
433
|
+
showSidebar: false,
|
|
434
|
+
type: 'navigation'
|
|
435
|
+
},
|
|
436
|
+
tooltips: {
|
|
437
|
+
...state.tooltips,
|
|
438
|
+
appearanceType: 'hover'
|
|
439
|
+
}
|
|
440
|
+
})
|
|
441
|
+
break
|
|
442
|
+
case 'bubble':
|
|
443
|
+
setState({
|
|
444
|
+
...state,
|
|
445
|
+
general: {
|
|
446
|
+
...state.general,
|
|
447
|
+
showSidebar: false,
|
|
448
|
+
type: 'bubble'
|
|
449
|
+
},
|
|
450
|
+
tooltips: {
|
|
451
|
+
...state.tooltips,
|
|
452
|
+
appearanceType: 'hover'
|
|
453
|
+
}
|
|
454
|
+
})
|
|
455
|
+
break
|
|
456
|
+
default:
|
|
457
|
+
console.warn('Map type not set')
|
|
458
|
+
break
|
|
459
|
+
}
|
|
460
|
+
break
|
|
461
|
+
case 'geoType':
|
|
462
|
+
// If we're still working with default data, switch to the world default to show it as an example
|
|
463
|
+
if (true === loadedDefault && 'world' === value) {
|
|
464
|
+
loadConfig(worldDefaultConfig)
|
|
465
|
+
ReactTooltip.rebuild()
|
|
466
|
+
break
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
if (true === loadedDefault && 'us' === value) {
|
|
470
|
+
loadConfig(usaDefaultConfig)
|
|
471
|
+
ReactTooltip.rebuild()
|
|
472
|
+
break
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
if (true === loadedDefault && 'us-county' === value) {
|
|
476
|
+
loadConfig(countyDefaultConfig)
|
|
477
|
+
ReactTooltip.rebuild()
|
|
478
|
+
break
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
switch (value) {
|
|
482
|
+
case 'us':
|
|
483
|
+
setState({
|
|
484
|
+
...state,
|
|
485
|
+
general: {
|
|
486
|
+
...state.general,
|
|
487
|
+
geoType: 'us'
|
|
488
|
+
},
|
|
489
|
+
dataTable: {
|
|
490
|
+
...state.dataTable,
|
|
491
|
+
forceDisplay: true
|
|
492
|
+
}
|
|
493
|
+
})
|
|
494
|
+
ReactTooltip.rebuild()
|
|
495
|
+
break
|
|
496
|
+
case 'us-region':
|
|
497
|
+
setState({
|
|
498
|
+
...state,
|
|
499
|
+
general: {
|
|
500
|
+
...state.general,
|
|
501
|
+
geoType: 'us-region'
|
|
502
|
+
},
|
|
503
|
+
dataTable: {
|
|
504
|
+
...state.dataTable,
|
|
505
|
+
forceDisplay: true
|
|
506
|
+
}
|
|
507
|
+
})
|
|
508
|
+
ReactTooltip.rebuild()
|
|
509
|
+
break
|
|
510
|
+
case 'world':
|
|
511
|
+
setState({
|
|
512
|
+
...state,
|
|
513
|
+
general: {
|
|
514
|
+
...state.general,
|
|
515
|
+
geoType: 'world'
|
|
516
|
+
},
|
|
517
|
+
dataTable: {
|
|
518
|
+
...state.dataTable,
|
|
519
|
+
forceDisplay: true
|
|
520
|
+
}
|
|
521
|
+
})
|
|
522
|
+
break
|
|
523
|
+
case 'us-county':
|
|
524
|
+
setState({
|
|
525
|
+
...state,
|
|
526
|
+
general: {
|
|
527
|
+
...state.general,
|
|
528
|
+
geoType: 'us-county',
|
|
529
|
+
expandDataTable: false
|
|
530
|
+
},
|
|
531
|
+
dataTable: {
|
|
532
|
+
...state.dataTable,
|
|
533
|
+
forceDisplay: true
|
|
534
|
+
}
|
|
535
|
+
})
|
|
536
|
+
break
|
|
537
|
+
case 'single-state':
|
|
538
|
+
setState({
|
|
539
|
+
...state,
|
|
540
|
+
general: {
|
|
541
|
+
...state.general,
|
|
542
|
+
geoType: 'single-state',
|
|
543
|
+
expandDataTable: false
|
|
544
|
+
},
|
|
545
|
+
dataTable: {
|
|
546
|
+
...state.dataTable,
|
|
547
|
+
forceDisplay: true
|
|
548
|
+
}
|
|
549
|
+
})
|
|
550
|
+
break
|
|
551
|
+
default:
|
|
552
|
+
break
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
ReactTooltip.rebuild()
|
|
556
|
+
break
|
|
557
|
+
case 'singleColumnLegend':
|
|
558
|
+
setState({
|
|
559
|
+
...state,
|
|
560
|
+
legend: {
|
|
561
|
+
...state.legend,
|
|
562
|
+
singleColumn: !state.legend.singleColumn,
|
|
563
|
+
singleRow: false
|
|
564
|
+
}
|
|
565
|
+
})
|
|
566
|
+
break
|
|
567
|
+
case 'singleRowLegend':
|
|
568
|
+
setState({
|
|
569
|
+
...state,
|
|
570
|
+
legend: {
|
|
571
|
+
...state.legend,
|
|
572
|
+
singleRow: !state.legend.singleRow,
|
|
573
|
+
singleColumn: false
|
|
574
|
+
}
|
|
575
|
+
})
|
|
576
|
+
break
|
|
577
|
+
case 'dynamicDescription':
|
|
578
|
+
setState({
|
|
579
|
+
...state,
|
|
580
|
+
editor: {
|
|
581
|
+
...state.editor,
|
|
582
|
+
activeFilterValueForDescription: value
|
|
583
|
+
},
|
|
584
|
+
legend: {
|
|
585
|
+
...state.legend,
|
|
586
|
+
dynamicDescription: !state.legend.dynamicDescription
|
|
587
|
+
}
|
|
588
|
+
})
|
|
589
|
+
break
|
|
590
|
+
case 'changeLegendDescription':
|
|
591
|
+
const [filterValKey, filterValDesc] = value
|
|
592
|
+
setState({
|
|
593
|
+
...state,
|
|
594
|
+
legend: {
|
|
595
|
+
...state.legend,
|
|
596
|
+
descriptions: {
|
|
597
|
+
...state.legend.descriptions,
|
|
598
|
+
[filterValKey]: [filterValDesc]
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
})
|
|
602
|
+
break
|
|
603
|
+
case 'appearanceType':
|
|
604
|
+
setState({
|
|
605
|
+
...state,
|
|
606
|
+
tooltips: {
|
|
607
|
+
...state.tooltips,
|
|
608
|
+
appearanceType: value
|
|
609
|
+
}
|
|
610
|
+
})
|
|
611
|
+
break
|
|
612
|
+
case 'linkLabel':
|
|
613
|
+
setState({
|
|
614
|
+
...state,
|
|
615
|
+
tooltips: {
|
|
616
|
+
...state.tooltips,
|
|
617
|
+
linkLabel: value
|
|
618
|
+
}
|
|
619
|
+
})
|
|
620
|
+
break
|
|
621
|
+
case 'displayStateLabels':
|
|
622
|
+
setState({
|
|
623
|
+
...state,
|
|
624
|
+
general: {
|
|
625
|
+
...state.general,
|
|
626
|
+
displayStateLabels: !state.general.displayStateLabels
|
|
627
|
+
}
|
|
628
|
+
})
|
|
629
|
+
break
|
|
630
|
+
case 'capitalizeLabels':
|
|
631
|
+
setState({
|
|
632
|
+
...state,
|
|
633
|
+
tooltips: {
|
|
634
|
+
...state.tooltips,
|
|
635
|
+
capitalizeLabels: value
|
|
636
|
+
}
|
|
637
|
+
})
|
|
638
|
+
break
|
|
639
|
+
case 'showDataTable':
|
|
640
|
+
setState({
|
|
641
|
+
...state,
|
|
642
|
+
dataTable: {
|
|
643
|
+
...state.dataTable,
|
|
644
|
+
forceDisplay: value
|
|
645
|
+
}
|
|
646
|
+
})
|
|
647
|
+
break
|
|
648
|
+
case 'limitDataTableHeight':
|
|
649
|
+
setState({
|
|
650
|
+
...state,
|
|
651
|
+
dataTable: {
|
|
652
|
+
...state.dataTable,
|
|
653
|
+
limitHeight: value
|
|
654
|
+
}
|
|
655
|
+
})
|
|
656
|
+
break
|
|
657
|
+
case 'chooseState':
|
|
658
|
+
let fipsCode = Object.keys(supportedStatesFipsCodes).find(key => supportedStatesFipsCodes[key] === value)
|
|
659
|
+
let stateName = value
|
|
660
|
+
let stateData = { fipsCode, stateName }
|
|
661
|
+
|
|
662
|
+
setState({
|
|
663
|
+
...state,
|
|
664
|
+
general: {
|
|
665
|
+
...state.general,
|
|
666
|
+
statePicked: stateData
|
|
667
|
+
}
|
|
668
|
+
})
|
|
669
|
+
break
|
|
670
|
+
case 'classificationType':
|
|
671
|
+
setState({
|
|
672
|
+
...state,
|
|
673
|
+
legend: {
|
|
674
|
+
...state.legend,
|
|
675
|
+
type: value
|
|
676
|
+
}
|
|
677
|
+
})
|
|
678
|
+
break
|
|
679
|
+
default:
|
|
680
|
+
console.warn(`Did not recognize editor property.`)
|
|
681
|
+
break
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
const columnsRequiredChecker = useCallback(() => {
|
|
686
|
+
console.info('Running columns required check.')
|
|
687
|
+
let columnList = []
|
|
688
|
+
|
|
689
|
+
// Geo is always required
|
|
690
|
+
if ('' === state.columns.geo.name) {
|
|
691
|
+
columnList.push('Geography')
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
// Primary is required if we're on a data map or a point map
|
|
695
|
+
if ('navigation' !== state.general.type && '' === state.columns.primary.name) {
|
|
696
|
+
columnList.push('Primary')
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
// Navigate is required for navigation maps
|
|
700
|
+
if ('navigation' === state.general.type && ('' === state.columns.navigate.name || undefined === state.columns.navigate)) {
|
|
701
|
+
columnList.push('Navigation')
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
if ('us-geocode' === state.general.type && '' === state.columns.latitude.name) {
|
|
705
|
+
columnList.push('Latitude')
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
if ('us-geocode' === state.general.type && '' === state.columns.longitude.name) {
|
|
709
|
+
columnList.push('Longitude')
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
if (columnList.length === 0) columnList = null
|
|
713
|
+
|
|
714
|
+
setRequiredColumns(columnList)
|
|
715
|
+
}, [state.columns, state.general.type])
|
|
716
|
+
|
|
717
|
+
const editColumn = async (columnName, editTarget, value) => {
|
|
718
|
+
let newSpecialClasses
|
|
719
|
+
|
|
720
|
+
switch (editTarget) {
|
|
721
|
+
case 'specialClassEdit':
|
|
722
|
+
newSpecialClasses = Array.from(legend.specialClasses)
|
|
723
|
+
|
|
724
|
+
newSpecialClasses[value.index][value.prop] = value.value
|
|
725
|
+
|
|
726
|
+
setState({
|
|
727
|
+
...state,
|
|
728
|
+
legend: {
|
|
729
|
+
...state.legend,
|
|
730
|
+
specialClasses: newSpecialClasses
|
|
731
|
+
}
|
|
732
|
+
})
|
|
733
|
+
break
|
|
734
|
+
case 'specialClassDelete':
|
|
735
|
+
newSpecialClasses = Array.from(legend.specialClasses)
|
|
736
|
+
|
|
737
|
+
newSpecialClasses.splice(value, 1)
|
|
738
|
+
|
|
739
|
+
setState({
|
|
740
|
+
...state,
|
|
741
|
+
legend: {
|
|
742
|
+
...state.legend,
|
|
743
|
+
specialClasses: newSpecialClasses
|
|
744
|
+
}
|
|
745
|
+
})
|
|
746
|
+
break
|
|
747
|
+
case 'specialClassAdd':
|
|
748
|
+
newSpecialClasses = legend.specialClasses
|
|
749
|
+
|
|
750
|
+
newSpecialClasses.push(value)
|
|
751
|
+
|
|
752
|
+
setState({
|
|
753
|
+
...state,
|
|
754
|
+
legend: {
|
|
755
|
+
...state.legend,
|
|
756
|
+
specialClasses: newSpecialClasses
|
|
757
|
+
}
|
|
758
|
+
})
|
|
759
|
+
break
|
|
760
|
+
case 'name':
|
|
761
|
+
setState({
|
|
762
|
+
...state,
|
|
763
|
+
columns: {
|
|
764
|
+
...state.columns,
|
|
765
|
+
[columnName]: {
|
|
766
|
+
...state.columns[columnName],
|
|
767
|
+
[editTarget]: value
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
})
|
|
771
|
+
|
|
772
|
+
break
|
|
773
|
+
default:
|
|
774
|
+
setState({
|
|
775
|
+
...state,
|
|
776
|
+
columns: {
|
|
777
|
+
...state.columns,
|
|
778
|
+
[columnName]: {
|
|
779
|
+
...state.columns[columnName],
|
|
780
|
+
[editTarget]: value
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
})
|
|
784
|
+
break
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
const changeFilter = async (idx, target, value) => {
|
|
789
|
+
let newFilters = [...state.filters]
|
|
790
|
+
|
|
791
|
+
switch (target) {
|
|
792
|
+
case 'addNew':
|
|
793
|
+
newFilters.push({
|
|
794
|
+
label: '',
|
|
795
|
+
values: []
|
|
796
|
+
})
|
|
797
|
+
break
|
|
798
|
+
case 'remove':
|
|
799
|
+
if (newFilters.length === 1) {
|
|
800
|
+
newFilters = []
|
|
801
|
+
} else {
|
|
802
|
+
newFilters.splice(idx, 1)
|
|
803
|
+
}
|
|
804
|
+
break
|
|
805
|
+
case 'columnName':
|
|
806
|
+
newFilters[idx] = { ...newFilters[idx] }
|
|
807
|
+
newFilters[idx].columnName = value
|
|
808
|
+
newFilters[idx].values = [] // when a column name changes knock the previous values out
|
|
809
|
+
break
|
|
810
|
+
case 'filterOrder':
|
|
811
|
+
if (value === 'desc') {
|
|
812
|
+
newFilters[idx] = { ...runtimeFilters[idx] }
|
|
813
|
+
delete newFilters[idx].active
|
|
814
|
+
newFilters[idx].order = 'desc'
|
|
815
|
+
}
|
|
816
|
+
if (value === 'asc') {
|
|
817
|
+
newFilters[idx] = { ...runtimeFilters[idx] }
|
|
818
|
+
delete newFilters[idx].active
|
|
819
|
+
newFilters[idx].order = 'asc'
|
|
820
|
+
}
|
|
821
|
+
if (value === 'cust') {
|
|
822
|
+
newFilters[idx] = { ...runtimeFilters[idx] }
|
|
823
|
+
newFilters[idx].order = 'cust'
|
|
824
|
+
}
|
|
825
|
+
break
|
|
826
|
+
default:
|
|
827
|
+
newFilters[idx][target] = value
|
|
828
|
+
break
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
setState({
|
|
832
|
+
...state,
|
|
833
|
+
filters: newFilters
|
|
834
|
+
})
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
const addAdditionalColumn = number => {
|
|
838
|
+
const columnKey = `additionalColumn${number}`
|
|
839
|
+
|
|
840
|
+
setState({
|
|
841
|
+
...state,
|
|
842
|
+
columns: {
|
|
843
|
+
...state.columns,
|
|
844
|
+
[columnKey]: {
|
|
845
|
+
label: 'New Column',
|
|
846
|
+
dataTable: false,
|
|
847
|
+
tooltips: false,
|
|
848
|
+
prefix: '',
|
|
849
|
+
suffix: ''
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
})
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
const removeAdditionalColumn = columnName => {
|
|
856
|
+
const newColumns = state.columns
|
|
857
|
+
|
|
858
|
+
delete newColumns[columnName]
|
|
859
|
+
|
|
860
|
+
setState({
|
|
861
|
+
...state,
|
|
862
|
+
columns: newColumns
|
|
863
|
+
})
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
const displayFilterLegendValue = arr => {
|
|
867
|
+
const filterName = state.filters[arr[0]].label || `Unlabeled Legend`
|
|
868
|
+
|
|
869
|
+
const filterValue = runtimeFilters[arr[0]]
|
|
870
|
+
|
|
871
|
+
if (filterValue) {
|
|
872
|
+
return filterName + ' - ' + filterValue.values[arr[1]]
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
const sortableItemStyles = {
|
|
877
|
+
display: 'block',
|
|
878
|
+
boxSizing: 'border-box',
|
|
879
|
+
border: '1px solid #D1D1D1',
|
|
880
|
+
borderRadius: '2px',
|
|
881
|
+
background: '#F1F1F1',
|
|
882
|
+
padding: '.4em .6em',
|
|
883
|
+
fontSize: '.8em',
|
|
884
|
+
marginRight: '.3em',
|
|
885
|
+
marginBottom: '.3em',
|
|
886
|
+
cursor: 'move',
|
|
887
|
+
zIndex: '999'
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
const convertStateToConfig = () => {
|
|
891
|
+
let strippedState = JSON.parse(JSON.stringify(state)) // Deep copy
|
|
892
|
+
|
|
893
|
+
// Strip ref
|
|
894
|
+
delete strippedState['']
|
|
895
|
+
|
|
896
|
+
delete strippedState.newViz
|
|
897
|
+
|
|
898
|
+
// Remove the legend
|
|
899
|
+
let strippedLegend = JSON.parse(JSON.stringify(state.legend))
|
|
900
|
+
|
|
901
|
+
delete strippedLegend.disabledAmt
|
|
902
|
+
|
|
903
|
+
strippedState.legend = strippedLegend
|
|
904
|
+
|
|
905
|
+
// Remove default data marker if the user started this map from default data
|
|
906
|
+
delete strippedState.defaultData
|
|
907
|
+
|
|
908
|
+
// Remove tooltips if they're active in the editor
|
|
909
|
+
let strippedGeneral = JSON.parse(JSON.stringify(state.general))
|
|
910
|
+
|
|
911
|
+
strippedState.general = strippedGeneral
|
|
912
|
+
|
|
913
|
+
// Add columns property back to data if it's there
|
|
914
|
+
if (state.data.columns) {
|
|
915
|
+
strippedState.data.columns = state.data.columns
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
return strippedState
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
useEffect(() => {
|
|
922
|
+
setLoadedDefault(state.defaultData)
|
|
923
|
+
|
|
924
|
+
columnsRequiredChecker()
|
|
925
|
+
}, [state])
|
|
926
|
+
|
|
927
|
+
useEffect(() => {
|
|
928
|
+
//If a categorical map is used and the order is either not defined or incorrect, fix it
|
|
929
|
+
if ('category' === state.legend.type) {
|
|
930
|
+
let valid = true
|
|
931
|
+
if (state.legend.categoryValuesOrder) {
|
|
932
|
+
runtimeLegend.forEach(item => {
|
|
933
|
+
if (!item.special && state.legend.categoryValuesOrder.indexOf(item.value) === -1) {
|
|
934
|
+
valid = false
|
|
935
|
+
}
|
|
936
|
+
})
|
|
937
|
+
} else {
|
|
938
|
+
valid = false
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
if (!valid) {
|
|
942
|
+
let arr = runtimeLegend.filter(item => !item.special).map(({ value }) => value)
|
|
943
|
+
|
|
944
|
+
setState({
|
|
945
|
+
...state,
|
|
946
|
+
legend: {
|
|
947
|
+
...state.legend,
|
|
948
|
+
categoryValuesOrder: arr
|
|
949
|
+
}
|
|
950
|
+
})
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
}, [runtimeLegend])
|
|
954
|
+
|
|
955
|
+
// if no state choice by default show alabama
|
|
956
|
+
useEffect(() => {
|
|
957
|
+
if (!state.general.statePicked) {
|
|
958
|
+
setState({
|
|
959
|
+
...state,
|
|
960
|
+
general: {
|
|
961
|
+
...general,
|
|
962
|
+
statePicked: {
|
|
963
|
+
fipsCode: '01',
|
|
964
|
+
stateName: 'Alabama'
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
})
|
|
968
|
+
}
|
|
969
|
+
}, [])
|
|
970
|
+
|
|
971
|
+
const columnsOptions = [
|
|
972
|
+
<option value='' key={'Select Option'}>
|
|
973
|
+
- Select Option -
|
|
974
|
+
</option>
|
|
975
|
+
]
|
|
976
|
+
|
|
977
|
+
columnsInData.map(colName => {
|
|
978
|
+
columnsOptions.push(
|
|
979
|
+
<option value={colName} key={colName}>
|
|
980
|
+
{colName}
|
|
981
|
+
</option>
|
|
982
|
+
)
|
|
983
|
+
})
|
|
984
|
+
|
|
985
|
+
let columnsByKey = {}
|
|
986
|
+
state.data.forEach(datum => {
|
|
987
|
+
Object.keys(datum).forEach(key => {
|
|
988
|
+
columnsByKey[key] = columnsByKey[key] || []
|
|
989
|
+
const value = typeof datum[key] === 'number' ? datum[key].toString() : datum[key]
|
|
990
|
+
|
|
991
|
+
if (columnsByKey[key].indexOf(value) === -1) {
|
|
992
|
+
columnsByKey[key].push(value)
|
|
993
|
+
}
|
|
994
|
+
})
|
|
995
|
+
})
|
|
996
|
+
|
|
997
|
+
let specialClasses = []
|
|
998
|
+
if (legend.specialClasses && legend.specialClasses.length && typeof legend.specialClasses[0] === 'string') {
|
|
999
|
+
legend.specialClasses.forEach(specialClass => {
|
|
1000
|
+
specialClasses.push({
|
|
1001
|
+
key: state.columns.primary && state.columns.primary.name ? state.columns.primary.name : columnsInData[0],
|
|
1002
|
+
value: specialClass,
|
|
1003
|
+
label: specialClass
|
|
1004
|
+
})
|
|
1005
|
+
})
|
|
1006
|
+
} else {
|
|
1007
|
+
specialClasses = legend.specialClasses || []
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
const additionalColumns = Object.keys(state.columns).filter(value => {
|
|
1011
|
+
const defaultCols = ['geo', 'navigate', 'primary', 'latitude', 'longitude']
|
|
1012
|
+
|
|
1013
|
+
if (true === defaultCols.includes(value)) {
|
|
1014
|
+
return false
|
|
1015
|
+
}
|
|
1016
|
+
return true
|
|
1017
|
+
})
|
|
1018
|
+
|
|
1019
|
+
const updateField = (section, subsection, fieldName, newValue) => {
|
|
1020
|
+
const isArray = Array.isArray(state[section])
|
|
1021
|
+
let sectionValue = isArray ? [...state[section], newValue] : { ...state[section], [fieldName]: newValue }
|
|
1022
|
+
|
|
1023
|
+
if (null !== subsection) {
|
|
1024
|
+
if (isArray) {
|
|
1025
|
+
sectionValue = [...state[section]]
|
|
1026
|
+
sectionValue[subsection] = { ...sectionValue[subsection], [fieldName]: newValue }
|
|
1027
|
+
} else {
|
|
1028
|
+
sectionValue = {
|
|
1029
|
+
...state[section],
|
|
1030
|
+
[subsection]: { ...state[section][subsection], [fieldName]: newValue }
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
let updatedState = {
|
|
1036
|
+
...state,
|
|
1037
|
+
[section]: sectionValue
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
setState(updatedState)
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
const onBackClick = () => {
|
|
1044
|
+
setDisplayPanel(!displayPanel)
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
const usedFilterColumns = {}
|
|
1048
|
+
|
|
1049
|
+
const filtersJSX = state.filters.map((filter, index) => {
|
|
1050
|
+
if (filter.columnName) {
|
|
1051
|
+
usedFilterColumns[filter.columnName] = true
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
const filterOptions = [
|
|
1055
|
+
{
|
|
1056
|
+
label: 'Ascending Alphanumeric',
|
|
1057
|
+
value: 'asc'
|
|
1058
|
+
},
|
|
1059
|
+
{
|
|
1060
|
+
label: 'Descending Alphanumeric',
|
|
1061
|
+
value: 'desc'
|
|
1062
|
+
},
|
|
1063
|
+
{
|
|
1064
|
+
label: 'Custom',
|
|
1065
|
+
value: 'cust'
|
|
1066
|
+
}
|
|
1067
|
+
]
|
|
1068
|
+
|
|
1069
|
+
return (
|
|
1070
|
+
<fieldset className='edit-block' key={`filter-${index}`}>
|
|
1071
|
+
<button
|
|
1072
|
+
className='remove-column'
|
|
1073
|
+
onClick={e => {
|
|
1074
|
+
e.preventDefault()
|
|
1075
|
+
changeFilter(index, 'remove')
|
|
1076
|
+
}}
|
|
1077
|
+
>
|
|
1078
|
+
Remove
|
|
1079
|
+
</button>
|
|
1080
|
+
<TextField value={state.filters[index].label} section='filters' subsection={index} fieldName='label' label='Label' updateField={updateField} />
|
|
1081
|
+
<label>
|
|
1082
|
+
<span className='edit-label column-heading'>
|
|
1083
|
+
Filter Column{' '}
|
|
1084
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1085
|
+
<Tooltip.Target>
|
|
1086
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
1087
|
+
</Tooltip.Target>
|
|
1121
1088
|
<Tooltip.Content>
|
|
1122
1089
|
<p>Selecting a column will add a dropdown menu below the map legend and allow users to filter based on the values in this column.</p>
|
|
1123
1090
|
</Tooltip.Content>
|
|
1124
1091
|
</Tooltip>
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
<AccordionItemHeading>
|
|
1301
|
-
<AccordionItemButton>Type</AccordionItemButton>
|
|
1302
|
-
</AccordionItemHeading>
|
|
1303
|
-
<AccordionItemPanel>
|
|
1304
|
-
{/* Geography */}
|
|
1305
|
-
<label>
|
|
1306
|
-
<span className='edit-label column-heading'>
|
|
1307
|
-
<span>Geography</span>
|
|
1308
|
-
</span>
|
|
1309
|
-
<ul className='geo-buttons'>
|
|
1310
|
-
<button
|
|
1311
|
-
className={
|
|
1312
|
-
state.general.geoType === 'us' ||
|
|
1313
|
-
state.general.geoType === 'us-county'
|
|
1314
|
-
? 'active'
|
|
1315
|
-
: ''
|
|
1316
|
-
}
|
|
1317
|
-
onClick={ (e) => {
|
|
1318
|
-
e.preventDefault();
|
|
1319
|
-
handleEditorChanges('geoType', 'us')
|
|
1320
|
-
}}
|
|
1321
|
-
>
|
|
1322
|
-
<UsaGraphic />
|
|
1323
|
-
<span>United States</span>
|
|
1324
|
-
</button>
|
|
1092
|
+
</span>
|
|
1093
|
+
<select
|
|
1094
|
+
value={filter.columnName}
|
|
1095
|
+
onChange={event => {
|
|
1096
|
+
changeFilter(index, 'columnName', event.target.value)
|
|
1097
|
+
}}
|
|
1098
|
+
>
|
|
1099
|
+
{columnsOptions.filter(({ key }) => undefined === usedFilterColumns[key] || filter.columnName === key)}
|
|
1100
|
+
</select>
|
|
1101
|
+
</label>
|
|
1102
|
+
|
|
1103
|
+
<label>
|
|
1104
|
+
<span className='edit-filterOrder column-heading'>Filter Order</span>
|
|
1105
|
+
<select
|
|
1106
|
+
value={filter.order}
|
|
1107
|
+
onChange={e => {
|
|
1108
|
+
changeFilter(index, 'filterOrder', e.target.value)
|
|
1109
|
+
}}
|
|
1110
|
+
>
|
|
1111
|
+
{filterOptions.map((option, index) => {
|
|
1112
|
+
return (
|
|
1113
|
+
<option value={option.value} key={`filter-${index}`}>
|
|
1114
|
+
{option.label}
|
|
1115
|
+
</option>
|
|
1116
|
+
)
|
|
1117
|
+
})}
|
|
1118
|
+
</select>
|
|
1119
|
+
</label>
|
|
1120
|
+
|
|
1121
|
+
{filter.order === 'cust' && (
|
|
1122
|
+
<DragDropContext onDragEnd={({ source, destination }) => handleFilterOrder(source.index, destination.index, index, runtimeFilters[index])}>
|
|
1123
|
+
<Droppable droppableId='filter_order'>
|
|
1124
|
+
{provided => (
|
|
1125
|
+
<ul {...provided.droppableProps} className='sort-list' ref={provided.innerRef} style={{ marginTop: '1em' }}>
|
|
1126
|
+
{runtimeFilters[index]?.values.map((value, index) => {
|
|
1127
|
+
return (
|
|
1128
|
+
<Draggable key={value} draggableId={`draggableFilter-${value}`} index={index}>
|
|
1129
|
+
{(provided, snapshot) => (
|
|
1130
|
+
<li>
|
|
1131
|
+
<div className={snapshot.isDragging ? 'currently-dragging' : ''} style={getItemStyle(snapshot.isDragging, provided.draggableProps.style, sortableItemStyles)} ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps}>
|
|
1132
|
+
{value}
|
|
1133
|
+
</div>
|
|
1134
|
+
</li>
|
|
1135
|
+
)}
|
|
1136
|
+
</Draggable>
|
|
1137
|
+
)
|
|
1138
|
+
})}
|
|
1139
|
+
{provided.placeholder}
|
|
1140
|
+
</ul>
|
|
1141
|
+
)}
|
|
1142
|
+
</Droppable>
|
|
1143
|
+
</DragDropContext>
|
|
1144
|
+
)}
|
|
1145
|
+
</fieldset>
|
|
1146
|
+
)
|
|
1147
|
+
})
|
|
1148
|
+
|
|
1149
|
+
const StateOptionList = () => {
|
|
1150
|
+
const arrOfArrays = Object.entries(supportedStatesFipsCodes)
|
|
1151
|
+
|
|
1152
|
+
let sorted = arrOfArrays.sort((a, b) => {
|
|
1153
|
+
return a[0].localeCompare(b[0])
|
|
1154
|
+
})
|
|
1155
|
+
|
|
1156
|
+
let options = []
|
|
1157
|
+
sorted.forEach(state => {
|
|
1158
|
+
options.push(
|
|
1159
|
+
<option key={state[0]} value={state[1]}>
|
|
1160
|
+
{state[1]}
|
|
1161
|
+
</option>
|
|
1162
|
+
)
|
|
1163
|
+
})
|
|
1164
|
+
|
|
1165
|
+
return options
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
const filterValueOptionList = []
|
|
1169
|
+
|
|
1170
|
+
if (runtimeFilters.length > 0) {
|
|
1171
|
+
runtimeFilters.forEach((filter, index) => {
|
|
1172
|
+
runtimeFilters[index].values.forEach((value, valueNum) => {
|
|
1173
|
+
filterValueOptionList.push([index, valueNum])
|
|
1174
|
+
})
|
|
1175
|
+
})
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
useEffect(() => {
|
|
1179
|
+
if (paletteName) handleEditorChanges('color', paletteName)
|
|
1180
|
+
}, [paletteName]) // dont add handleEditorChanges as a dependency even if it requires
|
|
1181
|
+
|
|
1182
|
+
useEffect(() => {
|
|
1183
|
+
const parsedData = convertStateToConfig()
|
|
1184
|
+
const formattedData = JSON.stringify(parsedData, undefined, 2)
|
|
1185
|
+
|
|
1186
|
+
setConfigTextbox(formattedData)
|
|
1187
|
+
}, [state])
|
|
1188
|
+
|
|
1189
|
+
useEffect(() => {
|
|
1190
|
+
// Pass up to Editor if needed
|
|
1191
|
+
if (setParentConfig) {
|
|
1192
|
+
const newConfig = convertStateToConfig()
|
|
1193
|
+
setParentConfig(newConfig)
|
|
1194
|
+
}
|
|
1195
|
+
}, [state])
|
|
1196
|
+
|
|
1197
|
+
let numberOfItemsLimit = 8
|
|
1198
|
+
|
|
1199
|
+
const getItemStyle = (isDragging, draggableStyle) => ({
|
|
1200
|
+
...draggableStyle
|
|
1201
|
+
})
|
|
1202
|
+
|
|
1203
|
+
const CategoryList = () => {
|
|
1204
|
+
return state.legend.categoryValuesOrder ? (
|
|
1205
|
+
state.legend.categoryValuesOrder.map((value, index) => (
|
|
1206
|
+
<Draggable key={value} draggableId={`item-${value}`} index={index}>
|
|
1207
|
+
{(provided, snapshot) => (
|
|
1208
|
+
<li style={{ position: 'relative' }}>
|
|
1209
|
+
<div className={snapshot.isDragging ? 'currently-dragging' : ''} style={getItemStyle(snapshot.isDragging, provided.draggableProps.style, sortableItemStyles)} ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps}>
|
|
1210
|
+
{value}
|
|
1211
|
+
</div>
|
|
1212
|
+
</li>
|
|
1213
|
+
)}
|
|
1214
|
+
</Draggable>
|
|
1215
|
+
))
|
|
1216
|
+
) : (
|
|
1217
|
+
<></>
|
|
1218
|
+
)
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
const Error = () => {
|
|
1222
|
+
return (
|
|
1223
|
+
<section className='waiting'>
|
|
1224
|
+
<section className='waiting-container'>
|
|
1225
|
+
<h3>Error With Configuration</h3>
|
|
1226
|
+
<p>{state.runtime.editorErrorMessage}</p>
|
|
1227
|
+
</section>
|
|
1228
|
+
</section>
|
|
1229
|
+
)
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
return (
|
|
1233
|
+
<ErrorBoundary component='EditorPanel'>
|
|
1234
|
+
{state?.runtime?.editorErrorMessage.length > 0 && <Error />}
|
|
1235
|
+
{requiredColumns && <Waiting requiredColumns={requiredColumns} className={displayPanel ? `waiting` : `waiting collapsed`} />}
|
|
1236
|
+
<button className={displayPanel ? `editor-toggle` : `editor-toggle collapsed`} title={displayPanel ? `Collapse Editor` : `Expand Editor`} onClick={onBackClick} data-html2canvas-ignore></button>
|
|
1237
|
+
|
|
1238
|
+
<section className={displayPanel ? 'editor-panel cove' : 'hidden editor-panel cove'} data-html2canvas-ignore>
|
|
1239
|
+
<ReactTooltip html={true} multiline={true} />
|
|
1240
|
+
<span className='base-label'>Configure Map</span>
|
|
1241
|
+
<section className='form-container'>
|
|
1242
|
+
<form>
|
|
1243
|
+
<Accordion allowZeroExpanded={true}>
|
|
1244
|
+
<AccordionItem>
|
|
1245
|
+
{' '}
|
|
1246
|
+
{/* Type */}
|
|
1247
|
+
<AccordionItemHeading>
|
|
1248
|
+
<AccordionItemButton>Type</AccordionItemButton>
|
|
1249
|
+
</AccordionItemHeading>
|
|
1250
|
+
<AccordionItemPanel>
|
|
1251
|
+
{/* Geography */}
|
|
1252
|
+
<label>
|
|
1253
|
+
<span className='edit-label column-heading'>
|
|
1254
|
+
<span>Geography</span>
|
|
1255
|
+
</span>
|
|
1256
|
+
<ul className='geo-buttons'>
|
|
1257
|
+
<button
|
|
1258
|
+
className={state.general.geoType === 'us' || state.general.geoType === 'us-county' ? 'active' : ''}
|
|
1259
|
+
onClick={e => {
|
|
1260
|
+
e.preventDefault()
|
|
1261
|
+
handleEditorChanges('geoType', 'us')
|
|
1262
|
+
}}
|
|
1263
|
+
>
|
|
1264
|
+
<UsaGraphic />
|
|
1265
|
+
<span>United States</span>
|
|
1266
|
+
</button>
|
|
1325
1267
|
<button
|
|
1326
1268
|
className={state.general.geoType === 'us-region' ? 'active' : ''}
|
|
1327
|
-
onClick={
|
|
1328
|
-
e.preventDefault()
|
|
1269
|
+
onClick={e => {
|
|
1270
|
+
e.preventDefault()
|
|
1329
1271
|
handleEditorChanges('geoType', 'us-region')
|
|
1330
1272
|
}}
|
|
1331
1273
|
>
|
|
1332
1274
|
<UsaRegionGraphic />
|
|
1333
1275
|
<span>U.S. Region</span>
|
|
1334
1276
|
</button>
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
}
|
|
1551
|
-
/>
|
|
1552
|
-
<TextField
|
|
1553
|
-
type='textarea'
|
|
1554
|
-
value={general.footnotes}
|
|
1555
|
-
updateField={updateField}
|
|
1556
|
-
section='general'
|
|
1557
|
-
fieldName='footnotes'
|
|
1558
|
-
label='Footnotes'
|
|
1559
|
-
tooltip={
|
|
1560
|
-
<Tooltip style={{textTransform: 'none'}}>
|
|
1561
|
-
<Tooltip.Target><Icon display="question" style={{marginLeft: '0.5rem'}}/></Tooltip.Target>
|
|
1562
|
-
<Tooltip.Content>
|
|
1563
|
-
<p>Footnotes</p>
|
|
1564
|
-
</Tooltip.Content>
|
|
1565
|
-
</Tooltip>
|
|
1566
|
-
}
|
|
1567
|
-
/>
|
|
1568
|
-
{'us' === state.general.geoType && (
|
|
1569
|
-
<TextField
|
|
1570
|
-
value={general.territoriesLabel}
|
|
1571
|
-
updateField={updateField}
|
|
1572
|
-
section='general'
|
|
1573
|
-
fieldName='territoriesLabel'
|
|
1574
|
-
label='Territories Label'
|
|
1575
|
-
placeholder='Territories'
|
|
1576
|
-
/>
|
|
1577
|
-
)}
|
|
1578
|
-
{/* <label className="checkbox mt-4">
|
|
1277
|
+
<button
|
|
1278
|
+
className={state.general.geoType === 'world' ? 'active' : ''}
|
|
1279
|
+
onClick={e => {
|
|
1280
|
+
e.preventDefault()
|
|
1281
|
+
handleEditorChanges('geoType', 'world')
|
|
1282
|
+
}}
|
|
1283
|
+
>
|
|
1284
|
+
<WorldGraphic />
|
|
1285
|
+
<span>World</span>
|
|
1286
|
+
</button>
|
|
1287
|
+
<button
|
|
1288
|
+
className={state.general.geoType === 'single-state' ? 'active' : ''}
|
|
1289
|
+
onClick={e => {
|
|
1290
|
+
e.preventDefault()
|
|
1291
|
+
handleEditorChanges('geoType', 'single-state')
|
|
1292
|
+
}}
|
|
1293
|
+
>
|
|
1294
|
+
<AlabamaGraphic />
|
|
1295
|
+
<span>U.S. State</span>
|
|
1296
|
+
</button>
|
|
1297
|
+
</ul>
|
|
1298
|
+
</label>
|
|
1299
|
+
{/* Select > State or County Map */}
|
|
1300
|
+
{(state.general.geoType === 'us' || state.general.geoType === 'us-county') && (
|
|
1301
|
+
<label>
|
|
1302
|
+
<span className='edit-label column-heading'>Geography Subtype</span>
|
|
1303
|
+
<select
|
|
1304
|
+
value={state.general.geoType}
|
|
1305
|
+
onChange={event => {
|
|
1306
|
+
handleEditorChanges('geoType', event.target.value)
|
|
1307
|
+
}}
|
|
1308
|
+
>
|
|
1309
|
+
<option value='us'>US State-Level</option>
|
|
1310
|
+
<option value='us-county'>US County-Level</option>
|
|
1311
|
+
</select>
|
|
1312
|
+
</label>
|
|
1313
|
+
)}
|
|
1314
|
+
{/* Type */}
|
|
1315
|
+
{/* Select > Filter a state */}
|
|
1316
|
+
{state.general.geoType === 'single-state' && (
|
|
1317
|
+
<label>
|
|
1318
|
+
<span className='edit-label column-heading'>State Selector</span>
|
|
1319
|
+
<select
|
|
1320
|
+
value={state.general.hasOwnProperty('statePicked') ? state.general.statePicked.stateName : { fipsCode: '04', stateName: 'Alabama' }}
|
|
1321
|
+
onChange={event => {
|
|
1322
|
+
handleEditorChanges('chooseState', event.target.value)
|
|
1323
|
+
}}
|
|
1324
|
+
>
|
|
1325
|
+
<StateOptionList />
|
|
1326
|
+
</select>
|
|
1327
|
+
</label>
|
|
1328
|
+
)}
|
|
1329
|
+
{/* Type */}
|
|
1330
|
+
<label>
|
|
1331
|
+
<span className='edit-label column-heading'>
|
|
1332
|
+
Map Type
|
|
1333
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1334
|
+
<Tooltip.Target>
|
|
1335
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
1336
|
+
</Tooltip.Target>
|
|
1337
|
+
<Tooltip.Content>
|
|
1338
|
+
<p>Select "Data" to create a color-coded data map. To create a navigation-only map, select "Navigation."</p>
|
|
1339
|
+
</Tooltip.Content>
|
|
1340
|
+
</Tooltip>
|
|
1341
|
+
</span>
|
|
1342
|
+
<select
|
|
1343
|
+
value={state.general.type}
|
|
1344
|
+
onChange={event => {
|
|
1345
|
+
handleEditorChanges('editorMapType', event.target.value)
|
|
1346
|
+
}}
|
|
1347
|
+
>
|
|
1348
|
+
<option value='data'>Data</option>
|
|
1349
|
+
<option value='us-geocode'>United States Geocode</option>
|
|
1350
|
+
<option value='navigation'>Navigation</option>
|
|
1351
|
+
{(state.general.geoType === 'world' || state.general.geoType === 'us') && <option value='bubble'>Bubble</option>}
|
|
1352
|
+
</select>
|
|
1353
|
+
</label>
|
|
1354
|
+
<label>
|
|
1355
|
+
<span className='edit-label'>Data Classification Type</span>
|
|
1356
|
+
<div>
|
|
1357
|
+
<label>
|
|
1358
|
+
<input type='radio' name='equalnumber' value='equalnumber' checked={state.legend.type === 'equalnumber'} onChange={e => handleEditorChanges('classificationType', e.target.value)} />
|
|
1359
|
+
Numeric/Quantitative
|
|
1360
|
+
</label>
|
|
1361
|
+
<label>
|
|
1362
|
+
<input type='radio' name='category' value='category' checked={state.legend.type === 'category'} onChange={e => handleEditorChanges('classificationType', e.target.value)} />
|
|
1363
|
+
Categorical
|
|
1364
|
+
</label>
|
|
1365
|
+
</div>
|
|
1366
|
+
</label>
|
|
1367
|
+
{/* SubType */}
|
|
1368
|
+
{'us' === state.general.geoType && 'data' === state.general.type && (
|
|
1369
|
+
<label className='checkbox mt-4'>
|
|
1370
|
+
<input
|
|
1371
|
+
type='checkbox'
|
|
1372
|
+
checked={state.general.displayAsHex}
|
|
1373
|
+
onChange={event => {
|
|
1374
|
+
handleEditorChanges('displayAsHex', event.target.checked)
|
|
1375
|
+
}}
|
|
1376
|
+
/>
|
|
1377
|
+
<span className='edit-label'>Display As Hex Map</span>
|
|
1378
|
+
</label>
|
|
1379
|
+
)}
|
|
1380
|
+
{'us' === state.general.geoType && 'bubble' !== state.general.type && false === state.general.displayAsHex && (
|
|
1381
|
+
<label className='checkbox'>
|
|
1382
|
+
<input
|
|
1383
|
+
type='checkbox'
|
|
1384
|
+
checked={state.general.displayStateLabels}
|
|
1385
|
+
onChange={event => {
|
|
1386
|
+
handleEditorChanges('displayStateLabels', event.target.checked)
|
|
1387
|
+
}}
|
|
1388
|
+
/>
|
|
1389
|
+
<span className='edit-label'>Display state labels</span>
|
|
1390
|
+
</label>
|
|
1391
|
+
)}
|
|
1392
|
+
</AccordionItemPanel>
|
|
1393
|
+
</AccordionItem>
|
|
1394
|
+
<AccordionItem>
|
|
1395
|
+
{' '}
|
|
1396
|
+
{/* General */}
|
|
1397
|
+
<AccordionItemHeading>
|
|
1398
|
+
<AccordionItemButton>General</AccordionItemButton>
|
|
1399
|
+
</AccordionItemHeading>
|
|
1400
|
+
<AccordionItemPanel>
|
|
1401
|
+
<TextField
|
|
1402
|
+
value={general.title}
|
|
1403
|
+
updateField={updateField}
|
|
1404
|
+
section='general'
|
|
1405
|
+
fieldName='title'
|
|
1406
|
+
label='Title'
|
|
1407
|
+
placeholder='Map Title'
|
|
1408
|
+
tooltip={
|
|
1409
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1410
|
+
<Tooltip.Target>
|
|
1411
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
1412
|
+
</Tooltip.Target>
|
|
1413
|
+
<Tooltip.Content>
|
|
1414
|
+
<p>For accessibility reasons, you should enter a title even if you are not planning on displaying it.</p>
|
|
1415
|
+
</Tooltip.Content>
|
|
1416
|
+
</Tooltip>
|
|
1417
|
+
}
|
|
1418
|
+
/>
|
|
1419
|
+
<TextField
|
|
1420
|
+
value={general.superTitle || ''}
|
|
1421
|
+
updateField={updateField}
|
|
1422
|
+
section='general'
|
|
1423
|
+
fieldName='superTitle'
|
|
1424
|
+
label='Super Title'
|
|
1425
|
+
tooltip={
|
|
1426
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1427
|
+
<Tooltip.Target>
|
|
1428
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
1429
|
+
</Tooltip.Target>
|
|
1430
|
+
<Tooltip.Content>
|
|
1431
|
+
<p>Super Title</p>
|
|
1432
|
+
</Tooltip.Content>
|
|
1433
|
+
</Tooltip>
|
|
1434
|
+
}
|
|
1435
|
+
/>
|
|
1436
|
+
<TextField
|
|
1437
|
+
type='textarea'
|
|
1438
|
+
value={general.introText}
|
|
1439
|
+
updateField={updateField}
|
|
1440
|
+
section='general'
|
|
1441
|
+
fieldName='introText'
|
|
1442
|
+
label='Intro Text'
|
|
1443
|
+
tooltip={
|
|
1444
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1445
|
+
<Tooltip.Target>
|
|
1446
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
1447
|
+
</Tooltip.Target>
|
|
1448
|
+
<Tooltip.Content>
|
|
1449
|
+
<p>Intro Text</p>
|
|
1450
|
+
</Tooltip.Content>
|
|
1451
|
+
</Tooltip>
|
|
1452
|
+
}
|
|
1453
|
+
/>
|
|
1454
|
+
<TextField
|
|
1455
|
+
type='textarea'
|
|
1456
|
+
value={general.subtext}
|
|
1457
|
+
updateField={updateField}
|
|
1458
|
+
section='general'
|
|
1459
|
+
fieldName='subtext'
|
|
1460
|
+
label='Subtext'
|
|
1461
|
+
tooltip={
|
|
1462
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1463
|
+
<Tooltip.Target>
|
|
1464
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
1465
|
+
</Tooltip.Target>
|
|
1466
|
+
<Tooltip.Content>
|
|
1467
|
+
<p>Enter supporting text to display below the data visualization, if applicable. The following HTML tags are supported: strong, em, sup, and sub.</p>
|
|
1468
|
+
</Tooltip.Content>
|
|
1469
|
+
</Tooltip>
|
|
1470
|
+
}
|
|
1471
|
+
/>
|
|
1472
|
+
<TextField
|
|
1473
|
+
type='textarea'
|
|
1474
|
+
value={general.footnotes}
|
|
1475
|
+
updateField={updateField}
|
|
1476
|
+
section='general'
|
|
1477
|
+
fieldName='footnotes'
|
|
1478
|
+
label='Footnotes'
|
|
1479
|
+
tooltip={
|
|
1480
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1481
|
+
<Tooltip.Target>
|
|
1482
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
1483
|
+
</Tooltip.Target>
|
|
1484
|
+
<Tooltip.Content>
|
|
1485
|
+
<p>Footnotes</p>
|
|
1486
|
+
</Tooltip.Content>
|
|
1487
|
+
</Tooltip>
|
|
1488
|
+
}
|
|
1489
|
+
/>
|
|
1490
|
+
{'us' === state.general.geoType && <TextField value={general.territoriesLabel} updateField={updateField} section='general' fieldName='territoriesLabel' label='Territories Label' placeholder='Territories' />}
|
|
1491
|
+
{/* <label className="checkbox mt-4">
|
|
1579
1492
|
<input type="checkbox" checked={ state.general.showDownloadMediaButton } onChange={(event) => { handleEditorChanges("toggleDownloadMediaButton", event.target.checked) }} />
|
|
1580
1493
|
<span className="edit-label">Enable Media Download</span>
|
|
1581
1494
|
</label> */}
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1495
|
+
</AccordionItemPanel>
|
|
1496
|
+
</AccordionItem>
|
|
1497
|
+
<AccordionItem>
|
|
1498
|
+
{' '}
|
|
1499
|
+
{/* Columns */}
|
|
1500
|
+
<AccordionItemHeading>
|
|
1501
|
+
<AccordionItemButton>Columns</AccordionItemButton>
|
|
1502
|
+
</AccordionItemHeading>
|
|
1503
|
+
<AccordionItemPanel>
|
|
1504
|
+
<label className='edit-block geo'>
|
|
1505
|
+
<span className='edit-label column-heading'>
|
|
1506
|
+
Geography
|
|
1507
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1508
|
+
<Tooltip.Target>
|
|
1509
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
1510
|
+
</Tooltip.Target>
|
|
1511
|
+
<Tooltip.Content>
|
|
1512
|
+
<p>Select the source column containing the map location names or, for county-level maps, the FIPS codes.</p>
|
|
1513
|
+
</Tooltip.Content>
|
|
1514
|
+
</Tooltip>
|
|
1515
|
+
</span>
|
|
1516
|
+
<select
|
|
1517
|
+
value={state.columns.geo ? state.columns.geo.name : columnsOptions[0]}
|
|
1518
|
+
onChange={event => {
|
|
1519
|
+
editColumn('geo', 'name', event.target.value)
|
|
1520
|
+
}}
|
|
1521
|
+
>
|
|
1522
|
+
{columnsOptions}
|
|
1523
|
+
</select>
|
|
1524
|
+
</label>
|
|
1525
|
+
|
|
1526
|
+
{'navigation' !== state.general.type && (
|
|
1527
|
+
<fieldset className='primary-fieldset edit-block'>
|
|
1528
|
+
<label>
|
|
1529
|
+
<span className='edit-label column-heading'>
|
|
1615
1530
|
Data Column
|
|
1616
|
-
<Tooltip style={{textTransform: 'none'}}>
|
|
1617
|
-
<Tooltip.Target
|
|
1531
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1532
|
+
<Tooltip.Target>
|
|
1533
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
1534
|
+
</Tooltip.Target>
|
|
1618
1535
|
<Tooltip.Content>
|
|
1619
1536
|
<p>Select the source column containing the categorical or numeric values to be mapped.</p>
|
|
1620
1537
|
</Tooltip.Content>
|
|
1621
1538
|
</Tooltip>
|
|
1622
1539
|
</span>
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
<Tooltip
|
|
1645
|
-
<
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
<
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1540
|
+
<select
|
|
1541
|
+
value={state.columns.primary ? state.columns.primary.name : columnsOptions[0]}
|
|
1542
|
+
onChange={event => {
|
|
1543
|
+
editColumn('primary', 'name', event.target.value)
|
|
1544
|
+
}}
|
|
1545
|
+
>
|
|
1546
|
+
{columnsOptions}
|
|
1547
|
+
</select>
|
|
1548
|
+
</label>
|
|
1549
|
+
<TextField
|
|
1550
|
+
value={columns.primary.label}
|
|
1551
|
+
section='columns'
|
|
1552
|
+
subsection='primary'
|
|
1553
|
+
fieldName='label'
|
|
1554
|
+
label='Label'
|
|
1555
|
+
updateField={updateField}
|
|
1556
|
+
tooltip={
|
|
1557
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1558
|
+
<Tooltip.Target>
|
|
1559
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
1560
|
+
</Tooltip.Target>
|
|
1561
|
+
<Tooltip.Content>
|
|
1562
|
+
<p>Enter a data label for use in tooltips and the data table.</p>
|
|
1563
|
+
</Tooltip.Content>
|
|
1564
|
+
</Tooltip>
|
|
1565
|
+
}
|
|
1566
|
+
/>
|
|
1567
|
+
<ul className='column-edit'>
|
|
1568
|
+
<li className='three-col'>
|
|
1569
|
+
<TextField value={columns.primary.prefix} section='columns' subsection='primary' fieldName='prefix' label='Prefix' updateField={updateField} />
|
|
1570
|
+
<TextField value={columns.primary.suffix} section='columns' subsection='primary' fieldName='suffix' label='Suffix' updateField={updateField} />
|
|
1571
|
+
<TextField type='number' value={columns.primary.roundToPlace} section='columns' subsection='primary' fieldName='roundToPlace' label='Round' updateField={updateField} min={0} />
|
|
1572
|
+
</li>
|
|
1573
|
+
<li>
|
|
1574
|
+
<label className='checkbox'>
|
|
1575
|
+
<input
|
|
1576
|
+
type='checkbox'
|
|
1577
|
+
checked={state.columns.primary.useCommas}
|
|
1578
|
+
onChange={event => {
|
|
1579
|
+
editColumn('primary', 'useCommas', event.target.checked)
|
|
1580
|
+
}}
|
|
1661
1581
|
/>
|
|
1662
|
-
<
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1582
|
+
<span className='edit-label'>Add Commas to Numbers</span>
|
|
1583
|
+
</label>
|
|
1584
|
+
</li>
|
|
1585
|
+
<li>
|
|
1586
|
+
<label className='checkbox'>
|
|
1587
|
+
<input
|
|
1588
|
+
type='checkbox'
|
|
1589
|
+
checked={state.columns.primary.dataTable || false}
|
|
1590
|
+
onChange={event => {
|
|
1591
|
+
editColumn('primary', 'dataTable', event.target.checked)
|
|
1592
|
+
}}
|
|
1669
1593
|
/>
|
|
1670
|
-
<
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1594
|
+
<span className='edit-label'>Display in Data Table</span>
|
|
1595
|
+
</label>
|
|
1596
|
+
</li>
|
|
1597
|
+
<li>
|
|
1598
|
+
<label className='checkbox'>
|
|
1599
|
+
<input
|
|
1600
|
+
type='checkbox'
|
|
1601
|
+
checked={state.columns.primary.tooltip || false}
|
|
1602
|
+
onChange={event => {
|
|
1603
|
+
editColumn('primary', 'tooltip', event.target.checked)
|
|
1604
|
+
}}
|
|
1679
1605
|
/>
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
<
|
|
1695
|
-
</
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
<
|
|
1783
|
-
<
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
{columnsByKey[specialClass.key] && columnsByKey[specialClass.key].sort().map(option => (
|
|
1813
|
-
<option key={`special-class-value-option-${i}-${option}`}>{option}</option>
|
|
1814
|
-
))}
|
|
1815
|
-
</select>
|
|
1816
|
-
</label>
|
|
1817
|
-
<label>
|
|
1818
|
-
<span className="edit-label column-heading">Label</span>
|
|
1819
|
-
<input type="text" value={specialClass.label} onChange={(e) => {
|
|
1820
|
-
editColumn('primary', 'specialClassEdit', {prop: 'label', index: i, value: e.target.value});
|
|
1821
|
-
}} />
|
|
1822
|
-
</label>
|
|
1823
|
-
</div>
|
|
1824
|
-
))}
|
|
1825
|
-
<button className="btn full-width" onClick={(e) => {
|
|
1826
|
-
e.preventDefault();
|
|
1827
|
-
editColumn('primary', 'specialClassAdd', {});
|
|
1828
|
-
}}>
|
|
1829
|
-
Add Special Class
|
|
1830
|
-
</button>
|
|
1831
|
-
</fieldset>
|
|
1832
|
-
)}
|
|
1833
|
-
|
|
1834
|
-
<label className='edit-block navigate column-heading'>
|
|
1835
|
-
<span className='edit-label column-heading'>
|
|
1606
|
+
<span className='edit-label'>Display in Tooltips</span>
|
|
1607
|
+
</label>
|
|
1608
|
+
</li>
|
|
1609
|
+
</ul>
|
|
1610
|
+
</fieldset>
|
|
1611
|
+
)}
|
|
1612
|
+
|
|
1613
|
+
{state.general.type === 'bubble' && state.legend.type === 'category' && (
|
|
1614
|
+
<fieldset className='primary-fieldset edit-block'>
|
|
1615
|
+
<label>
|
|
1616
|
+
<span className='edit-label column-heading'>
|
|
1617
|
+
Category Column
|
|
1618
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1619
|
+
<Tooltip.Target>
|
|
1620
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
1621
|
+
</Tooltip.Target>
|
|
1622
|
+
<Tooltip.Content>
|
|
1623
|
+
<p>Select the source column containing the categorical bubble values to be mapped.</p>
|
|
1624
|
+
</Tooltip.Content>
|
|
1625
|
+
</Tooltip>
|
|
1626
|
+
</span>
|
|
1627
|
+
<select
|
|
1628
|
+
value={state.columns.categorical ? state.columns.categorical.name : columnsOptions[0]}
|
|
1629
|
+
onChange={event => {
|
|
1630
|
+
editColumn('categorical', 'name', event.target.value)
|
|
1631
|
+
}}
|
|
1632
|
+
>
|
|
1633
|
+
{columnsOptions}
|
|
1634
|
+
</select>
|
|
1635
|
+
</label>
|
|
1636
|
+
</fieldset>
|
|
1637
|
+
)}
|
|
1638
|
+
|
|
1639
|
+
{'us-geocode' === state.general.type && (
|
|
1640
|
+
<>
|
|
1641
|
+
<label>Latitude Column</label>
|
|
1642
|
+
<select
|
|
1643
|
+
value={state.columns.latitude.name ? state.columns.latitude.name : ''}
|
|
1644
|
+
onChange={e => {
|
|
1645
|
+
editColumn('latitude', 'name', e.target.value)
|
|
1646
|
+
}}
|
|
1647
|
+
>
|
|
1648
|
+
{columnsOptions}
|
|
1649
|
+
</select>
|
|
1650
|
+
<label>Longitude Column</label>
|
|
1651
|
+
<select
|
|
1652
|
+
value={state.columns.longitude.name ? state.columns.longitude.name : ''}
|
|
1653
|
+
onChange={e => {
|
|
1654
|
+
editColumn('longitude', 'name', e.target.value)
|
|
1655
|
+
}}
|
|
1656
|
+
>
|
|
1657
|
+
{columnsOptions}
|
|
1658
|
+
</select>
|
|
1659
|
+
</>
|
|
1660
|
+
)}
|
|
1661
|
+
|
|
1662
|
+
{'navigation' !== state.general.type && (
|
|
1663
|
+
<fieldset className='primary-fieldset edit-block'>
|
|
1664
|
+
<label>
|
|
1665
|
+
<span className='edit-label'>
|
|
1666
|
+
Special Classes
|
|
1667
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1668
|
+
<Tooltip.Target>
|
|
1669
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
1670
|
+
</Tooltip.Target>
|
|
1671
|
+
<Tooltip.Content>
|
|
1672
|
+
<p>For secondary values such as "NA", the system can automatically color-code them in shades of gray, one shade for each special class.</p>
|
|
1673
|
+
</Tooltip.Content>
|
|
1674
|
+
</Tooltip>
|
|
1675
|
+
</span>
|
|
1676
|
+
</label>
|
|
1677
|
+
{specialClasses.map((specialClass, i) => (
|
|
1678
|
+
<div className='edit-block' key={`special-class-${i}`}>
|
|
1679
|
+
<button
|
|
1680
|
+
className='remove-column'
|
|
1681
|
+
onClick={e => {
|
|
1682
|
+
e.preventDefault()
|
|
1683
|
+
editColumn('primary', 'specialClassDelete', i)
|
|
1684
|
+
}}
|
|
1685
|
+
>
|
|
1686
|
+
Remove
|
|
1687
|
+
</button>
|
|
1688
|
+
<p>Special Class {i + 1}</p>
|
|
1689
|
+
<label>
|
|
1690
|
+
<span className='edit-label column-heading'>Data Key</span>
|
|
1691
|
+
<select
|
|
1692
|
+
value={specialClass.key}
|
|
1693
|
+
onChange={e => {
|
|
1694
|
+
editColumn('primary', 'specialClassEdit', { prop: 'key', index: i, value: e.target.value })
|
|
1695
|
+
}}
|
|
1696
|
+
>
|
|
1697
|
+
{columnsOptions}
|
|
1698
|
+
</select>
|
|
1699
|
+
</label>
|
|
1700
|
+
<label>
|
|
1701
|
+
<span className='edit-label column-heading'>Value</span>
|
|
1702
|
+
<select
|
|
1703
|
+
value={specialClass.value}
|
|
1704
|
+
onChange={e => {
|
|
1705
|
+
editColumn('primary', 'specialClassEdit', { prop: 'value', index: i, value: e.target.value })
|
|
1706
|
+
}}
|
|
1707
|
+
>
|
|
1708
|
+
<option value=''>- Select Value -</option>
|
|
1709
|
+
{columnsByKey[specialClass.key] && columnsByKey[specialClass.key].sort().map(option => <option key={`special-class-value-option-${i}-${option}`}>{option}</option>)}
|
|
1710
|
+
</select>
|
|
1711
|
+
</label>
|
|
1712
|
+
<label>
|
|
1713
|
+
<span className='edit-label column-heading'>Label</span>
|
|
1714
|
+
<input
|
|
1715
|
+
type='text'
|
|
1716
|
+
value={specialClass.label}
|
|
1717
|
+
onChange={e => {
|
|
1718
|
+
editColumn('primary', 'specialClassEdit', { prop: 'label', index: i, value: e.target.value })
|
|
1719
|
+
}}
|
|
1720
|
+
/>
|
|
1721
|
+
</label>
|
|
1722
|
+
</div>
|
|
1723
|
+
))}
|
|
1724
|
+
<button
|
|
1725
|
+
className='btn full-width'
|
|
1726
|
+
onClick={e => {
|
|
1727
|
+
e.preventDefault()
|
|
1728
|
+
editColumn('primary', 'specialClassAdd', {})
|
|
1729
|
+
}}
|
|
1730
|
+
>
|
|
1731
|
+
Add Special Class
|
|
1732
|
+
</button>
|
|
1733
|
+
</fieldset>
|
|
1734
|
+
)}
|
|
1735
|
+
|
|
1736
|
+
<label className='edit-block navigate column-heading'>
|
|
1737
|
+
<span className='edit-label column-heading'>
|
|
1836
1738
|
Navigation
|
|
1837
|
-
<Tooltip style={{textTransform: 'none'}}>
|
|
1838
|
-
<Tooltip.Target
|
|
1739
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1740
|
+
<Tooltip.Target>
|
|
1741
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
1742
|
+
</Tooltip.Target>
|
|
1839
1743
|
<Tooltip.Content>
|
|
1840
1744
|
<p>To provide end users with navigation functionality, select the source column containing the navigation URLs.</p>
|
|
1841
1745
|
</Tooltip.Content>
|
|
1842
1746
|
</Tooltip>
|
|
1843
1747
|
</span>
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
{'navigation' !== state.general.type &&
|
|
1856
|
-
<fieldset className="primary-fieldset edit-block">
|
|
1748
|
+
<select
|
|
1749
|
+
value={state.columns.navigate ? state.columns.navigate.name : columnsOptions[0]}
|
|
1750
|
+
onChange={event => {
|
|
1751
|
+
editColumn('navigate', 'name', event.target.value)
|
|
1752
|
+
}}
|
|
1753
|
+
>
|
|
1754
|
+
{columnsOptions}
|
|
1755
|
+
</select>
|
|
1756
|
+
</label>
|
|
1757
|
+
{'navigation' !== state.general.type && (
|
|
1758
|
+
<fieldset className='primary-fieldset edit-block'>
|
|
1857
1759
|
<label>
|
|
1858
|
-
<span className=
|
|
1760
|
+
<span className='edit-label'>
|
|
1859
1761
|
Additional Columns
|
|
1860
|
-
<Tooltip style={{textTransform: 'none'}}>
|
|
1861
|
-
<Tooltip.Target
|
|
1762
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1763
|
+
<Tooltip.Target>
|
|
1764
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
1765
|
+
</Tooltip.Target>
|
|
1862
1766
|
<Tooltip.Content>
|
|
1863
1767
|
<p>You can specify additional columns to display in tooltips and / or the supporting data table.</p>
|
|
1864
1768
|
</Tooltip.Content>
|
|
1865
1769
|
</Tooltip>
|
|
1866
1770
|
</span>
|
|
1867
1771
|
</label>
|
|
1868
|
-
{additionalColumns.map(
|
|
1869
|
-
<fieldset className=
|
|
1772
|
+
{additionalColumns.map(val => (
|
|
1773
|
+
<fieldset className='edit-block' key={val}>
|
|
1870
1774
|
<button
|
|
1871
|
-
className=
|
|
1872
|
-
onClick={
|
|
1775
|
+
className='remove-column'
|
|
1776
|
+
onClick={event => {
|
|
1873
1777
|
event.preventDefault()
|
|
1874
1778
|
removeAdditionalColumn(val)
|
|
1875
1779
|
}}
|
|
@@ -1877,90 +1781,57 @@ const EditorPanel = (props) => {
|
|
|
1877
1781
|
Remove
|
|
1878
1782
|
</button>
|
|
1879
1783
|
<label>
|
|
1880
|
-
<span className=
|
|
1784
|
+
<span className='edit-label column-heading'>Column</span>
|
|
1881
1785
|
<select
|
|
1882
|
-
value={
|
|
1883
|
-
|
|
1884
|
-
? state.columns[val].name
|
|
1885
|
-
: columnsOptions[0]
|
|
1886
|
-
}
|
|
1887
|
-
onChange={(event) => {
|
|
1786
|
+
value={state.columns[val] ? state.columns[val].name : columnsOptions[0]}
|
|
1787
|
+
onChange={event => {
|
|
1888
1788
|
editColumn(val, 'name', event.target.value)
|
|
1889
1789
|
}}
|
|
1890
1790
|
>
|
|
1891
1791
|
{columnsOptions}
|
|
1892
1792
|
</select>
|
|
1893
1793
|
</label>
|
|
1894
|
-
<TextField
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
updateField={updateField}
|
|
1901
|
-
/>
|
|
1902
|
-
<ul className="column-edit">
|
|
1903
|
-
<li className="three-col">
|
|
1904
|
-
<TextField
|
|
1905
|
-
value={columns[val].prefix}
|
|
1906
|
-
section="columns"
|
|
1907
|
-
subsection={val}
|
|
1908
|
-
fieldName="prefix"
|
|
1909
|
-
label="Prefix"
|
|
1910
|
-
updateField={updateField}
|
|
1911
|
-
/>
|
|
1912
|
-
<TextField
|
|
1913
|
-
value={columns[val].suffix}
|
|
1914
|
-
section="columns"
|
|
1915
|
-
subsection={val}
|
|
1916
|
-
fieldName="suffix"
|
|
1917
|
-
label="Suffix"
|
|
1918
|
-
updateField={updateField}
|
|
1919
|
-
/>
|
|
1920
|
-
<TextField
|
|
1921
|
-
type="number"
|
|
1922
|
-
value={columns[val].roundToPlace}
|
|
1923
|
-
section="columns"
|
|
1924
|
-
subsection={val}
|
|
1925
|
-
fieldName="roundToPlace"
|
|
1926
|
-
label="Round"
|
|
1927
|
-
updateField={updateField}
|
|
1928
|
-
/>
|
|
1794
|
+
<TextField value={columns[val].label} section='columns' subsection={val} fieldName='label' label='Label' updateField={updateField} />
|
|
1795
|
+
<ul className='column-edit'>
|
|
1796
|
+
<li className='three-col'>
|
|
1797
|
+
<TextField value={columns[val].prefix} section='columns' subsection={val} fieldName='prefix' label='Prefix' updateField={updateField} />
|
|
1798
|
+
<TextField value={columns[val].suffix} section='columns' subsection={val} fieldName='suffix' label='Suffix' updateField={updateField} />
|
|
1799
|
+
<TextField type='number' value={columns[val].roundToPlace} section='columns' subsection={val} fieldName='roundToPlace' label='Round' updateField={updateField} />
|
|
1929
1800
|
</li>
|
|
1930
1801
|
<li>
|
|
1931
|
-
<label className=
|
|
1802
|
+
<label className='checkbox'>
|
|
1932
1803
|
<input
|
|
1933
|
-
type=
|
|
1804
|
+
type='checkbox'
|
|
1934
1805
|
checked={state.columns[val].useCommas}
|
|
1935
|
-
onChange={
|
|
1806
|
+
onChange={event => {
|
|
1936
1807
|
editColumn(val, 'useCommas', event.target.checked)
|
|
1937
1808
|
}}
|
|
1938
1809
|
/>
|
|
1939
|
-
<span className=
|
|
1810
|
+
<span className='edit-label'>Add Commas to Numbers</span>
|
|
1940
1811
|
</label>
|
|
1941
1812
|
</li>
|
|
1942
1813
|
<li>
|
|
1943
|
-
<label className=
|
|
1814
|
+
<label className='checkbox'>
|
|
1944
1815
|
<input
|
|
1945
|
-
type=
|
|
1816
|
+
type='checkbox'
|
|
1946
1817
|
checked={state.columns[val].dataTable}
|
|
1947
|
-
onChange={
|
|
1818
|
+
onChange={event => {
|
|
1948
1819
|
editColumn(val, 'dataTable', event.target.checked)
|
|
1949
1820
|
}}
|
|
1950
1821
|
/>
|
|
1951
|
-
<span className=
|
|
1822
|
+
<span className='edit-label'>Display in Data Table</span>
|
|
1952
1823
|
</label>
|
|
1953
1824
|
</li>
|
|
1954
1825
|
<li>
|
|
1955
|
-
<label className=
|
|
1826
|
+
<label className='checkbox'>
|
|
1956
1827
|
<input
|
|
1957
|
-
type=
|
|
1828
|
+
type='checkbox'
|
|
1958
1829
|
checked={state.columns[val].tooltip}
|
|
1959
|
-
onChange={
|
|
1830
|
+
onChange={event => {
|
|
1960
1831
|
editColumn(val, 'tooltip', event.target.checked)
|
|
1961
1832
|
}}
|
|
1962
1833
|
/>
|
|
1963
|
-
<span className=
|
|
1834
|
+
<span className='edit-label'>Display in Tooltips</span>
|
|
1964
1835
|
</label>
|
|
1965
1836
|
</li>
|
|
1966
1837
|
</ul>
|
|
@@ -1968,707 +1839,680 @@ const EditorPanel = (props) => {
|
|
|
1968
1839
|
))}
|
|
1969
1840
|
<button
|
|
1970
1841
|
className={'btn full-width'}
|
|
1971
|
-
onClick={
|
|
1972
|
-
event.preventDefault()
|
|
1973
|
-
addAdditionalColumn(additionalColumns.length + 1)
|
|
1842
|
+
onClick={event => {
|
|
1843
|
+
event.preventDefault()
|
|
1844
|
+
addAdditionalColumn(additionalColumns.length + 1)
|
|
1974
1845
|
}}
|
|
1975
1846
|
>
|
|
1976
1847
|
Add Column
|
|
1977
1848
|
</button>
|
|
1978
1849
|
</fieldset>
|
|
1979
|
-
}
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
1850
|
+
)}
|
|
1851
|
+
</AccordionItemPanel>
|
|
1852
|
+
</AccordionItem>{' '}
|
|
1853
|
+
{/* Columns */}
|
|
1854
|
+
{'navigation' !== state.general.type && (
|
|
1855
|
+
<AccordionItem>
|
|
1856
|
+
{' '}
|
|
1857
|
+
{/* Legend */}
|
|
1858
|
+
<AccordionItemHeading>
|
|
1859
|
+
<AccordionItemButton>Legend</AccordionItemButton>
|
|
1860
|
+
</AccordionItemHeading>
|
|
1861
|
+
<AccordionItemPanel>
|
|
1862
|
+
{(state.legend.type === 'equalnumber' || state.legend.type === 'equalinterval') && (
|
|
1863
|
+
<label>
|
|
1864
|
+
<span className='edit-label'>Legend Type</span>
|
|
1865
|
+
<select
|
|
1866
|
+
value={legend.type}
|
|
1867
|
+
onChange={event => {
|
|
1868
|
+
handleEditorChanges('legendType', event.target.value)
|
|
1869
|
+
}}
|
|
1870
|
+
>
|
|
1871
|
+
<option value='equalnumber'>Equal Number (Quantiles)</option>
|
|
1872
|
+
<option value='equalinterval'>Equal Interval</option>
|
|
1873
|
+
</select>
|
|
1874
|
+
</label>
|
|
1875
|
+
)}
|
|
1876
|
+
{'navigation' !== state.general.type && (
|
|
1877
|
+
<label className='checkbox'>
|
|
1878
|
+
<input
|
|
1879
|
+
type='checkbox'
|
|
1880
|
+
checked={state.general.showSidebar || false}
|
|
1881
|
+
onChange={event => {
|
|
1882
|
+
handleEditorChanges('showSidebar', event.target.checked)
|
|
1883
|
+
}}
|
|
1884
|
+
/>
|
|
1885
|
+
<span className='edit-label'>Show Legend</span>
|
|
1886
|
+
</label>
|
|
1887
|
+
)}
|
|
1888
|
+
{'navigation' !== state.general.type && (
|
|
1889
|
+
<label>
|
|
1890
|
+
<span className='edit-label'>Legend Position</span>
|
|
1891
|
+
<select
|
|
1892
|
+
value={legend.position || false}
|
|
1893
|
+
onChange={event => {
|
|
1894
|
+
handleEditorChanges('sidebarPosition', event.target.value)
|
|
1895
|
+
}}
|
|
1896
|
+
>
|
|
1897
|
+
<option value='side'>Side</option>
|
|
1898
|
+
<option value='bottom'>Bottom</option>
|
|
1899
|
+
</select>
|
|
1900
|
+
</label>
|
|
1901
|
+
)}
|
|
1902
|
+
{'side' === legend.position && (
|
|
1903
|
+
<label className='checkbox'>
|
|
1904
|
+
<input
|
|
1905
|
+
type='checkbox'
|
|
1906
|
+
checked={legend.singleColumn}
|
|
1907
|
+
onChange={event => {
|
|
1908
|
+
handleEditorChanges('singleColumnLegend', event.target.checked)
|
|
1909
|
+
}}
|
|
1910
|
+
/>
|
|
1911
|
+
<span className='edit-label'>Single Column Legend</span>
|
|
1912
|
+
</label>
|
|
1913
|
+
)}
|
|
1914
|
+
{'bottom' === legend.position && (
|
|
1915
|
+
<label className='checkbox'>
|
|
1916
|
+
<input
|
|
1917
|
+
type='checkbox'
|
|
1918
|
+
checked={legend.singleRow}
|
|
1919
|
+
onChange={event => {
|
|
1920
|
+
handleEditorChanges('singleRowLegend', event.target.checked)
|
|
1921
|
+
}}
|
|
1922
|
+
/>
|
|
1923
|
+
<span className='edit-label'>Single Row Legend</span>
|
|
1924
|
+
</label>
|
|
1925
|
+
)}
|
|
1926
|
+
{'category' !== legend.type && (
|
|
1927
|
+
<label className='checkbox'>
|
|
1928
|
+
<input type='checkbox' checked={legend.separateZero || false} onChange={event => handleEditorChanges('separateZero', event.target.checked)} />
|
|
1929
|
+
<span className='edit-label'>
|
|
1930
|
+
Separate Zero
|
|
1931
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1932
|
+
<Tooltip.Target>
|
|
1933
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
1934
|
+
</Tooltip.Target>
|
|
1935
|
+
<Tooltip.Content>
|
|
1936
|
+
<p>For numeric data, you can separate the zero value as its own data class.</p>
|
|
1937
|
+
</Tooltip.Content>
|
|
1938
|
+
</Tooltip>
|
|
1939
|
+
</span>
|
|
1940
|
+
</label>
|
|
1941
|
+
)}
|
|
1942
|
+
{/* Temp Checkbox */}
|
|
1943
|
+
|
|
1944
|
+
{state.legend.type === 'equalnumber' && (
|
|
1945
|
+
<label className='checkbox mt-4'>
|
|
1946
|
+
<input
|
|
1947
|
+
type='checkbox'
|
|
1948
|
+
checked={state.general.equalNumberOptIn}
|
|
1949
|
+
onChange={event => {
|
|
1950
|
+
handleEditorChanges('showEqualNumber', event.target.checked)
|
|
1951
|
+
}}
|
|
1952
|
+
/>
|
|
1953
|
+
<span className='edit-label'>Use new quantile legend</span>
|
|
1954
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1955
|
+
<Tooltip.Target>
|
|
1956
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
1957
|
+
</Tooltip.Target>
|
|
1958
|
+
<Tooltip.Content>
|
|
1959
|
+
<p>This prevents numbers from being used in more than one category (ie. 0-1, 1-2, 2-3) </p>
|
|
1960
|
+
</Tooltip.Content>
|
|
1961
|
+
</Tooltip>
|
|
1962
|
+
</label>
|
|
1963
|
+
)}
|
|
1964
|
+
{'category' !== legend.type && (
|
|
1965
|
+
<label>
|
|
1966
|
+
<span className='edit-label'>
|
|
2081
1967
|
Number of Items
|
|
2082
|
-
<Tooltip style={{textTransform: 'none'}}>
|
|
2083
|
-
<Tooltip.Target
|
|
1968
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1969
|
+
<Tooltip.Target>
|
|
1970
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
1971
|
+
</Tooltip.Target>
|
|
2084
1972
|
<Tooltip.Content>
|
|
2085
1973
|
<p>For numeric maps, select the number of data classes. Do not include designated special classes.</p>
|
|
2086
1974
|
</Tooltip.Content>
|
|
2087
1975
|
</Tooltip>
|
|
2088
1976
|
</span>
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
2108
|
-
|
|
1977
|
+
<select
|
|
1978
|
+
value={legend.numberOfItems}
|
|
1979
|
+
onChange={event => {
|
|
1980
|
+
handleEditorChanges('legendNumber', event.target.value)
|
|
1981
|
+
}}
|
|
1982
|
+
>
|
|
1983
|
+
{[...Array(numberOfItemsLimit).keys()].map(num => {
|
|
1984
|
+
return (
|
|
1985
|
+
<option value={num + 1} key={num + 1}>
|
|
1986
|
+
{num + 1}
|
|
1987
|
+
</option>
|
|
1988
|
+
)
|
|
1989
|
+
})}
|
|
1990
|
+
</select>
|
|
1991
|
+
</label>
|
|
1992
|
+
)}
|
|
1993
|
+
{'category' === legend.type && (
|
|
1994
|
+
<React.Fragment>
|
|
1995
|
+
<label>
|
|
1996
|
+
<span className='edit-label'>
|
|
2109
1997
|
Category Order
|
|
2110
|
-
<Tooltip style={{textTransform: 'none'}}>
|
|
2111
|
-
<Tooltip.Target
|
|
1998
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
1999
|
+
<Tooltip.Target>
|
|
2000
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
2001
|
+
</Tooltip.Target>
|
|
2112
2002
|
<Tooltip.Content>
|
|
2113
2003
|
<p>Drag map categories into preferred legend order. </p>
|
|
2114
2004
|
</Tooltip.Content>
|
|
2115
2005
|
</Tooltip>
|
|
2116
2006
|
</span>
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2132
|
-
|
|
2133
|
-
|
|
2134
|
-
|
|
2135
|
-
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
|
|
2177
|
-
|
|
2178
|
-
|
|
2179
|
-
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
|
|
2184
|
-
|
|
2185
|
-
|
|
2186
|
-
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
-
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
|
|
2201
|
-
|
|
2202
|
-
|
|
2203
|
-
|
|
2204
|
-
|
|
2205
|
-
|
|
2206
|
-
|
|
2207
|
-
|
|
2208
|
-
|
|
2209
|
-
|
|
2210
|
-
|
|
2211
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
|
|
2215
|
-
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
</AccordionItemPanel>
|
|
2247
|
-
</AccordionItem>
|
|
2248
|
-
)}
|
|
2249
|
-
{'navigation' !== state.general.type && (
|
|
2250
|
-
<AccordionItem>
|
|
2251
|
-
{' '}
|
|
2252
|
-
{/* Filters */}
|
|
2253
|
-
<AccordionItemHeading>
|
|
2254
|
-
<AccordionItemButton>Filters</AccordionItemButton>
|
|
2255
|
-
</AccordionItemHeading>
|
|
2256
|
-
<AccordionItemPanel>
|
|
2257
|
-
{filtersJSX.length > 0 ? (
|
|
2258
|
-
filtersJSX
|
|
2259
|
-
) : (
|
|
2260
|
-
<p style={{ textAlign: 'center' }}>There are currently no filters.</p>
|
|
2261
|
-
)}
|
|
2262
|
-
<button
|
|
2263
|
-
className={'btn full-width'}
|
|
2264
|
-
onClick={(event) => {
|
|
2265
|
-
event.preventDefault();
|
|
2266
|
-
changeFilter(null, 'addNew');
|
|
2267
|
-
}}
|
|
2268
|
-
>
|
|
2269
|
-
Add Filter
|
|
2270
|
-
</button>
|
|
2271
|
-
</AccordionItemPanel>
|
|
2272
|
-
</AccordionItem>
|
|
2273
|
-
)}
|
|
2274
|
-
{'navigation' !== state.general.type && (
|
|
2275
|
-
<AccordionItem>
|
|
2276
|
-
{' '}
|
|
2277
|
-
{/* Data Table */}
|
|
2278
|
-
<AccordionItemHeading>
|
|
2279
|
-
<AccordionItemButton>Data Table</AccordionItemButton>
|
|
2280
|
-
</AccordionItemHeading>
|
|
2281
|
-
<AccordionItemPanel>
|
|
2282
|
-
<TextField
|
|
2283
|
-
value={dataTable.title}
|
|
2284
|
-
updateField={updateField}
|
|
2285
|
-
section='dataTable'
|
|
2286
|
-
fieldName='title'
|
|
2287
|
-
label='Data Table Title'
|
|
2288
|
-
placeholder='Data Table'
|
|
2289
|
-
/>
|
|
2290
|
-
<TextField
|
|
2291
|
-
value={dataTable.indexLabel || ''}
|
|
2292
|
-
updateField={updateField}
|
|
2293
|
-
section='dataTable'
|
|
2294
|
-
fieldName='indexLabel'
|
|
2295
|
-
label='Index Column Header'
|
|
2296
|
-
placeholder='Location'
|
|
2297
|
-
tooltip={
|
|
2298
|
-
<Tooltip style={{textTransform: 'none'}}>
|
|
2299
|
-
<Tooltip.Target><Icon display="question" style={{marginLeft: '0.5rem'}}/></Tooltip.Target>
|
|
2300
|
-
<Tooltip.Content>
|
|
2301
|
-
<p>To comply with 508 standards, if the first column in the data table has no header, enter a brief one here.</p>
|
|
2302
|
-
</Tooltip.Content>
|
|
2303
|
-
</Tooltip>
|
|
2304
|
-
}
|
|
2305
|
-
/>
|
|
2306
|
-
<TextField
|
|
2307
|
-
value={dataTable.caption}
|
|
2308
|
-
updateField={updateField}
|
|
2309
|
-
section='dataTable'
|
|
2310
|
-
fieldName='caption'
|
|
2311
|
-
label='Data Table Caption'
|
|
2312
|
-
placeholder='Data Table'
|
|
2007
|
+
</label>
|
|
2008
|
+
{/* TODO: Swap out this drag and drop library back to something simpler. I had to remove the old one because it hadn't been updated and wouldn't work with Webpack 5. This is overkill for our needs. */}
|
|
2009
|
+
<DragDropContext onDragEnd={({ source, destination }) => categoryMove(source.index, destination.index)}>
|
|
2010
|
+
<Droppable droppableId='category_order'>
|
|
2011
|
+
{provided => (
|
|
2012
|
+
<ul {...provided.droppableProps} className='sort-list' ref={provided.innerRef}>
|
|
2013
|
+
<CategoryList />
|
|
2014
|
+
{provided.placeholder}
|
|
2015
|
+
</ul>
|
|
2016
|
+
)}
|
|
2017
|
+
</Droppable>
|
|
2018
|
+
</DragDropContext>
|
|
2019
|
+
{state.legend.categoryValuesOrder && state.legend.categoryValuesOrder.length >= 10 && (
|
|
2020
|
+
<section className='error-box my-2'>
|
|
2021
|
+
<div>
|
|
2022
|
+
<strong className='pt-1'>Warning</strong>
|
|
2023
|
+
<p>The maximum number of categorical legend items is 10. If your data has more than 10 categories your map will not display properly.</p>
|
|
2024
|
+
</div>
|
|
2025
|
+
</section>
|
|
2026
|
+
)}
|
|
2027
|
+
</React.Fragment>
|
|
2028
|
+
)}
|
|
2029
|
+
<TextField value={legend.title} updateField={updateField} section='legend' fieldName='title' label='Legend Title' placeholder='Legend Title' />
|
|
2030
|
+
{false === legend.dynamicDescription && <TextField type='textarea' value={legend.description} updateField={updateField} section='legend' fieldName='description' label='Legend Description' />}
|
|
2031
|
+
{true === legend.dynamicDescription && (
|
|
2032
|
+
<React.Fragment>
|
|
2033
|
+
<label>
|
|
2034
|
+
<span>Legend Description</span>
|
|
2035
|
+
<span className='subtext'>For {displayFilterLegendValue(activeFilterValueForDescription)}</span>
|
|
2036
|
+
<DynamicDesc value={legend.descriptions[String(activeFilterValueForDescription)]} />
|
|
2037
|
+
</label>
|
|
2038
|
+
<label>
|
|
2039
|
+
<select
|
|
2040
|
+
value={String(activeFilterValueForDescription)}
|
|
2041
|
+
onChange={event => {
|
|
2042
|
+
handleEditorChanges('changeActiveFilterValue', event.target.value)
|
|
2043
|
+
}}
|
|
2044
|
+
>
|
|
2045
|
+
{filterValueOptionList.map((arr, i) => {
|
|
2046
|
+
return (
|
|
2047
|
+
<option value={arr} key={i}>
|
|
2048
|
+
{displayFilterLegendValue(arr)}
|
|
2049
|
+
</option>
|
|
2050
|
+
)
|
|
2051
|
+
})}
|
|
2052
|
+
</select>
|
|
2053
|
+
</label>
|
|
2054
|
+
</React.Fragment>
|
|
2055
|
+
)}
|
|
2056
|
+
{filtersJSX.length > 0 && (
|
|
2057
|
+
<label className='checkbox'>
|
|
2058
|
+
<input
|
|
2059
|
+
type='checkbox'
|
|
2060
|
+
checked={legend.dynamicDescription}
|
|
2061
|
+
onChange={() => {
|
|
2062
|
+
handleEditorChanges('dynamicDescription', filterValueOptionList[0])
|
|
2063
|
+
}}
|
|
2064
|
+
/>
|
|
2065
|
+
<span className='edit-label'>
|
|
2066
|
+
Dynamic Legend Description
|
|
2067
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
2068
|
+
<Tooltip.Target>
|
|
2069
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
2070
|
+
</Tooltip.Target>
|
|
2071
|
+
<Tooltip.Content>
|
|
2072
|
+
<p>Check this option if the map has multiple filter controls and you want to specify a description for each filter selection.</p>
|
|
2073
|
+
</Tooltip.Content>
|
|
2074
|
+
</Tooltip>
|
|
2075
|
+
</span>
|
|
2076
|
+
</label>
|
|
2077
|
+
)}
|
|
2078
|
+
{(filtersJSX.length > 0 || state.general.type === 'bubble' || state.general.geoType === 'us') && (
|
|
2079
|
+
<label className='checkbox'>
|
|
2080
|
+
<input type='checkbox' checked={legend.unified} onChange={event => handleEditorChanges('unifiedLegend', event.target.checked)} />
|
|
2081
|
+
<span className='edit-label'>
|
|
2082
|
+
Unified Legend
|
|
2083
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
2084
|
+
<Tooltip.Target>
|
|
2085
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
2086
|
+
</Tooltip.Target>
|
|
2087
|
+
<Tooltip.Content>
|
|
2088
|
+
<p>
|
|
2089
|
+
For a map with filters, check this option if you want the high and low values in the legend to be based on <em>all</em> mapped values.
|
|
2090
|
+
</p>
|
|
2091
|
+
</Tooltip.Content>
|
|
2092
|
+
</Tooltip>
|
|
2093
|
+
</span>
|
|
2094
|
+
</label>
|
|
2095
|
+
)}
|
|
2096
|
+
</AccordionItemPanel>
|
|
2097
|
+
</AccordionItem>
|
|
2098
|
+
)}
|
|
2099
|
+
{'navigation' !== state.general.type && (
|
|
2100
|
+
<AccordionItem>
|
|
2101
|
+
{' '}
|
|
2102
|
+
{/* Filters */}
|
|
2103
|
+
<AccordionItemHeading>
|
|
2104
|
+
<AccordionItemButton>Filters</AccordionItemButton>
|
|
2105
|
+
</AccordionItemHeading>
|
|
2106
|
+
<AccordionItemPanel>
|
|
2107
|
+
{filtersJSX.length > 0 ? filtersJSX : <p style={{ textAlign: 'center' }}>There are currently no filters.</p>}
|
|
2108
|
+
<button
|
|
2109
|
+
className={'btn full-width'}
|
|
2110
|
+
onClick={event => {
|
|
2111
|
+
event.preventDefault()
|
|
2112
|
+
changeFilter(null, 'addNew')
|
|
2113
|
+
}}
|
|
2114
|
+
>
|
|
2115
|
+
Add Filter
|
|
2116
|
+
</button>
|
|
2117
|
+
</AccordionItemPanel>
|
|
2118
|
+
</AccordionItem>
|
|
2119
|
+
)}
|
|
2120
|
+
{'navigation' !== state.general.type && (
|
|
2121
|
+
<AccordionItem>
|
|
2122
|
+
{' '}
|
|
2123
|
+
{/* Data Table */}
|
|
2124
|
+
<AccordionItemHeading>
|
|
2125
|
+
<AccordionItemButton>Data Table</AccordionItemButton>
|
|
2126
|
+
</AccordionItemHeading>
|
|
2127
|
+
<AccordionItemPanel>
|
|
2128
|
+
<TextField value={dataTable.title} updateField={updateField} section='dataTable' fieldName='title' label='Data Table Title' placeholder='Data Table' />
|
|
2129
|
+
<TextField
|
|
2130
|
+
value={dataTable.indexLabel || ''}
|
|
2131
|
+
updateField={updateField}
|
|
2132
|
+
section='dataTable'
|
|
2133
|
+
fieldName='indexLabel'
|
|
2134
|
+
label='Index Column Header'
|
|
2135
|
+
placeholder='Location'
|
|
2313
2136
|
tooltip={
|
|
2314
|
-
<Tooltip style={{textTransform: 'none'}}>
|
|
2315
|
-
<Tooltip.Target
|
|
2137
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
2138
|
+
<Tooltip.Target>
|
|
2139
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
2140
|
+
</Tooltip.Target>
|
|
2141
|
+
<Tooltip.Content>
|
|
2142
|
+
<p>To comply with 508 standards, if the first column in the data table has no header, enter a brief one here.</p>
|
|
2143
|
+
</Tooltip.Content>
|
|
2144
|
+
</Tooltip>
|
|
2145
|
+
}
|
|
2146
|
+
/>
|
|
2147
|
+
<TextField
|
|
2148
|
+
value={dataTable.caption}
|
|
2149
|
+
updateField={updateField}
|
|
2150
|
+
section='dataTable'
|
|
2151
|
+
fieldName='caption'
|
|
2152
|
+
label='Data Table Caption'
|
|
2153
|
+
placeholder='Data Table'
|
|
2154
|
+
tooltip={
|
|
2155
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
2156
|
+
<Tooltip.Target>
|
|
2157
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
2158
|
+
</Tooltip.Target>
|
|
2316
2159
|
<Tooltip.Content>
|
|
2317
2160
|
<p>Enter a description of the data table to be read by screen readers.</p>
|
|
2318
2161
|
</Tooltip.Content>
|
|
2319
2162
|
</Tooltip>
|
|
2320
2163
|
}
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
handleEditorChanges('showDataTable', event.target.checked);
|
|
2333
|
-
}}
|
|
2334
|
-
/>
|
|
2335
|
-
<span className='edit-label'>
|
|
2164
|
+
type='textarea'
|
|
2165
|
+
/>
|
|
2166
|
+
<label className='checkbox'>
|
|
2167
|
+
<input
|
|
2168
|
+
type='checkbox'
|
|
2169
|
+
checked={state.dataTable.forceDisplay !== undefined ? state.dataTable.forceDisplay : !isDashboard}
|
|
2170
|
+
onChange={event => {
|
|
2171
|
+
handleEditorChanges('showDataTable', event.target.checked)
|
|
2172
|
+
}}
|
|
2173
|
+
/>
|
|
2174
|
+
<span className='edit-label'>
|
|
2336
2175
|
Show Table
|
|
2337
|
-
<Tooltip style={{textTransform: 'none'}}>
|
|
2338
|
-
<Tooltip.Target
|
|
2176
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
2177
|
+
<Tooltip.Target>
|
|
2178
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
2179
|
+
</Tooltip.Target>
|
|
2339
2180
|
<Tooltip.Content>
|
|
2340
2181
|
<p>Data tables are required for 508 compliance. When choosing to hide this data table, replace with your own version.</p>
|
|
2341
2182
|
</Tooltip.Content>
|
|
2342
2183
|
</Tooltip>
|
|
2343
2184
|
</span>
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
2356
|
-
|
|
2357
|
-
|
|
2358
|
-
|
|
2359
|
-
|
|
2360
|
-
|
|
2361
|
-
|
|
2362
|
-
|
|
2363
|
-
|
|
2364
|
-
|
|
2365
|
-
|
|
2366
|
-
|
|
2367
|
-
|
|
2368
|
-
|
|
2369
|
-
|
|
2370
|
-
|
|
2371
|
-
|
|
2372
|
-
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
|
|
2376
|
-
|
|
2377
|
-
|
|
2378
|
-
|
|
2379
|
-
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
|
|
2388
|
-
|
|
2389
|
-
|
|
2390
|
-
|
|
2391
|
-
|
|
2392
|
-
|
|
2393
|
-
|
|
2394
|
-
|
|
2395
|
-
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
|
|
2400
|
-
|
|
2401
|
-
|
|
2402
|
-
|
|
2185
|
+
</label>
|
|
2186
|
+
<label className='checkbox'>
|
|
2187
|
+
<input
|
|
2188
|
+
type='checkbox'
|
|
2189
|
+
checked={state.dataTable.limitHeight}
|
|
2190
|
+
onChange={event => {
|
|
2191
|
+
handleEditorChanges('limitDataTableHeight', event.target.checked)
|
|
2192
|
+
}}
|
|
2193
|
+
/>
|
|
2194
|
+
<span className='edit-label'>Limit Table Height</span>
|
|
2195
|
+
</label>
|
|
2196
|
+
{state.dataTable.limitHeight && <TextField value={dataTable.height} updateField={updateField} section='dataTable' fieldName='height' label='Data Table Height' placeholder='Height(px)' type='number' min='0' max='500' />}
|
|
2197
|
+
<label className='checkbox'>
|
|
2198
|
+
<input
|
|
2199
|
+
type='checkbox'
|
|
2200
|
+
checked={state.general.expandDataTable || false}
|
|
2201
|
+
onChange={event => {
|
|
2202
|
+
handleEditorChanges('expandDataTable', event.target.checked)
|
|
2203
|
+
}}
|
|
2204
|
+
/>
|
|
2205
|
+
<span className='edit-label'>Map loads with data table expanded</span>
|
|
2206
|
+
</label>
|
|
2207
|
+
<label className='checkbox'>
|
|
2208
|
+
<input
|
|
2209
|
+
type='checkbox'
|
|
2210
|
+
checked={state.table.showDownloadUrl}
|
|
2211
|
+
onChange={event => {
|
|
2212
|
+
handleEditorChanges('toggleDataUrl', event.target.checked)
|
|
2213
|
+
}}
|
|
2214
|
+
/>
|
|
2215
|
+
<span className='edit-label'>Enable Link to Dataset</span>
|
|
2216
|
+
</label>
|
|
2217
|
+
<label className='checkbox'>
|
|
2218
|
+
<input
|
|
2219
|
+
type='checkbox'
|
|
2220
|
+
checked={state.general.showDownloadButton}
|
|
2221
|
+
onChange={event => {
|
|
2222
|
+
handleEditorChanges('toggleDownloadButton', event.target.checked)
|
|
2223
|
+
}}
|
|
2224
|
+
/>
|
|
2225
|
+
<span className='edit-label'>Enable Download CSV Button</span>
|
|
2226
|
+
</label>
|
|
2227
|
+
{/* <label className='checkbox'>
|
|
2228
|
+
<input
|
|
2229
|
+
type='checkbox'
|
|
2230
|
+
checked={state.general.showDownloadImgButton}
|
|
2231
|
+
onChange={event => {
|
|
2232
|
+
handleEditorChanges('toggleDownloadImgButton', event.target.checked)
|
|
2233
|
+
}}
|
|
2234
|
+
/>
|
|
2235
|
+
<span className='edit-label'>Enable Image Download</span>
|
|
2236
|
+
</label> */}
|
|
2237
|
+
{/* <label className='checkbox'>
|
|
2238
|
+
<input
|
|
2239
|
+
type='checkbox'
|
|
2240
|
+
checked={state.general.showDownloadPdfButton}
|
|
2241
|
+
onChange={event => {
|
|
2242
|
+
handleEditorChanges('toggleDownloadPdfButton', event.target.checked)
|
|
2243
|
+
}}
|
|
2244
|
+
/>
|
|
2245
|
+
<span className='edit-label'>Enable Pdf Download</span>
|
|
2246
|
+
</label> */}
|
|
2247
|
+
</AccordionItemPanel>
|
|
2248
|
+
</AccordionItem>
|
|
2249
|
+
)}
|
|
2250
|
+
<AccordionItem>
|
|
2251
|
+
{' '}
|
|
2252
|
+
{/* Tooltips */}
|
|
2253
|
+
<AccordionItemHeading>
|
|
2254
|
+
<AccordionItemButton>Interactivity</AccordionItemButton>
|
|
2255
|
+
</AccordionItemHeading>
|
|
2256
|
+
<AccordionItemPanel>
|
|
2257
|
+
<label>
|
|
2258
|
+
<span className='edit-label'>
|
|
2259
|
+
Detail displays on{' '}
|
|
2260
|
+
<Tooltip style={{ textTransform: 'none' }}>
|
|
2261
|
+
<Tooltip.Target>
|
|
2262
|
+
<Icon display='question' style={{ marginLeft: '0.5rem' }} />
|
|
2263
|
+
</Tooltip.Target>
|
|
2403
2264
|
<Tooltip.Content>
|
|
2404
2265
|
<p>At mobile sizes, information always appears in a popover modal when a user taps on an item.</p>
|
|
2405
2266
|
</Tooltip.Content>
|
|
2406
2267
|
</Tooltip>
|
|
2407
|
-
|
|
2408
|
-
|
|
2409
|
-
|
|
2410
|
-
|
|
2411
|
-
|
|
2412
|
-
|
|
2413
|
-
|
|
2414
|
-
|
|
2415
|
-
|
|
2416
|
-
|
|
2417
|
-
|
|
2418
|
-
|
|
2419
|
-
|
|
2420
|
-
|
|
2421
|
-
|
|
2422
|
-
|
|
2423
|
-
|
|
2424
|
-
|
|
2425
|
-
|
|
2426
|
-
|
|
2427
|
-
|
|
2428
|
-
|
|
2429
|
-
|
|
2430
|
-
|
|
2431
|
-
|
|
2432
|
-
|
|
2433
|
-
|
|
2434
|
-
|
|
2435
|
-
|
|
2436
|
-
|
|
2437
|
-
|
|
2438
|
-
|
|
2439
|
-
|
|
2440
|
-
|
|
2441
|
-
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
|
|
2447
|
-
|
|
2448
|
-
|
|
2449
|
-
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
|
|
2453
|
-
|
|
2454
|
-
|
|
2455
|
-
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
|
|
2463
|
-
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
|
|
2481
|
-
|
|
2482
|
-
|
|
2483
|
-
|
|
2484
|
-
|
|
2485
|
-
|
|
2486
|
-
|
|
2487
|
-
|
|
2488
|
-
|
|
2489
|
-
|
|
2490
|
-
|
|
2491
|
-
|
|
2492
|
-
|
|
2493
|
-
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
|
|
2500
|
-
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
|
|
2519
|
-
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2552
|
-
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
|
|
2557
|
-
|
|
2558
|
-
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
|
|
2575
|
-
|
|
2576
|
-
|
|
2577
|
-
|
|
2578
|
-
|
|
2579
|
-
|
|
2580
|
-
|
|
2581
|
-
|
|
2582
|
-
|
|
2583
|
-
|
|
2584
|
-
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
|
|
2588
|
-
|
|
2589
|
-
|
|
2590
|
-
|
|
2591
|
-
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
|
|
2599
|
-
|
|
2600
|
-
|
|
2601
|
-
|
|
2602
|
-
|
|
2603
|
-
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
|
|
2621
|
-
|
|
2622
|
-
|
|
2623
|
-
|
|
2624
|
-
|
|
2625
|
-
|
|
2626
|
-
|
|
2627
|
-
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
|
|
2634
|
-
|
|
2635
|
-
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
|
|
2640
|
-
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
|
|
2647
|
-
|
|
2648
|
-
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
<option value='pin'>Pin</option>
|
|
2659
|
-
</select>
|
|
2660
|
-
</label>
|
|
2661
|
-
}
|
|
2662
|
-
</AccordionItemPanel>
|
|
2663
|
-
</AccordionItem>
|
|
2664
|
-
</Accordion>
|
|
2665
|
-
</form>
|
|
2666
|
-
<AdvancedEditor loadConfig={loadConfig} state={state} convertStateToConfig={convertStateToConfig} />
|
|
2667
|
-
|
|
2668
|
-
</section>
|
|
2669
|
-
</section>
|
|
2670
|
-
</ErrorBoundary>
|
|
2671
|
-
);
|
|
2672
|
-
};
|
|
2673
|
-
|
|
2674
|
-
export default EditorPanel;
|
|
2268
|
+
</span>
|
|
2269
|
+
<select
|
|
2270
|
+
value={state.tooltips.appearanceType}
|
|
2271
|
+
onChange={event => {
|
|
2272
|
+
handleEditorChanges('appearanceType', event.target.value)
|
|
2273
|
+
}}
|
|
2274
|
+
>
|
|
2275
|
+
<option value='hover'>Hover - Tooltip</option>
|
|
2276
|
+
<option value='click'>Click - Popover Modal</option>
|
|
2277
|
+
</select>
|
|
2278
|
+
</label>
|
|
2279
|
+
{'click' === state.tooltips.appearanceType && <TextField value={tooltips.linkLabel} section='tooltips' fieldName='linkLabel' label='Tooltips Link Label' updateField={updateField} />}
|
|
2280
|
+
<label className='checkbox'>
|
|
2281
|
+
<input
|
|
2282
|
+
type='checkbox'
|
|
2283
|
+
checked={state.tooltips.capitalizeLabels}
|
|
2284
|
+
onChange={event => {
|
|
2285
|
+
handleEditorChanges('capitalizeLabels', event.target.checked)
|
|
2286
|
+
}}
|
|
2287
|
+
/>
|
|
2288
|
+
<span className='edit-label'>Capitalize text inside tooltip</span>
|
|
2289
|
+
</label>
|
|
2290
|
+
</AccordionItemPanel>
|
|
2291
|
+
</AccordionItem>
|
|
2292
|
+
<AccordionItem>
|
|
2293
|
+
{' '}
|
|
2294
|
+
{/* Visual */}
|
|
2295
|
+
<AccordionItemHeading>
|
|
2296
|
+
<AccordionItemButton>Visual</AccordionItemButton>
|
|
2297
|
+
</AccordionItemHeading>
|
|
2298
|
+
<AccordionItemPanel>
|
|
2299
|
+
<label>
|
|
2300
|
+
<span className='edit-label'>Header Theme</span>
|
|
2301
|
+
<ul className='color-palette'>
|
|
2302
|
+
{headerColors.map(palette => {
|
|
2303
|
+
return (
|
|
2304
|
+
<li
|
|
2305
|
+
title={palette}
|
|
2306
|
+
key={palette}
|
|
2307
|
+
onClick={() => {
|
|
2308
|
+
handleEditorChanges('headerColor', palette)
|
|
2309
|
+
}}
|
|
2310
|
+
className={state.general.headerColor === palette ? 'selected ' + palette : palette}
|
|
2311
|
+
></li>
|
|
2312
|
+
)
|
|
2313
|
+
})}
|
|
2314
|
+
</ul>
|
|
2315
|
+
</label>
|
|
2316
|
+
<label className='checkbox'>
|
|
2317
|
+
<input
|
|
2318
|
+
type='checkbox'
|
|
2319
|
+
checked={state.general.showTitle || false}
|
|
2320
|
+
onChange={event => {
|
|
2321
|
+
handleEditorChanges('showTitle', event.target.checked)
|
|
2322
|
+
}}
|
|
2323
|
+
/>
|
|
2324
|
+
<span className='edit-label'>Show Title</span>
|
|
2325
|
+
</label>
|
|
2326
|
+
|
|
2327
|
+
<label className='checkbox'>
|
|
2328
|
+
<input
|
|
2329
|
+
type='checkbox'
|
|
2330
|
+
checked={state.general.hideGeoColumnInTooltip || false}
|
|
2331
|
+
onChange={event => {
|
|
2332
|
+
handleEditorChanges('hideGeoColumnInTooltip', event.target.checked)
|
|
2333
|
+
}}
|
|
2334
|
+
/>
|
|
2335
|
+
<span className='edit-label'>Hide Geography Column Name in Tooltip</span>
|
|
2336
|
+
</label>
|
|
2337
|
+
|
|
2338
|
+
<label className='checkbox'>
|
|
2339
|
+
<input
|
|
2340
|
+
type='checkbox'
|
|
2341
|
+
checked={state.general.hidePrimaryColumnInTooltip || false}
|
|
2342
|
+
onChange={event => {
|
|
2343
|
+
handleEditorChanges('hidePrimaryColumnInTooltip', event.target.checked)
|
|
2344
|
+
}}
|
|
2345
|
+
/>
|
|
2346
|
+
<span className='edit-label'>Hide Primary Column Name in Tooltip</span>
|
|
2347
|
+
</label>
|
|
2348
|
+
{'navigation' === state.general.type && (
|
|
2349
|
+
<label className='checkbox'>
|
|
2350
|
+
<input
|
|
2351
|
+
type='checkbox'
|
|
2352
|
+
checked={state.general.fullBorder || false}
|
|
2353
|
+
onChange={event => {
|
|
2354
|
+
handleEditorChanges('fullBorder', event.target.checked)
|
|
2355
|
+
}}
|
|
2356
|
+
/>
|
|
2357
|
+
<span className='edit-label'>Add border around map</span>
|
|
2358
|
+
</label>
|
|
2359
|
+
)}
|
|
2360
|
+
<label>
|
|
2361
|
+
<span className='edit-label'>Geo Border Color</span>
|
|
2362
|
+
<select
|
|
2363
|
+
value={state.general.geoBorderColor || false}
|
|
2364
|
+
onChange={event => {
|
|
2365
|
+
handleEditorChanges('geoBorderColor', event.target.value)
|
|
2366
|
+
}}
|
|
2367
|
+
>
|
|
2368
|
+
<option value='darkGray'>Dark Gray (Default)</option>
|
|
2369
|
+
<option value='sameAsBackground'>White</option>
|
|
2370
|
+
</select>
|
|
2371
|
+
</label>
|
|
2372
|
+
<label>
|
|
2373
|
+
<span className='edit-label'>Map Color Palette</span>
|
|
2374
|
+
</label>
|
|
2375
|
+
{/* <InputCheckbox section="general" subsection="palette" fieldName='isReversed' size='small' label='Use selected palette in reverse order' updateField={updateField} value={isPaletteReversed} /> */}
|
|
2376
|
+
<InputToggle type='3d' section='general' subsection='palette' fieldName='isReversed' size='small' label='Use selected palette in reverse order' updateField={updateField} value={isPaletteReversed} />
|
|
2377
|
+
<span>Sequential</span>
|
|
2378
|
+
<ul className='color-palette'>
|
|
2379
|
+
{filteredPallets.map(palette => {
|
|
2380
|
+
const colorOne = {
|
|
2381
|
+
backgroundColor: colorPalettes[palette][2]
|
|
2382
|
+
}
|
|
2383
|
+
|
|
2384
|
+
const colorTwo = {
|
|
2385
|
+
backgroundColor: colorPalettes[palette][4]
|
|
2386
|
+
}
|
|
2387
|
+
|
|
2388
|
+
const colorThree = {
|
|
2389
|
+
backgroundColor: colorPalettes[palette][6]
|
|
2390
|
+
}
|
|
2391
|
+
|
|
2392
|
+
return (
|
|
2393
|
+
<li
|
|
2394
|
+
title={palette}
|
|
2395
|
+
key={palette}
|
|
2396
|
+
onClick={() => {
|
|
2397
|
+
handleEditorChanges('color', palette)
|
|
2398
|
+
}}
|
|
2399
|
+
className={state.color === palette ? 'selected' : ''}
|
|
2400
|
+
>
|
|
2401
|
+
<span style={colorOne}></span>
|
|
2402
|
+
<span style={colorTwo}></span>
|
|
2403
|
+
<span style={colorThree}></span>
|
|
2404
|
+
</li>
|
|
2405
|
+
)
|
|
2406
|
+
})}
|
|
2407
|
+
</ul>
|
|
2408
|
+
<span>Non-Sequential</span>
|
|
2409
|
+
<ul className='color-palette'>
|
|
2410
|
+
{filteredQualitative.map(palette => {
|
|
2411
|
+
const colorOne = {
|
|
2412
|
+
backgroundColor: colorPalettes[palette][2]
|
|
2413
|
+
}
|
|
2414
|
+
|
|
2415
|
+
const colorTwo = {
|
|
2416
|
+
backgroundColor: colorPalettes[palette][4]
|
|
2417
|
+
}
|
|
2418
|
+
|
|
2419
|
+
const colorThree = {
|
|
2420
|
+
backgroundColor: colorPalettes[palette][6]
|
|
2421
|
+
}
|
|
2422
|
+
|
|
2423
|
+
// hide palettes with too few colors for region maps
|
|
2424
|
+
if (colorPalettes[palette].length <= 8 && state.general.geoType === 'us-region') {
|
|
2425
|
+
return ''
|
|
2426
|
+
}
|
|
2427
|
+
return (
|
|
2428
|
+
<li
|
|
2429
|
+
title={palette}
|
|
2430
|
+
key={palette}
|
|
2431
|
+
onClick={() => {
|
|
2432
|
+
handleEditorChanges('color', palette)
|
|
2433
|
+
}}
|
|
2434
|
+
className={state.color === palette ? 'selected' : ''}
|
|
2435
|
+
>
|
|
2436
|
+
<span style={colorOne}></span>
|
|
2437
|
+
<span style={colorTwo}></span>
|
|
2438
|
+
<span style={colorThree}></span>
|
|
2439
|
+
</li>
|
|
2440
|
+
)
|
|
2441
|
+
})}
|
|
2442
|
+
</ul>
|
|
2443
|
+
{'us-geocode' === state.general.type && (
|
|
2444
|
+
<label>
|
|
2445
|
+
Geocode Settings
|
|
2446
|
+
<TextField type='number' value={state.visual.geoCodeCircleSize} section='visual' max='10' fieldName='geoCodeCircleSize' label='Geocode Circle Size' updateField={updateField} />
|
|
2447
|
+
</label>
|
|
2448
|
+
)}
|
|
2449
|
+
|
|
2450
|
+
{state.general.type === 'bubble' && (
|
|
2451
|
+
<>
|
|
2452
|
+
<TextField type='number' value={state.visual.minBubbleSize} section='visual' fieldName='minBubbleSize' label='Minimum Bubble Size' updateField={updateField} />
|
|
2453
|
+
<TextField type='number' value={state.visual.maxBubbleSize} section='visual' fieldName='maxBubbleSize' label='Maximum Bubble Size' updateField={updateField} />
|
|
2454
|
+
</>
|
|
2455
|
+
)}
|
|
2456
|
+
{(state.general.geoType === 'world' || (state.general.geoType === 'us' && state.general.type === 'bubble')) && (
|
|
2457
|
+
<label className='checkbox'>
|
|
2458
|
+
<input
|
|
2459
|
+
type='checkbox'
|
|
2460
|
+
checked={state.visual.showBubbleZeros}
|
|
2461
|
+
onChange={event => {
|
|
2462
|
+
handleEditorChanges('showBubbleZeros', event.target.checked)
|
|
2463
|
+
}}
|
|
2464
|
+
/>
|
|
2465
|
+
<span className='edit-label'>Show Data with Zero's on Bubble Map</span>
|
|
2466
|
+
</label>
|
|
2467
|
+
)}
|
|
2468
|
+
{state.general.geoType === 'world' && (
|
|
2469
|
+
<label className='checkbox'>
|
|
2470
|
+
<input
|
|
2471
|
+
type='checkbox'
|
|
2472
|
+
checked={state.general.allowMapZoom}
|
|
2473
|
+
onChange={event => {
|
|
2474
|
+
handleEditorChanges('allowMapZoom', event.target.checked)
|
|
2475
|
+
}}
|
|
2476
|
+
/>
|
|
2477
|
+
<span className='edit-label'>Allow Map Zooming</span>
|
|
2478
|
+
</label>
|
|
2479
|
+
)}
|
|
2480
|
+
{state.general.type === 'bubble' && (
|
|
2481
|
+
<label className='checkbox'>
|
|
2482
|
+
<input
|
|
2483
|
+
type='checkbox'
|
|
2484
|
+
checked={state.visual.extraBubbleBorder}
|
|
2485
|
+
onChange={event => {
|
|
2486
|
+
handleEditorChanges('toggleExtraBubbleBorder', event.target.checked)
|
|
2487
|
+
}}
|
|
2488
|
+
/>
|
|
2489
|
+
<span className='edit-label'>Bubble Map has extra border</span>
|
|
2490
|
+
</label>
|
|
2491
|
+
)}
|
|
2492
|
+
{state.general.geoType === 'us' ||
|
|
2493
|
+
(state.general.geoType === 'us-county' && (
|
|
2494
|
+
<label>
|
|
2495
|
+
<span className='edit-label'>City Style</span>
|
|
2496
|
+
<select
|
|
2497
|
+
value={state.visual.cityStyle || false}
|
|
2498
|
+
onChange={event => {
|
|
2499
|
+
handleEditorChanges('handleCityStyle', event.target.value)
|
|
2500
|
+
}}
|
|
2501
|
+
>
|
|
2502
|
+
<option value='circle'>Circle</option>
|
|
2503
|
+
<option value='pin'>Pin</option>
|
|
2504
|
+
</select>
|
|
2505
|
+
</label>
|
|
2506
|
+
))}
|
|
2507
|
+
</AccordionItemPanel>
|
|
2508
|
+
</AccordionItem>
|
|
2509
|
+
</Accordion>
|
|
2510
|
+
</form>
|
|
2511
|
+
<AdvancedEditor loadConfig={loadConfig} state={state} convertStateToConfig={convertStateToConfig} />
|
|
2512
|
+
</section>
|
|
2513
|
+
</section>
|
|
2514
|
+
</ErrorBoundary>
|
|
2515
|
+
)
|
|
2516
|
+
}
|
|
2517
|
+
|
|
2518
|
+
export default EditorPanel
|