@schukai/monster 1.21.1 → 1.25.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (205) hide show
  1. package/CHANGELOG +48 -1
  2. package/README.md +4 -4
  3. package/dist/modules/constants.js +2 -2
  4. package/dist/modules/constraints/abstract.js +1 -1
  5. package/dist/modules/constraints/abstractoperator.js +1 -1
  6. package/dist/modules/constraints/andoperator.js +1 -1
  7. package/dist/modules/constraints/invalid.js +1 -1
  8. package/dist/modules/constraints/isarray.js +1 -1
  9. package/dist/modules/constraints/isobject.js +1 -1
  10. package/dist/modules/constraints/namespace.js +1 -1
  11. package/dist/modules/constraints/oroperator.js +1 -1
  12. package/dist/modules/constraints/valid.js +1 -1
  13. package/dist/modules/data/buildmap.js +1 -1
  14. package/dist/modules/data/datasource/namespace.js +2 -0
  15. package/dist/modules/data/datasource/restapi/writeerror.js +2 -0
  16. package/dist/modules/data/datasource/restapi.js +2 -0
  17. package/dist/modules/data/datasource/storage/localstorage.js +2 -0
  18. package/dist/modules/data/datasource/storage/namespace.js +2 -0
  19. package/dist/modules/data/datasource/storage/sessionstorage.js +2 -0
  20. package/dist/modules/data/datasource/storage.js +2 -0
  21. package/dist/modules/data/datasource.js +2 -0
  22. package/dist/modules/data/diff.js +2 -2
  23. package/dist/modules/data/extend.js +1 -1
  24. package/dist/modules/data/namespace.js +1 -1
  25. package/dist/modules/data/pathfinder.js +2 -2
  26. package/dist/modules/data/pipe.js +1 -1
  27. package/dist/modules/data/transformer.js +2 -2
  28. package/dist/modules/dom/assembler.js +1 -1
  29. package/dist/modules/dom/attributes.js +1 -1
  30. package/dist/modules/dom/constants.js +2 -2
  31. package/dist/modules/dom/customcontrol.js +2 -2
  32. package/dist/modules/dom/customelement.js +2 -2
  33. package/dist/modules/dom/events.js +1 -1
  34. package/dist/modules/dom/focusmanager.js +2 -0
  35. package/dist/modules/dom/locale.js +1 -1
  36. package/dist/modules/dom/namespace.js +1 -1
  37. package/dist/modules/dom/resource/data.js +2 -0
  38. package/dist/modules/dom/resource/link/stylesheet.js +2 -0
  39. package/dist/modules/dom/resource/link.js +2 -0
  40. package/dist/modules/dom/resource/script.js +2 -0
  41. package/dist/modules/dom/resource.js +2 -0
  42. package/dist/modules/dom/resourcemanager.js +2 -0
  43. package/dist/modules/dom/template.js +1 -1
  44. package/dist/modules/dom/theme.js +1 -1
  45. package/dist/modules/dom/updater.js +2 -2
  46. package/dist/modules/dom/util.js +1 -1
  47. package/dist/modules/dom/worker/factory.js +2 -0
  48. package/dist/modules/i18n/locale.js +1 -1
  49. package/dist/modules/i18n/namespace.js +1 -1
  50. package/dist/modules/i18n/provider.js +1 -1
  51. package/dist/modules/i18n/providers/fetch.js +2 -2
  52. package/dist/modules/i18n/providers/namespace.js +1 -1
  53. package/dist/modules/i18n/translations.js +1 -1
  54. package/dist/modules/logging/handler/console.js +1 -1
  55. package/dist/modules/logging/handler/namespace.js +1 -1
  56. package/dist/modules/logging/handler.js +1 -1
  57. package/dist/modules/logging/logentry.js +1 -1
  58. package/dist/modules/logging/logger.js +1 -1
  59. package/dist/modules/logging/namespace.js +1 -1
  60. package/dist/modules/math/namespace.js +1 -1
  61. package/dist/modules/math/random.js +2 -2
  62. package/dist/modules/monster.js +1 -1
  63. package/dist/modules/namespace.js +1 -1
  64. package/dist/modules/text/formatter.js +2 -2
  65. package/dist/modules/text/namespace.js +1 -1
  66. package/dist/modules/types/base.js +1 -1
  67. package/dist/modules/types/basewithoptions.js +2 -2
  68. package/dist/modules/types/binary.js +1 -1
  69. package/dist/modules/types/dataurl.js +1 -1
  70. package/dist/modules/types/global.js +1 -1
  71. package/dist/modules/types/id.js +1 -1
  72. package/dist/modules/types/is.js +1 -1
  73. package/dist/modules/types/mediatype.js +1 -1
  74. package/dist/modules/types/namespace.js +1 -1
  75. package/dist/modules/types/observer.js +1 -1
  76. package/dist/modules/types/observerlist.js +2 -2
  77. package/dist/modules/types/proxyobserver.js +2 -2
  78. package/dist/modules/types/queue.js +1 -1
  79. package/dist/modules/types/randomid.js +1 -1
  80. package/dist/modules/types/stack.js +1 -1
  81. package/dist/modules/types/tokenlist.js +2 -2
  82. package/dist/modules/types/typeof.js +1 -1
  83. package/dist/modules/types/uniquequeue.js +1 -1
  84. package/dist/modules/types/uuid.js +2 -0
  85. package/dist/modules/types/validate.js +1 -1
  86. package/dist/modules/types/version.js +2 -2
  87. package/dist/modules/util/clone.js +2 -2
  88. package/dist/modules/util/comparator.js +2 -2
  89. package/dist/modules/util/freeze.js +1 -1
  90. package/dist/modules/util/namespace.js +1 -1
  91. package/dist/modules/util/processing.js +2 -2
  92. package/dist/modules/util/trimspaces.js +2 -0
  93. package/dist/monster.dev.js +1499 -732
  94. package/dist/monster.dev.js.map +1 -1
  95. package/dist/monster.js +2 -2
  96. package/package.json +1 -1
  97. package/source/constants.js +16 -7
  98. package/source/constraints/andoperator.js +5 -5
  99. package/source/constraints/invalid.js +3 -3
  100. package/source/constraints/isarray.js +3 -3
  101. package/source/constraints/isobject.js +3 -3
  102. package/source/constraints/oroperator.js +5 -5
  103. package/source/constraints/valid.js +3 -3
  104. package/source/data/buildmap.js +6 -6
  105. package/source/data/datasource/namespace.js +16 -0
  106. package/source/data/datasource/restapi/writeerror.js +49 -0
  107. package/source/data/datasource/restapi.js +266 -0
  108. package/source/data/datasource/storage/localstorage.js +64 -0
  109. package/source/data/datasource/storage/namespace.js +16 -0
  110. package/source/data/datasource/storage/sessionstorage.js +61 -0
  111. package/source/data/datasource/storage.js +131 -0
  112. package/source/data/datasource.js +246 -0
  113. package/source/data/diff.js +8 -8
  114. package/source/data/extend.js +5 -5
  115. package/source/data/pathfinder.js +12 -6
  116. package/source/data/pipe.js +6 -5
  117. package/source/data/transformer.js +131 -24
  118. package/source/dom/assembler.js +2 -2
  119. package/source/dom/attributes.js +24 -24
  120. package/source/dom/constants.js +305 -12
  121. package/source/dom/customcontrol.js +40 -19
  122. package/source/dom/customelement.js +182 -103
  123. package/source/dom/events.js +6 -6
  124. package/source/dom/focusmanager.js +251 -0
  125. package/source/dom/locale.js +4 -3
  126. package/source/dom/resource/data.js +170 -0
  127. package/source/dom/resource/link/stylesheet.js +54 -0
  128. package/source/dom/resource/link.js +125 -0
  129. package/source/dom/resource/script.js +112 -0
  130. package/source/dom/resource.js +268 -0
  131. package/source/dom/resourcemanager.js +214 -0
  132. package/source/dom/template.js +40 -10
  133. package/source/dom/theme.js +3 -3
  134. package/source/dom/updater.js +114 -58
  135. package/source/dom/util.js +6 -6
  136. package/source/dom/worker/factory.js +134 -0
  137. package/source/i18n/locale.js +8 -8
  138. package/source/i18n/provider.js +4 -4
  139. package/source/i18n/providers/fetch.js +8 -13
  140. package/source/i18n/translations.js +6 -5
  141. package/source/logging/handler/console.js +2 -2
  142. package/source/logging/handler.js +2 -2
  143. package/source/logging/logentry.js +2 -2
  144. package/source/logging/logger.js +4 -4
  145. package/source/math/random.js +11 -5
  146. package/source/namespace.js +1 -1
  147. package/source/text/formatter.js +82 -7
  148. package/source/types/base.js +4 -4
  149. package/source/types/basewithoptions.js +10 -15
  150. package/source/types/binary.js +8 -8
  151. package/source/types/dataurl.js +6 -6
  152. package/source/types/global.js +9 -7
  153. package/source/types/id.js +2 -2
  154. package/source/types/is.js +23 -23
  155. package/source/types/mediatype.js +4 -4
  156. package/source/types/observer.js +3 -3
  157. package/source/types/observerlist.js +3 -3
  158. package/source/types/proxyobserver.js +24 -7
  159. package/source/types/queue.js +5 -5
  160. package/source/types/randomid.js +2 -2
  161. package/source/types/stack.js +2 -2
  162. package/source/types/tokenlist.js +8 -9
  163. package/source/types/typeof.js +3 -3
  164. package/source/types/uniquequeue.js +4 -4
  165. package/source/types/uuid.js +102 -0
  166. package/source/types/validate.js +20 -20
  167. package/source/types/version.js +6 -6
  168. package/source/util/clone.js +5 -6
  169. package/source/util/comparator.js +5 -5
  170. package/source/util/freeze.js +5 -5
  171. package/source/util/processing.js +33 -36
  172. package/source/util/trimspaces.js +85 -0
  173. package/test/cases/data/datasource/restapi.js +89 -0
  174. package/test/cases/data/datasource/storage/localstorage.js +47 -0
  175. package/test/cases/data/datasource/storage/sessionstorage.js +47 -0
  176. package/test/cases/data/datasource.js +60 -0
  177. package/test/cases/data/diff.js +4 -4
  178. package/test/cases/data/pathfinder.js +18 -9
  179. package/test/cases/data/pipe.js +26 -2
  180. package/test/cases/data/transformer.js +41 -10
  181. package/test/cases/dom/customcontrol.js +6 -5
  182. package/test/cases/dom/customelement.js +25 -26
  183. package/test/cases/dom/focusmanager.js +111 -0
  184. package/test/cases/dom/locale.js +1 -4
  185. package/test/cases/dom/resource/data.js +129 -0
  186. package/test/cases/dom/resource/link/stylesheet.js +101 -0
  187. package/test/cases/dom/resource/link.js +101 -0
  188. package/test/cases/dom/resource/script.js +115 -0
  189. package/test/cases/dom/resourcemanager.js +118 -0
  190. package/test/cases/dom/updater.js +42 -19
  191. package/test/cases/dom/worker/factory.js +63 -0
  192. package/test/cases/monster.js +1 -1
  193. package/test/cases/text/formatter.js +38 -6
  194. package/test/cases/types/proxyobserver.js +55 -11
  195. package/test/cases/types/uuid.js +42 -0
  196. package/test/cases/util/freeze.js +30 -4
  197. package/test/cases/util/trimspaces.js +24 -0
  198. package/test/util/cleanupdom.js +48 -0
  199. package/test/util/jsdom.js +23 -9
  200. package/test/util/localstorage.js +81 -0
  201. package/test/web/import.js +13 -0
  202. package/test/web/monster-dev.html +3 -3
  203. package/test/web/monster.html +2 -2
  204. package/test/web/test.html +3 -3
  205. package/test/web/tests.js +7 -7
