@optionfactory/ful 6.0.4 → 6.0.6
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/README.md +6 -109
- package/dist/ful.css +1 -1
- package/dist/ful.css.map +1 -1
- package/dist/ful.iife.js +34 -21
- 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 +35 -22
- package/dist/ful.mjs.map +1 -1
- package/package.json +4 -4
package/dist/ful.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ParsedElement, Attributes, registry, Fragments, Nodes, Rendering } from '@optionfactory/ftl';
|
|
1
|
+
import { ParsedElement, Attributes, registry, Fragments, Templates, Nodes, Rendering } from '@optionfactory/ftl';
|
|
2
2
|
|
|
3
3
|
class Base64 {
|
|
4
4
|
static encode(arrayBuffer, dialect) {
|
|
@@ -1471,6 +1471,20 @@ class Input extends ParsedElement {
|
|
|
1471
1471
|
this.required = observed.required;
|
|
1472
1472
|
this.value = observed.value;
|
|
1473
1473
|
}
|
|
1474
|
+
this._input.addEventListener('keydown', (evt) => {
|
|
1475
|
+
if (evt.key !== 'Enter' || this._type() === 'textarea') {
|
|
1476
|
+
return;
|
|
1477
|
+
}
|
|
1478
|
+
const form = this.internals.form;
|
|
1479
|
+
if(!form){
|
|
1480
|
+
return;
|
|
1481
|
+
}
|
|
1482
|
+
const candidates = /** @type [HTMLButtonElement|HTMLInputElement] */ (Array.from(form.querySelectorAll(
|
|
1483
|
+
'button:not(:disabled), input:not(:disabled)'
|
|
1484
|
+
)));
|
|
1485
|
+
const submitter = candidates.find(el => el.type === 'submit');
|
|
1486
|
+
form.requestSubmit(submitter);
|
|
1487
|
+
});
|
|
1474
1488
|
this._input.addEventListener('input', (evt) => {
|
|
1475
1489
|
const re = this.getAttribute('mask');
|
|
1476
1490
|
if (!re) {
|
|
@@ -2123,11 +2137,20 @@ class Dropdown extends ParsedElement {
|
|
|
2123
2137
|
<ful-spinner class="centered" hidden></ful-spinner>
|
|
2124
2138
|
<menu tabindex="-1" hidden></menu>
|
|
2125
2139
|
`;
|
|
2140
|
+
static templates = {
|
|
2141
|
+
options: `
|
|
2142
|
+
<li data-tpl-each="self" data-tpl-selected="index == 0" data-tpl-value="index">
|
|
2143
|
+
{{ label }}
|
|
2144
|
+
</li>
|
|
2145
|
+
`
|
|
2146
|
+
};
|
|
2126
2147
|
#spinner;
|
|
2127
2148
|
#menu;
|
|
2149
|
+
#optionstemplate;
|
|
2128
2150
|
#options = new Map();
|
|
2129
2151
|
render({ slots }) {
|
|
2130
2152
|
const fragment = this.template().render();
|
|
2153
|
+
this.#optionstemplate = Fragments.isBlank(slots.default) ? this.template('options') : Templates.fromFragment(slots.default);
|
|
2131
2154
|
this.#spinner = fragment.querySelector("ful-spinner");
|
|
2132
2155
|
this.#menu = fragment.querySelector("menu");
|
|
2133
2156
|
this.#menu.addEventListener('click', evt => {
|
|
@@ -2149,21 +2172,8 @@ class Dropdown extends ParsedElement {
|
|
|
2149
2172
|
throw new Error("null data");
|
|
2150
2173
|
}
|
|
2151
2174
|
this.#options = new Map(values.map((v, i) => [String(i), v]));
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
el.classList.add('text-center', 'py-2', 'bi', 'bi-database-slash');
|
|
2155
|
-
this.#menu.replaceChildren(el);
|
|
2156
|
-
return;
|
|
2157
|
-
}
|
|
2158
|
-
this.#menu.replaceChildren(...values.map(([k, v, m], i) => {
|
|
2159
|
-
const el = document.createElement('li');
|
|
2160
|
-
if (i === 0) {
|
|
2161
|
-
el.setAttribute("selected", '');
|
|
2162
|
-
}
|
|
2163
|
-
el.setAttribute("value", i);
|
|
2164
|
-
el.innerText = v;
|
|
2165
|
-
return el;
|
|
2166
|
-
}));
|
|
2175
|
+
const data = values.map(([key, label, metadata], index) => ({ index, key, label, metadata}));
|
|
2176
|
+
this.#optionstemplate.withOverlay(data).renderTo(this.#menu);
|
|
2167
2177
|
}
|
|
2168
2178
|
#change(target) {
|
|
2169
2179
|
const index = target.getAttribute('value');
|
|
@@ -2224,7 +2234,7 @@ class Select extends ParsedElement {
|
|
|
2224
2234
|
<badges></badges>
|
|
2225
2235
|
<input type="text" form="">
|
|
2226
2236
|
</div>
|
|
2227
|
-
<ful-dropdown hidden popover="manual"
|
|
2237
|
+
<ful-dropdown hidden popover="manual">{{{{ slots.dropdown }}}}</ful-dropdown>
|
|
2228
2238
|
</div>
|
|
2229
2239
|
{{{{ slots.after }}}}
|
|
2230
2240
|
<span data-tpl-if="slots.iafter" class="input-group-text">{{{{ slots.iafter }}}}</span>
|
|
@@ -2338,16 +2348,17 @@ class Select extends ParsedElement {
|
|
|
2338
2348
|
this.#input.value = '';
|
|
2339
2349
|
});
|
|
2340
2350
|
this.#input.addEventListener('keydown', e => {
|
|
2341
|
-
e.stopPropagation();
|
|
2342
2351
|
if (this.disabled || this.readonly) {
|
|
2343
2352
|
return;
|
|
2344
2353
|
}
|
|
2345
2354
|
switch (e.code) {
|
|
2346
2355
|
case 'ArrowUp': {
|
|
2356
|
+
e.preventDefault();
|
|
2347
2357
|
this.#ddmenu.moveOrShow(false, () => self.#loader.load(self.#input.value));
|
|
2348
2358
|
break;
|
|
2349
2359
|
}
|
|
2350
2360
|
case 'ArrowDown': {
|
|
2361
|
+
e.preventDefault();
|
|
2351
2362
|
this.#ddmenu.moveOrShow(true, () => self.#loader.load(self.#input.value));
|
|
2352
2363
|
break;
|
|
2353
2364
|
}
|
|
@@ -2356,12 +2367,13 @@ class Select extends ParsedElement {
|
|
|
2356
2367
|
break;
|
|
2357
2368
|
}
|
|
2358
2369
|
case 'Enter': {
|
|
2370
|
+
e.preventDefault();
|
|
2359
2371
|
this.#ddmenu.acceptSelection();
|
|
2360
2372
|
this.#input.value = '';
|
|
2361
2373
|
break;
|
|
2362
2374
|
}
|
|
2363
2375
|
case 'Backspace': {
|
|
2364
|
-
//remove last if caret
|
|
2376
|
+
//remove last if caret at position 0
|
|
2365
2377
|
if (this.#values.size && this.#input.selectionStart === 0 && this.#input.selectionEnd === 0) {
|
|
2366
2378
|
this.#values.delete(Array.from(this.#values.keys()).pop());
|
|
2367
2379
|
this.#changed();
|
|
@@ -2630,7 +2642,7 @@ class Checkbox extends ParsedElement {
|
|
|
2630
2642
|
static template = `
|
|
2631
2643
|
<div data-tpl-class="klass">
|
|
2632
2644
|
<div class="input-container">
|
|
2633
|
-
<input class="form-check-input" type="checkbox" role="switch" form="" placeholder=" ">
|
|
2645
|
+
<input class="form-check-input" type="checkbox" data-tpl-role="isSwitch ? 'switch' : false" form="" placeholder=" ">
|
|
2634
2646
|
</div>
|
|
2635
2647
|
<div class="form-check-label">
|
|
2636
2648
|
<label>{{{{ slots.default }}}}</label>
|
|
@@ -2649,8 +2661,9 @@ class Checkbox extends ParsedElement {
|
|
|
2649
2661
|
this.internals.role = 'presentation';
|
|
2650
2662
|
}
|
|
2651
2663
|
render({ slots, observed, disabled }) {
|
|
2652
|
-
const
|
|
2653
|
-
const
|
|
2664
|
+
const isSwitch = this.getAttribute('type') == 'switch';
|
|
2665
|
+
const klass = isSwitch ? "form-check form-switch" : "form-check";
|
|
2666
|
+
const fragment = this.template().withOverlay({ slots, klass, isSwitch }).render();
|
|
2654
2667
|
this.#container = fragment.firstElementChild;
|
|
2655
2668
|
this.#input = fragment.querySelector("input");
|
|
2656
2669
|
Attributes.forward('input-', this, this.#input);
|