@schukai/monster 1.23.0 → 1.26.1

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.
Files changed (221) hide show
  1. package/CHANGELOG +53 -0
  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 +2 -2
  14. package/dist/modules/data/buildtree.js +2 -0
  15. package/dist/modules/data/datasource/namespace.js +1 -1
  16. package/dist/modules/data/datasource/restapi/writeerror.js +2 -0
  17. package/dist/modules/data/datasource/restapi.js +2 -2
  18. package/dist/modules/data/datasource/storage/localstorage.js +2 -2
  19. package/dist/modules/data/datasource/storage/namespace.js +1 -1
  20. package/dist/modules/data/datasource/storage/sessionstorage.js +2 -2
  21. package/dist/modules/data/datasource/storage.js +2 -2
  22. package/dist/modules/data/datasource.js +2 -2
  23. package/dist/modules/data/diff.js +2 -2
  24. package/dist/modules/data/extend.js +1 -1
  25. package/dist/modules/data/namespace.js +1 -1
  26. package/dist/modules/data/pathfinder.js +2 -2
  27. package/dist/modules/data/pipe.js +1 -1
  28. package/dist/modules/data/transformer.js +2 -2
  29. package/dist/modules/dom/assembler.js +1 -1
  30. package/dist/modules/dom/attributes.js +1 -1
  31. package/dist/modules/dom/constants.js +2 -2
  32. package/dist/modules/dom/customcontrol.js +2 -2
  33. package/dist/modules/dom/customelement.js +2 -2
  34. package/dist/modules/dom/events.js +1 -1
  35. package/dist/modules/dom/focusmanager.js +2 -0
  36. package/dist/modules/dom/locale.js +1 -1
  37. package/dist/modules/dom/namespace.js +1 -1
  38. package/dist/modules/dom/resource/data.js +2 -0
  39. package/dist/modules/dom/resource/link/stylesheet.js +2 -0
  40. package/dist/modules/dom/resource/link.js +2 -0
  41. package/dist/modules/dom/resource/script.js +2 -0
  42. package/dist/modules/dom/resource.js +2 -0
  43. package/dist/modules/dom/resourcemanager.js +2 -0
  44. package/dist/modules/dom/template.js +2 -2
  45. package/dist/modules/dom/theme.js +1 -1
  46. package/dist/modules/dom/updater.js +2 -2
  47. package/dist/modules/dom/util.js +1 -1
  48. package/dist/modules/dom/worker/factory.js +2 -0
  49. package/dist/modules/i18n/formatter.js +2 -0
  50. package/dist/modules/i18n/locale.js +1 -1
  51. package/dist/modules/i18n/namespace.js +1 -1
  52. package/dist/modules/i18n/provider.js +1 -1
  53. package/dist/modules/i18n/providers/fetch.js +2 -2
  54. package/dist/modules/i18n/providers/namespace.js +1 -1
  55. package/dist/modules/i18n/translations.js +1 -1
  56. package/dist/modules/logging/handler/console.js +1 -1
  57. package/dist/modules/logging/handler/namespace.js +1 -1
  58. package/dist/modules/logging/handler.js +1 -1
  59. package/dist/modules/logging/logentry.js +1 -1
  60. package/dist/modules/logging/logger.js +1 -1
  61. package/dist/modules/logging/namespace.js +1 -1
  62. package/dist/modules/math/namespace.js +1 -1
  63. package/dist/modules/math/random.js +2 -2
  64. package/dist/modules/monster.js +1 -1
  65. package/dist/modules/namespace.js +1 -1
  66. package/dist/modules/text/formatter.js +2 -2
  67. package/dist/modules/text/namespace.js +1 -1
  68. package/dist/modules/types/base.js +1 -1
  69. package/dist/modules/types/basewithoptions.js +2 -2
  70. package/dist/modules/types/binary.js +1 -1
  71. package/dist/modules/types/dataurl.js +1 -1
  72. package/dist/modules/types/global.js +1 -1
  73. package/dist/modules/types/id.js +1 -1
  74. package/dist/modules/types/is.js +2 -2
  75. package/dist/modules/types/mediatype.js +1 -1
  76. package/dist/modules/types/namespace.js +1 -1
  77. package/dist/modules/types/node.js +2 -0
  78. package/dist/modules/types/nodelist.js +2 -0
  79. package/dist/modules/types/noderecursiveiterator.js +2 -0
  80. package/dist/modules/types/observer.js +1 -1
  81. package/dist/modules/types/observerlist.js +2 -2
  82. package/dist/modules/types/proxyobserver.js +2 -2
  83. package/dist/modules/types/queue.js +1 -1
  84. package/dist/modules/types/randomid.js +1 -1
  85. package/dist/modules/types/regex.js +2 -0
  86. package/dist/modules/types/stack.js +1 -1
  87. package/dist/modules/types/tokenlist.js +2 -2
  88. package/dist/modules/types/typeof.js +1 -1
  89. package/dist/modules/types/uniquequeue.js +1 -1
  90. package/dist/modules/types/uuid.js +2 -0
  91. package/dist/modules/types/validate.js +1 -1
  92. package/dist/modules/types/version.js +2 -2
  93. package/dist/modules/util/clone.js +1 -1
  94. package/dist/modules/util/comparator.js +2 -2
  95. package/dist/modules/util/freeze.js +1 -1
  96. package/dist/modules/util/namespace.js +1 -1
  97. package/dist/modules/util/processing.js +2 -2
  98. package/dist/modules/util/trimspaces.js +2 -0
  99. package/dist/monster.dev.js +1684 -696
  100. package/dist/monster.dev.js.map +1 -1
  101. package/dist/monster.js +2 -2
  102. package/package.json +13 -2
  103. package/source/constants.js +16 -7
  104. package/source/constraints/abstract.js +5 -0
  105. package/source/constraints/abstractoperator.js +5 -0
  106. package/source/constraints/andoperator.js +10 -5
  107. package/source/constraints/invalid.js +8 -3
  108. package/source/constraints/isarray.js +9 -4
  109. package/source/constraints/isobject.js +8 -3
  110. package/source/constraints/oroperator.js +10 -5
  111. package/source/constraints/valid.js +8 -3
  112. package/source/data/buildmap.js +27 -11
  113. package/source/data/buildtree.js +95 -0
  114. package/source/data/datasource/restapi/writeerror.js +49 -0
  115. package/source/data/datasource/restapi.js +87 -20
  116. package/source/data/datasource/storage/localstorage.js +4 -10
  117. package/source/data/datasource/storage/sessionstorage.js +4 -12
  118. package/source/data/datasource/storage.js +7 -14
  119. package/source/data/datasource.js +55 -17
  120. package/source/data/diff.js +8 -8
  121. package/source/data/extend.js +5 -5
  122. package/source/data/pathfinder.js +12 -6
  123. package/source/data/pipe.js +6 -5
  124. package/source/data/transformer.js +131 -24
  125. package/source/dom/assembler.js +2 -2
  126. package/source/dom/attributes.js +24 -24
  127. package/source/dom/constants.js +305 -12
  128. package/source/dom/customcontrol.js +40 -19
  129. package/source/dom/customelement.js +121 -92
  130. package/source/dom/events.js +6 -6
  131. package/source/dom/focusmanager.js +250 -0
  132. package/source/dom/locale.js +10 -5
  133. package/source/dom/resource/data.js +170 -0
  134. package/source/dom/resource/link/stylesheet.js +54 -0
  135. package/source/dom/resource/link.js +125 -0
  136. package/source/dom/resource/script.js +112 -0
  137. package/source/dom/resource.js +268 -0
  138. package/source/dom/resourcemanager.js +214 -0
  139. package/source/dom/template.js +52 -12
  140. package/source/dom/theme.js +3 -3
  141. package/source/dom/updater.js +47 -33
  142. package/source/dom/util.js +6 -6
  143. package/source/dom/worker/factory.js +134 -0
  144. package/source/i18n/formatter.js +140 -0
  145. package/source/i18n/locale.js +10 -8
  146. package/source/i18n/provider.js +4 -4
  147. package/source/i18n/providers/fetch.js +24 -14
  148. package/source/i18n/translations.js +20 -10
  149. package/source/logging/handler/console.js +2 -2
  150. package/source/logging/handler.js +2 -2
  151. package/source/logging/logentry.js +2 -2
  152. package/source/logging/logger.js +4 -4
  153. package/source/math/random.js +11 -5
  154. package/source/namespace.js +1 -1
  155. package/source/text/formatter.js +244 -27
  156. package/source/types/base.js +4 -4
  157. package/source/types/basewithoptions.js +10 -15
  158. package/source/types/binary.js +4 -4
  159. package/source/types/dataurl.js +6 -6
  160. package/source/types/global.js +9 -7
  161. package/source/types/id.js +6 -3
  162. package/source/types/is.js +103 -85
  163. package/source/types/mediatype.js +4 -4
  164. package/source/types/node.js +179 -0
  165. package/source/types/nodelist.js +125 -0
  166. package/source/types/noderecursiveiterator.js +126 -0
  167. package/source/types/observer.js +3 -3
  168. package/source/types/observerlist.js +3 -3
  169. package/source/types/proxyobserver.js +24 -7
  170. package/source/types/queue.js +6 -6
  171. package/source/types/randomid.js +2 -2
  172. package/source/types/regex.js +49 -0
  173. package/source/types/stack.js +2 -2
  174. package/source/types/tokenlist.js +8 -9
  175. package/source/types/typeof.js +3 -3
  176. package/source/types/uniquequeue.js +4 -4
  177. package/source/types/uuid.js +102 -0
  178. package/source/types/validate.js +20 -20
  179. package/source/types/version.js +6 -6
  180. package/source/util/clone.js +4 -5
  181. package/source/util/comparator.js +5 -5
  182. package/source/util/freeze.js +5 -5
  183. package/source/util/processing.js +33 -36
  184. package/source/util/trimspaces.js +85 -0
  185. package/test/cases/data/buildtree.js +149 -0
  186. package/test/cases/data/datasource/restapi.js +1 -1
  187. package/test/cases/data/datasource.js +4 -4
  188. package/test/cases/data/diff.js +4 -4
  189. package/test/cases/data/pathfinder.js +18 -9
  190. package/test/cases/data/pipe.js +26 -2
  191. package/test/cases/data/transformer.js +41 -10
  192. package/test/cases/dom/attributes.js +18 -14
  193. package/test/cases/dom/customcontrol.js +6 -5
  194. package/test/cases/dom/customelement.js +14 -16
  195. package/test/cases/dom/focusmanager.js +111 -0
  196. package/test/cases/dom/locale.js +1 -4
  197. package/test/cases/dom/resource/data.js +129 -0
  198. package/test/cases/dom/resource/link/stylesheet.js +101 -0
  199. package/test/cases/dom/resource/link.js +101 -0
  200. package/test/cases/dom/resource/script.js +115 -0
  201. package/test/cases/dom/resourcemanager.js +118 -0
  202. package/test/cases/dom/updater.js +28 -4
  203. package/test/cases/dom/worker/factory.js +63 -0
  204. package/test/cases/i18n/formatter.js +66 -0
  205. package/test/cases/monster.js +1 -1
  206. package/test/cases/text/formatter.js +71 -8
  207. package/test/cases/types/node.js +196 -0
  208. package/test/cases/types/nodelist.js +64 -0
  209. package/test/cases/types/noderecursiveiterator.js +54 -0
  210. package/test/cases/types/proxyobserver.js +55 -11
  211. package/test/cases/types/regex.js +32 -0
  212. package/test/cases/types/uuid.js +42 -0
  213. package/test/cases/util/freeze.js +30 -4
  214. package/test/cases/util/trimspaces.js +24 -0
  215. package/test/util/cleanupdom.js +48 -0
  216. package/test/util/jsdom.js +22 -9
  217. package/test/web/import.js +15 -0
  218. package/test/web/monster-dev.html +3 -3
  219. package/test/web/monster.html +2 -2
  220. package/test/web/test.html +3 -3
  221. package/test/web/tests.js +7 -7