@@ -1,47 +1,43 @@
1
1
  'use strict';
2
2
 
3
- import {PROPERTY_KEY_INTERNALDATA} from "../constants.js";
4
- import {extend} from "../data/extend.js";
5
- import {Pathfinder} from "../data/pathfinder.js";
6
3
  /**
7
4
  * @author schukai GmbH
8
5
  */
6
+
7
+ import {internalSymbol} from "../constants.js";
8
+ import {extend} from "../data/extend.js";
9
+ import {Pathfinder} from "../data/pathfinder.js";
9
10
  import {assignToNamespace, Monster} from '../namespace.js';
10
11
  import {parseDataURL} from "../types/dataurl.js";
11
12
  import {getGlobalObject} from "../types/global.js";
12
- import {isArray, isObject, isString} from "../types/is.js";
13
+ import {isArray, isFunction, isObject, isString} from "../types/is.js";
13
14
  import {Observer} from "../types/observer.js";
14
15
  import {ProxyObserver} from "../types/proxyobserver.js";
15
16
  import {validateFunction, validateInstance, validateObject} from "../types/validate.js";
16
17
  import {clone} from "../util/clone.js";
17
18
  import {addToObjectLink, getLinkedObjects, hasObjectLink} from "./attributes.js";
18
- import {ATTRIBUTE_OPTIONS, OBJECTLINK_KEY_UPDATER} from "./constants.js";
19
+ import {ATTRIBUTE_DISABLED, ATTRIBUTE_OPTIONS, objectUpdaterLinkSymbol} from "./constants.js";
19
20
  import {findDocumentTemplate, Template} from "./template.js";
