@optionfactory/ful 6.0.4 → 6.0.5

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.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
- if (values.length === 0) {
2153
- const el = document.createElement('div');
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"></ful-dropdown>
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 a position 0
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();