@@ -3,46 +3,41 @@
3
3
  /**
4
4
  * @author schukai GmbH
5
5
  */
6
-
7
- import {PROPERTY_KEY_INTERNALDATA} from "../constants.js";
6
+
7
+ import {internalSymbol} from "../constants.js";
8
8
  import {extend} from "../data/extend.js";
9
9
  import {Pathfinder} from "../data/pathfinder.js";
10
10
  import {assignToNamespace, Monster} from '../namespace.js';
11
11
  import {parseDataURL} from "../types/dataurl.js";
12
12
  import {getGlobalObject} from "../types/global.js";
13
- import {isArray, isObject, isString} from "../types/is.js";
13
+ import {isArray, isFunction, isObject, isString} from "../types/is.js";
14
14
  import {Observer} from "../types/observer.js";
15
15
  import {ProxyObserver} from "../types/proxyobserver.js";
16
16
  import {validateFunction, validateInstance, validateObject} from "../types/validate.js";
17
17
  import {clone} from "../util/clone.js";
18
18
  import {addToObjectLink, getLinkedObjects, hasObjectLink} from "./attributes.js";
19
- import {ATTRIBUTE_OPTIONS, OBJECTLINK_KEY_UPDATER} from "./constants.js";
19
+ import {ATTRIBUTE_DISABLED, ATTRIBUTE_OPTIONS, objectUpdaterLinkSymbol} from "./constants.js";
20
20
  import {findDocumentTemplate, Template} from "./template.js";