20
21
  import {Updater} from "./updater.js";
21
22
 
22
23
  /**
23
- * @private
24
- * @type {symbol}
25
- */
26
- const internalDataSymbol = Symbol.for(PROPERTY_KEY_INTERNALDATA);
27
-
28
- /**
29
- * @private
24
+ * @memberOf Monster.DOM
30
25
  * @type {symbol}
31
26
  */
32
- const objectLinkSymbol = Symbol.for(OBJECTLINK_KEY_UPDATER);
27
+ const initMethodSymbol = Symbol('initMethodSymbol');
33
28
 
34
29
  /**
35
30
  * @memberOf Monster.DOM
36
31
  * @type {symbol}
37
32
  */
38
- const initMethodSymbol = Symbol('initMethodSymbol');
33
+ const assembleMethodSymbol = Symbol('assembleMethodSymbol');
39
34
 
40
35
  /**
36
+ * this symbol holds the attribute observer callbacks. The key is the attribute name.
41
37
  * @memberOf Monster.DOM
42
38
  * @type {symbol}
43
39
  */
44
- const assembleMethodSymbol = Symbol('assembleMethodSymbol');
40
+ const attributeObserverSymbol = Symbol('attributeObserver');
45
41
 
46
42
 
47
43
  /**
@@ -96,21 +92,12 @@ const assembleMethodSymbol = Symbol('assembleMethodSymbol');
96
92
  *
97
93
  * <img src="./images/customelement-class.png">
98
94
  *
99
- * You can create the object via the monster namespace `new Monster.DOM.CustomElement()`.
100
- *
101
- * ```
102
- * <script type="module">
103
- * import {CustomElement} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.21.1/dist/modules/dom/customelement.js';
104
- * console.log(new Monster.DOM.CustomElement())
105
- * </script>
106
- * ```
107
- *
108
- * Alternatively, you can also integrate this function individually.
95
+ * You can create the object via the function `document.createElement()`.
109
96
  *
110
97
  * ```
111
98
  * <script type="module">
112
- * import {CustomElement} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.21.1/dist/modules/dom/customelement.js';
113
- * console.log(new CustomElement())
99
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.25.0/dist/modules/dom/customelement.js';
100
+ * document.createElement('monster-')
114
101
  * </script>
115
102
  * ```
116
103
  *
@@ -213,7 +200,8 @@ class CustomElement extends HTMLElement {
213
200
  */
