@optionfactory/ful 0.43.0 → 0.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ful.iife.js +220 -163
- package/dist/ful.iife.js.map +1 -1
- package/dist/ful.iife.min.js +1 -1
- package/dist/ful.iife.min.js.map +1 -1
- package/dist/ful.min.mjs +1 -1
- package/dist/ful.min.mjs.map +1 -1
- package/dist/ful.mjs +218 -164
- package/dist/ful.mjs.map +1 -1
- package/package.json +1 -1
package/dist/ful.mjs
CHANGED
|
@@ -557,16 +557,41 @@ const timing = {
|
|
|
557
557
|
}
|
|
558
558
|
};
|
|
559
559
|
|
|
560
|
+
// SyncEvent.on($0, 'asd', async e => { await ful.timing.sleep(10_000); return 3; })
|
|
561
|
+
// const [success, results] = await new SyncEvent("asd").dispatchTo($0);
|
|
562
|
+
class SyncEvent extends CustomEvent {
|
|
563
|
+
#results;
|
|
564
|
+
constructor(type, options) {
|
|
565
|
+
super(type, options);
|
|
566
|
+
this.#results = [];
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
async dispatchTo(el) {
|
|
570
|
+
// unlike "native" events, which are fired by the browser and invoke
|
|
571
|
+
// event handlers asynchronously via the event loop, dispatchEvent()
|
|
572
|
+
// invokes event handlers synchronously.
|
|
573
|
+
// see: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent
|
|
574
|
+
const success = el.dispatchEvent(this);
|
|
575
|
+
const results = await Promise.all(this.#results);
|
|
576
|
+
return [success, results];
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
static on(el, type, h, useCapture) {
|
|
580
|
+
el.addEventListener(type, e => {
|
|
581
|
+
//e *must* be an async event
|
|
582
|
+
e.#results.push(h(e));
|
|
583
|
+
}, useCapture);
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
560
587
|
class Fragments {
|
|
561
588
|
static fromHtml(...html) {
|
|
562
589
|
const el = document.createElement('div');
|
|
563
590
|
el.innerHTML = html.join("");
|
|
564
591
|
const fragment = new DocumentFragment();
|
|
565
|
-
|
|
566
|
-
fragment.appendChild(node);
|
|
567
|
-
});
|
|
592
|
+
fragment.append(...el.childNodes);
|
|
568
593
|
return fragment;
|
|
569
|
-
}
|
|
594
|
+
}
|
|
570
595
|
static toHtml(fragment) {
|
|
571
596
|
var r = document.createElement("root");
|
|
572
597
|
r.appendChild(fragment);
|
|
@@ -574,17 +599,12 @@ class Fragments {
|
|
|
574
599
|
}
|
|
575
600
|
static from(...nodes) {
|
|
576
601
|
const fragment = new DocumentFragment();
|
|
577
|
-
|
|
578
|
-
fragment.appendChild(nodes[i]);
|
|
579
|
-
}
|
|
602
|
+
fragment.append(...nodes);
|
|
580
603
|
return fragment;
|
|
581
604
|
}
|
|
582
605
|
static fromChildNodes(el) {
|
|
583
|
-
const nodes = Array.from(el.childNodes);
|
|
584
606
|
const fragment = new DocumentFragment();
|
|
585
|
-
|
|
586
|
-
fragment.appendChild(nodes[i]);
|
|
587
|
-
}
|
|
607
|
+
fragment.append(...el.childNodes);
|
|
588
608
|
return fragment;
|
|
589
609
|
}
|
|
590
610
|
}
|
|
@@ -634,20 +654,85 @@ class Slots {
|
|
|
634
654
|
}
|
|
635
655
|
}
|
|
636
656
|
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
657
|
+
class Nodes {
|
|
658
|
+
static isParsed(el) {
|
|
659
|
+
for (var c = el; c; c = c.parentNode) {
|
|
660
|
+
if (c.nextSibling) {
|
|
661
|
+
return true;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
return false;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
class UpgradeQueue {
|
|
669
|
+
#q = [];
|
|
670
|
+
constructor() {
|
|
671
|
+
document.addEventListener('DOMContentLoaded', this.dequeue.bind(this));
|
|
672
|
+
}
|
|
673
|
+
enqueue(el) {
|
|
674
|
+
if (!this.#q.length) {
|
|
675
|
+
requestAnimationFrame(this.dequeue.bind(this));
|
|
676
|
+
}
|
|
677
|
+
this.#q.push(el);
|
|
678
|
+
}
|
|
679
|
+
dequeue() {
|
|
680
|
+
this.#q.splice(0).forEach(el => el.upgrade());
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
const upgradeQueue = new UpgradeQueue();
|
|
685
|
+
|
|
686
|
+
class ParsedElement extends HTMLElement {
|
|
687
|
+
#parsed;
|
|
688
|
+
connectedCallback() {
|
|
689
|
+
if (this.#parsed) {
|
|
690
|
+
return;
|
|
691
|
+
}
|
|
692
|
+
if (this.ownerDocument.readyState === 'complete' || Nodes.isParsed(this)) {
|
|
693
|
+
upgradeQueue.enqueue(this);
|
|
694
|
+
return;
|
|
695
|
+
}
|
|
696
|
+
this.ownerDocument.addEventListener('DOMContentLoaded', () => {
|
|
697
|
+
observer.disconnect();
|
|
698
|
+
upgradeQueue.enqueue(this);
|
|
699
|
+
});
|
|
700
|
+
const observer = new MutationObserver(() => {
|
|
701
|
+
if (!Nodes.isParsed(this)) {
|
|
642
702
|
return;
|
|
643
703
|
}
|
|
704
|
+
observer.disconnect();
|
|
705
|
+
upgradeQueue.enqueue(this);
|
|
706
|
+
});
|
|
707
|
+
observer.observe(this.parentNode, { childList: true, subtree: true });
|
|
708
|
+
}
|
|
709
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
710
|
+
if (!this.#parsed || oldValue === newValue) {
|
|
711
|
+
return;
|
|
712
|
+
}
|
|
713
|
+
this[name] = newValue;
|
|
714
|
+
const method = this[`on${name.charAt(0).toUpperCase()}${name.substr(1).toLowerCase()}Changed`];
|
|
715
|
+
method?.call(this, newValue, oldValue);
|
|
716
|
+
}
|
|
717
|
+
upgrade() {
|
|
718
|
+
if (this.#parsed) {
|
|
719
|
+
return;
|
|
720
|
+
}
|
|
721
|
+
this.#parsed = true;
|
|
722
|
+
return this.ready();
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
|
|
727
|
+
const Templated = (SuperClass, template) => {
|
|
728
|
+
return class extends SuperClass {
|
|
729
|
+
async ready() {
|
|
644
730
|
const slotted = Slots.from(this);
|
|
645
731
|
const fragment = await Promise.resolve(this.render(slotted, template));
|
|
646
732
|
this.innerHTML = '';
|
|
647
733
|
if (fragment) {
|
|
648
734
|
this.appendChild(fragment);
|
|
649
735
|
}
|
|
650
|
-
this.#rendered = true;
|
|
651
736
|
}
|
|
652
737
|
};
|
|
653
738
|
};
|
|
@@ -656,40 +741,35 @@ const Stateful = (SuperClass, flags, others) => {
|
|
|
656
741
|
|
|
657
742
|
const all = [].concat(flags).concat(others || []);
|
|
658
743
|
|
|
659
|
-
|
|
744
|
+
const k = class extends SuperClass {
|
|
660
745
|
static get observedAttributes() {
|
|
661
746
|
return all;
|
|
662
747
|
}
|
|
663
748
|
constructor(...args) {
|
|
664
749
|
super(...args);
|
|
665
750
|
this.internals_ = this.internals_ || this.attachInternals();
|
|
666
|
-
for (const flag of flags) {
|
|
667
|
-
Object.defineProperty(this, flag, {
|
|
668
|
-
get() {
|
|
669
|
-
return this.internals_.states.has(`--${flag}`);
|
|
670
|
-
},
|
|
671
|
-
set(value) {
|
|
672
|
-
//see https://developer.mozilla.org/en-US/docs/Web/API/CustomStateSet#using_double_dash_prefixed_idents
|
|
673
|
-
if (Attributes.asBoolean(value)) {
|
|
674
|
-
this.internals_.states.add(`--${flag}`);
|
|
675
|
-
this.setAttribute(flag, '');
|
|
676
|
-
return;
|
|
677
|
-
}
|
|
678
|
-
this.internals_.states.delete(`--${flag}`);
|
|
679
|
-
this.removeAttribute(flag);
|
|
680
|
-
}
|
|
681
|
-
});
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
attributeChangedCallback(name, oldValue, newValue) {
|
|
685
|
-
if (oldValue === newValue) {
|
|
686
|
-
return;
|
|
687
|
-
}
|
|
688
|
-
this[name] = newValue;
|
|
689
|
-
const method = this[`on${name.charAt(0).toUpperCase()}${name.substr(1).toLowerCase()}Changed`];
|
|
690
|
-
method?.call(this, newValue, oldValue);
|
|
691
751
|
}
|
|
692
752
|
};
|
|
753
|
+
|
|
754
|
+
for (const flag of flags) {
|
|
755
|
+
Object.defineProperty(k.prototype, flag, {
|
|
756
|
+
enumerable: true,
|
|
757
|
+
configurable: true,
|
|
758
|
+
get() {
|
|
759
|
+
return this.internals_.states.has(`--${flag}`);
|
|
760
|
+
},
|
|
761
|
+
set(value) {
|
|
762
|
+
//see https://developer.mozilla.org/en-US/docs/Web/API/CustomStateSet#using_double_dash_prefixed_idents
|
|
763
|
+
if (Attributes.asBoolean(value)) {
|
|
764
|
+
this.internals_.states.add(`--${flag}`);
|
|
765
|
+
return;
|
|
766
|
+
}
|
|
767
|
+
this.internals_.states.delete(`--${flag}`);
|
|
768
|
+
}
|
|
769
|
+
});
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
return k;
|
|
693
773
|
};
|
|
694
774
|
|
|
695
775
|
/* global Infinity, CSS */
|
|
@@ -706,10 +786,65 @@ function flatten(obj, prefix) {
|
|
|
706
786
|
}, {});
|
|
707
787
|
}
|
|
708
788
|
|
|
709
|
-
|
|
710
|
-
|
|
789
|
+
function providePath(result, path, value) {
|
|
790
|
+
const keys = path.split(".").map((k) => k.match(/^[0-9]+$/) ? +k : k);
|
|
791
|
+
let current = result;
|
|
792
|
+
let previous = null;
|
|
793
|
+
for (let i = 0; ; ++i) {
|
|
794
|
+
const ckey = keys[i];
|
|
795
|
+
const pkey = keys[i - 1];
|
|
796
|
+
if (Number.isInteger(ckey) && !Array.isArray(current)) {
|
|
797
|
+
if (previous !== null) {
|
|
798
|
+
previous[pkey] = current = [];
|
|
799
|
+
} else {
|
|
800
|
+
result = current = [];
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
if (i === keys.length - 1) {
|
|
804
|
+
//when value is undefined we only want to define the property if it's not defined
|
|
805
|
+
current[ckey] = value !== undefined ? value : (ckey in current ? current[ckey] : null);
|
|
806
|
+
return result;
|
|
807
|
+
}
|
|
808
|
+
if (current[ckey] === undefined) {
|
|
809
|
+
current[ckey] = {};
|
|
810
|
+
}
|
|
811
|
+
previous = current;
|
|
812
|
+
current = current[ckey];
|
|
813
|
+
}
|
|
814
|
+
}
|
|
711
815
|
|
|
712
|
-
|
|
816
|
+
function extract(el) {
|
|
817
|
+
if (el.getAttribute('type') === 'radio') {
|
|
818
|
+
if (!el.checked) {
|
|
819
|
+
return undefined;
|
|
820
|
+
}
|
|
821
|
+
return el.dataset['fulBindType'] === 'boolean' ? el.value === 'true' : el.value;
|
|
822
|
+
}
|
|
823
|
+
if (el.getAttribute('type') === 'checkbox') {
|
|
824
|
+
return el.checked;
|
|
825
|
+
}
|
|
826
|
+
if (el.dataset['fulBindType'] === 'boolean') {
|
|
827
|
+
return !el.value ? null : el.value === 'true';
|
|
828
|
+
}
|
|
829
|
+
return el.value || null;
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
function mutate(el, raw) {
|
|
833
|
+
if (el.getAttribute('type') === 'radio') {
|
|
834
|
+
el.checked = el.getAttribute('value') === raw;
|
|
835
|
+
return;
|
|
836
|
+
}
|
|
837
|
+
if (el.getAttribute('type') === 'checkbox') {
|
|
838
|
+
el.checked = raw;
|
|
839
|
+
return;
|
|
840
|
+
}
|
|
841
|
+
el.value = raw;
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
class Form extends Templated(ParsedElement) {
|
|
845
|
+
static IGNORED_CHILDREN_SELECTOR = '.d-none, [hidden]';
|
|
846
|
+
static SCROLL_OFFSET = 50;
|
|
847
|
+
render(slotted) {
|
|
713
848
|
const form = document.createElement('form');
|
|
714
849
|
form.append(slotted.default);
|
|
715
850
|
form.addEventListener('submit', async (e) => {
|
|
@@ -717,11 +852,11 @@ class Form extends Templated(HTMLElement) {
|
|
|
717
852
|
this.spinner(true);
|
|
718
853
|
try {
|
|
719
854
|
if (this.submitter) {
|
|
720
|
-
await this.submitter(this.
|
|
855
|
+
await this.submitter(this.values, this);
|
|
721
856
|
}
|
|
722
857
|
} catch (e) {
|
|
723
858
|
if (e instanceof Failure) {
|
|
724
|
-
this.
|
|
859
|
+
this.errors = e.problems;
|
|
725
860
|
return;
|
|
726
861
|
}
|
|
727
862
|
throw e;
|
|
@@ -732,21 +867,15 @@ class Form extends Templated(HTMLElement) {
|
|
|
732
867
|
return form;
|
|
733
868
|
}
|
|
734
869
|
spinner(spin) {
|
|
735
|
-
this.querySelectorAll('ful-spinner').forEach(el =>
|
|
736
|
-
|
|
737
|
-
});
|
|
738
|
-
this.querySelectorAll('[type=submit],[type=reset]').forEach(el => {
|
|
739
|
-
el.disabled = spin;
|
|
740
|
-
});
|
|
870
|
+
this.querySelectorAll('ful-spinner').forEach(el => el.hidden = !spin);
|
|
871
|
+
this.querySelectorAll('[type=submit],[type=reset]').forEach(el => el.disabled = spin);
|
|
741
872
|
}
|
|
742
|
-
|
|
743
|
-
for (const [flattenedKey, value] of Object.entries(flatten(
|
|
744
|
-
|
|
745
|
-
Form.mutate(el, value);
|
|
746
|
-
});
|
|
873
|
+
set values(vs) {
|
|
874
|
+
for (const [flattenedKey, value] of Object.entries(flatten(vs, ''))) {
|
|
875
|
+
this.querySelectorAll(`[name='${CSS.escape(flattenedKey)}']`).forEach(el => mutate(el, value));
|
|
747
876
|
}
|
|
748
877
|
}
|
|
749
|
-
|
|
878
|
+
get values() {
|
|
750
879
|
return Array.from(this.querySelectorAll('[name]'))
|
|
751
880
|
.filter((el) => {
|
|
752
881
|
if (el.dataset['fulBindInclude'] === 'never') {
|
|
@@ -755,29 +884,30 @@ class Form extends Templated(HTMLElement) {
|
|
|
755
884
|
return el.dataset['fulBindInclude'] === 'always' || el.closest(Form.IGNORED_CHILDREN_SELECTOR) === null;
|
|
756
885
|
})
|
|
757
886
|
.reduce((result, el) => {
|
|
758
|
-
return
|
|
887
|
+
return providePath(result, el.getAttribute('name'), extract(el));
|
|
759
888
|
}, {});
|
|
760
889
|
}
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
})
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
890
|
+
set errors(es) {
|
|
891
|
+
const fieldErrors = es.filter((e) => e.type === 'FIELD_ERROR' || e.type === 'INVALID_FORMAT');
|
|
892
|
+
const globalErrors = es.filter((e) => e.type !== 'FIELD_ERROR' && e.type !== 'INVALID_FORMAT');
|
|
893
|
+
this.querySelectorAll('.is-invalid').forEach(el => el.classList.remove('is-invalid'));
|
|
894
|
+
this.querySelectorAll("ful-errors").forEach(el => {
|
|
895
|
+
el.innerHTML = '';
|
|
896
|
+
el.setAttribute('hidden', '');
|
|
897
|
+
});
|
|
898
|
+
fieldErrors.forEach((e) => {
|
|
899
|
+
const name = e.context.replace("[", ".").replace("].", ".");
|
|
900
|
+
const validationTargetsSelector = `[name='${CSS.escape(name)}'] [ful-validation-target],[name='${CSS.escape(name)}']:not(:has([ful-validation-target]))`;
|
|
901
|
+
this.querySelectorAll(validationTargetsSelector).forEach(input => input.classList.add('is-invalid'));
|
|
902
|
+
const fieldErrorsSelector = `ful-field-error[field='${CSS.escape(name)}']`;
|
|
903
|
+
this.querySelectorAll(fieldErrorsSelector).forEach(el => el.innerText = e.reason);
|
|
904
|
+
});
|
|
905
|
+
this.querySelectorAll("ful-errors").forEach(el => {
|
|
906
|
+
el.innerText = globalErrors.map(e => e.reason).join("\n");
|
|
907
|
+
if (globalErrors.length !== 0) {
|
|
908
|
+
el.removeAttribute('hidden');
|
|
909
|
+
}
|
|
910
|
+
});
|
|
781
911
|
if (!this.hasAttribute('scroll-on-error')) {
|
|
782
912
|
return;
|
|
783
913
|
}
|
|
@@ -786,69 +916,7 @@ class Form extends Templated(HTMLElement) {
|
|
|
786
916
|
.map(el => el.getBoundingClientRect().y + window.scrollY);
|
|
787
917
|
const miny = Math.min(...ys);
|
|
788
918
|
if (miny !== Infinity) {
|
|
789
|
-
window.scroll(window.scrollX, miny >
|
|
790
|
-
}
|
|
791
|
-
}
|
|
792
|
-
clearErrors() {
|
|
793
|
-
this.querySelectorAll('.is-invalid')
|
|
794
|
-
.forEach(el => el.classList.remove('is-invalid'));
|
|
795
|
-
this.querySelectorAll("ful-errors")
|
|
796
|
-
.forEach(el => {
|
|
797
|
-
el.innerHTML = '';
|
|
798
|
-
el.setAttribute('hidden', '');
|
|
799
|
-
});
|
|
800
|
-
}
|
|
801
|
-
static extract(el) {
|
|
802
|
-
if (el.getAttribute('type') === 'radio') {
|
|
803
|
-
if (!el.checked) {
|
|
804
|
-
return undefined;
|
|
805
|
-
}
|
|
806
|
-
return el.dataset['fulBindType'] === 'boolean' ? el.value === 'true' : el.value;
|
|
807
|
-
}
|
|
808
|
-
if (el.getAttribute('type') === 'checkbox') {
|
|
809
|
-
return el.checked;
|
|
810
|
-
}
|
|
811
|
-
if (el.dataset['fulBindType'] === 'boolean') {
|
|
812
|
-
return !el.value ? null : el.value === 'true';
|
|
813
|
-
}
|
|
814
|
-
return el.value || null;
|
|
815
|
-
}
|
|
816
|
-
static mutate(el, raw) {
|
|
817
|
-
if (el.getAttribute('type') === 'radio') {
|
|
818
|
-
el.checked = el.getAttribute('value') === raw;
|
|
819
|
-
return;
|
|
820
|
-
}
|
|
821
|
-
if (el.getAttribute('type') === 'checkbox') {
|
|
822
|
-
el.checked = raw;
|
|
823
|
-
return;
|
|
824
|
-
}
|
|
825
|
-
el.value = raw;
|
|
826
|
-
}
|
|
827
|
-
|
|
828
|
-
static providePath(result, path, value) {
|
|
829
|
-
const keys = path.split(".").map((k) => k.match(/^[0-9]+$/) ? +k : k);
|
|
830
|
-
let current = result;
|
|
831
|
-
let previous = null;
|
|
832
|
-
for (let i = 0; ; ++i) {
|
|
833
|
-
const ckey = keys[i];
|
|
834
|
-
const pkey = keys[i - 1];
|
|
835
|
-
if (Number.isInteger(ckey) && !Array.isArray(current)) {
|
|
836
|
-
if (previous !== null) {
|
|
837
|
-
previous[pkey] = current = [];
|
|
838
|
-
} else {
|
|
839
|
-
result = current = [];
|
|
840
|
-
}
|
|
841
|
-
}
|
|
842
|
-
if (i === keys.length - 1) {
|
|
843
|
-
//when value is undefined we only want to define the property if it's not defined
|
|
844
|
-
current[ckey] = value !== undefined ? value : (ckey in current ? current[ckey] : null);
|
|
845
|
-
return result;
|
|
846
|
-
}
|
|
847
|
-
if (current[ckey] === undefined) {
|
|
848
|
-
current[ckey] = {};
|
|
849
|
-
}
|
|
850
|
-
previous = current;
|
|
851
|
-
current = current[ckey];
|
|
919
|
+
window.scroll(window.scrollX, miny > Form.SCROLL_OFFSET ? miny - Form.SCROLL_OFFSET : 0);
|
|
852
920
|
}
|
|
853
921
|
}
|
|
854
922
|
static configure() {
|
|
@@ -872,7 +940,7 @@ const ful_input_template_ = globalThis.ful_input_template || ftl.Template.fromHt
|
|
|
872
940
|
<ful-field-error data-tpl-if="name" data-tpl-field="name"></ful-field-error>
|
|
873
941
|
`, ful_input_ec);
|
|
874
942
|
|
|
875
|
-
class StatelessInput extends Templated(
|
|
943
|
+
class StatelessInput extends Templated(ParsedElement, ful_input_template_) {
|
|
876
944
|
render(slotted, template) {
|
|
877
945
|
const input = this.input = slotted.input = slotted.input || (() => {
|
|
878
946
|
const el = document.createElement("input");
|
|
@@ -899,16 +967,9 @@ class Input extends Stateful(StatelessInput, [], ['value']) {
|
|
|
899
967
|
return fragment;
|
|
900
968
|
}
|
|
901
969
|
get value() {
|
|
902
|
-
if (!this.input) {
|
|
903
|
-
return this.getAttribute('value');
|
|
904
|
-
}
|
|
905
970
|
return this.input.value;
|
|
906
971
|
}
|
|
907
972
|
set value(value) {
|
|
908
|
-
if (!this.input) {
|
|
909
|
-
//handled during rendering
|
|
910
|
-
return;
|
|
911
|
-
}
|
|
912
973
|
this.input.value = value;
|
|
913
974
|
}
|
|
914
975
|
static configure() {
|
|
@@ -938,7 +999,7 @@ const ful_select_template_ = globalThis.ful_select_template || ftl.Template.from
|
|
|
938
999
|
`, ful_select_ec);
|
|
939
1000
|
|
|
940
1001
|
|
|
941
|
-
class Select extends Templated(
|
|
1002
|
+
class Select extends Stateful(Templated(ParsedElement, ful_select_template_), [], ["value"]) {
|
|
942
1003
|
constructor(tsConfig) {
|
|
943
1004
|
super();
|
|
944
1005
|
this.tsConfig = tsConfig;
|
|
@@ -1053,7 +1114,7 @@ const ful_radiougroup_template_ = globalThis.ful_radiogroup_template || ftl.Temp
|
|
|
1053
1114
|
`, ful_radiogroup_ec);
|
|
1054
1115
|
|
|
1055
1116
|
|
|
1056
|
-
class RadioGroup extends Stateful(Templated(
|
|
1117
|
+
class RadioGroup extends Stateful(Templated(ParsedElement, ful_radiougroup_template_), ['disabled'], ['value']) {
|
|
1057
1118
|
render(slotted, template) {
|
|
1058
1119
|
const name = this.getAttribute('name') || Attributes.uid('ful-radiogroup');
|
|
1059
1120
|
const radioEls = Array.from(slotted.default.querySelectorAll('ful-radio'));
|
|
@@ -1101,7 +1162,7 @@ const ful_spinner_template_ = globalThis.ful_spinner_template || ftl.Template.fr
|
|
|
1101
1162
|
`, ful_spinner_ec);
|
|
1102
1163
|
|
|
1103
1164
|
|
|
1104
|
-
class Spinner extends Templated(
|
|
1165
|
+
class Spinner extends Templated(ParsedElement, ful_spinner_template_) {
|
|
1105
1166
|
render(slotted, template) {
|
|
1106
1167
|
return template.render({ slotted });
|
|
1107
1168
|
}
|
|
@@ -1161,7 +1222,7 @@ class Wizard extends HTMLElement {
|
|
|
1161
1222
|
cancelable: true
|
|
1162
1223
|
}));
|
|
1163
1224
|
}
|
|
1164
|
-
moveTo
|
|
1225
|
+
moveTo(n) {
|
|
1165
1226
|
this.progress.forEach(p => {
|
|
1166
1227
|
const children = [...p.children];
|
|
1167
1228
|
const current = children.filter(e => e.matches(".active"))[0];
|
|
@@ -1177,17 +1238,10 @@ class Wizard extends HTMLElement {
|
|
|
1177
1238
|
cancelable: true
|
|
1178
1239
|
}));
|
|
1179
1240
|
}
|
|
1180
|
-
static custom(tagName, configuration) {
|
|
1181
|
-
customElements.define(tagName, class extends Wizard {
|
|
1182
|
-
constructor() {
|
|
1183
|
-
super(configuration);
|
|
1184
|
-
}
|
|
1185
|
-
});
|
|
1186
|
-
}
|
|
1187
1241
|
static configure() {
|
|
1188
1242
|
return Wizard.custom('ful-wizard');
|
|
1189
1243
|
}
|
|
1190
1244
|
}
|
|
1191
1245
|
|
|
1192
|
-
export { Attributes, AuthorizationCodeFlow, AuthorizationCodeFlowInterceptor, AuthorizationCodeFlowSession, Base64, Failure, Form, Fragments, Hex, HttpClient, Input, LocalStorage, RadioGroup, Select, SessionStorage, Slots, Spinner, Stateful, StatelessInput, Templated, VersionedStorage, Wizard, jsonPatch, jsonPost, jsonPut, jsonRequest, timing };
|
|
1246
|
+
export { Attributes, AuthorizationCodeFlow, AuthorizationCodeFlowInterceptor, AuthorizationCodeFlowSession, Base64, Failure, Form, Fragments, Hex, HttpClient, Input, LocalStorage, Nodes, ParsedElement, RadioGroup, Select, SessionStorage, Slots, Spinner, Stateful, StatelessInput, SyncEvent, Templated, VersionedStorage, Wizard, jsonPatch, jsonPost, jsonPut, jsonRequest, timing };
|
|
1193
1247
|
//# sourceMappingURL=ful.mjs.map
|