21
21
  import {Updater} from "./updater.js";
22
22
 
23
23
  /**
24
- * @private
25
- * @type {symbol}
26
- */
27
- const internalDataSymbol = Symbol.for(PROPERTY_KEY_INTERNALDATA);
28
-
29
- /**
30
- * @private
24
+ * @memberOf Monster.DOM
31
25
  * @type {symbol}
32
26
  */
33
- const objectLinkSymbol = Symbol.for(OBJECTLINK_KEY_UPDATER);
27
+ const initMethodSymbol = Symbol('initMethodSymbol');
34
28
 
35
29
  /**
36
30
  * @memberOf Monster.DOM
37
31
  * @type {symbol}
38
32
  */
39
- const initMethodSymbol = Symbol('initMethodSymbol');
33
+ const assembleMethodSymbol = Symbol('assembleMethodSymbol');
40
34
 
41
35
  /**
36
+ * this symbol holds the attribute observer callbacks. The key is the attribute name.
42
37
  * @memberOf Monster.DOM
43
38
  * @type {symbol}
44
39
  */
45
- const assembleMethodSymbol = Symbol('assembleMethodSymbol');
40
+ const attributeObserverSymbol = Symbol('attributeObserver');
46
41
 
47
42
 
48
43
  /**
@@ -97,19 +92,12 @@ const assembleMethodSymbol = Symbol('assembleMethodSymbol');
97
92
  *
98
93
  * <img src="./images/customelement-class.png">
99
94
  *
100
- * You can create the object via the monster namespace `new Monster.DOM.CustomElement()`.
95
+ * You can create the object via the function `document.createElement()`.
101
96
  *
102
97
  * ```
103
98
  * <script type="module">
104
- * import {CustomElement} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/dom/customelement.js';
105
- * </script>
106
- * ```
107
- *
108
- * Alternatively, you can also integrate this function individually.
109
- *
110
- * ```
111
- * <script type="module">
112
- * import {CustomElement} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/dom/customelement.js';
99
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/monster.js';
100
+ * document.createElement('monster-')
113
101
  * </script>
114
102
  * ```
115
103
  *
@@ -212,7 +200,8 @@ class CustomElement extends HTMLElement {
212
200
  */
