@schukai/monster 3.55.2 → 3.55.3
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/CHANGELOG.md +11 -0
- package/package.json +1 -1
- package/source/components/datatable/stylesheet/column-bar.mjs +7 -13
- package/source/components/datatable/stylesheet/dataset.mjs +7 -13
- package/source/components/datatable/stylesheet/datasource.mjs +7 -13
- package/source/components/datatable/stylesheet/datatable.mjs +7 -13
- package/source/components/datatable/stylesheet/embedded-pagination.mjs +7 -13
- package/source/components/datatable/stylesheet/filter-button.mjs +7 -13
- package/source/components/datatable/stylesheet/filter-controls-defaults.mjs +7 -13
- package/source/components/datatable/stylesheet/filter-date-range.mjs +7 -13
- package/source/components/datatable/stylesheet/filter-range.mjs +7 -13
- package/source/components/datatable/stylesheet/filter.mjs +7 -13
- package/source/components/datatable/stylesheet/pagination.mjs +7 -13
- package/source/components/datatable/stylesheet/select-filter.mjs +7 -13
- package/source/components/datatable/stylesheet/status.mjs +7 -13
- package/source/components/form/select.mjs +1812 -1638
- package/source/components/form/stylesheet/action-button.mjs +7 -13
- package/source/components/form/stylesheet/api-button.mjs +7 -13
- package/source/components/form/stylesheet/button-bar.mjs +7 -13
- package/source/components/form/stylesheet/button.mjs +7 -13
- package/source/components/form/stylesheet/confirm-button.mjs +7 -13
- package/source/components/form/stylesheet/context-error.mjs +7 -13
- package/source/components/form/stylesheet/context-help.mjs +7 -13
- package/source/components/form/stylesheet/form.mjs +7 -13
- package/source/components/form/stylesheet/message-state-button.mjs +7 -13
- package/source/components/form/stylesheet/popper-button.mjs +7 -13
- package/source/components/form/stylesheet/popper.mjs +7 -13
- package/source/components/form/stylesheet/select.mjs +7 -13
- package/source/components/form/stylesheet/state-button.mjs +7 -13
- package/source/components/form/stylesheet/tabs.mjs +7 -13
- package/source/components/form/stylesheet/tree-select.mjs +7 -13
- package/source/components/form/tree-select.mjs +12 -3
- package/source/components/host/stylesheet/call-button.mjs +7 -13
- package/source/components/host/stylesheet/collapse.mjs +7 -13
- package/source/components/host/stylesheet/config-manager.mjs +7 -13
- package/source/components/host/stylesheet/details.mjs +7 -13
- package/source/components/host/stylesheet/host.mjs +7 -13
- package/source/components/host/stylesheet/overlay.mjs +7 -13
- package/source/components/host/stylesheet/toggle-button.mjs +7 -13
- package/source/components/host/stylesheet/viewer.mjs +7 -13
- package/source/components/notify/stylesheet/message.mjs +7 -13
- package/source/components/notify/stylesheet/notify.mjs +7 -13
- package/source/components/state/stylesheet/log.mjs +7 -13
- package/source/components/state/stylesheet/state.mjs +7 -13
- package/source/components/stylesheet/badge.mjs +7 -13
- package/source/components/stylesheet/border.mjs +7 -13
- package/source/components/stylesheet/button.mjs +7 -13
- package/source/components/stylesheet/card.mjs +7 -13
- package/source/components/stylesheet/color.mjs +7 -13
- package/source/components/stylesheet/common.mjs +7 -13
- package/source/components/stylesheet/control.mjs +7 -13
- package/source/components/stylesheet/data-grid.mjs +7 -13
- package/source/components/stylesheet/display.mjs +7 -13
- package/source/components/stylesheet/floating-ui.mjs +7 -13
- package/source/components/stylesheet/form.mjs +7 -13
- package/source/components/stylesheet/host.mjs +7 -13
- package/source/components/stylesheet/icons.mjs +7 -13
- package/source/components/stylesheet/link.mjs +7 -13
- package/source/components/stylesheet/normalize.mjs +7 -13
- package/source/components/stylesheet/popper.mjs +7 -13
- package/source/components/stylesheet/property.mjs +7 -13
- package/source/components/stylesheet/ripple.mjs +7 -13
- package/source/components/stylesheet/skeleton.mjs +7 -13
- package/source/components/stylesheet/space.mjs +7 -13
- package/source/components/stylesheet/spinner.mjs +7 -13
- package/source/components/stylesheet/table.mjs +7 -13
- package/source/components/stylesheet/theme.mjs +7 -13
- package/source/components/stylesheet/typography.mjs +7 -13
- package/source/components/tree-menu/stylesheet/tree-menu.mjs +7 -13
- package/source/data/extend.mjs +56 -47
- package/source/dom/customelement.mjs +8 -3
- package/source/dom/util/init-options-from-attributes.mjs +0 -1
- package/source/monster.mjs +1 -0
- package/source/types/version.mjs +1 -1
- package/test/cases/components/form/button.mjs +1 -1
- package/test/cases/components/form/confirm-button.mjs +1 -1
- package/test/cases/components/form/reload.mjs +1 -1
- package/test/cases/components/form/select.mjs +25 -29
- package/test/cases/components/form/state-button.mjs +1 -1
- package/test/cases/components/form/tabs.mjs +1 -1
- package/test/cases/components/form/template.mjs +1 -1
- package/test/cases/components/form/tree-select.mjs +26 -18
- package/test/cases/data/extend.mjs +43 -2
- package/test/cases/monster.mjs +1 -1
- package/test/web/test.html +2 -2
- package/test/web/tests.js +5 -0
|
@@ -4,61 +4,61 @@
|
|
|
4
4
|
* This file is licensed under the AGPLv3 License.
|
|
5
5
|
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
7
|
+
import {instanceSymbol} from "../../constants.mjs";
|
|
8
|
+
import {internalSymbol} from "../../constants.mjs";
|
|
9
|
+
import {buildMap} from "../../data/buildmap.mjs";
|
|
10
|
+
import {DeadMansSwitch} from "../../util/deadmansswitch.mjs";
|
|
11
|
+
import {positionPopper} from "./util/floating-ui.mjs";
|
|
12
12
|
import {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
addAttributeToken,
|
|
14
|
+
findClosestByAttribute,
|
|
15
|
+
removeAttributeToken,
|
|
16
16
|
} from "../../dom/attributes.mjs";
|
|
17
17
|
import {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
ATTRIBUTE_ERRORMESSAGE,
|
|
19
|
+
ATTRIBUTE_PREFIX,
|
|
20
|
+
ATTRIBUTE_ROLE,
|
|
21
21
|
} from "../../dom/constants.mjs";
|
|
22
|
-
import {
|
|
22
|
+
import {CustomControl} from "../../dom/customcontrol.mjs";
|
|
23
23
|
import {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
assembleMethodSymbol,
|
|
25
|
+
getSlottedElements,
|
|
26
|
+
registerCustomElement,
|
|
27
27
|
} from "../../dom/customelement.mjs";
|
|
28
28
|
import {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
findTargetElementFromEvent,
|
|
30
|
+
fireCustomEvent,
|
|
31
|
+
fireEvent,
|
|
32
32
|
} from "../../dom/events.mjs";
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
import {
|
|
33
|
+
import {getDocument} from "../../dom/util.mjs";
|
|
34
|
+
import {Formatter} from "../../text/formatter.mjs";
|
|
35
|
+
import {getGlobal} from "../../types/global.mjs";
|
|
36
|
+
import {ID} from "../../types/id.mjs";
|
|
37
37
|
import {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
38
|
+
isArray,
|
|
39
|
+
isFunction,
|
|
40
|
+
isInteger,
|
|
41
|
+
isIterable,
|
|
42
|
+
isObject,
|
|
43
|
+
isPrimitive,
|
|
44
|
+
isString,
|
|
45
45
|
} from "../../types/is.mjs";
|
|
46
|
-
import {
|
|
47
|
-
import {
|
|
48
|
-
import {
|
|
49
|
-
import {
|
|
50
|
-
import {
|
|
51
|
-
import {
|
|
46
|
+
import {Observer} from "../../types/observer.mjs";
|
|
47
|
+
import {ProxyObserver} from "../../types/proxyobserver.mjs";
|
|
48
|
+
import {validateArray, validateString} from "../../types/validate.mjs";
|
|
49
|
+
import {Processing} from "../../util/processing.mjs";
|
|
50
|
+
import {STYLE_DISPLAY_MODE_BLOCK} from "./constants.mjs";
|
|
51
|
+
import {SelectStyleSheet} from "./stylesheet/select.mjs";
|
|
52
52
|
import {
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
getDocumentTranslations,
|
|
54
|
+
Translations,
|
|
55
55
|
} from "../../i18n/translations.mjs";
|
|
56
56
|
|
|
57
57
|
export {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
Select,
|
|
59
|
+
popperElementSymbol,
|
|
60
|
+
getSummaryTemplate,
|
|
61
|
+
getSelectionTemplate,
|
|
62
62
|
};
|
|
63
63
|
|
|
64
64
|
/**
|
|
@@ -67,12 +67,30 @@ export {
|
|
|
67
67
|
*/
|
|
68
68
|
const noOptionsAvailableMessage = "No options available.";
|
|
69
69
|
|
|
70
|
+
/**
|
|
71
|
+
* @private
|
|
72
|
+
* @type {string}
|
|
73
|
+
*/
|
|
74
|
+
const clickToLoadOptionsMessage = "Click to load options.";
|
|
75
|
+
|
|
70
76
|
/**
|
|
71
77
|
* @private
|
|
72
78
|
* @type {symbol}
|
|
73
79
|
*/
|
|
74
80
|
const timerCallbackSymbol = Symbol("timerCallback");
|
|
75
81
|
|
|
82
|
+
/**
|
|
83
|
+
* @private
|
|
84
|
+
* @type {symbol}
|
|
85
|
+
*/
|
|
86
|
+
const keyFilterEventSymbol = Symbol("keyFilterEvent");
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @private
|
|
90
|
+
* @type {symbol}
|
|
91
|
+
*/
|
|
92
|
+
const lazyLoadDoneSymbol = Symbol("lazyLoadDone");
|
|
93
|
+
|
|
76
94
|
/**
|
|
77
95
|
* local symbol
|
|
78
96
|
* @private
|
|
@@ -160,7 +178,7 @@ const popperFilterElementSymbol = Symbol("popperFilterElement");
|
|
|
160
178
|
* @type {symbol}
|
|
161
179
|
*/
|
|
162
180
|
const popperFilterContainerElementSymbol = Symbol(
|
|
163
|
-
|
|
181
|
+
"popperFilterContainerElement",
|
|
164
182
|
);
|
|
165
183
|
|
|
166
184
|
/**
|
|
@@ -296,459 +314,489 @@ const FILTER_POSITION_INLINE = "inline";
|
|
|
296
314
|
* @fires Monster.Components.Form.event:monster-changed
|
|
297
315
|
*/
|
|
298
316
|
class Select extends CustomControl {
|
|
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
|
-
|
|
317
|
+
/**
|
|
318
|
+
* @extends CustomControl
|
|
319
|
+
*/
|
|
320
|
+
constructor() {
|
|
321
|
+
super();
|
|
322
|
+
initOptionObserver.call(this);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* This method is called by the `instanceof` operator.
|
|
327
|
+
* @returns {symbol}
|
|
328
|
+
* @since 2.1.0
|
|
329
|
+
*/
|
|
330
|
+
static get [instanceSymbol]() {
|
|
331
|
+
return Symbol.for("@schukai/monster/components/form/select@@instance");
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* The current selection of the Select
|
|
336
|
+
*
|
|
337
|
+
* ```
|
|
338
|
+
* e = document.querySelector('monster-select');
|
|
339
|
+
* console.log(e.value)
|
|
340
|
+
* // ↦ 1
|
|
341
|
+
* // ↦ ['1','2']
|
|
342
|
+
* ```
|
|
343
|
+
*
|
|
344
|
+
* @property {string|array}
|
|
345
|
+
*/
|
|
346
|
+
get value() {
|
|
347
|
+
return convertSelectionToValue.call(this, this.getOption("selection"));
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/attachInternals}
|
|
352
|
+
* @return {boolean}
|
|
353
|
+
*/
|
|
354
|
+
static get formAssociated() {
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Set selection
|
|
360
|
+
*
|
|
361
|
+
* ```
|
|
362
|
+
* e = document.querySelector('monster-select');
|
|
363
|
+
* e.value=1
|
|
364
|
+
* ```
|
|
365
|
+
*
|
|
366
|
+
* @property {string|array} value
|
|
367
|
+
* @since 1.2.0
|
|
368
|
+
* @throws {Error} unsupported type
|
|
369
|
+
*/
|
|
370
|
+
set value(value) {
|
|
371
|
+
const result = convertValueToSelection.call(this, value);
|
|
372
|
+
setSelection
|
|
373
|
+
.call(this, result.selection)
|
|
374
|
+
.then(() => {
|
|
375
|
+
})
|
|
376
|
+
.catch((e) => {
|
|
377
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message);
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* To set the options via the html tag the attribute `data-monster-options` must be used.
|
|
383
|
+
* @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
|
|
384
|
+
*
|
|
385
|
+
* The individual configuration values can be found in the table.
|
|
386
|
+
*
|
|
387
|
+
* @property {Object} toggleEventType=click,touch List of event types to be observed for opening the dropdown
|
|
388
|
+
* @property {boolean} delegatesFocus=false lorem [see mozilla.org](https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot/delegatesFocus)
|
|
389
|
+
* @property {Object[]} options Selection of key identifier pairs available for selection and displayed in the dropdown.
|
|
390
|
+
* @property {string} options[].label Label
|
|
391
|
+
* @property {string} options[].value Value
|
|
392
|
+
* @property {string} options[].visibility hidden or visible
|
|
393
|
+
* @property {Array} selection Selected options
|
|
394
|
+
* @property {Integer} showMaxOptions=10 Maximum number of visible options before a scroll bar should be displayed.
|
|
395
|
+
* @property {string} type=radio Multiple (checkbox) or single selection (radio)
|
|
396
|
+
* @property {string} name=(random id) Name of the form field
|
|
397
|
+
* @property {string} url Load options from server per url
|
|
398
|
+
* @property {Object} fetch Fetch [see Using Fetch mozilla.org](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch)
|
|
399
|
+
* @property {String} fetch.redirect=error
|
|
400
|
+
* @property {String} fetch.method=GET
|
|
401
|
+
* @property {String} fetch.mode=same-origin
|
|
402
|
+
* @property {String} fetch.credentials=same-origin
|
|
403
|
+
* @property {Object} fetch.headers={"accept":"application/json"}}
|
|
404
|
+
* @property {Object} labels
|
|
405
|
+
* @property {string} labels.cannot-be-loaded cannot be loaded
|
|
406
|
+
* @property {string} labels.no-options-available no options available
|
|
407
|
+
* @property {string} labels.select-an-option select an option
|
|
408
|
+
* @property {string} labels.no-option no option in the list, maybe you have to change the filter
|
|
409
|
+
* @property {Object} features List with features
|
|
410
|
+
* @property {Boolean} features.clearAll=true Display of a delete button to delete the entire selection
|
|
411
|
+
* @property {Boolean} features.clear=true Display of a delete key for deleting the specific selection
|
|
412
|
+
* @property {Boolean} features.lazyLoad=false Load options when first opening the dropdown
|
|
413
|
+
* @property {Boolean} features.closeOnSelect=false Close the dropdown when an option is selected (since 3.54.0)
|
|
414
|
+
* @property {Boolean} filter.defaultValue=* Default filter value, if the filter is empty
|
|
415
|
+
* @property {Boolean} filter.mode=options Filter mode, values: options, remote, disabled
|
|
416
|
+
* @property {Object} templates Template definitions
|
|
417
|
+
* @property {string} templates.main Main template
|
|
418
|
+
* @property {string} templateMapping Mapping of the template placeholders
|
|
419
|
+
* @property {string} templateMapping.selected Selected Template
|
|
420
|
+
* @property {Object} popper [PopperJS Options](https://popper.js.org/docs/v2/)
|
|
421
|
+
* @property {string} popper.placement=bottom PopperJS placement
|
|
422
|
+
* @property {Object[]} modifiers={name:offset} PopperJS placement
|
|
423
|
+
* @property {Object} mapping
|
|
424
|
+
* @property {String} mapping.selector=* Path to select the appropriate entries
|
|
425
|
+
* @property {String} mapping.labelTemplate="" template with the label placeholders in the form ${name}, where name is the key (**)
|
|
426
|
+
* @property {String} mapping.valueTemplate="" template with the value placeholders in the form ${name}, where name is the key
|
|
427
|
+
* @property {Monster.Components.Form~exampleFilterCallback|undefined} mapping.filter Filtering of values via a function
|
|
428
|
+
* @property {Object} formatter
|
|
429
|
+
* @property {Monster.Components.Form~formatterSelectionCallback|undefined} formatter.selection format selection label
|
|
430
|
+
*/
|
|
431
|
+
get defaults() {
|
|
432
|
+
return Object.assign(
|
|
433
|
+
{},
|
|
434
|
+
super.defaults,
|
|
435
|
+
{
|
|
436
|
+
toggleEventType: ["click", "touch"],
|
|
437
|
+
delegatesFocus: false,
|
|
438
|
+
options: [],
|
|
439
|
+
selection: [],
|
|
440
|
+
showMaxOptions: 10,
|
|
441
|
+
type: "radio",
|
|
442
|
+
name: new ID("s").toString(),
|
|
443
|
+
features: {
|
|
444
|
+
clearAll: true,
|
|
445
|
+
clear: true,
|
|
446
|
+
lazyLoad: false,
|
|
447
|
+
closeOnSelect: false,
|
|
448
|
+
},
|
|
449
|
+
url: null,
|
|
450
|
+
labels: {
|
|
451
|
+
"cannot-be-loaded": "Cannot be loaded",
|
|
452
|
+
"no-options-available": noOptionsAvailableMessage,
|
|
453
|
+
"click-to-load-options": clickToLoadOptionsMessage,
|
|
454
|
+
"select-an-option": "Select an option",
|
|
455
|
+
"summary-text": {
|
|
456
|
+
zero: "No entries were selected",
|
|
457
|
+
one: '<span class="monster-badge-primary-pill">1</span> entry was selected',
|
|
458
|
+
other:
|
|
459
|
+
'<span class="monster-badge-primary-pill">${count}</span> entries were selected',
|
|
460
|
+
},
|
|
461
|
+
"no-options":
|
|
462
|
+
"Unfortunately, there are no options available in the list.",
|
|
463
|
+
"no-options-found":
|
|
464
|
+
"No options are available in the list. Please consider modifying the filter.",
|
|
465
|
+
},
|
|
466
|
+
messages: {
|
|
467
|
+
control: null,
|
|
468
|
+
selected: null,
|
|
469
|
+
emptyOptions: null,
|
|
470
|
+
},
|
|
471
|
+
fetch: {
|
|
472
|
+
redirect: "error",
|
|
473
|
+
method: "GET",
|
|
474
|
+
mode: "same-origin",
|
|
475
|
+
credentials: "same-origin",
|
|
476
|
+
headers: {
|
|
477
|
+
accept: "application/json",
|
|
478
|
+
},
|
|
479
|
+
},
|
|
480
|
+
filter: {
|
|
481
|
+
defaultValue: "*",
|
|
482
|
+
mode: FILTER_MODE_DISABLED,
|
|
483
|
+
position: FILTER_POSITION_INLINE,
|
|
484
|
+
},
|
|
485
|
+
classes: {
|
|
486
|
+
badge: "monster-badge-primary",
|
|
487
|
+
statusOrRemoveBadge: "empty",
|
|
488
|
+
},
|
|
489
|
+
mapping: {
|
|
490
|
+
selector: "*",
|
|
491
|
+
labelTemplate: "",
|
|
492
|
+
valueTemplate: "",
|
|
493
|
+
filter: null,
|
|
494
|
+
},
|
|
495
|
+
formatter: {
|
|
496
|
+
selection: buildSelectionLabel,
|
|
497
|
+
},
|
|
498
|
+
templates: {
|
|
499
|
+
main: getTemplate(),
|
|
500
|
+
},
|
|
501
|
+
templateMapping: {
|
|
502
|
+
/** with the attribute `data-monster-selected-template` the template for the selected options can be defined. */
|
|
503
|
+
selected: getSelectionTemplate(),
|
|
504
|
+
},
|
|
505
|
+
|
|
506
|
+
popper: {
|
|
507
|
+
placement: "bottom",
|
|
508
|
+
middleware: ["flip", "offset:1"],
|
|
509
|
+
},
|
|
510
|
+
},
|
|
511
|
+
initOptionsFromArguments.call(this),
|
|
512
|
+
);
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* @return {Monster.Components.Form.Select}
|
|
517
|
+
*/
|
|
518
|
+
[assembleMethodSymbol]() {
|
|
519
|
+
const self = this;
|
|
520
|
+
super[assembleMethodSymbol]();
|
|
521
|
+
|
|
522
|
+
initControlReferences.call(self);
|
|
523
|
+
initEventHandler.call(self);
|
|
524
|
+
|
|
525
|
+
const lazyLoadFlag = self.getOption("features.lazyLoad")
|
|
526
|
+
|
|
527
|
+
if (
|
|
528
|
+
self.getOption("url") !== null &&
|
|
529
|
+
!lazyLoadFlag
|
|
530
|
+
) {
|
|
531
|
+
|
|
532
|
+
|
|
533
|
+
setStatusOrRemoveBadges.call(this, "loading");
|
|
534
|
+
|
|
535
|
+
new Processing(200, () => {
|
|
536
|
+
this.fetch().then(() => {
|
|
537
|
+
setTimeout(() => {
|
|
538
|
+
|
|
539
|
+
let result;
|
|
540
|
+
if (self.hasAttribute("value")) {
|
|
541
|
+
result = setSelection.call(self, self.getAttribute("value"));
|
|
542
|
+
} else {
|
|
543
|
+
result = setSelection.call(self, []);
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
result
|
|
547
|
+
.then(() => {
|
|
548
|
+
})
|
|
549
|
+
.catch((e) => {
|
|
550
|
+
addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, `${e}`);
|
|
551
|
+
});
|
|
552
|
+
|
|
553
|
+
}, 100);
|
|
554
|
+
}).catch((e) => {
|
|
555
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message);
|
|
556
|
+
setStatusOrRemoveBadges.call(this, "error");
|
|
557
|
+
|
|
558
|
+
});
|
|
559
|
+
})
|
|
560
|
+
.run()
|
|
561
|
+
.catch((e) => {
|
|
562
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message);
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
let lastValue = self.value;
|
|
568
|
+
self[internalSymbol].attachObserver(
|
|
569
|
+
new Observer(function () {
|
|
570
|
+
if (isObject(this) && this instanceof ProxyObserver) {
|
|
571
|
+
const n = this.getSubject()?.options?.value;
|
|
572
|
+
|
|
573
|
+
if (lastValue !== n) {
|
|
574
|
+
lastValue = n;
|
|
575
|
+
setSelection
|
|
576
|
+
.call(self, n)
|
|
577
|
+
.then(() => {
|
|
578
|
+
})
|
|
579
|
+
.catch((e) => {
|
|
580
|
+
addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, `${e}`);
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
}),
|
|
585
|
+
);
|
|
586
|
+
|
|
587
|
+
areOptionsAvailableAndInit.call(self);
|
|
588
|
+
|
|
589
|
+
return this;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
/**
|
|
593
|
+
* The Button.click() method simulates a click on the internal button element.
|
|
594
|
+
*
|
|
595
|
+
* @since 3.27.0
|
|
596
|
+
* @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click}
|
|
597
|
+
*/
|
|
598
|
+
click() {
|
|
599
|
+
|
|
600
|
+
if (this.getOption("disabled") === true) {
|
|
601
|
+
return;
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
toggle.call(this);
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
/**
|
|
608
|
+
* The Button.focus() method sets focus on the internal button element.
|
|
609
|
+
*
|
|
610
|
+
* @since 3.27.0
|
|
611
|
+
* @see {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus}
|
|
612
|
+
*/
|
|
613
|
+
focus(options) {
|
|
614
|
+
if (this.getOption("disabled") === true) {
|
|
615
|
+
return;
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
new Processing(() => {
|
|
619
|
+
gatherState.call(this);
|
|
620
|
+
focusFilter.call(this, options);
|
|
621
|
+
})
|
|
622
|
+
.run()
|
|
623
|
+
.catch((e) => {
|
|
624
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, `${e}`);
|
|
625
|
+
});
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
/**
|
|
629
|
+
* The Button.blur() method removes focus from the internal button element.
|
|
630
|
+
* @link https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/blur
|
|
631
|
+
*/
|
|
632
|
+
blur() {
|
|
633
|
+
new Processing(() => {
|
|
634
|
+
gatherState.call(this);
|
|
635
|
+
blurFilter.call(this);
|
|
636
|
+
})
|
|
637
|
+
.run()
|
|
638
|
+
.catch((e) => {
|
|
639
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, `${e}`);
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
/**
|
|
644
|
+
* If no url is specified, the options are taken from the Component itself.
|
|
645
|
+
*
|
|
646
|
+
* @param {string|URL} url URL to fetch the options
|
|
647
|
+
* @return {Promise}
|
|
648
|
+
*/
|
|
649
|
+
fetch(url) {
|
|
650
|
+
|
|
651
|
+
if (url instanceof URL) {
|
|
652
|
+
url = url.toString();
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
if (url !== undefined && url !== null) {
|
|
656
|
+
url = validateString(url);
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
return new Promise((resolve, reject) => {
|
|
660
|
+
let response = fetchData.call(this, url).then((map) => {
|
|
661
|
+
if (
|
|
662
|
+
isObject(map) ||
|
|
663
|
+
isArray(map) || (map instanceof Set) ||
|
|
664
|
+
map instanceof Map
|
|
665
|
+
) {
|
|
666
|
+
this.importOptions(map);
|
|
667
|
+
setTimeout(() => {
|
|
668
|
+
resolve();
|
|
669
|
+
}, 10);
|
|
670
|
+
return;
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
reject(new Error("invalid response"));
|
|
674
|
+
});
|
|
675
|
+
|
|
676
|
+
});
|
|
677
|
+
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
/**
|
|
681
|
+
* @return {void}
|
|
682
|
+
*/
|
|
683
|
+
connectedCallback() {
|
|
684
|
+
super.connectedCallback();
|
|
685
|
+
const document = getDocument();
|
|
686
|
+
|
|
687
|
+
for (const [, type] of Object.entries(["click", "touch"])) {
|
|
688
|
+
// close on outside ui-events
|
|
689
|
+
document.addEventListener(type, this[closeEventHandler]);
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
parseSlotsToOptions.call(this);
|
|
693
|
+
attachResizeObserver.call(this);
|
|
694
|
+
updatePopper.call(this);
|
|
695
|
+
|
|
696
|
+
new Processing(() => {
|
|
697
|
+
gatherState.call(this);
|
|
698
|
+
focusFilter.call(this);
|
|
699
|
+
}).run();
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
/**
|
|
703
|
+
* @return {void}
|
|
704
|
+
*/
|
|
705
|
+
disconnectedCallback() {
|
|
706
|
+
super.disconnectedCallback();
|
|
707
|
+
const document = getDocument();
|
|
708
|
+
|
|
709
|
+
// close on outside ui-events
|
|
710
|
+
for (const [, type] of Object.entries(["click", "touch"])) {
|
|
711
|
+
document.removeEventListener(type, this[closeEventHandler]);
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
disconnectResizeObserver.call(this);
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
/**
|
|
718
|
+
* Import Select Options from dataset
|
|
719
|
+
* Not to be confused with the control defaults/options
|
|
720
|
+
*
|
|
721
|
+
* @since 0.16.0
|
|
722
|
+
* @param {array|object|Map|Set} data
|
|
723
|
+
* @return {Select}
|
|
724
|
+
* @throws {Error} map is not iterable
|
|
725
|
+
* @throws {Error} missing label configuration
|
|
726
|
+
*/
|
|
727
|
+
importOptions(data) {
|
|
728
|
+
const mappingOptions = this.getOption("mapping", {});
|
|
729
|
+
const selector = mappingOptions?.["selector"];
|
|
730
|
+
const labelTemplate = mappingOptions?.["labelTemplate"];
|
|
731
|
+
const valueTemplate = mappingOptions?.["valueTemplate"];
|
|
732
|
+
const filter = mappingOptions?.["filter"];
|
|
733
|
+
|
|
734
|
+
let flag = false;
|
|
735
|
+
if (labelTemplate === "") {
|
|
736
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, "empty label template");
|
|
737
|
+
flag = true;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
if (valueTemplate === "") {
|
|
741
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, "empty value template");
|
|
742
|
+
flag = true;
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
if (flag === true) {
|
|
746
|
+
throw new Error("missing label configuration");
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
const map = buildMap(data, selector, labelTemplate, valueTemplate, filter);
|
|
750
|
+
|
|
751
|
+
const options = [];
|
|
752
|
+
if (!isIterable(map)) {
|
|
753
|
+
throw new Error("map is not iterable");
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
const visibility = "visible";
|
|
757
|
+
|
|
758
|
+
map.forEach((label, value) => {
|
|
759
|
+
options.push({
|
|
760
|
+
value,
|
|
761
|
+
label,
|
|
762
|
+
visibility,
|
|
763
|
+
});
|
|
764
|
+
});
|
|
765
|
+
|
|
766
|
+
runAsOptionLengthChanged.call(this, map.size);
|
|
767
|
+
this.setOption("options", options);
|
|
768
|
+
|
|
769
|
+
fireCustomEvent(this, "monster-options-set", {
|
|
770
|
+
options,
|
|
771
|
+
});
|
|
772
|
+
|
|
773
|
+
return this;
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
/**
|
|
777
|
+
* @private
|
|
778
|
+
* @return {Monster.Components.Form.Select}
|
|
779
|
+
*/
|
|
780
|
+
calcAndSetOptionsDimension() {
|
|
781
|
+
calcAndSetOptionsDimension.call(this);
|
|
782
|
+
return this;
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
/**
|
|
786
|
+
*
|
|
787
|
+
* @return {string}
|
|
788
|
+
*/
|
|
789
|
+
static getTag() {
|
|
790
|
+
return "monster-select";
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
/**
|
|
794
|
+
*
|
|
795
|
+
* @return {CSSStyleSheet[]}
|
|
796
|
+
*/
|
|
797
|
+
static getCSSStyleSheet() {
|
|
798
|
+
return [SelectStyleSheet];
|
|
799
|
+
}
|
|
752
800
|
}
|
|
753
801
|
|
|
754
802
|
/**
|
|
@@ -759,67 +807,68 @@ class Select extends CustomControl {
|
|
|
759
807
|
* ```
|
|
760
808
|
*
|
|
761
809
|
* @private
|
|
810
|
+
* @deprecated 2024-01-21 (you should use data-monster-option-...)
|
|
762
811
|
* @return {object}
|
|
763
812
|
*/
|
|
764
813
|
function initOptionsFromArguments() {
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
814
|
+
const options = {};
|
|
815
|
+
|
|
816
|
+
const template = this.getAttribute("data-monster-selected-template");
|
|
817
|
+
if (isString(template)) {
|
|
818
|
+
if (!options["templateMapping"]) options["templateMapping"] = {};
|
|
819
|
+
|
|
820
|
+
switch (template) {
|
|
821
|
+
case "summary":
|
|
822
|
+
case "default":
|
|
823
|
+
options["templateMapping"]["selected"] = getSummaryTemplate();
|
|
824
|
+
break;
|
|
825
|
+
case "selected":
|
|
826
|
+
options["templateMapping"]["selected"] = getSelectionTemplate();
|
|
827
|
+
break;
|
|
828
|
+
default:
|
|
829
|
+
addAttributeToken(
|
|
830
|
+
this,
|
|
831
|
+
ATTRIBUTE_ERRORMESSAGE,
|
|
832
|
+
"invalid template, use summary or selected",
|
|
833
|
+
);
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
return options;
|
|
789
838
|
}
|
|
790
839
|
|
|
791
840
|
/**
|
|
792
841
|
* @private
|
|
793
842
|
*/
|
|
794
843
|
function attachResizeObserver() {
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
844
|
+
// against flickering
|
|
845
|
+
this[resizeObserverSymbol] = new ResizeObserver((entries) => {
|
|
846
|
+
if (this[timerCallbackSymbol] instanceof DeadMansSwitch) {
|
|
847
|
+
try {
|
|
848
|
+
this[timerCallbackSymbol].touch();
|
|
849
|
+
return;
|
|
850
|
+
} catch (e) {
|
|
851
|
+
delete this[timerCallbackSymbol];
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
this[timerCallbackSymbol] = new DeadMansSwitch(200, () => {
|
|
856
|
+
updatePopper.call(this);
|
|
857
|
+
delete this[timerCallbackSymbol];
|
|
858
|
+
});
|
|
859
|
+
});
|
|
860
|
+
|
|
861
|
+
this[resizeObserverSymbol].observe(this.parentElement);
|
|
813
862
|
}
|
|
814
863
|
|
|
815
864
|
function disconnectResizeObserver() {
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
865
|
+
if (this[resizeObserverSymbol] instanceof ResizeObserver) {
|
|
866
|
+
this[resizeObserverSymbol].disconnect();
|
|
867
|
+
}
|
|
819
868
|
}
|
|
820
869
|
|
|
821
870
|
function getSelectionTemplate() {
|
|
822
|
-
|
|
871
|
+
return `<div data-monster-role="selection"
|
|
823
872
|
data-monster-insert="selection path:selection" role="search"
|
|
824
873
|
><input type="text" role="searchbox"
|
|
825
874
|
part="inline-filter" name="inline-filter"
|
|
@@ -831,7 +880,7 @@ function getSelectionTemplate() {
|
|
|
831
880
|
}
|
|
832
881
|
|
|
833
882
|
function getSummaryTemplate() {
|
|
834
|
-
|
|
883
|
+
return `<div data-monster-role="selection" role="search">
|
|
835
884
|
<input type="text" role="searchbox"
|
|
836
885
|
part="inline-filter" name="inline-filter"
|
|
837
886
|
data-monster-role="filter"
|
|
@@ -847,35 +896,35 @@ function getSummaryTemplate() {
|
|
|
847
896
|
* @private
|
|
848
897
|
*/
|
|
849
898
|
function parseSlotsToOptions() {
|
|
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
|
-
|
|
899
|
+
let options = this.getOption("options");
|
|
900
|
+
if (!isIterable(options)) {
|
|
901
|
+
options = [];
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
let counter = 1;
|
|
905
|
+
getSlottedElements.call(this, "div").forEach((node) => {
|
|
906
|
+
let value = (counter++).toString();
|
|
907
|
+
let visibility = "visible";
|
|
908
|
+
|
|
909
|
+
if (node.hasAttribute("data-monster-value")) {
|
|
910
|
+
value = node.getAttribute("data-monster-value");
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
if (node.style.display === "none") {
|
|
914
|
+
visibility = "hidden";
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
const label = node.outerHTML;
|
|
918
|
+
|
|
919
|
+
options.push({
|
|
920
|
+
value,
|
|
921
|
+
label,
|
|
922
|
+
visibility,
|
|
923
|
+
});
|
|
924
|
+
});
|
|
925
|
+
|
|
926
|
+
runAsOptionLengthChanged.call(this, options.length);
|
|
927
|
+
this.setOption("options", options);
|
|
879
928
|
}
|
|
880
929
|
|
|
881
930
|
/**
|
|
@@ -885,39 +934,39 @@ function parseSlotsToOptions() {
|
|
|
885
934
|
* @param {int} targetLength
|
|
886
935
|
*/
|
|
887
936
|
function runAsOptionLengthChanged(targetLength) {
|
|
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
|
-
|
|
937
|
+
const self = this;
|
|
938
|
+
|
|
939
|
+
if (!self[optionsElementSymbol]) {
|
|
940
|
+
return;
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
const callback = function (mutationsList, observer) {
|
|
944
|
+
const run = false;
|
|
945
|
+
for (const mutation of mutationsList) {
|
|
946
|
+
if (mutation.type === "childList") {
|
|
947
|
+
const run = true;
|
|
948
|
+
break;
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
if (run === true) {
|
|
953
|
+
const nodes = self[optionsElementSymbol].querySelectorAll(
|
|
954
|
+
`div[${ATTRIBUTE_ROLE}=option]`,
|
|
955
|
+
);
|
|
956
|
+
|
|
957
|
+
if (nodes.length === targetLength) {
|
|
958
|
+
checkOptionState.call(self);
|
|
959
|
+
observer.disconnect();
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
};
|
|
963
|
+
|
|
964
|
+
const observer = new MutationObserver(callback);
|
|
965
|
+
observer.observe(self[optionsElementSymbol], {
|
|
966
|
+
attributes: false,
|
|
967
|
+
childList: true,
|
|
968
|
+
subtree: true,
|
|
969
|
+
});
|
|
921
970
|
}
|
|
922
971
|
|
|
923
972
|
/**
|
|
@@ -926,18 +975,18 @@ function runAsOptionLengthChanged(targetLength) {
|
|
|
926
975
|
* @return {*}
|
|
927
976
|
*/
|
|
928
977
|
function buildSelectionLabel(value) {
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
978
|
+
const options = this.getOption("options");
|
|
979
|
+
|
|
980
|
+
for (let i = 0; i < options.length; i++) {
|
|
981
|
+
const o = options?.[i];
|
|
982
|
+
if (isObject(o) && o?.["value"] === value) {
|
|
983
|
+
return o?.["label"];
|
|
984
|
+
} else if (isPrimitive(o) && o === value) {
|
|
985
|
+
return o;
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
return undefined;
|
|
941
990
|
}
|
|
942
991
|
|
|
943
992
|
/**
|
|
@@ -947,17 +996,17 @@ function buildSelectionLabel(value) {
|
|
|
947
996
|
* @throws {Error} no value found
|
|
948
997
|
*/
|
|
949
998
|
function getSelectionLabel(value) {
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
999
|
+
const callback = this.getOption("formatter.selection");
|
|
1000
|
+
if (isFunction(callback)) {
|
|
1001
|
+
const label = callback.call(this, value);
|
|
1002
|
+
if (isString(label)) return label;
|
|
1003
|
+
}
|
|
955
1004
|
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
1005
|
+
if (isString(value) || isInteger(value)) {
|
|
1006
|
+
return `${value}`;
|
|
1007
|
+
}
|
|
959
1008
|
|
|
960
|
-
|
|
1009
|
+
return this.getOption("labels.cannot-be-loaded", value);
|
|
961
1010
|
}
|
|
962
1011
|
|
|
963
1012
|
/**
|
|
@@ -965,16 +1014,16 @@ function getSelectionLabel(value) {
|
|
|
965
1014
|
* @param {Event} event
|
|
966
1015
|
*/
|
|
967
1016
|
function handleToggleKeyboardEvents(event) {
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
1017
|
+
switch (event?.["code"]) {
|
|
1018
|
+
case "Escape":
|
|
1019
|
+
toggle.call(this);
|
|
1020
|
+
event.preventDefault();
|
|
1021
|
+
break;
|
|
1022
|
+
case "Space":
|
|
1023
|
+
toggle.call(this);
|
|
1024
|
+
event.preventDefault();
|
|
1025
|
+
break;
|
|
1026
|
+
}
|
|
978
1027
|
}
|
|
979
1028
|
|
|
980
1029
|
/**
|
|
@@ -984,35 +1033,38 @@ function handleToggleKeyboardEvents(event) {
|
|
|
984
1033
|
* @this CustomElement
|
|
985
1034
|
*/
|
|
986
1035
|
function initOptionObserver() {
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1036
|
+
const self = this;
|
|
1037
|
+
|
|
1038
|
+
self.attachObserver(
|
|
1039
|
+
new Observer(function () {
|
|
1040
|
+
new Processing(() => {
|
|
1041
|
+
try {
|
|
1042
|
+
self.updateI18n();
|
|
1043
|
+
} catch (e) {
|
|
1044
|
+
}
|
|
1045
|
+
try {
|
|
1046
|
+
areOptionsAvailableAndInit.call(self);
|
|
1047
|
+
} catch (e) {
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
setSummaryAndControlText.call(self);
|
|
1051
|
+
}).run();
|
|
1052
|
+
}),
|
|
1053
|
+
);
|
|
1003
1054
|
}
|
|
1004
1055
|
|
|
1005
1056
|
function getDefaultTranslation() {
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1057
|
+
const translation = new Translations("en").assignTranslations(
|
|
1058
|
+
this.getOption("labels", {}),
|
|
1059
|
+
);
|
|
1009
1060
|
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1061
|
+
try {
|
|
1062
|
+
const doc = getDocumentTranslations();
|
|
1063
|
+
translation.locale = doc.locale;
|
|
1064
|
+
} catch (e) {
|
|
1065
|
+
}
|
|
1014
1066
|
|
|
1015
|
-
|
|
1067
|
+
return translation;
|
|
1016
1068
|
}
|
|
1017
1069
|
|
|
1018
1070
|
/**
|
|
@@ -1020,36 +1072,36 @@ function getDefaultTranslation() {
|
|
|
1020
1072
|
* @returns {string|*}
|
|
1021
1073
|
*/
|
|
1022
1074
|
function setSummaryAndControlText() {
|
|
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
|
-
|
|
1075
|
+
const translations = getDefaultTranslation.call(this);
|
|
1076
|
+
const selections = this.getOption("selection");
|
|
1077
|
+
|
|
1078
|
+
const text = translations.getPluralRuleText(
|
|
1079
|
+
"summary-text",
|
|
1080
|
+
selections.length,
|
|
1081
|
+
"",
|
|
1082
|
+
);
|
|
1083
|
+
|
|
1084
|
+
const selectedText = new Formatter({
|
|
1085
|
+
count: String(selections.length),
|
|
1086
|
+
}).format(text);
|
|
1087
|
+
|
|
1088
|
+
this.setOption("messages.selected", selectedText);
|
|
1089
|
+
|
|
1090
|
+
const current = this.getOption("messages.control");
|
|
1091
|
+
let msg = this.getOption("labels.select-an-option");
|
|
1092
|
+
|
|
1093
|
+
if (
|
|
1094
|
+
current === "" ||
|
|
1095
|
+
current === undefined ||
|
|
1096
|
+
current === msg ||
|
|
1097
|
+
current === null
|
|
1098
|
+
) {
|
|
1099
|
+
if (selections === undefined || selections.length === 0) {
|
|
1100
|
+
this.setOption("messages.control", msg);
|
|
1101
|
+
} else {
|
|
1102
|
+
this.setOption("messages.control", "");
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1053
1105
|
}
|
|
1054
1106
|
|
|
1055
1107
|
/**
|
|
@@ -1057,9 +1109,9 @@ function setSummaryAndControlText() {
|
|
|
1057
1109
|
* @return {NodeList}
|
|
1058
1110
|
*/
|
|
1059
1111
|
function getOptionElements() {
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1112
|
+
return this[optionsElementSymbol].querySelectorAll(
|
|
1113
|
+
`[${ATTRIBUTE_ROLE}=option]`,
|
|
1114
|
+
);
|
|
1063
1115
|
}
|
|
1064
1116
|
|
|
1065
1117
|
/**
|
|
@@ -1081,78 +1133,90 @@ function getOptionElements() {
|
|
|
1081
1133
|
* @see Monster.Data.buildMap
|
|
1082
1134
|
*/
|
|
1083
1135
|
|
|
1136
|
+
|
|
1084
1137
|
/**
|
|
1085
1138
|
* @private
|
|
1086
1139
|
*/
|
|
1087
1140
|
function calcAndSetOptionsDimension() {
|
|
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
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
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
|
-
|
|
1141
|
+
const options = getOptionElements.call(this);
|
|
1142
|
+
const container = this[optionsElementSymbol];
|
|
1143
|
+
if (!(container instanceof HTMLElement && options instanceof NodeList)) {
|
|
1144
|
+
return;
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
let visible = 0;
|
|
1148
|
+
let optionHeight = 0;
|
|
1149
|
+
const max = this.getOption("showMaxOptions", 10);
|
|
1150
|
+
|
|
1151
|
+
let scrollFlag = false;
|
|
1152
|
+
for (const [, option] of Object.entries(options)) {
|
|
1153
|
+
const computedStyle = getGlobal().getComputedStyle(option);
|
|
1154
|
+
if (computedStyle.display === "none") continue;
|
|
1155
|
+
|
|
1156
|
+
let h = option.getBoundingClientRect().height;
|
|
1157
|
+
h += parseInt(computedStyle.getPropertyValue("margin-top"), 10);
|
|
1158
|
+
h += parseInt(computedStyle.getPropertyValue("margin-bottom"), 10);
|
|
1159
|
+
optionHeight += h;
|
|
1160
|
+
|
|
1161
|
+
visible++;
|
|
1162
|
+
|
|
1163
|
+
if (visible > max) {
|
|
1164
|
+
break;
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
if (visible > max) {
|
|
1169
|
+
visible = max;
|
|
1170
|
+
scrollFlag = true;
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1173
|
+
if (visible === 0) {
|
|
1174
|
+
if (this.getOption("options").length === 0) {
|
|
1175
|
+
this.setOption(
|
|
1176
|
+
"messages.emptyOptions",
|
|
1177
|
+
this.getOption("labels.no-options-available"),
|
|
1178
|
+
);
|
|
1179
|
+
} else {
|
|
1180
|
+
|
|
1181
|
+
if (this.getOption("filter.mode") === FILTER_MODE_DISABLED) {
|
|
1182
|
+
this.setOption(
|
|
1183
|
+
"messages.emptyOptions",
|
|
1184
|
+
this.getOption("labels.no-options-available"),
|
|
1185
|
+
);
|
|
1186
|
+
} else {
|
|
1187
|
+
|
|
1188
|
+
this.setOption(
|
|
1189
|
+
"messages.emptyOptions",
|
|
1190
|
+
this.getOption("labels.no-options-found"),
|
|
1191
|
+
);
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
this[noOptionsAvailableElementSymbol].classList.remove("d-none");
|
|
1195
|
+
} else {
|
|
1196
|
+
this[noOptionsAvailableElementSymbol].classList.add("d-none");
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
const styles = getGlobal().getComputedStyle(this[optionsElementSymbol]);
|
|
1200
|
+
let padding = parseInt(styles.getPropertyValue("padding-top"), 10);
|
|
1201
|
+
padding += parseInt(styles.getPropertyValue("padding-bottom"), 10);
|
|
1202
|
+
|
|
1203
|
+
let margin = parseInt(styles.getPropertyValue("margin-top"), 10);
|
|
1204
|
+
margin += parseInt(styles.getPropertyValue("margin-bottom"), 10);
|
|
1205
|
+
|
|
1206
|
+
const containerHeight = optionHeight + padding + margin;
|
|
1207
|
+
container.style.height = `${containerHeight}px`;
|
|
1208
|
+
|
|
1209
|
+
|
|
1210
|
+
if (scrollFlag === true) {
|
|
1211
|
+
container.style.overflowY = "scroll";
|
|
1212
|
+
} else {
|
|
1213
|
+
container.style.overflowY = "auto";
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1216
|
+
const domRect = this[controlElementSymbol].getBoundingClientRect();
|
|
1217
|
+
|
|
1218
|
+
this[popperElementSymbol].style.width = `${domRect.width}px`;
|
|
1219
|
+
container.style.overflowX = "auto";
|
|
1156
1220
|
}
|
|
1157
1221
|
|
|
1158
1222
|
/**
|
|
@@ -1161,114 +1225,116 @@ function calcAndSetOptionsDimension() {
|
|
|
1161
1225
|
* @throws {Error} no shadow-root is defined
|
|
1162
1226
|
*/
|
|
1163
1227
|
function activateCurrentOption(direction) {
|
|
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
|
-
|
|
1228
|
+
if (!this.shadowRoot) {
|
|
1229
|
+
throw new Error("no shadow-root is defined");
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
let focused = this.shadowRoot.querySelector(`[${ATTRIBUTE_PREFIX}focused]`);
|
|
1233
|
+
|
|
1234
|
+
if (
|
|
1235
|
+
!(focused instanceof HTMLElement) ||
|
|
1236
|
+
focused.matches("[data-monster-visibility=hidden]")
|
|
1237
|
+
) {
|
|
1238
|
+
for (const [, e] of Object.entries(
|
|
1239
|
+
this.shadowRoot.querySelectorAll(`[${ATTRIBUTE_ROLE}=option]`),
|
|
1240
|
+
)) {
|
|
1241
|
+
if (e.matches("[data-monster-visibility=visible]")) {
|
|
1242
|
+
focused = e;
|
|
1243
|
+
break;
|
|
1244
|
+
}
|
|
1245
|
+
}
|
|
1246
|
+
} else {
|
|
1247
|
+
if (direction === FOCUS_DIRECTION_DOWN) {
|
|
1248
|
+
while (focused.nextSibling) {
|
|
1249
|
+
focused = focused.nextSibling;
|
|
1250
|
+
|
|
1251
|
+
if (
|
|
1252
|
+
focused instanceof HTMLElement &&
|
|
1253
|
+
focused.hasAttribute(ATTRIBUTE_ROLE) &&
|
|
1254
|
+
focused.getAttribute(ATTRIBUTE_ROLE) === "option" &&
|
|
1255
|
+
focused.matches("[data-monster-visibility=visible]") &&
|
|
1256
|
+
focused.matches(":not([data-monster-filtered=true])")
|
|
1257
|
+
) {
|
|
1258
|
+
break;
|
|
1259
|
+
}
|
|
1260
|
+
}
|
|
1261
|
+
} else {
|
|
1262
|
+
while (focused.previousSibling) {
|
|
1263
|
+
focused = focused.previousSibling;
|
|
1264
|
+
|
|
1265
|
+
if (
|
|
1266
|
+
focused instanceof HTMLElement &&
|
|
1267
|
+
focused.hasAttribute(ATTRIBUTE_ROLE) &&
|
|
1268
|
+
focused.getAttribute(ATTRIBUTE_ROLE) === "option" &&
|
|
1269
|
+
focused.matches("[data-monster-visibility=visible]") &&
|
|
1270
|
+
focused.matches(":not([data-monster-filtered=true])")
|
|
1271
|
+
) {
|
|
1272
|
+
break;
|
|
1273
|
+
}
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1278
|
+
new Processing(() => {
|
|
1279
|
+
if (focused instanceof HTMLElement) {
|
|
1280
|
+
this.shadowRoot
|
|
1281
|
+
.querySelectorAll(`[${ATTRIBUTE_PREFIX}focused]`)
|
|
1282
|
+
.forEach((e) => {
|
|
1283
|
+
e.removeAttribute(`${ATTRIBUTE_PREFIX}focused`);
|
|
1284
|
+
});
|
|
1285
|
+
|
|
1286
|
+
focused.focus();
|
|
1287
|
+
focused.setAttribute(`${ATTRIBUTE_PREFIX}focused`, true);
|
|
1288
|
+
}
|
|
1289
|
+
}).run();
|
|
1226
1290
|
}
|
|
1227
1291
|
|
|
1228
1292
|
/**
|
|
1229
1293
|
* @private
|
|
1230
1294
|
*/
|
|
1231
1295
|
function filterOptions() {
|
|
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
|
-
|
|
1296
|
+
new Processing(() => {
|
|
1297
|
+
let filterValue;
|
|
1298
|
+
|
|
1299
|
+
switch (this.getOption("filter.position")) {
|
|
1300
|
+
case FILTER_POSITION_INLINE:
|
|
1301
|
+
if (this[inlineFilterElementSymbol] instanceof HTMLElement) {
|
|
1302
|
+
filterValue = this[inlineFilterElementSymbol].value.toLowerCase();
|
|
1303
|
+
} else {
|
|
1304
|
+
return;
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1307
|
+
break;
|
|
1308
|
+
case FILTER_POSITION_POPPER:
|
|
1309
|
+
default:
|
|
1310
|
+
if (this[popperFilterElementSymbol] instanceof HTMLInputElement) {
|
|
1311
|
+
filterValue = this[popperFilterElementSymbol].value.toLowerCase();
|
|
1312
|
+
} else {
|
|
1313
|
+
return;
|
|
1314
|
+
}
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1317
|
+
const options = this.getOption("options");
|
|
1318
|
+
for (const [i, option] of Object.entries(options)) {
|
|
1319
|
+
if (option.label.toLowerCase().indexOf(filterValue) === -1) {
|
|
1320
|
+
this.setOption(`options.${i}.filtered`, "true");
|
|
1321
|
+
} else {
|
|
1322
|
+
this.setOption(`options.${i}.filtered`, undefined);
|
|
1323
|
+
}
|
|
1324
|
+
}
|
|
1325
|
+
})
|
|
1326
|
+
.run()
|
|
1327
|
+
.then(() => {
|
|
1328
|
+
new Processing(100, () => {
|
|
1329
|
+
calcAndSetOptionsDimension.call(this);
|
|
1330
|
+
focusFilter.call(this);
|
|
1331
|
+
}).run().catch((e) => {
|
|
1332
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message);
|
|
1333
|
+
});
|
|
1334
|
+
})
|
|
1335
|
+
.catch((e) => {
|
|
1336
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message);
|
|
1337
|
+
});
|
|
1272
1338
|
}
|
|
1273
1339
|
|
|
1274
1340
|
/**
|
|
@@ -1276,73 +1342,119 @@ function filterOptions() {
|
|
|
1276
1342
|
* @param {Event} event
|
|
1277
1343
|
*/
|
|
1278
1344
|
function handleFilterKeyboardEvents(event) {
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1345
|
+
const shiftKey = event?.["shiftKey"];
|
|
1346
|
+
|
|
1347
|
+
switch (event?.["code"]) {
|
|
1348
|
+
case "Tab":
|
|
1349
|
+
activateCurrentOption.call(this, FOCUS_DIRECTION_DOWN);
|
|
1350
|
+
event.preventDefault();
|
|
1351
|
+
break;
|
|
1352
|
+
case "Escape":
|
|
1353
|
+
toggle.call(this);
|
|
1354
|
+
event.preventDefault();
|
|
1355
|
+
break;
|
|
1356
|
+
case "Tab" && shiftKey === true:
|
|
1357
|
+
case "ArrowUp":
|
|
1358
|
+
activateCurrentOption.call(this, FOCUS_DIRECTION_UP);
|
|
1359
|
+
event.preventDefault();
|
|
1360
|
+
break;
|
|
1361
|
+
case "Tab" && !shiftKey:
|
|
1362
|
+
case "ArrowDown":
|
|
1363
|
+
activateCurrentOption.call(this, FOCUS_DIRECTION_DOWN);
|
|
1364
|
+
event.preventDefault();
|
|
1365
|
+
break;
|
|
1366
|
+
default:
|
|
1367
|
+
|
|
1368
|
+
if (this.getOption("features.lazyLoad") === true && this[lazyLoadDoneSymbol] !== true) {
|
|
1369
|
+
this.click();
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
handleFilterKeyEvents.call(this);
|
|
1373
|
+
|
|
1374
|
+
}
|
|
1309
1375
|
}
|
|
1310
1376
|
|
|
1377
|
+
|
|
1378
|
+
/**
|
|
1379
|
+
*
|
|
1380
|
+
|
|
1381
|
+
*/
|
|
1382
|
+
|
|
1383
|
+
/**
|
|
1384
|
+
* Method handleFilterKeyEvents is used to handle filter key events.
|
|
1385
|
+
* Debounce is used to prevent multiple calls.
|
|
1386
|
+
*
|
|
1387
|
+
* @function
|
|
1388
|
+
* @name handleFilterKeyEvents
|
|
1389
|
+
*
|
|
1390
|
+
* @private
|
|
1391
|
+
* @returns {void} This method does not return anything.
|
|
1392
|
+
*/
|
|
1393
|
+
function handleFilterKeyEvents() {
|
|
1394
|
+
|
|
1395
|
+
|
|
1396
|
+
if (this[keyFilterEventSymbol] instanceof DeadMansSwitch) {
|
|
1397
|
+
try {
|
|
1398
|
+
this[keyFilterEventSymbol].touch();
|
|
1399
|
+
return;
|
|
1400
|
+
} catch (e) {
|
|
1401
|
+
delete this[keyFilterEventSymbol];
|
|
1402
|
+
}
|
|
1403
|
+
}
|
|
1404
|
+
|
|
1405
|
+
this[keyFilterEventSymbol] = new DeadMansSwitch(200, () => {
|
|
1406
|
+
|
|
1407
|
+
if (this.getOption("filter.mode") !== FILTER_MODE_REMOTE) {
|
|
1408
|
+
filterOptions.call(this);
|
|
1409
|
+
} else {
|
|
1410
|
+
filterFromRemote.call(this).catch((e) => {
|
|
1411
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message);
|
|
1412
|
+
});
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
|
|
1416
|
+
delete this[keyFilterEventSymbol];
|
|
1417
|
+
});
|
|
1418
|
+
|
|
1419
|
+
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1422
|
+
|
|
1311
1423
|
/**
|
|
1312
1424
|
* @private
|
|
1313
1425
|
*/
|
|
1314
1426
|
function filterFromRemote() {
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1427
|
+
if (!(this[inlineFilterElementSymbol] instanceof HTMLElement)) {
|
|
1428
|
+
return;
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
const optionUrl = this.getOption("url");
|
|
1432
|
+
if (!optionUrl) {
|
|
1433
|
+
addAttributeToken(
|
|
1434
|
+
this,
|
|
1435
|
+
ATTRIBUTE_ERRORMESSAGE,
|
|
1436
|
+
"Missing URL for Remote Filter.",
|
|
1437
|
+
);
|
|
1438
|
+
return;
|
|
1439
|
+
}
|
|
1440
|
+
|
|
1441
|
+
return new Processing(() => {
|
|
1442
|
+
const filterValue = encodeURI(
|
|
1443
|
+
this[inlineFilterElementSymbol].value.toLowerCase(),
|
|
1444
|
+
);
|
|
1445
|
+
let url = optionUrl;
|
|
1446
|
+
if (filterValue.length > 0) {
|
|
1447
|
+
url = new Formatter({filter: filterValue}).format(optionUrl);
|
|
1448
|
+
}
|
|
1449
|
+
|
|
1450
|
+
this.fetch(url)
|
|
1451
|
+
.then(() => {
|
|
1452
|
+
checkOptionState.call(this);
|
|
1453
|
+
})
|
|
1454
|
+
.catch((e) => {
|
|
1455
|
+
throw e;
|
|
1456
|
+
});
|
|
1457
|
+
}).run();
|
|
1346
1458
|
}
|
|
1347
1459
|
|
|
1348
1460
|
/**
|
|
@@ -1351,45 +1463,45 @@ function filterFromRemote() {
|
|
|
1351
1463
|
* @private
|
|
1352
1464
|
*/
|
|
1353
1465
|
function handleOptionKeyboardEvents(event) {
|
|
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
|
-
|
|
1466
|
+
const shiftKey = event?.["shiftKey"];
|
|
1467
|
+
|
|
1468
|
+
switch (event?.["code"]) {
|
|
1469
|
+
case "Escape":
|
|
1470
|
+
toggle.call(this);
|
|
1471
|
+
event.preventDefault();
|
|
1472
|
+
break;
|
|
1473
|
+
case "Enter":
|
|
1474
|
+
case "Space":
|
|
1475
|
+
const path = event.composedPath();
|
|
1476
|
+
const element = path?.[0];
|
|
1477
|
+
|
|
1478
|
+
fireEvent(element.getElementsByTagName("input"), "click");
|
|
1479
|
+
event.preventDefault();
|
|
1480
|
+
break;
|
|
1481
|
+
|
|
1482
|
+
case "Tab" && shiftKey === true:
|
|
1483
|
+
case "ArrowUp":
|
|
1484
|
+
activateCurrentOption.call(this, FOCUS_DIRECTION_UP);
|
|
1485
|
+
event.preventDefault();
|
|
1486
|
+
break;
|
|
1487
|
+
|
|
1488
|
+
case "Tab" && !shiftKey:
|
|
1489
|
+
case "ArrowLeft":
|
|
1490
|
+
case "ArrowRight":
|
|
1491
|
+
// handled by tree select
|
|
1492
|
+
break;
|
|
1493
|
+
case "ArrowDown":
|
|
1494
|
+
activateCurrentOption.call(this, FOCUS_DIRECTION_DOWN);
|
|
1495
|
+
event.preventDefault();
|
|
1496
|
+
break;
|
|
1497
|
+
default:
|
|
1498
|
+
const p = event.composedPath();
|
|
1499
|
+
if (p?.[0] instanceof HTMLInputElement) {
|
|
1500
|
+
return;
|
|
1501
|
+
}
|
|
1502
|
+
focusFilter.call(this);
|
|
1503
|
+
break;
|
|
1504
|
+
}
|
|
1393
1505
|
}
|
|
1394
1506
|
|
|
1395
1507
|
/**
|
|
@@ -1397,33 +1509,33 @@ function handleOptionKeyboardEvents(event) {
|
|
|
1397
1509
|
* @returns {string}
|
|
1398
1510
|
*/
|
|
1399
1511
|
function getFilterMode() {
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1512
|
+
switch (this.getOption("filter.mode")) {
|
|
1513
|
+
case FILTER_MODE_OPTIONS:
|
|
1514
|
+
return FILTER_MODE_OPTIONS;
|
|
1515
|
+
case FILTER_MODE_REMOTE:
|
|
1516
|
+
return FILTER_MODE_REMOTE;
|
|
1517
|
+
default:
|
|
1518
|
+
return FILTER_MODE_DISABLED;
|
|
1519
|
+
}
|
|
1408
1520
|
}
|
|
1409
1521
|
|
|
1410
1522
|
/**
|
|
1411
1523
|
* @private
|
|
1412
1524
|
*/
|
|
1413
1525
|
function blurFilter() {
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1526
|
+
if (!(this[inlineFilterElementSymbol] instanceof HTMLElement)) {
|
|
1527
|
+
return;
|
|
1528
|
+
}
|
|
1417
1529
|
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1530
|
+
if (getFilterMode.call(this) === FILTER_MODE_DISABLED) {
|
|
1531
|
+
return;
|
|
1532
|
+
}
|
|
1421
1533
|
|
|
1422
|
-
|
|
1423
|
-
|
|
1534
|
+
this[popperFilterContainerElementSymbol].classList.remove("active");
|
|
1535
|
+
this[popperFilterContainerElementSymbol].blur();
|
|
1424
1536
|
|
|
1425
|
-
|
|
1426
|
-
|
|
1537
|
+
this[inlineFilterElementSymbol].classList.remove("active");
|
|
1538
|
+
this[inlineFilterElementSymbol].blur();
|
|
1427
1539
|
}
|
|
1428
1540
|
|
|
1429
1541
|
/**
|
|
@@ -1431,29 +1543,29 @@ function blurFilter() {
|
|
|
1431
1543
|
* @param focusOptions
|
|
1432
1544
|
*/
|
|
1433
1545
|
function focusPopperFilter(focusOptions) {
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1546
|
+
this[popperFilterContainerElementSymbol].classList.remove("d-none");
|
|
1547
|
+
this[popperFilterElementSymbol].classList.add("active");
|
|
1548
|
+
this[inlineFilterElementSymbol].classList.remove("active");
|
|
1549
|
+
this[inlineFilterElementSymbol].classList.add("d-none");
|
|
1550
|
+
|
|
1551
|
+
if (!(this[popperFilterElementSymbol] instanceof HTMLElement)) {
|
|
1552
|
+
addAttributeToken(
|
|
1553
|
+
this,
|
|
1554
|
+
ATTRIBUTE_ERRORMESSAGE,
|
|
1555
|
+
"Missing Popper Filter Element.",
|
|
1556
|
+
);
|
|
1557
|
+
return;
|
|
1558
|
+
}
|
|
1559
|
+
|
|
1560
|
+
// visibility is set to visible, because focus() does not work on invisible elements
|
|
1561
|
+
// and the class definition is assigned later in the processing
|
|
1562
|
+
setTimeout(() => {
|
|
1563
|
+
if (focusOptions === undefined || focusOptions === null) {
|
|
1564
|
+
this[popperFilterElementSymbol].focus();
|
|
1565
|
+
} else {
|
|
1566
|
+
this[popperFilterElementSymbol].focus(focusOptions);
|
|
1567
|
+
}
|
|
1568
|
+
}, 100);
|
|
1457
1569
|
}
|
|
1458
1570
|
|
|
1459
1571
|
/**
|
|
@@ -1461,44 +1573,44 @@ function focusPopperFilter(focusOptions) {
|
|
|
1461
1573
|
* @param focusOptions
|
|
1462
1574
|
*/
|
|
1463
1575
|
function focusInlineFilter(focusOptions) {
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1576
|
+
const options = this.getOption("options");
|
|
1577
|
+
if (
|
|
1578
|
+
(!isArray(options) || options.length === 0) &&
|
|
1579
|
+
this.getOption("filter.mode") !== FILTER_MODE_REMOTE
|
|
1580
|
+
) {
|
|
1581
|
+
return;
|
|
1582
|
+
}
|
|
1583
|
+
|
|
1584
|
+
this[popperFilterContainerElementSymbol].classList.add("d-none");
|
|
1585
|
+
this[inlineFilterElementSymbol].classList.add("active");
|
|
1586
|
+
this[inlineFilterElementSymbol].classList.remove("d-none");
|
|
1587
|
+
|
|
1588
|
+
// visibility is set to visible, because focus() does not work on invisible elements
|
|
1589
|
+
// and the class definition is assigned later in the processing
|
|
1590
|
+
setTimeout(() => {
|
|
1591
|
+
if (focusOptions === undefined || focusOptions === null) {
|
|
1592
|
+
this[inlineFilterElementSymbol].focus();
|
|
1593
|
+
} else {
|
|
1594
|
+
this[inlineFilterElementSymbol].focus(focusOptions);
|
|
1595
|
+
}
|
|
1596
|
+
}, 100);
|
|
1485
1597
|
}
|
|
1486
1598
|
|
|
1487
1599
|
/**
|
|
1488
1600
|
* @private
|
|
1489
1601
|
*/
|
|
1490
1602
|
function focusFilter(focusOptions) {
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1603
|
+
if (getFilterMode.call(this) === FILTER_MODE_DISABLED) {
|
|
1604
|
+
this[popperFilterContainerElementSymbol].classList.add("d-none");
|
|
1605
|
+
this[inlineFilterElementSymbol].classList.add("d-none");
|
|
1606
|
+
return;
|
|
1607
|
+
}
|
|
1496
1608
|
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1609
|
+
if (this.getOption("filter.position") === FILTER_POSITION_INLINE) {
|
|
1610
|
+
return focusInlineFilter.call(this, focusOptions);
|
|
1611
|
+
}
|
|
1500
1612
|
|
|
1501
|
-
|
|
1613
|
+
return focusPopperFilter.call(this, focusOptions);
|
|
1502
1614
|
}
|
|
1503
1615
|
|
|
1504
1616
|
/**
|
|
@@ -1508,38 +1620,39 @@ function focusFilter(focusOptions) {
|
|
|
1508
1620
|
* @throws {Error} unsupported type
|
|
1509
1621
|
*/
|
|
1510
1622
|
function gatherState() {
|
|
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
|
-
|
|
1623
|
+
const type = this.getOption("type");
|
|
1624
|
+
if (["radio", "checkbox"].indexOf(type) === -1) {
|
|
1625
|
+
throw new Error("unsupported type");
|
|
1626
|
+
}
|
|
1627
|
+
|
|
1628
|
+
if (!this.shadowRoot) {
|
|
1629
|
+
throw new Error("no shadow-root is defined");
|
|
1630
|
+
}
|
|
1631
|
+
|
|
1632
|
+
const selection = [];
|
|
1633
|
+
const elements = this.shadowRoot.querySelectorAll(
|
|
1634
|
+
`input[type=${type}]:checked`,
|
|
1635
|
+
);
|
|
1636
|
+
for (const e of elements) {
|
|
1637
|
+
selection.push({
|
|
1638
|
+
label: getSelectionLabel.call(this, e.value),
|
|
1639
|
+
value: e.value,
|
|
1640
|
+
});
|
|
1641
|
+
}
|
|
1642
|
+
|
|
1643
|
+
setSelection
|
|
1644
|
+
.call(this, selection)
|
|
1645
|
+
.then(() => {
|
|
1646
|
+
})
|
|
1647
|
+
.catch((e) => {
|
|
1648
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, `${e}`);
|
|
1649
|
+
});
|
|
1650
|
+
|
|
1651
|
+
if (this.getOption("features.closeOnSelect") === true) {
|
|
1652
|
+
toggle.call(this);
|
|
1653
|
+
}
|
|
1654
|
+
|
|
1655
|
+
return this;
|
|
1543
1656
|
}
|
|
1544
1657
|
|
|
1545
1658
|
/**
|
|
@@ -1548,110 +1661,119 @@ function gatherState() {
|
|
|
1548
1661
|
* @throws {Error} unsupported type
|
|
1549
1662
|
*/
|
|
1550
1663
|
function clearSelection() {
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1664
|
+
const type = this.getOption("type");
|
|
1665
|
+
if (["radio", "checkbox"].indexOf(type) === -1) {
|
|
1666
|
+
throw new Error("unsupported type");
|
|
1667
|
+
}
|
|
1668
|
+
|
|
1669
|
+
if (!this.shadowRoot) {
|
|
1670
|
+
throw new Error("no shadow-root is defined");
|
|
1671
|
+
}
|
|
1672
|
+
|
|
1673
|
+
setSelection
|
|
1674
|
+
.call(this, [])
|
|
1675
|
+
.then(() => {
|
|
1676
|
+
})
|
|
1677
|
+
.catch((e) => {
|
|
1678
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, `${e}`);
|
|
1679
|
+
});
|
|
1566
1680
|
}
|
|
1567
1681
|
|
|
1568
1682
|
/**
|
|
1569
1683
|
* @private
|
|
1570
1684
|
*/
|
|
1571
1685
|
function areOptionsAvailableAndInit() {
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
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
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1686
|
+
// prevent multiple calls
|
|
1687
|
+
if (this[areOptionsAvailableAndInitSymbol] === undefined) {
|
|
1688
|
+
this[areOptionsAvailableAndInitSymbol] = 0;
|
|
1689
|
+
}
|
|
1690
|
+
|
|
1691
|
+
if (this[areOptionsAvailableAndInitSymbol] > 0) {
|
|
1692
|
+
this[areOptionsAvailableAndInitSymbol]--;
|
|
1693
|
+
return true;
|
|
1694
|
+
}
|
|
1695
|
+
|
|
1696
|
+
this[areOptionsAvailableAndInitSymbol]++;
|
|
1697
|
+
|
|
1698
|
+
const options = this.getOption("options");
|
|
1699
|
+
|
|
1700
|
+
if (
|
|
1701
|
+
options === undefined ||
|
|
1702
|
+
options === null ||
|
|
1703
|
+
(isArray(options) && options.length === 0)
|
|
1704
|
+
) {
|
|
1705
|
+
setStatusOrRemoveBadges.call(this, "empty");
|
|
1706
|
+
|
|
1707
|
+
hide.call(this);
|
|
1708
|
+
|
|
1709
|
+
let msg = this.getOption("labels.no-options-available");
|
|
1710
|
+
|
|
1711
|
+
if (this.getOption("url") !== null
|
|
1712
|
+
&& this.getOption("features.lazyLoad") === true
|
|
1713
|
+
&& this[lazyLoadDoneSymbol] !== true) {
|
|
1714
|
+
msg = this.getOption("labels.click-to-load-options");
|
|
1715
|
+
}
|
|
1716
|
+
|
|
1717
|
+
this.setOption(
|
|
1718
|
+
"messages.control",
|
|
1719
|
+
msg,
|
|
1720
|
+
);
|
|
1721
|
+
this.setOption("messages.summary", "");
|
|
1722
|
+
this.setOption("selection", []);
|
|
1723
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, noOptionsAvailableMessage);
|
|
1724
|
+
return false;
|
|
1725
|
+
}
|
|
1726
|
+
|
|
1727
|
+
const selections = this.getOption("selection");
|
|
1728
|
+
if (
|
|
1729
|
+
selections === undefined ||
|
|
1730
|
+
selections === null ||
|
|
1731
|
+
selections.length === 0
|
|
1732
|
+
) {
|
|
1733
|
+
this.setOption(
|
|
1734
|
+
"messages.control",
|
|
1735
|
+
this.getOption("labels.select-an-option"),
|
|
1736
|
+
);
|
|
1737
|
+
} else {
|
|
1738
|
+
this.setOption("messages.control", "");
|
|
1739
|
+
}
|
|
1740
|
+
|
|
1741
|
+
this.setOption("messages.summary", setSummaryAndControlText.call(this));
|
|
1742
|
+
|
|
1743
|
+
let updated = false;
|
|
1744
|
+
let valueCounter = 1;
|
|
1745
|
+
for (const option of options) {
|
|
1746
|
+
if (option?.visibility === undefined) {
|
|
1747
|
+
option.visibility = "visible";
|
|
1748
|
+
updated = true;
|
|
1749
|
+
}
|
|
1750
|
+
|
|
1751
|
+
if (option?.value === undefined && option?.label === undefined) {
|
|
1752
|
+
option.value = `${valueCounter++}`;
|
|
1753
|
+
option.label = option.value;
|
|
1754
|
+
updated = true;
|
|
1755
|
+
continue;
|
|
1756
|
+
}
|
|
1757
|
+
|
|
1758
|
+
if (option?.value === undefined) {
|
|
1759
|
+
option.value = option.label;
|
|
1760
|
+
updated = true;
|
|
1761
|
+
}
|
|
1762
|
+
|
|
1763
|
+
if (option?.label === undefined) {
|
|
1764
|
+
option.label = option.value;
|
|
1765
|
+
updated = true;
|
|
1766
|
+
}
|
|
1767
|
+
}
|
|
1768
|
+
|
|
1769
|
+
if (updated) {
|
|
1770
|
+
this.setOption("options", options);
|
|
1771
|
+
}
|
|
1772
|
+
|
|
1773
|
+
setStatusOrRemoveBadges.call(this, "status");
|
|
1774
|
+
|
|
1775
|
+
removeAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, noOptionsAvailableMessage);
|
|
1776
|
+
return true;
|
|
1655
1777
|
}
|
|
1656
1778
|
|
|
1657
1779
|
/**
|
|
@@ -1659,30 +1781,30 @@ function areOptionsAvailableAndInit() {
|
|
|
1659
1781
|
* @throws {Error} no shadow-root is defined
|
|
1660
1782
|
*/
|
|
1661
1783
|
function checkOptionState() {
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1784
|
+
if (!this.shadowRoot) {
|
|
1785
|
+
throw new Error("no shadow-root is defined");
|
|
1786
|
+
}
|
|
1787
|
+
|
|
1788
|
+
const elements = this.shadowRoot.querySelectorAll(
|
|
1789
|
+
`[${ATTRIBUTE_ROLE}=option] input`,
|
|
1790
|
+
);
|
|
1791
|
+
|
|
1792
|
+
let selection = this.getOption("selection");
|
|
1793
|
+
if (!isArray(selection)) {
|
|
1794
|
+
selection = [];
|
|
1795
|
+
}
|
|
1796
|
+
|
|
1797
|
+
const checkedValues = selection.map((a) => {
|
|
1798
|
+
return a.value;
|
|
1799
|
+
});
|
|
1800
|
+
|
|
1801
|
+
for (const e of elements) {
|
|
1802
|
+
if (checkedValues.indexOf(e.value) !== -1) {
|
|
1803
|
+
if (e.checked !== true) e.checked = true;
|
|
1804
|
+
} else {
|
|
1805
|
+
if (e.checked !== false) e.checked = false;
|
|
1806
|
+
}
|
|
1807
|
+
}
|
|
1686
1808
|
}
|
|
1687
1809
|
|
|
1688
1810
|
/**
|
|
@@ -1691,41 +1813,41 @@ function checkOptionState() {
|
|
|
1691
1813
|
* @return {Object}
|
|
1692
1814
|
*/
|
|
1693
1815
|
function convertValueToSelection(value) {
|
|
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
|
-
|
|
1816
|
+
const selection = [];
|
|
1817
|
+
|
|
1818
|
+
if (isString(value)) {
|
|
1819
|
+
value = value
|
|
1820
|
+
.split(",")
|
|
1821
|
+
.map((a) => {
|
|
1822
|
+
return a.trim();
|
|
1823
|
+
})
|
|
1824
|
+
.filter((a) => {
|
|
1825
|
+
return a !== "";
|
|
1826
|
+
});
|
|
1827
|
+
}
|
|
1828
|
+
|
|
1829
|
+
if (isString(value) || isInteger(value)) {
|
|
1830
|
+
selection.push({
|
|
1831
|
+
label: getSelectionLabel.call(this, value),
|
|
1832
|
+
value: value,
|
|
1833
|
+
});
|
|
1834
|
+
} else if (isArray(value)) {
|
|
1835
|
+
for (const v of value) {
|
|
1836
|
+
selection.push({
|
|
1837
|
+
label: getSelectionLabel.call(this, v),
|
|
1838
|
+
value: v,
|
|
1839
|
+
});
|
|
1840
|
+
}
|
|
1841
|
+
|
|
1842
|
+
value = value.join(",");
|
|
1843
|
+
} else {
|
|
1844
|
+
throw new Error("unsupported type");
|
|
1845
|
+
}
|
|
1846
|
+
|
|
1847
|
+
return {
|
|
1848
|
+
selection: selection,
|
|
1849
|
+
value: value,
|
|
1850
|
+
};
|
|
1729
1851
|
}
|
|
1730
1852
|
|
|
1731
1853
|
/**
|
|
@@ -1734,22 +1856,22 @@ function convertValueToSelection(value) {
|
|
|
1734
1856
|
* @return {string}
|
|
1735
1857
|
*/
|
|
1736
1858
|
function convertSelectionToValue(selection) {
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1859
|
+
const value = [];
|
|
1860
|
+
|
|
1861
|
+
if (isArray(selection)) {
|
|
1862
|
+
for (const obj of selection) {
|
|
1863
|
+
const v = obj?.["value"];
|
|
1864
|
+
if (v !== undefined) value.push(v);
|
|
1865
|
+
}
|
|
1866
|
+
}
|
|
1867
|
+
|
|
1868
|
+
if (value.length === 0) {
|
|
1869
|
+
return "";
|
|
1870
|
+
} else if (value.length === 1) {
|
|
1871
|
+
return value.pop();
|
|
1872
|
+
}
|
|
1873
|
+
|
|
1874
|
+
return value.join(",");
|
|
1753
1875
|
}
|
|
1754
1876
|
|
|
1755
1877
|
/**
|
|
@@ -1759,54 +1881,54 @@ function convertSelectionToValue(selection) {
|
|
|
1759
1881
|
* @throws {Error} no shadow-root is defined
|
|
1760
1882
|
*/
|
|
1761
1883
|
function setSelection(selection) {
|
|
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
|
-
|
|
1884
|
+
if (isString(selection)) {
|
|
1885
|
+
const result = convertValueToSelection.call(this, selection);
|
|
1886
|
+
selection = result?.selection;
|
|
1887
|
+
} else if (selection === undefined) {
|
|
1888
|
+
selection = [];
|
|
1889
|
+
}
|
|
1890
|
+
|
|
1891
|
+
this.setOption("selection", validateArray(selection));
|
|
1892
|
+
checkOptionState.call(this);
|
|
1893
|
+
|
|
1894
|
+
try {
|
|
1895
|
+
this?.setFormValue(this.value);
|
|
1896
|
+
} catch (e) {
|
|
1897
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message);
|
|
1898
|
+
}
|
|
1899
|
+
|
|
1900
|
+
fireCustomEvent(this, "monster-selected", {
|
|
1901
|
+
selection,
|
|
1902
|
+
});
|
|
1903
|
+
|
|
1904
|
+
return new Processing(() => {
|
|
1905
|
+
const CLASSNAME = "selected";
|
|
1906
|
+
|
|
1907
|
+
if (!this.shadowRoot) {
|
|
1908
|
+
throw new Error("no shadow-root is defined");
|
|
1909
|
+
}
|
|
1910
|
+
|
|
1911
|
+
const notSelected = this.shadowRoot.querySelectorAll(":not(:checked)");
|
|
1912
|
+
|
|
1913
|
+
if (notSelected) {
|
|
1914
|
+
notSelected.forEach((node) => {
|
|
1915
|
+
const parent = node.closest(`[${ATTRIBUTE_ROLE}=option]`);
|
|
1916
|
+
if (parent) {
|
|
1917
|
+
parent.classList.remove(CLASSNAME);
|
|
1918
|
+
}
|
|
1919
|
+
});
|
|
1920
|
+
}
|
|
1921
|
+
|
|
1922
|
+
const selected = this.shadowRoot.querySelectorAll(":checked");
|
|
1923
|
+
if (selected) {
|
|
1924
|
+
selected.forEach((node) => {
|
|
1925
|
+
const parent = node.closest(`[${ATTRIBUTE_ROLE}=option]`);
|
|
1926
|
+
if (parent) {
|
|
1927
|
+
parent.classList.add(CLASSNAME);
|
|
1928
|
+
}
|
|
1929
|
+
});
|
|
1930
|
+
}
|
|
1931
|
+
}).run();
|
|
1810
1932
|
}
|
|
1811
1933
|
|
|
1812
1934
|
/**
|
|
@@ -1817,101 +1939,136 @@ function setSelection(selection) {
|
|
|
1817
1939
|
* @throws {TypeError} unsupported response
|
|
1818
1940
|
*/
|
|
1819
1941
|
function fetchData(url) {
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1942
|
+
|
|
1943
|
+
const self = this;
|
|
1944
|
+
|
|
1945
|
+
if (!url) url = this.getOption("url");
|
|
1946
|
+
if (!url) return Promise.resolve();
|
|
1947
|
+
|
|
1948
|
+
const fetchOptions = this.getOption("fetch", {});
|
|
1949
|
+
|
|
1950
|
+
setStatusOrRemoveBadges.call(this, "loading");
|
|
1951
|
+
url = new Formatter({filter: this.getOption("filter.defaultValue")}).format(
|
|
1952
|
+
url,
|
|
1953
|
+
);
|
|
1954
|
+
|
|
1955
|
+
const global = getGlobal();
|
|
1956
|
+
return global
|
|
1957
|
+
.fetch(url, fetchOptions)
|
|
1958
|
+
.then((response) => {
|
|
1959
|
+
const contentType = response.headers.get("content-type");
|
|
1960
|
+
if (contentType && contentType.indexOf("application/json") !== -1) {
|
|
1961
|
+
return response.text();
|
|
1962
|
+
}
|
|
1963
|
+
|
|
1964
|
+
throw new TypeError(`unsupported response ${contentType}`);
|
|
1965
|
+
})
|
|
1966
|
+
.then((text) => {
|
|
1967
|
+
try {
|
|
1968
|
+
return Promise.resolve(JSON.parse(String(text)));
|
|
1969
|
+
} catch (e) {
|
|
1970
|
+
throw new TypeError("the result cannot be parsed");
|
|
1971
|
+
}
|
|
1972
|
+
}).catch((e) => {
|
|
1973
|
+
throw e;
|
|
1974
|
+
})
|
|
1848
1975
|
}
|
|
1849
1976
|
|
|
1850
1977
|
/**
|
|
1851
1978
|
* @private
|
|
1852
1979
|
*/
|
|
1853
1980
|
function hide() {
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1981
|
+
this[popperElementSymbol].style.display = "none";
|
|
1982
|
+
setStatusOrRemoveBadges.call(this, "status");
|
|
1983
|
+
removeAttributeToken(this[controlElementSymbol], "class", "open");
|
|
1857
1984
|
}
|
|
1858
1985
|
|
|
1859
1986
|
/**
|
|
1860
1987
|
* @private
|
|
1861
1988
|
*/
|
|
1862
1989
|
function show() {
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1990
|
+
const self = this;
|
|
1991
|
+
|
|
1992
|
+
if (this.getOption("disabled", undefined) === true) {
|
|
1993
|
+
return;
|
|
1994
|
+
}
|
|
1995
|
+
|
|
1996
|
+
if (this[popperElementSymbol].style.display === STYLE_DISPLAY_MODE_BLOCK) {
|
|
1997
|
+
return;
|
|
1998
|
+
}
|
|
1999
|
+
|
|
2000
|
+
focusFilter.call(this);
|
|
2001
|
+
|
|
2002
|
+
const lazyLoadFlag = this.getOption("features.lazyLoad") && this[lazyLoadDoneSymbol] !== true;
|
|
2003
|
+
|
|
2004
|
+
if (lazyLoadFlag === true) {
|
|
2005
|
+
this[lazyLoadDoneSymbol] = true;
|
|
2006
|
+
setStatusOrRemoveBadges.call(this, "loading");
|
|
2007
|
+
|
|
2008
|
+
new Processing(200, () => {
|
|
2009
|
+
this.fetch().then(() => {
|
|
2010
|
+
setTimeout(() => {
|
|
2011
|
+
|
|
2012
|
+
let result;
|
|
2013
|
+
if (self.hasAttribute("value")) {
|
|
2014
|
+
result = setSelection.call(self, self.getAttribute("value"));
|
|
2015
|
+
} else {
|
|
2016
|
+
result = setSelection.call(self, []);
|
|
2017
|
+
}
|
|
2018
|
+
|
|
2019
|
+
result
|
|
2020
|
+
.then(() => {
|
|
2021
|
+
show.call(this);
|
|
2022
|
+
})
|
|
2023
|
+
.catch((e) => {
|
|
2024
|
+
addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, `${e}`);
|
|
2025
|
+
});
|
|
2026
|
+
|
|
2027
|
+
|
|
2028
|
+
}, 100);
|
|
2029
|
+
}).catch((e) => {
|
|
2030
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message);
|
|
2031
|
+
setStatusOrRemoveBadges.call(this, "error");
|
|
2032
|
+
});
|
|
2033
|
+
})
|
|
2034
|
+
.run()
|
|
2035
|
+
.catch((e) => {
|
|
2036
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message);
|
|
2037
|
+
});
|
|
2038
|
+
|
|
2039
|
+
return;
|
|
2040
|
+
}
|
|
2041
|
+
//debugger
|
|
2042
|
+
//const optionsAvailable = areOptionsAvailableAndInit.call(this);
|
|
2043
|
+
|
|
2044
|
+
|
|
2045
|
+
this[popperElementSymbol].style.visibility = "hidden";
|
|
2046
|
+
this[popperElementSymbol].style.display = STYLE_DISPLAY_MODE_BLOCK;
|
|
2047
|
+
setStatusOrRemoveBadges.call(this, "open");
|
|
2048
|
+
|
|
2049
|
+
addAttributeToken(this[controlElementSymbol], "class", "open");
|
|
2050
|
+
|
|
2051
|
+
new Processing(() => {
|
|
2052
|
+
calcAndSetOptionsDimension.call(this);
|
|
2053
|
+
focusFilter.call(this);
|
|
2054
|
+
this[popperElementSymbol].style.removeProperty("visibility");
|
|
2055
|
+
updatePopper.call(this);
|
|
2056
|
+
})
|
|
2057
|
+
.run()
|
|
2058
|
+
.catch((e) => {
|
|
2059
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message);
|
|
2060
|
+
});
|
|
1904
2061
|
}
|
|
1905
2062
|
|
|
1906
2063
|
/**
|
|
1907
2064
|
* @private
|
|
1908
2065
|
*/
|
|
1909
2066
|
function toggle() {
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
2067
|
+
if (this[popperElementSymbol].style.display === STYLE_DISPLAY_MODE_BLOCK) {
|
|
2068
|
+
hide.call(this);
|
|
2069
|
+
} else {
|
|
2070
|
+
show.call(this);
|
|
2071
|
+
}
|
|
1915
2072
|
}
|
|
1916
2073
|
|
|
1917
2074
|
/**
|
|
@@ -1919,188 +2076,190 @@ function toggle() {
|
|
|
1919
2076
|
* @fires Monster.Components.Form.event:monster-selection-removed
|
|
1920
2077
|
* @fires Monster.Components.Form.event:monster-selection-cleared
|
|
1921
2078
|
*/
|
|
1922
|
-
function
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
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
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2079
|
+
function initEventHandler() {
|
|
2080
|
+
const self = this;
|
|
2081
|
+
|
|
2082
|
+
/**
|
|
2083
|
+
* @param {Event} event
|
|
2084
|
+
*/
|
|
2085
|
+
self[clearOptionEventHandler] = (event) => {
|
|
2086
|
+
const element = findTargetElementFromEvent(
|
|
2087
|
+
event,
|
|
2088
|
+
ATTRIBUTE_ROLE,
|
|
2089
|
+
"remove-badge",
|
|
2090
|
+
);
|
|
2091
|
+
|
|
2092
|
+
if (element instanceof HTMLElement) {
|
|
2093
|
+
const badge = findClosestByAttribute(element, ATTRIBUTE_ROLE, "badge");
|
|
2094
|
+
if (badge instanceof HTMLElement) {
|
|
2095
|
+
const value = badge.getAttribute(`${ATTRIBUTE_PREFIX}value`);
|
|
2096
|
+
|
|
2097
|
+
let selection = self.getOption("selection");
|
|
2098
|
+
selection = selection.filter((b) => {
|
|
2099
|
+
return value !== b.value;
|
|
2100
|
+
});
|
|
2101
|
+
|
|
2102
|
+
setSelection
|
|
2103
|
+
.call(self, selection)
|
|
2104
|
+
.then(() => {
|
|
2105
|
+
fireCustomEvent(self, "monster-selection-removed", {
|
|
2106
|
+
value,
|
|
2107
|
+
});
|
|
2108
|
+
})
|
|
2109
|
+
.catch((e) => {
|
|
2110
|
+
addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, e.message);
|
|
2111
|
+
});
|
|
2112
|
+
}
|
|
2113
|
+
}
|
|
2114
|
+
};
|
|
2115
|
+
|
|
2116
|
+
/**
|
|
2117
|
+
* @param {Event} event
|
|
2118
|
+
*/
|
|
2119
|
+
self[closeEventHandler] = (event) => {
|
|
2120
|
+
const path = event.composedPath();
|
|
2121
|
+
|
|
2122
|
+
for (const [, element] of Object.entries(path)) {
|
|
2123
|
+
if (element === self) {
|
|
2124
|
+
return;
|
|
2125
|
+
}
|
|
2126
|
+
}
|
|
2127
|
+
hide.call(self);
|
|
2128
|
+
};
|
|
2129
|
+
|
|
2130
|
+
/**
|
|
2131
|
+
* @param {Event} event
|
|
2132
|
+
*/
|
|
2133
|
+
self[inputEventHandler] = (event) => {
|
|
2134
|
+
const path = event.composedPath();
|
|
2135
|
+
const element = path?.[0];
|
|
2136
|
+
|
|
2137
|
+
if (element instanceof HTMLElement) {
|
|
2138
|
+
if (
|
|
2139
|
+
element.hasAttribute(ATTRIBUTE_ROLE) &&
|
|
2140
|
+
element.getAttribute(ATTRIBUTE_ROLE) === "option-control"
|
|
2141
|
+
) {
|
|
2142
|
+
fireCustomEvent(self, "monster-change", {
|
|
2143
|
+
type: event.type,
|
|
2144
|
+
value: element.value,
|
|
2145
|
+
checked: element.checked,
|
|
2146
|
+
});
|
|
2147
|
+
} else if (
|
|
2148
|
+
element.hasAttribute(ATTRIBUTE_ROLE) &&
|
|
2149
|
+
element.getAttribute(ATTRIBUTE_ROLE) === "filter"
|
|
2150
|
+
) {
|
|
2151
|
+
}
|
|
2152
|
+
}
|
|
2153
|
+
};
|
|
2154
|
+
|
|
2155
|
+
/**
|
|
2156
|
+
* @param {Event} event
|
|
2157
|
+
*/
|
|
2158
|
+
self[changeEventHandler] = (event) => {
|
|
2159
|
+
gatherState.call(self);
|
|
2160
|
+
fireCustomEvent(self, "monster-changed", event?.detail);
|
|
2161
|
+
};
|
|
2162
|
+
|
|
2163
|
+
self[keyEventHandler] = (event) => {
|
|
2164
|
+
const path = event.composedPath();
|
|
2165
|
+
const element = path.shift();
|
|
2166
|
+
|
|
2167
|
+
let role;
|
|
2168
|
+
|
|
2169
|
+
if (element instanceof HTMLElement) {
|
|
2170
|
+
if (element.hasAttribute(ATTRIBUTE_ROLE)) {
|
|
2171
|
+
role = element.getAttribute(ATTRIBUTE_ROLE);
|
|
2172
|
+
} else if (element === this) {
|
|
2173
|
+
show.call(this);
|
|
2174
|
+
// focusFilter.call(self);
|
|
2175
|
+
} else {
|
|
2176
|
+
const e = element.closest(`[${ATTRIBUTE_ROLE}]`);
|
|
2177
|
+
if (e instanceof HTMLElement && e.hasAttribute(ATTRIBUTE_ROLE)) {
|
|
2178
|
+
role = e.getAttribute(ATTRIBUTE_ROLE);
|
|
2179
|
+
}
|
|
2180
|
+
}
|
|
2181
|
+
} else {
|
|
2182
|
+
return;
|
|
2183
|
+
}
|
|
2184
|
+
|
|
2185
|
+
switch (role) {
|
|
2186
|
+
case "filter":
|
|
2187
|
+
handleFilterKeyboardEvents.call(self, event);
|
|
2188
|
+
break;
|
|
2189
|
+
case "option-label":
|
|
2190
|
+
case "option-control":
|
|
2191
|
+
case "option":
|
|
2192
|
+
handleOptionKeyboardEvents.call(self, event);
|
|
2193
|
+
break;
|
|
2194
|
+
case "control":
|
|
2195
|
+
case "toggle":
|
|
2196
|
+
handleToggleKeyboardEvents.call(self, event);
|
|
2197
|
+
break;
|
|
2198
|
+
}
|
|
2199
|
+
};
|
|
2200
|
+
|
|
2201
|
+
const types = self.getOption("toggleEventType", ["click"]);
|
|
2202
|
+
|
|
2203
|
+
for (const [, type] of Object.entries(types)) {
|
|
2204
|
+
self[controlElementSymbol]
|
|
2205
|
+
.querySelector(`[${ATTRIBUTE_ROLE}="container"]`)
|
|
2206
|
+
.addEventListener(type, function (event) {
|
|
2207
|
+
|
|
2208
|
+
const element = findTargetElementFromEvent(
|
|
2209
|
+
event,
|
|
2210
|
+
ATTRIBUTE_ROLE,
|
|
2211
|
+
"remove-badge",
|
|
2212
|
+
);
|
|
2213
|
+
if (element instanceof HTMLElement) {
|
|
2214
|
+
return;
|
|
2215
|
+
}
|
|
2216
|
+
|
|
2217
|
+
toggle.call(self);
|
|
2218
|
+
});
|
|
2219
|
+
|
|
2220
|
+
self[controlElementSymbol]
|
|
2221
|
+
.querySelector(`[${ATTRIBUTE_ROLE}="status-or-remove-badges"]`)
|
|
2222
|
+
.addEventListener(type, function (event) {
|
|
2223
|
+
if (self.getOption("disabled", undefined) === true) {
|
|
2224
|
+
return;
|
|
2225
|
+
}
|
|
2226
|
+
|
|
2227
|
+
const path = event.composedPath();
|
|
2228
|
+
const element = path?.[0];
|
|
2229
|
+
if (element instanceof HTMLElement) {
|
|
2230
|
+
const control = element.closest(
|
|
2231
|
+
`[${ATTRIBUTE_ROLE}="status-or-remove-badges"]`,
|
|
2232
|
+
);
|
|
2233
|
+
if (control instanceof HTMLElement) {
|
|
2234
|
+
if (control.classList.contains("clear")) {
|
|
2235
|
+
clearSelection.call(self);
|
|
2236
|
+
|
|
2237
|
+
fireCustomEvent(self, "monster-selection-cleared", {});
|
|
2238
|
+
} else {
|
|
2239
|
+
const element = findTargetElementFromEvent(
|
|
2240
|
+
event,
|
|
2241
|
+
ATTRIBUTE_ROLE,
|
|
2242
|
+
"remove-badge",
|
|
2243
|
+
);
|
|
2244
|
+
if (element instanceof HTMLElement) {
|
|
2245
|
+
return;
|
|
2246
|
+
}
|
|
2247
|
+
|
|
2248
|
+
toggle.call(self);
|
|
2249
|
+
}
|
|
2250
|
+
}
|
|
2251
|
+
}
|
|
2252
|
+
});
|
|
2253
|
+
|
|
2254
|
+
// badge, selection
|
|
2255
|
+
self.addEventListener(type, self[clearOptionEventHandler]);
|
|
2256
|
+
}
|
|
2257
|
+
|
|
2258
|
+
self.addEventListener("monster-change", self[changeEventHandler]);
|
|
2259
|
+
self.addEventListener("input", self[inputEventHandler]);
|
|
2260
|
+
self.addEventListener("keydown", self[keyEventHandler]);
|
|
2261
|
+
|
|
2262
|
+
return self;
|
|
2104
2263
|
}
|
|
2105
2264
|
|
|
2106
2265
|
/**
|
|
@@ -2108,45 +2267,58 @@ function initEventhandler() {
|
|
|
2108
2267
|
* @return {Select}
|
|
2109
2268
|
*/
|
|
2110
2269
|
function setStatusOrRemoveBadges(suggestion) {
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
|
-
|
|
2116
|
-
|
|
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
|
-
|
|
2270
|
+
const self = this;
|
|
2271
|
+
setTimeout(() => {
|
|
2272
|
+
|
|
2273
|
+
const selection = this.getOption("selection");
|
|
2274
|
+
const clearAllFlag =
|
|
2275
|
+
isArray(selection) &&
|
|
2276
|
+
selection.length > 0 &&
|
|
2277
|
+
this.getOption("features.clearAll") === true;
|
|
2278
|
+
|
|
2279
|
+
const current = this.getOption("classes.statusOrRemoveBadge");
|
|
2280
|
+
|
|
2281
|
+
if (clearAllFlag) {
|
|
2282
|
+
if (current !== "clear") {
|
|
2283
|
+
this.setOption("classes.statusOrRemoveBadge", "clear");
|
|
2284
|
+
}
|
|
2285
|
+
return;
|
|
2286
|
+
}
|
|
2287
|
+
|
|
2288
|
+
if (suggestion === "loading") {
|
|
2289
|
+
if (current !== "loading") {
|
|
2290
|
+
this.setOption("classes.statusOrRemoveBadge", "loading");
|
|
2291
|
+
}
|
|
2292
|
+
return;
|
|
2293
|
+
}
|
|
2294
|
+
|
|
2295
|
+
if (this[controlElementSymbol].classList.contains("open")) {
|
|
2296
|
+
if (current !== "open") {
|
|
2297
|
+
this.setOption("classes.statusOrRemoveBadge", "open");
|
|
2298
|
+
}
|
|
2299
|
+
return;
|
|
2300
|
+
}
|
|
2301
|
+
|
|
2302
|
+
const options = this.getOption("options");
|
|
2303
|
+
if (
|
|
2304
|
+
options === undefined ||
|
|
2305
|
+
options === null ||
|
|
2306
|
+
(isArray(options) && options.length === 0)
|
|
2307
|
+
) {
|
|
2308
|
+
if (current !== "empty") {
|
|
2309
|
+
this.setOption("classes.statusOrRemoveBadge", "empty");
|
|
2310
|
+
}
|
|
2311
|
+
return;
|
|
2312
|
+
}
|
|
2313
|
+
|
|
2314
|
+
if (suggestion) {
|
|
2315
|
+
if (current !== suggestion) {
|
|
2316
|
+
this.setOption("classes.statusOrRemoveBadge", suggestion);
|
|
2317
|
+
}
|
|
2318
|
+
return;
|
|
2319
|
+
}
|
|
2320
|
+
|
|
2321
|
+
}, 2);
|
|
2150
2322
|
}
|
|
2151
2323
|
|
|
2152
2324
|
/**
|
|
@@ -2155,64 +2327,66 @@ function setStatusOrRemoveBadges(suggestion) {
|
|
|
2155
2327
|
* @throws {Error} no shadow-root is defined
|
|
2156
2328
|
*/
|
|
2157
2329
|
function initControlReferences() {
|
|
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
|
-
|
|
2330
|
+
if (!this.shadowRoot) {
|
|
2331
|
+
throw new Error("no shadow-root is defined");
|
|
2332
|
+
}
|
|
2333
|
+
|
|
2334
|
+
this[controlElementSymbol] = this.shadowRoot.querySelector(
|
|
2335
|
+
`[${ATTRIBUTE_ROLE}=control]`,
|
|
2336
|
+
);
|
|
2337
|
+
this[selectionElementSymbol] = this.shadowRoot.querySelector(
|
|
2338
|
+
`[${ATTRIBUTE_ROLE}=selection]`,
|
|
2339
|
+
);
|
|
2340
|
+
this[containerElementSymbol] = this.shadowRoot.querySelector(
|
|
2341
|
+
`[${ATTRIBUTE_ROLE}=container]`,
|
|
2342
|
+
);
|
|
2343
|
+
this[popperElementSymbol] = this.shadowRoot.querySelector(
|
|
2344
|
+
`[${ATTRIBUTE_ROLE}=popper]`,
|
|
2345
|
+
);
|
|
2346
|
+
this[inlineFilterElementSymbol] = this.shadowRoot.querySelector(
|
|
2347
|
+
`[${ATTRIBUTE_ROLE}=filter][name="inline-filter"]`,
|
|
2348
|
+
);
|
|
2349
|
+
this[popperFilterElementSymbol] = this.shadowRoot.querySelector(
|
|
2350
|
+
`[${ATTRIBUTE_ROLE}=filter][name="popper-filter"]`,
|
|
2351
|
+
);
|
|
2352
|
+
this[popperFilterContainerElementSymbol] =
|
|
2353
|
+
this[popperFilterElementSymbol].parentElement;
|
|
2354
|
+
this[optionsElementSymbol] = this.shadowRoot.querySelector(
|
|
2355
|
+
`[${ATTRIBUTE_ROLE}=options]`,
|
|
2356
|
+
);
|
|
2357
|
+
this[noOptionsAvailableElementSymbol] = this.shadowRoot.querySelector(
|
|
2358
|
+
`[${ATTRIBUTE_ROLE}="no-options"]`,
|
|
2359
|
+
);
|
|
2360
|
+
this[statusOrRemoveBadgesElementSymbol] = this.shadowRoot.querySelector(
|
|
2361
|
+
`[${ATTRIBUTE_ROLE}=status-or-remove-badges]`,
|
|
2362
|
+
);
|
|
2191
2363
|
}
|
|
2192
2364
|
|
|
2193
2365
|
/**
|
|
2194
2366
|
* @private
|
|
2195
2367
|
*/
|
|
2196
2368
|
function updatePopper() {
|
|
2197
|
-
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
|
|
2201
|
-
|
|
2202
|
-
|
|
2203
|
-
|
|
2204
|
-
|
|
2205
|
-
|
|
2206
|
-
|
|
2207
|
-
|
|
2208
|
-
|
|
2209
|
-
|
|
2210
|
-
|
|
2211
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
|
|
2215
|
-
|
|
2369
|
+
if (this[popperElementSymbol].style.display !== STYLE_DISPLAY_MODE_BLOCK) {
|
|
2370
|
+
return;
|
|
2371
|
+
}
|
|
2372
|
+
|
|
2373
|
+
if (this.getOption("disabled", false) === true) {
|
|
2374
|
+
return;
|
|
2375
|
+
}
|
|
2376
|
+
|
|
2377
|
+
new Processing(() => {
|
|
2378
|
+
calcAndSetOptionsDimension.call(this);
|
|
2379
|
+
positionPopper.call(
|
|
2380
|
+
this,
|
|
2381
|
+
this[controlElementSymbol],
|
|
2382
|
+
this[popperElementSymbol],
|
|
2383
|
+
this.getOption("popper", {}),
|
|
2384
|
+
);
|
|
2385
|
+
}).run().catch((e) => {
|
|
2386
|
+
addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, e.message);
|
|
2387
|
+
})
|
|
2388
|
+
|
|
2389
|
+
return this;
|
|
2216
2390
|
}
|
|
2217
2391
|
|
|
2218
2392
|
/**
|
|
@@ -2220,8 +2394,8 @@ function updatePopper() {
|
|
|
2220
2394
|
* @return {string}
|
|
2221
2395
|
*/
|
|
2222
2396
|
function getTemplate() {
|
|
2223
|
-
|
|
2224
|
-
|
|
2397
|
+
// language=HTML
|
|
2398
|
+
return `
|
|
2225
2399
|
<template id="options">
|
|
2226
2400
|
<div data-monster-role="option" tabindex="-1"
|
|
2227
2401
|
data-monster-attributes="
|