214
201
  constructor() {
215
202
  super();
216
- this[internalDataSymbol] = new ProxyObserver({'options': extend({}, this.defaults, getOptionsFromAttributes.call(this))});
203
+ this[internalSymbol] = new ProxyObserver({'options': extend({}, this.defaults, getOptionsFromAttributes.call(this))});
204
+ this[attributeObserverSymbol] = {};
217
205
  initOptionObserver.call(this);
218
206
  this[initMethodSymbol]();
219
207
  }
@@ -225,7 +213,7 @@ class CustomElement extends HTMLElement {
225
213
  * @since 1.15.0
226
214
  */
227
215
  static get observedAttributes() {
228
- return [ATTRIBUTE_OPTIONS];
216
+ return [ATTRIBUTE_OPTIONS, ATTRIBUTE_DISABLED];
229
217
  }
230
218
 
231
219
  /**
@@ -261,12 +249,11 @@ class CustomElement extends HTMLElement {
261
249
  * @property {string} templates.main=undefined Main template
262
250
  *
263
251
  * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/attachShadow
264
- * @return {{shadowMode: string, delegatesFocus: boolean}}
265
252
  * @since 1.8.0
266
253
  */
267
254
  get defaults() {
268
255
  return {
269
- disabled: false,
256
+ ATTRIBUTE_DISABLED: this.getAttribute(ATTRIBUTE_DISABLED),
270
257
  shadowMode: 'open',
271
258
  delegatesFocus: true,
272
259
  templates: {
@@ -321,7 +308,7 @@ class CustomElement extends HTMLElement {
321
308
  * @returns {CustomElement}
322
309
  */
323
310
  attachObserver(observer) {
324
- this[internalDataSymbol].attachObserver(observer)
311
+ this[internalSymbol].attachObserver(observer)
325
312
  return this;
326
313
  }
327
314
 
@@ -332,7 +319,7 @@ class CustomElement extends HTMLElement {
332
319
  * @returns {CustomElement}
333
320
  */
334
321
  detachObserver(observer) {
335
- this[internalDataSymbol].detachObserver(observer)
322
+ this[internalSymbol].detachObserver(observer)
336
323
  return this;
337
324
  }
338
325
 
@@ -341,7 +328,7 @@ class CustomElement extends HTMLElement {
341
328
  * @returns {ProxyObserver}
342
329
  */
343
330
  containsObserver(observer) {
344
- return this[internalDataSymbol].containsObserver(observer)
331
+ return this[internalSymbol].containsObserver(observer)
345
332
  }
346
333
 
347
334
  /**
@@ -356,7 +343,7 @@ class CustomElement extends HTMLElement {
356
343
  let value;
357
344
 
358
345
  try {
359
- value = new Pathfinder(this[internalDataSymbol].getRealSubject()['options']).getVia(path);
346
+ value = new Pathfinder(this[internalSymbol].getRealSubject()['options']).getVia(path);
360
347
  } catch (e) {
361
348
 
362
349
  }
@@ -374,7 +361,7 @@ class CustomElement extends HTMLElement {
374
361
  * @since 1.14.0
375
362
  */
376
363
  setOption(path, value) {
377
- new Pathfinder(this[internalDataSymbol].getSubject()['options']).setVia(path, value);
364
+ new Pathfinder(this[internalSymbol].getSubject()['options']).setVia(path, value);
378
365
  return this;
379
366
  }
380
367
 
@@ -390,7 +377,7 @@ class CustomElement extends HTMLElement {
390
377
  }
391
378
 
392
379
  const self = this;
393
- extend(self[internalDataSymbol].getSubject()['options'], self.defaults, options);
380
+ extend(self[internalSymbol].getSubject()['options'], self.defaults, options);
394
381
 
395
382
  return self;
396
383
  }
@@ -414,15 +401,17 @@ class CustomElement extends HTMLElement {
414
401
  [assembleMethodSymbol]() {
415
402
 
416
403
  const self = this;
417
- let elements;
404
+ let elements, nodeList;
418
405
 
419
- if (this.getOption('shadowMode', false) !== false) {
406
+ if (self.getOption('shadowMode', false) !== false) {
420
407
  try {
421
- initShadowRoot.call(this);
422
- elements = this.shadowRoot.childNodes;
408
+ initShadowRoot.call(self);
409
+ elements = self.shadowRoot.childNodes;
410
+
423
411
  } catch (e) {
424
412
 
425
413
  }
414
+
426
415
  try {
427
416
  initCSSStylesheet.call(this);
428
417
  } catch (e) {
@@ -431,34 +420,25 @@ class CustomElement extends HTMLElement {
431
420
  }
432
421
 
433
422
  if (!(elements instanceof NodeList)) {
434
- initHtmlContent.call(this);
435
- elements = this.childNodes;
436
- }
437
-
438
- const updater = new Set;
439
- addToObjectLink(this, objectLinkSymbol, updater);
440
-
441
- for (const [, element] of Object.entries(elements)) {
442
-
443
- if (!(element instanceof HTMLElement)) continue;
444
- if ((element instanceof HTMLTemplateElement)) continue;
445
- const u = new Updater(element, clone(self[internalDataSymbol].getRealSubject()['options']))
446
- updater.add(u);
447
-
448
- u.run().then(() => {
449
- u.enableEventProcessing();
450
- });
451
-
423
+ if (!(elements instanceof NodeList)) {
424
+ initHtmlContent.call(this);
425
+ elements = this.childNodes;
426
+ }
452
427
  }
453
428
 
454
- if (this.hasAttribute('disabled')) {
455
- self.setOption('disabled', true);
429
+ try {
430
+ nodeList = new Set([
431
+ ...elements,
432
+ ...getSlottedElements.call(self)
433
+ ])
434
+ } catch (e) {
435
+ nodeList = elements
456
436
  }
457
437
 
458
- return this;
438
+ assignUpdaterToElement.call(self, nodeList, clone(self[internalSymbol].getRealSubject()['options']));
439
+ return self;
459
440
  }
460
441
 
461
-
462
442
  /**
463
443
  * Called every time the element is inserted into the DOM. Useful for running setup code, such as
464
444
  * fetching resources or rendering. Generally, you should try to delay work until this time.
@@ -468,7 +448,7 @@ class CustomElement extends HTMLElement {
468
448
  */
469
449
  connectedCallback() {
470
450
  let self = this;
471
- if (!hasObjectLink(self, objectLinkSymbol)) {
451
+ if (!hasObjectLink(self, objectUpdaterLinkSymbol)) {
472
452
  self[assembleMethodSymbol]()
473
453
  }
474
454
  }
@@ -507,8 +487,10 @@ class CustomElement extends HTMLElement {
507
487
  attributeChangedCallback(attrName, oldVal, newVal) {
508
488
  const self = this;
509
489
 
510
- if (attrName === ATTRIBUTE_OPTIONS) {
511
- self.setOptions(newVal);
490
+ const callback = self[attributeObserverSymbol]?.[attrName];
491
+
492
+ if (isFunction(callback)) {
493
+ callback.call(self, newVal, oldVal);
512
494
  }
513
495
 
514
496
  }
@@ -523,7 +505,6 @@ class CustomElement extends HTMLElement {
523
505
  hasNode(node) {
524
506
  const self = this;
525
507
 
526
-
527
508
  if (containChildNode.call(self, validateInstance(node, Node))) {
528
509
  return true;
529
510
  }
@@ -539,6 +520,48 @@ class CustomElement extends HTMLElement {
539
520
  }
540
521
 
541
522
  /**
523
+ * @private
524
+ * @param {String} filter
525
+ * @return {*}
526
+ * @this CustomElement
527
+ * @since 1.23.0
528
+ */
529
+ function getSlottedElements(filter) {
530
+ const self = this;
531
+ const result = new Set;
532
+
533
+
534
+ if (!(self.shadowRoot instanceof ShadowRoot)) {
535
+ return result;
536
+ }
537
+
538
+ const slots = self.shadowRoot.querySelectorAll('slot');
539
+
540
+ for (const [, slot] of Object.entries(slots)) {
541
+ slot.assignedElements().forEach(function (node) {
542
+
543
+ if (!(node instanceof HTMLElement)) return;
544
+
545
+ if (filter !== undefined) {
546
+ node.querySelectorAll(filter).forEach(function (n) {
547
+ result.add(n);
548
+ });
549
+
550
+ if (node.matches(filter)) {
551
+ result.add(node);
552
+ }
553
+
554
+ } else {
555
+ result.add(node);
556
+ }
557
+ })
558
+ }
559
+
560
+ return result;
561
+ }
562
+
563
+ /**
564
+ * @this CustomElement
542
565
  * @private
543
566
  * @param {Node} node
544
567
  * @return {boolean}
@@ -578,63 +601,70 @@ function initOptionObserver() {
578
601
  return;
579
602
  }
580
603
 
581
- if (self.shadowRoot instanceof ShadowRoot) {
582
- const found = self.shadowRoot.querySelectorAll('button, command, fieldset, keygen, optgroup, option, select, textarea, input, [data-monster-objectlink]');
583
- for (const [, element] of Object.entries(found)) {
584
- if (flag === true) {
585
- element.setAttribute('disabled', '');
586
- } else {
587
- element.removeAttribute('disabled');
588
- }
604
+ lastDisabledValue = flag;
589
605
 
590
- }
606
+ if (!(self.shadowRoot instanceof ShadowRoot)) {
607
+ return;
591
608
  }
592
609
 
593
- lastDisabledValue = flag;
610
+ const query = 'button, command, fieldset, keygen, optgroup, option, select, textarea, input, [data-monster-objectlink]';
611
+ const elements = self.shadowRoot.querySelectorAll(query);
612
+
613
+ let nodeList;
614
+ try {
615
+ nodeList = new Set([
616
+ ...elements,
617
+ ...getSlottedElements.call(self, query)
618
+ ])
619
+ } catch (e) {
620
+ nodeList = elements
621
+ }
622
+
623
+ for (const element of [...nodeList]) {
624
+ if (flag === true) {
625
+ element.setAttribute(ATTRIBUTE_DISABLED, '');
626
+ } else {
627
+ element.removeAttribute(ATTRIBUTE_DISABLED);
628
+ }
629
+ }
594
630
 
595
631
  }));
596
-
632
+
597
633
  self.attachObserver(new Observer(function () {
598
634
 
599
635
  // not initialised
600
- if (!hasObjectLink(self, Symbol.for(OBJECTLINK_KEY_UPDATER))) {
636
+ if (!hasObjectLink(self, objectUpdaterLinkSymbol)) {
601
637
  return;
602
638
  }
603
639
  // inform every element
604
- const updaters = getLinkedObjects(self, Symbol.for(OBJECTLINK_KEY_UPDATER));
640
+ const updaters = getLinkedObjects(self, objectUpdaterLinkSymbol);
605
641
 
606
642
  for (const list of updaters) {
607
643
  for (const updater of list) {
608
- let d = clone(self[internalDataSymbol].getRealSubject()['options']);
644
+ let d = clone(self[internalSymbol].getRealSubject()['options']);
609
645
  Object.assign(updater.getSubject(), d);
610
646
  }
611
647
  }
612
648
 
613
649
  }));
614
650
 
615
- const observer = new MutationObserver(function (mutationsList, observer) {
616
-
617
- for (const mutation of mutationsList) {
618
- if (mutation.type === 'attributes') {
619
-
620
- switch (mutation?.attributeName) {
621
- case 'disabled':
622
- self.setOption('disabled', self.hasAttribute('disabled') ? true : undefined);
623
- break;
624
- case ATTRIBUTE_OPTIONS:
625
- const options = getOptionsFromAttributes.call(self);
626
- if (isObject(options)) {
627
- self.setOptions(options);
628
- }
629
-
630
- break;
631
- }
651
+ // disabled
652
+ self[attributeObserverSymbol][ATTRIBUTE_DISABLED] = (newVal) => {
653
+ if (self.hasAttribute(ATTRIBUTE_DISABLED)) {
654
+ self.setOption(ATTRIBUTE_DISABLED, true);
655
+ } else {
656
+ self.setOption(ATTRIBUTE_DISABLED, undefined);
657
+ }
658
+ }
632
659
 
633
- }
660
+ // data-monster-options
661
+ self[attributeObserverSymbol][ATTRIBUTE_OPTIONS] = () => {
662
+ const options = getOptionsFromAttributes.call(self);
663
+ if (isObject(options)) {
664
+ self.setOptions(options);
634
665
  }
635
- });
666
+ }
636
667
 
637
- observer.observe(this, {attributes: true, attributeOldValue: true, childList: false, subtree: false});
638
668
 
639
669
  }
640
670
 
@@ -787,5 +817,54 @@ function registerCustomElement(element) {
787
817
  getGlobalObject('customElements').define(element.getTag(), element);
788
818
  }
789
819
 
790
- assignToNamespace('Monster.DOM', CustomElement, registerCustomElement);
791
- export {Monster, registerCustomElement, CustomElement, initMethodSymbol, assembleMethodSymbol}
820
+
821
+ /**
822
+ *
823
+ * @param element
824
+ * @param object
825
+ * @return {Promise[]}
826
+ * @since 1.23.0
827
+ * @memberOf Monster.DOM
828
+ */
829
+ function assignUpdaterToElement(elements, object) {
830
+
831
+ const updaters = new Set;
832
+
833
+ if (elements instanceof NodeList) {
834
+ elements = new Set([
835
+ ...elements
836
+ ])
837
+ }
838
+
839
+ let result = [];
840
+
841
+ elements.forEach((element) => {
842
+ if (!(element instanceof HTMLElement)) return;
843
+ if ((element instanceof HTMLTemplateElement)) return;
844
+
845
+ const u = new Updater(element, object)
846
+ updaters.add(u);
847
+
848
+ result.push(u.run().then(() => {
849
+ return u.enableEventProcessing();
850
+ }));
851
+
852
+ });
853
+
854
+ if (updaters.size > 0) {
855
+ addToObjectLink(this, objectUpdaterLinkSymbol, updaters);
856
+ }
857
+
858
+ return result;
859
+ }
860
+
861
+ assignToNamespace('Monster.DOM', CustomElement, registerCustomElement, assignUpdaterToElement);
862
+ export {
863
+ Monster,
864
+ registerCustomElement,
865
+ CustomElement,
866
+ initMethodSymbol,
867
+ assembleMethodSymbol,
868
+ assignUpdaterToElement,
869
+ attributeObserverSymbol
870
+ }
@@ -13,7 +13,7 @@ import {getDocument} from "./util.js";
13
13
  *
14
14
  * ```
15
15
  * <script type="module">
16
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.21.1/dist/modules/dom/events.js';
16
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.25.0/dist/modules/dom/events.js';
17
17
  * console.log(new Monster.DOM.fireEvent())
18
18
  * </script>
19
19
  * ```
@@ -22,7 +22,7 @@ import {getDocument} from "./util.js";
22
22
  *
23
23
  * ```
24
24
  * <script type="module">
25
- * import {fireEvent} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.21.1/dist/modules/dom/events.js';
25
+ * import {fireEvent} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.25.0/dist/modules/dom/events.js';
26
26
  * console.log(fireEvent())
27
27
  * </script>
28
28
  * ```
@@ -66,14 +66,14 @@ function fireEvent(element, type) {
66
66
 
67
67
  /**
68
68
  * This function gets the path `Event.composedPath()` from an event and tries to find the next element
69
- * up the tree `element.closest()` with the attribute and value. If no value, or a value that is undefined or null,
69
+ * up the tree `element.closest()` with the attribute and value. If no value, or a value that is undefined or null,
70
70
  * is specified, only the attribute is searched.
71
71
  *
72
72
  * You can call the function via the monster namespace `new Monster.DOM.findTargetElementFromEvent()`.
73
73
  *
74
74
  * ```
75
75
  * <script type="module">
76
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.21.1/dist/modules/dom/events.js';
76
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.25.0/dist/modules/dom/events.js';
77
77
  * console.log(new Monster.DOM.findTargetElementFromEvent())
78
78
  * </script>
79
79
  * ```
@@ -82,7 +82,7 @@ function fireEvent(element, type) {
82
82
  *
83
83
  * ```
84
84
  * <script type="module">
85
- * import {findTargetElementFromEvent} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.21.1/dist/modules/dom/events.js';
85
+ * import {findTargetElementFromEvent} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.25.0/dist/modules/dom/events.js';
86
86
  * console.log(findTargetElementFromEvent())
87
87
  * </script>
88
88
  * ```
@@ -114,7 +114,7 @@ function findTargetElementFromEvent(event, attributeName, attributeValue) {
114
114
 
115
115
  if (o instanceof HTMLElement &&
116
116
  o.hasAttribute(attributeName)
117
- && (attributeValue===undefined || o.getAttribute(attributeName) === attributeValue)) {
117
+ && (attributeValue === undefined || o.getAttribute(attributeName) === attributeValue)) {
118
118
  return o;
119
119
  }
120
120
  }