213
201
  constructor() {
214
202
  super();
215
- 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] = {};
216
205
  initOptionObserver.call(this);
217
206
  this[initMethodSymbol]();
218
207
  }
@@ -224,7 +213,7 @@ class CustomElement extends HTMLElement {
224
213
  * @since 1.15.0
225
214
  */
226
215
  static get observedAttributes() {
227
- return [ATTRIBUTE_OPTIONS];
216
+ return [ATTRIBUTE_OPTIONS, ATTRIBUTE_DISABLED];
228
217
  }
229
218
 
230
219
  /**
@@ -264,7 +253,7 @@ class CustomElement extends HTMLElement {
264
253
  */
265
254
  get defaults() {
266
255
  return {
267
- disabled: false,
256
+ ATTRIBUTE_DISABLED: this.getAttribute(ATTRIBUTE_DISABLED),
268
257
  shadowMode: 'open',
269
258
  delegatesFocus: true,
270
259
  templates: {
@@ -319,7 +308,7 @@ class CustomElement extends HTMLElement {
319
308
  * @returns {CustomElement}
320
309
  */
321
310
  attachObserver(observer) {
322
- this[internalDataSymbol].attachObserver(observer)
311
+ this[internalSymbol].attachObserver(observer)
323
312
  return this;
324
313
  }
325
314
 
@@ -330,7 +319,7 @@ class CustomElement extends HTMLElement {
330
319
  * @returns {CustomElement}
331
320
  */
332
321
  detachObserver(observer) {
333
- this[internalDataSymbol].detachObserver(observer)
322
+ this[internalSymbol].detachObserver(observer)
334
323
  return this;
335
324
  }
336
325
 
@@ -339,7 +328,7 @@ class CustomElement extends HTMLElement {
339
328
  * @returns {ProxyObserver}
340
329
  */
341
330
  containsObserver(observer) {
342
- return this[internalDataSymbol].containsObserver(observer)
331
+ return this[internalSymbol].containsObserver(observer)
343
332
  }
344
333
 
345
334
  /**
@@ -354,7 +343,7 @@ class CustomElement extends HTMLElement {
354
343
  let value;
355
344
 
356
345
  try {
357
- value = new Pathfinder(this[internalDataSymbol].getRealSubject()['options']).getVia(path);
346
+ value = new Pathfinder(this[internalSymbol].getRealSubject()['options']).getVia(path);
358
347
  } catch (e) {
359
348
 
360
349
  }
@@ -372,7 +361,7 @@ class CustomElement extends HTMLElement {
372
361
  * @since 1.14.0
373
362
  */
374
363
  setOption(path, value) {
375
- new Pathfinder(this[internalDataSymbol].getSubject()['options']).setVia(path, value);
364
+ new Pathfinder(this[internalSymbol].getSubject()['options']).setVia(path, value);
376
365
  return this;
377
366
  }
378
367
 
@@ -388,7 +377,7 @@ class CustomElement extends HTMLElement {
388
377
  }
389
378
 
390
379
  const self = this;
391
- extend(self[internalDataSymbol].getSubject()['options'], self.defaults, options);
380
+ extend(self[internalSymbol].getSubject()['options'], self.defaults, options);
392
381
 
393
382
  return self;
394
383
  }
@@ -446,16 +435,10 @@ class CustomElement extends HTMLElement {
446
435
  nodeList = elements
447
436
  }
448
437
 
449
- assignUpdaterToElement.call(self, nodeList, clone(self[internalDataSymbol].getRealSubject()['options']));
450
-
451
- if (self.hasAttribute('disabled')) {
452
- self.setOption('disabled', true);
453
- }
454
-
438
+ assignUpdaterToElement.call(self, nodeList, clone(self[internalSymbol].getRealSubject()['options']));
455
439
  return self;
456
440
  }
457
441
 
458
-
459
442
  /**
460
443
  * Called every time the element is inserted into the DOM. Useful for running setup code, such as
461
444
  * fetching resources or rendering. Generally, you should try to delay work until this time.
@@ -465,7 +448,7 @@ class CustomElement extends HTMLElement {
465
448
  */
466
449
  connectedCallback() {
467
450
  let self = this;
468
- if (!hasObjectLink(self, objectLinkSymbol)) {
451
+ if (!hasObjectLink(self, objectUpdaterLinkSymbol)) {
469
452
  self[assembleMethodSymbol]()
470
453
  }
471
454
  }
@@ -504,8 +487,10 @@ class CustomElement extends HTMLElement {
504
487
  attributeChangedCallback(attrName, oldVal, newVal) {
505
488
  const self = this;
506
489
 
507
- if (attrName === ATTRIBUTE_OPTIONS) {
508
- self.setOptions(newVal);
490
+ const callback = self[attributeObserverSymbol]?.[attrName];
491
+
492
+ if (isFunction(callback)) {
493
+ callback.call(self, newVal, oldVal);
509
494
  }
510
495
 
511
496
  }
@@ -520,7 +505,6 @@ class CustomElement extends HTMLElement {
520
505
  hasNode(node) {
521
506
  const self = this;
522
507
 
523
-
524
508
  if (containChildNode.call(self, validateInstance(node, Node))) {
525
509
  return true;
526
510
  }
@@ -536,19 +520,43 @@ class CustomElement extends HTMLElement {
536
520
  }
537
521
 
538
522
  /**
523
+ * @private
524
+ * @param {String} filter
525
+ * @return {*}
539
526
  * @this CustomElement
540
527
  * @since 1.23.0
541
- * @private
542
528
  */
543
- function getSlottedElements() {
529
+ function getSlottedElements(filter) {
544
530
  const self = this;
545
- const slots = self.shadowRoot.querySelectorAll('slot');
546
-
547
531
  const result = new Set;
548
532
 
533
+
534
+ if (!(self.shadowRoot instanceof ShadowRoot)) {
535
+ return result;
536
+ }
537
+
538
+ const slots = self.shadowRoot.querySelectorAll('slot');
539
+
549
540
  for (const [, slot] of Object.entries(slots)) {
550
- result.append(...slot.assignedNodes())
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
+ })
551
558
  }
559
+
552
560
  return result;
553
561
  }
554
562
 
@@ -593,63 +601,70 @@ function initOptionObserver() {
593
601
  return;
594
602
  }
595
603
 
596
- if (self.shadowRoot instanceof ShadowRoot) {
597
- const found = self.shadowRoot.querySelectorAll('button, command, fieldset, keygen, optgroup, option, select, textarea, input, [data-monster-objectlink]');
598
- for (const [, element] of Object.entries(found)) {
599
- if (flag === true) {
600
- element.setAttribute('disabled', '');
601
- } else {
602
- element.removeAttribute('disabled');
603
- }
604
+ lastDisabledValue = flag;
604
605
 
605
- }
606
+ if (!(self.shadowRoot instanceof ShadowRoot)) {
607
+ return;
606
608
  }
607
609
 
608
- 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
+ }
609
630
 
610
631
  }));
611
632
 
612
633
  self.attachObserver(new Observer(function () {
613
634
 
614
635
  // not initialised
615
- if (!hasObjectLink(self, Symbol.for(OBJECTLINK_KEY_UPDATER))) {
636
+ if (!hasObjectLink(self, objectUpdaterLinkSymbol)) {
616
637
  return;
617
638
  }
618
639
  // inform every element
619
- const updaters = getLinkedObjects(self, Symbol.for(OBJECTLINK_KEY_UPDATER));
640
+ const updaters = getLinkedObjects(self, objectUpdaterLinkSymbol);
620
641
 
621
642
  for (const list of updaters) {
622
643
  for (const updater of list) {
623
- let d = clone(self[internalDataSymbol].getRealSubject()['options']);
644
+ let d = clone(self[internalSymbol].getRealSubject()['options']);
624
645
  Object.assign(updater.getSubject(), d);
625
646
  }
626
647
  }
627
648
 
628
649
  }));
629
650
 
630
- const observer = new MutationObserver(function (mutationsList, observer) {
631
-
632
- for (const mutation of mutationsList) {
633
- if (mutation.type === 'attributes') {
634
-
635
- switch (mutation?.attributeName) {
636
- case 'disabled':
637
- self.setOption('disabled', self.hasAttribute('disabled') ? true : undefined);
638
- break;
639
- case ATTRIBUTE_OPTIONS:
640
- const options = getOptionsFromAttributes.call(self);
641
- if (isObject(options)) {
642
- self.setOptions(options);
643
- }
644
-
645
- break;
646
- }
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
+ }
647
659
 
648
- }
660
+ // data-monster-options
661
+ self[attributeObserverSymbol][ATTRIBUTE_OPTIONS] = () => {
662
+ const options = getOptionsFromAttributes.call(self);
663
+ if (isObject(options)) {
664
+ self.setOptions(options);
649
665
  }
650
- });
666
+ }
651
667
 
652
- observer.observe(this, {attributes: true, attributeOldValue: true, childList: false, subtree: false});
653
668
 
654
669
  }
655
670
 
@@ -807,14 +822,13 @@ function registerCustomElement(element) {
807
822
  *
808
823
  * @param element
809
824
  * @param object
810
- * @return {*}
825
+ * @return {Promise[]}
811
826
  * @since 1.23.0
827
+ * @memberOf Monster.DOM
812
828
  */
813
829
  function assignUpdaterToElement(elements, object) {
814
830
 
815
- const updater = new Set;
816
-
817
- addToObjectLink(this, objectLinkSymbol, updater);
831
+ const updaters = new Set;
818
832
 
819
833
  if (elements instanceof NodeList) {
820
834
  elements = new Set([
@@ -822,20 +836,35 @@ function assignUpdaterToElement(elements, object) {
822
836
  ])
823
837
  }
824
838
 
839
+ let result = [];
840
+
825
841
  elements.forEach((element) => {
826
842
  if (!(element instanceof HTMLElement)) return;
827
843
  if ((element instanceof HTMLTemplateElement)) return;
844
+
828
845
  const u = new Updater(element, object)
829
- updater.add(u);
846
+ updaters.add(u);
830
847
 
831
- u.run().then(() => {
832
- u.enableEventProcessing();
833
- });
848
+ result.push(u.run().then(() => {
849
+ return u.enableEventProcessing();
850
+ }));
834
851
 
835
852
  });
836
853
 
837
- return updater;
854
+ if (updaters.size > 0) {
855
+ addToObjectLink(this, objectUpdaterLinkSymbol, updaters);
856
+ }
857
+
858
+ return result;
838
859
  }
839
860
 
840
861
  assignToNamespace('Monster.DOM', CustomElement, registerCustomElement, assignUpdaterToElement);
841
- export {Monster, registerCustomElement, CustomElement, initMethodSymbol, assembleMethodSymbol, 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.23.0/dist/modules/dom/events.js';
16
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/monster.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.23.0/dist/modules/dom/events.js';
25
+ * import {fireEvent} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/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.23.0/dist/modules/dom/events.js';
76
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/monster.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.23.0/dist/modules/dom/events.js';
85
+ * import {findTargetElementFromEvent} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/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
  }