@twobirds/microcomponents 0.0.83 → 0.0.84

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 (194) hide show
  1. package/assets/test/test.html +1 -1
  2. package/dist/MC.d.ts +10 -9
  3. package/dist/MC.d.ts.map +1 -1
  4. package/dist/MC.js +126 -158
  5. package/dist/MC.min.js +146 -254
  6. package/dist/MC.ts +182 -241
  7. package/dist/elements.d.ts.map +1 -1
  8. package/dist/elements.js +10 -4
  9. package/dist/elements.min.js +1 -1
  10. package/dist/elements.ts +17 -4
  11. package/dist/formValues.js +2 -2
  12. package/dist/formValues.min.js +1 -1
  13. package/dist/formValues.ts +3 -3
  14. package/dist/microcomponents.d.ts +0 -1
  15. package/dist/microcomponents.d.ts.map +1 -1
  16. package/dist/microcomponents.js +0 -1
  17. package/dist/microcomponents.min.js +1 -1
  18. package/dist/microcomponents.ts +1 -1
  19. package/dist/observables.d.ts.map +1 -1
  20. package/dist/observables.js +14 -12
  21. package/dist/observables.min.js +1 -1
  22. package/dist/observables.ts +32 -32
  23. package/package.json +1 -1
  24. package/public/MC.d.ts +10 -9
  25. package/public/MC.d.ts.map +1 -1
  26. package/public/MC.js +126 -158
  27. package/public/MC.js.map +1 -1
  28. package/public/MC.min.js +146 -254
  29. package/public/MC.ts +182 -241
  30. package/public/elements.d.ts.map +1 -1
  31. package/public/elements.js +10 -4
  32. package/public/elements.js.map +1 -1
  33. package/public/elements.min.js +1 -1
  34. package/public/elements.ts +17 -4
  35. package/public/formValues.js +2 -2
  36. package/public/formValues.js.map +1 -1
  37. package/public/formValues.min.js +1 -1
  38. package/public/formValues.ts +3 -3
  39. package/public/microcomponents.d.ts +0 -1
  40. package/public/microcomponents.d.ts.map +1 -1
  41. package/public/microcomponents.js +0 -1
  42. package/public/microcomponents.js.map +1 -1
  43. package/public/microcomponents.min.js +1 -1
  44. package/public/microcomponents.ts +1 -1
  45. package/public/observables.d.ts.map +1 -1
  46. package/public/observables.js +14 -12
  47. package/public/observables.js.map +1 -1
  48. package/public/observables.min.js +1 -1
  49. package/public/observables.ts +32 -32
  50. package/public/src/MC.d.ts +10 -9
  51. package/public/src/MC.d.ts.map +1 -1
  52. package/public/src/MC.js +126 -158
  53. package/public/src/MC.js.map +1 -1
  54. package/public/src/MC.ts +182 -241
  55. package/public/src/elements.d.ts.map +1 -1
  56. package/public/src/elements.js +10 -4
  57. package/public/src/elements.js.map +1 -1
  58. package/public/src/elements.ts +17 -4
  59. package/public/src/formValues.js +2 -2
  60. package/public/src/formValues.js.map +1 -1
  61. package/public/src/formValues.ts +3 -3
  62. package/public/src/microcomponents.d.ts +0 -1
  63. package/public/src/microcomponents.d.ts.map +1 -1
  64. package/public/src/microcomponents.js +0 -1
  65. package/public/src/microcomponents.js.map +1 -1
  66. package/public/src/microcomponents.ts +1 -1
  67. package/public/src/observables.d.ts.map +1 -1
  68. package/public/src/observables.js +14 -12
  69. package/public/src/observables.js.map +1 -1
  70. package/public/src/observables.ts +32 -32
  71. package/public/src/test/test/grandparent.d.ts.map +1 -1
  72. package/public/src/test/test/grandparent.js +1 -1
  73. package/public/src/test/test/grandparent.js.map +1 -1
  74. package/public/src/test/test/grandparent.ts +12 -4
  75. package/public/src/test/test/testform.js +1 -1
  76. package/public/src/test/test/testform.js.map +1 -1
  77. package/public/src/test/test/testform.ts +6 -8
  78. package/public/src/test/test.js +5 -4
  79. package/public/src/test/test.js.map +1 -1
  80. package/public/src/test/test.ts +8 -8
  81. package/public/test/MC.d.ts +10 -9
  82. package/public/test/MC.d.ts.map +1 -1
  83. package/public/test/MC.js +126 -158
  84. package/public/test/MC.min.js +146 -254
  85. package/public/test/MC.ts +182 -241
  86. package/public/test/elements.d.ts.map +1 -1
  87. package/public/test/elements.js +10 -4
  88. package/public/test/elements.min.js +1 -1
  89. package/public/test/elements.ts +17 -4
  90. package/public/test/formValues.js +2 -2
  91. package/public/test/formValues.min.js +1 -1
  92. package/public/test/formValues.ts +3 -3
  93. package/public/test/microcomponents.d.ts +0 -1
  94. package/public/test/microcomponents.d.ts.map +1 -1
  95. package/public/test/microcomponents.js +0 -1
  96. package/public/test/microcomponents.min.js +1 -1
  97. package/public/test/microcomponents.ts +1 -1
  98. package/public/test/observables.d.ts.map +1 -1
  99. package/public/test/observables.js +14 -12
  100. package/public/test/observables.min.js +1 -1
  101. package/public/test/observables.ts +32 -32
  102. package/public/test/test/grandparent.d.ts.map +1 -1
  103. package/public/test/test/grandparent.js +1 -1
  104. package/public/test/test/grandparent.js.map +1 -1
  105. package/public/test/test/grandparent.ts +12 -4
  106. package/public/test/test/testform.js +1 -1
  107. package/public/test/test/testform.js.map +1 -1
  108. package/public/test/test/testform.ts +6 -8
  109. package/public/test/test.html +1 -1
  110. package/public/test/test.js +5 -4
  111. package/public/test/test.js.map +1 -1
  112. package/public/test/test.ts +8 -8
  113. package/public/typedoc/assets/navigation.js +1 -1
  114. package/public/typedoc/assets/search.js +1 -1
  115. package/public/typedoc/classes/MC.DC.html +6 -4
  116. package/public/typedoc/classes/MC.MC.html +3 -4
  117. package/public/typedoc/classes/MC.McBase.html +3 -4
  118. package/public/typedoc/functions/MC.autoload.html +1 -1
  119. package/public/typedoc/functions/MC.off.html +1 -0
  120. package/public/typedoc/functions/MC.on.html +1 -0
  121. package/public/typedoc/functions/MC.one.html +1 -0
  122. package/public/typedoc/functions/elements.defineCE.html +1 -1
  123. package/public/typedoc/functions/elements.getCE.html +1 -1
  124. package/public/typedoc/functions/formValues.formValues.html +1 -1
  125. package/public/typedoc/functions/observables.observe.html +1 -1
  126. package/public/typedoc/interfaces/MC.HTMLMcElement.html +2 -2
  127. package/public/typedoc/modules/MC.html +7 -6
  128. package/public/typedoc/modules/elements.html +1 -1
  129. package/public/typedoc/modules/formValues.html +1 -1
  130. package/public/typedoc/modules/observables.html +1 -1
  131. package/public/typedoc/modules.html +0 -1
  132. package/public/typedoc/types/observables.Observable.html +1 -1
  133. package/src/MC.ts +182 -241
  134. package/src/elements.ts +17 -4
  135. package/src/formValues.ts +3 -3
  136. package/src/microcomponents.ts +1 -1
  137. package/src/observables.ts +32 -32
  138. package/src/test/test/grandparent.ts +12 -4
  139. package/src/test/test/testform.ts +6 -8
  140. package/src/test/test.ts +8 -8
  141. package/tsconfig.json +2 -2
  142. package/typedoc.json +1 -1
  143. package/webpack.config.js +2 -2
  144. package/dist/McEvent.d.ts +0 -15
  145. package/dist/McEvent.d.ts.map +0 -1
  146. package/dist/McEvent.js +0 -71
  147. package/dist/selectors.d.ts +0 -106
  148. package/dist/selectors.d.ts.map +0 -1
  149. package/dist/selectors.js +0 -759
  150. package/dist/selectors.min.js +0 -1
  151. package/public/McEvent.d.ts +0 -15
  152. package/public/McEvent.d.ts.map +0 -1
  153. package/public/McEvent.js +0 -71
  154. package/public/McEvent.js.map +0 -1
  155. package/public/selectors.d.ts +0 -106
  156. package/public/selectors.d.ts.map +0 -1
  157. package/public/selectors.js +0 -759
  158. package/public/selectors.js.map +0 -1
  159. package/public/selectors.min.js +0 -1
  160. package/public/src/McEvent.d.ts +0 -15
  161. package/public/src/McEvent.d.ts.map +0 -1
  162. package/public/src/McEvent.js +0 -71
  163. package/public/src/McEvent.js.map +0 -1
  164. package/public/src/selectors.d.ts +0 -106
  165. package/public/src/selectors.d.ts.map +0 -1
  166. package/public/src/selectors.js +0 -759
  167. package/public/src/selectors.js.map +0 -1
  168. package/public/test/McEvent.d.ts +0 -15
  169. package/public/test/McEvent.d.ts.map +0 -1
  170. package/public/test/McEvent.js +0 -71
  171. package/public/test/McEvent.ts +0 -96
  172. package/public/test/selectors.d.ts +0 -106
  173. package/public/test/selectors.d.ts.map +0 -1
  174. package/public/test/selectors.js +0 -759
  175. package/public/test/selectors.min.js +0 -1
  176. package/public/test/selectors.ts +0 -1269
  177. package/public/typedoc/classes/MC.McEvent.html +0 -9
  178. package/public/typedoc/functions/MC.addListener.html +0 -1
  179. package/public/typedoc/functions/MC.removeListener.html +0 -1
  180. package/public/typedoc/functions/selectors._d.html +0 -1
  181. package/public/typedoc/functions/selectors._t.html +0 -1
  182. package/public/typedoc/interfaces/selectors.DSelector.html +0 -48
  183. package/public/typedoc/interfaces/selectors.TSelector.html +0 -34
  184. package/public/typedoc/modules/selectors.html +0 -7
  185. package/public/typedoc/types/selectors.selection.html +0 -1
  186. package/public/typedoc/types/selectors.singleSelector.html +0 -1
  187. package/src/McEvent.ts +0 -96
  188. package/src/selectors.ts +0 -1269
  189. /package/{dist/McEvent.ts → public/McEvent._ts} +0 -0
  190. /package/{dist/selectors.ts → public/selectors._ts} +0 -0
  191. /package/public/{McEvent.ts → src/McEvent._ts} +0 -0
  192. /package/public/{selectors.ts → src/selectors._ts} +0 -0
  193. /package/{public/src/McEvent.ts → src/McEvent._ts} +0 -0
  194. /package/{public/src/selectors.ts → src/selectors._ts} +0 -0
package/public/src/MC.ts CHANGED
@@ -1,19 +1,20 @@
1
1
  'use strict';
2
2
 
3
3
  import { LooseObject } from './helpers.js';
4
- import { McEvent } from './McEvent.js';
5
4
 
6
5
  var isBrowser = new Function(
7
6
  'try {return this===window;}catch(e){ return false;}'
8
7
  );
9
8
 
10
- let nativeEventNames: Set<string> = new Set();
11
-
12
- // HTMLElement native event names
13
- if (isBrowser()) {
14
- Object.keys(HTMLElement.prototype)
15
- .filter((key) => /^on/.test(key))
16
- .forEach((eventName) => nativeEventNames.add(eventName));
9
+ // get HTMLElement native event names
10
+ function getNativeEventNames( domNode: HTMLElement ): string[] {
11
+ let nativeEventNames: Array<string> = [];
12
+ if (isBrowser()) {
13
+ Object.keys(HTMLElement.prototype)
14
+ .filter((key) => /^on/.test(key))
15
+ .forEach((eventName) => nativeEventNames.push(eventName));
16
+ }
17
+ return nativeEventNames;
17
18
  }
18
19
 
19
20
  export interface HTMLMcElement extends HTMLElement {
@@ -64,34 +65,6 @@ function isDOM(element: { [key: string]: any }) {
64
65
  return element && element instanceof HTMLElement;
65
66
  }
66
67
 
67
- function addListener(
68
- domNode: Node,
69
- eventName: string,
70
- handler: EventListenerOrEventListenerObject | null,
71
- capture: boolean = false,
72
- once: boolean = false
73
- ) {
74
- let options: EventListenerOptions & { once: boolean } = { once: false };
75
- if (capture) {
76
- options.capture = capture;
77
- }
78
-
79
- if (once) {
80
- options.once = once;
81
- }
82
-
83
- //console.log( 'addEventListener', eventName, ( handler as Function ).name, options );
84
- domNode.addEventListener(eventName, handler, options);
85
- }
86
-
87
- function removeListener(
88
- domNode: Node,
89
- eventName: string,
90
- handler: EventListenerOrEventListenerObject | null
91
- ) {
92
- domNode.removeEventListener(eventName, handler);
93
- }
94
-
95
68
  // add a microcomponent to a target DOM node
96
69
  function add(target: HTMLElement, key: string, element = {}): any {
97
70
  let node = target as HTMLMcElement;
@@ -111,8 +84,8 @@ function add(target: HTMLElement, key: string, element = {}): any {
111
84
  if (key.length && !_mc[key]) {
112
85
  _mc[key] = element;
113
86
  // add attribute if HTMLElement
114
- if (target instanceof HTMLElement && ! target.getAttribute('_mc') ) {
115
- target.setAttribute('_mc', '');
87
+ if (target instanceof HTMLElement && ! target.getAttribute('data-mc') ) {
88
+ target.setAttribute('data-mc', '');
116
89
  }
117
90
  }
118
91
  return element;
@@ -133,44 +106,13 @@ function remove(target: HTMLMcElement, key: string) {
133
106
  if (
134
107
  !Object.keys(_mc).length &&
135
108
  target instanceof HTMLElement &&
136
- target.hasAttribute('_mc')
109
+ target.hasAttribute('data-mc')
137
110
  ) {
138
- target.removeAttribute('_mc');
111
+ target.removeAttribute('data-mc');
139
112
  }
140
113
  return;
141
114
  }
142
115
 
143
- // trigger an event
144
- function trigger(
145
- target: HTMLElement,
146
- ev: McEvent | string,
147
- data: any = {},
148
- bubble: string = 'l'
149
- ) {
150
- let _mc = (target as any)?._mc;
151
- if (!_mc) return;
152
-
153
- let event =
154
- ev instanceof McEvent
155
- ? new McEvent(ev.type, ev.data, 'l')
156
- : new McEvent(ev, data, 'l'),
157
- mcEvent: McEvent =
158
- typeof ev !== 'string' ? (ev as McEvent) : new McEvent(ev, data, bubble);
159
-
160
- [...Object.values(_mc)].forEach((mc: any) => {
161
- //console.log( 'mc [', mc.constructor.name, ']', mc.constructor.prototype?.oneInit );
162
- if ((mc as any)?.trigger && typeof (mc as any)?.trigger === 'function') {
163
- (mc as any)?.trigger(event);
164
- }
165
- });
166
-
167
- if (/[ud]/.test(mcEvent.bubble)) {
168
- bubbleEvent(target, mcEvent);
169
- }
170
-
171
- return;
172
- }
173
-
174
116
  // run the "init" lifecycle event on the complete _mc structure
175
117
  function init(element: MC | DC) {
176
118
  if (element.constructor === DC) return;
@@ -193,6 +135,77 @@ function init(element: MC | DC) {
193
135
  }, 0);
194
136
  }
195
137
 
138
+ function getMcEventName( eventName: string ): string {
139
+ return '_mc' + eventName[0].toUpperCase() + eventName.substring(1);
140
+ }
141
+
142
+ /*
143
+ CustomEvent Section...
144
+ */
145
+ function off( domNode: Node, eventName: string, handler: EventListenerOrEventListenerObject ){
146
+ domNode.removeEventListener( getMcEventName(eventName), handler );
147
+ }
148
+
149
+ function on( domNode: Node, eventName: string, handler: EventListenerOrEventListenerObject, once: boolean = false ) {
150
+ domNode.addEventListener( getMcEventName(eventName), handler, { capture: false, once });
151
+ }
152
+
153
+ function one( domNode: Node, eventName: string, handler: EventListenerOrEventListenerObject ) {
154
+ on(domNode, eventName, handler, true );
155
+ }
156
+
157
+ // create and dispatch custom event
158
+ function trigger(
159
+ domNode: HTMLElement,
160
+ event: CustomEvent | string,
161
+ data: any = {},
162
+ bubble: string = 'l'
163
+ ){
164
+ const ev = typeof event === 'string'
165
+ ? new CustomEvent( getMcEventName( event ), { detail: {data, bubble} } )
166
+ : event;
167
+
168
+ // execute locally if 'l' or nothing is given as bubble
169
+ if( bubble.length && bubble.indexOf('l') > -1 ){
170
+ domNode.dispatchEvent( ev );
171
+ }
172
+
173
+ // bubble if up or down is indicated
174
+ if( /[u|d]/.test( bubble ) ){
175
+ bubbleEvent( domNode, ev );
176
+ }
177
+ }
178
+
179
+ function bubbleEvent( domNode: HTMLElement, ev: CustomEvent) {
180
+ // at this point, either 'u' or 'd' bubbling should be indicated
181
+ // event bubbling is asynchronous!
182
+ setTimeout(() => {
183
+
184
+ // add missing 'l', or else no handlers are executed
185
+ if (ev.detail.bubble.indexOf('l') === -1) {
186
+ ev.detail.bubble += 'l';
187
+ }
188
+
189
+ // bubble up towards root
190
+ if (ev.detail.bubble.indexOf('u') > -1 ) {
191
+ domNode.closest('[data-mc]')?.dispatchEvent( ev );
192
+ }
193
+
194
+ // bubble down
195
+ if (ev.detail.bubble.indexOf('d') > -1) {
196
+ let targets = new Set<HTMLMcElement>(
197
+ (domNode as HTMLMcElement)._mc
198
+ .children()
199
+ .map((c: unknown) => (c as any)?.target)
200
+ );
201
+ targets.forEach((target: HTMLMcElement) => {
202
+ if (target) DC.trigger(target, ev);
203
+ });
204
+ }
205
+
206
+ }, 0);
207
+ }
208
+
196
209
  function autoAttachListeners(element: MC | DC) {
197
210
  if (!isBrowser() || element.constructor === DC) return;
198
211
 
@@ -209,70 +222,39 @@ function autoAttachListeners(element: MC | DC) {
209
222
  .forEach((key) => {
210
223
  let once = /^one/.test(key),
211
224
  withoutOnOne = key.replace(/^on[e]{0,1}/, ''), // preserves upper/lowercase for non-native events
212
- nativeEventName = withoutOnOne.toLowerCase(),
213
- listener = (ev: McEvent | Event | CustomEvent) => {
214
- that.trigger(withoutOnOne, ev);
215
- };
216
- if (once) {
217
- // console.log( '...is only called once', that.constructor.prototype[key] );
218
- Object.defineProperty(element, 'on' + withoutOnOne, {
219
- configurable: true,
220
- enumerable: false,
221
- writable: true,
222
- value: (ev: any) => {
223
- // console.log( 'onceHandler execute:', that.constructor.prototype[key] );
224
- that.constructor.prototype[key].bind(that)(ev);
225
- },
226
- });
227
- }
225
+ nativeEventName = withoutOnOne.toLowerCase(); // lowercase for native event names
228
226
 
229
- if (nativeEventNames.has('on' + nativeEventName)) {
230
- // native event defined in HTMLElement
231
- // console.log('added as native listener', target, nativeEventName );
232
- addListener(target, nativeEventName, listener, false, once);
227
+ let listener = (ev: Event | CustomEvent) => {
228
+ that[key]( ev );
229
+ }
230
+
231
+ if ( !!( target as any )['on' + nativeEventName] ) {
232
+ // it is a native HTML event
233
+ //console.log( 'AAL: attach native event listener', nativeEventName, 'to', target );
234
+ target.addEventListener( nativeEventName, listener);
235
+ } else {
236
+ // it is a customEvent
237
+ //console.log( 'AAL: attach custom event listener', '_mc' + withoutOnOne , 'to key', key, 'in', element );
238
+ on( target, withoutOnOne, listener, once );
233
239
  }
234
240
  });
235
241
  }
236
242
  }
237
243
 
238
- function bubbleEvent(target: HTMLElement, ev: McEvent) {
239
- // at this point, either 'u' or 'd' bubbling should be indicated
240
- // mcEvent bubbling is asynchronous, and the order of target MC execution in case of multiple matches is not guaranteed!
241
- if (/[ud]/.test(ev.bubble)) {
242
- setTimeout(() => {
243
- // bubbling must include 'l' for local, or else no handlers are executed'
244
- if (ev.bubble.indexOf('l') === -1) {
245
- ev.bubble += 'l';
246
- }
247
-
248
- // bubble up towards root
249
- if (ev.bubble.indexOf('u') > -1) {
250
- let parent = traverseNodes(target, '', true)?.[0].target;
251
- if (parent) DC.trigger(parent, ev);
252
- }
253
-
254
- // bubble down
255
- if (ev.bubble.indexOf('d') > -1) {
256
- let targets = new Set<HTMLMcElement>(
257
- (target as HTMLMcElement)._mc
258
- .children()
259
- .map((c: unknown) => (c as any)?.target)
260
- );
261
- targets.forEach((target: HTMLMcElement) => {
262
- if (target) DC.trigger(target, ev);
263
- });
264
- }
265
- }, 0);
266
- }
244
+ function getMcChildNodes(domNode: HTMLElement): NodeListOf<Element> {
245
+ const id = Math.random().toString().replace('.', '');
246
+ const selector = '[data-mc]:not([temp_id="' + id + '"] [data-mc] [data-mc])';
247
+ domNode.setAttribute('temp_id', id);
248
+ const myDomElements = domNode.querySelectorAll(selector);
249
+ domNode.removeAttribute('temp_id');
250
+ return myDomElements;
267
251
  }
268
252
 
269
253
  class McBase {
270
254
  private _target: WeakRef<any>; // avoid circular reference
271
- private __mc: LooseObject = {};
272
255
 
273
256
  constructor(target?: { [key: string]: any }, debug: boolean = false) {
274
- let that: unknown = this,
275
- element = that as MC | DC;
257
+ let element = this as unknown as MC | DC;
276
258
 
277
259
  this._target = new WeakRef(target || {});
278
260
 
@@ -285,9 +267,6 @@ class McBase {
285
267
  return this._target.deref();
286
268
  }
287
269
 
288
- get _mc(): any {
289
- return this.__mc;
290
- }
291
270
  }
292
271
 
293
272
  class MC extends McBase {
@@ -296,73 +275,9 @@ class MC extends McBase {
296
275
  }
297
276
 
298
277
  static trigger = trigger;
299
-
300
- trigger(ev: McEvent | string, data: any = {}, bubble: string = 'l') {
301
- let that = this;
302
-
303
- //console.log( that, '.trigger(', ev, data, bubble, ')' );
304
-
305
- // run all triggers
306
- if (that.constructor === MC || that.constructor === DC) {
307
- let event =
308
- ev instanceof McEvent
309
- ? new McEvent(ev.type, ev.data, 'l')
310
- : new McEvent(ev, data, 'l'),
311
- mcEvent: McEvent =
312
- typeof ev !== 'string'
313
- ? (ev as McEvent)
314
- : new McEvent(ev, data, bubble);
315
- [...Object.getOwnPropertyNames(that)].forEach((mc) => {
316
- if (
317
- (that as any)[mc]?.trigger &&
318
- typeof (that as any)[mc]?.trigger === 'function'
319
- ) {
320
- (that as any)[mc]?.trigger(event);
321
- }
322
- });
323
-
324
- if (/[ud]/.test(mcEvent.bubble)) {
325
- bubbleEvent(that.target, mcEvent);
326
- }
327
-
328
- return; // must return here!
329
- }
330
-
331
- // only this instance
332
- if ((that as any) instanceof MC || (that as any) instanceof DC) {
333
- const that = this,
334
- mcEvent: McEvent =
335
- typeof ev !== 'string'
336
- ? (ev as McEvent)
337
- : new McEvent(ev, data, bubble),
338
- handlerName =
339
- 'on' + mcEvent.type[0].toUpperCase() + mcEvent.type.slice(1);
340
- // console.log('trigger', handlerName, mcEvent, data, bubble );
341
-
342
- if (mcEvent.bubble.indexOf('l') > -1) {
343
- if (
344
- !mcEvent.immediateStopped &&
345
- typeof (that as any)[handlerName] === 'function'
346
- ) {
347
- // console.log( 'execute handler:', handlerName );
348
- (that as any)[handlerName](mcEvent);
349
- if ((that as any).hasOwnProperty(handlerName)) {
350
- // it is a once handler
351
- delete (that as any)[handlerName]; // remove after first execution
352
- }
353
- }
354
- }
355
-
356
- // if event stopped or local only, handling is cancelled
357
- if (mcEvent.stopped || mcEvent.bubble === 'l') {
358
- return that;
359
- }
360
-
361
- //console.log('bubble', mcEvent);
362
- if (/[ud]/.test(mcEvent.bubble)) {
363
- bubbleEvent(that.target, mcEvent);
364
- }
365
- }
278
+
279
+ trigger(ev: string, data: any = {}, bubble: string = 'l') {
280
+ // TBD
366
281
  }
367
282
  }
368
283
 
@@ -375,8 +290,23 @@ class DC extends McBase {
375
290
  static remove: Function = remove;
376
291
  static trigger: Function = trigger;
377
292
 
378
- trigger(ev: McEvent | string, data: any = {}, bubble?: string) {
379
- MC.prototype.trigger.call(this, ev, data, bubble);
293
+ off( eventName: string, handler: EventListenerOrEventListenerObject ) {
294
+ off( this.target, eventName, handler );
295
+ }
296
+
297
+ on( eventName: string, handler: EventListenerOrEventListenerObject ) {
298
+ on( this.target, eventName, handler );
299
+ }
300
+
301
+ one( eventName: string, handler: EventListenerOrEventListenerObject ) {
302
+ one( this.target, eventName, handler );
303
+ }
304
+
305
+ trigger(ev: CustomEvent | string, data: any = {}, bubble: string = 'l') {
306
+ if ( typeof ev === 'string' ){
307
+
308
+ }
309
+ //trigger( this.target, ev, data, bubble);
380
310
  }
381
311
 
382
312
  parent(search: string = ''): any[] {
@@ -394,48 +324,29 @@ class DC extends McBase {
394
324
  children(search: string = ''): any[] {
395
325
  let target: any = (this as any)?.target;
396
326
  if (!isDOM(target)) return [];
397
- const id = Math.random().toString().replace('.', '');
398
- const selector = '[_mc]:not([temp_id="' + id + '"] [_mc] [_mc])';
399
- target.setAttribute('temp_id', id);
400
- const myDomElements = target.querySelectorAll(selector);
327
+ const myDomElements = getMcChildNodes(target);
401
328
  const mcValues = getMicroComponents([...myDomElements], search);
402
- target.removeAttribute('temp_id');
403
329
  return mcValues;
404
330
  }
405
331
 
406
332
  descendants(search: string = ''): any[] {
407
333
  let target: any = (this as any)?.target;
408
334
  if (!isDOM(target)) return [];
409
- const myDomElements = target.querySelectorAll('*[_mc]');
335
+ const myDomElements = target.querySelectorAll('*[data-mc]');
410
336
  return getMicroComponents([...myDomElements], search);
411
337
  }
412
338
  }
413
339
 
414
- const loadingMCs = new Set<string>();
340
+ const loadingDCs = new Set<string>();
415
341
 
416
- function makeLoadScript( element: string ) {
417
-
418
- if ( loadingMCs.has( element ) ) return; // already loading
419
-
420
- loadingMCs.add( element );
421
-
422
- //console.log( 'makeLoadScript:', element);
423
- const fileName: string = './' + element.split('-').join('/')+'.js';
424
-
425
- const se: HTMLScriptElement = document.createElement('script');
342
+ // this only applies to DCs defined in the data-mc attribute,
343
+ // since they need to be attached manually
344
+ function attachDC(element: string): Function {
426
345
 
427
- se.setAttribute('src', fileName);
428
- se.setAttribute('blocking', 'render');
429
- se.async = true;
430
- se.setAttribute('type', 'module');
431
- se.setAttribute( 'data-name', element);
432
- se.setAttribute( 'loading', '');
433
-
434
- const loadedPromise = customElements.whenDefined( element );
435
-
436
- loadedPromise.then( () => {
346
+ //@ts-ignore
347
+ return () => {
437
348
  const elements: HTMLElement[] = Array
438
- .from(document.querySelectorAll(`[_mc*="${element}"]`))
349
+ .from(document.querySelectorAll(`[data-mc*="${element}"]`))
439
350
  .filter( element => element instanceof HTMLElement );
440
351
 
441
352
  if ( elements.length === 0 ) return;
@@ -450,28 +361,53 @@ function makeLoadScript( element: string ) {
450
361
 
451
362
  //@ts-ignore
452
363
  const new_mc = node
453
- .getAttribute( '_mc' )
364
+ .getAttribute( 'data-mc' )
454
365
  .split(' ')
455
366
  .filter( (name) => name !== element && name !== '' )
456
- .join(' ');
367
+ .join(' ')
368
+ .trim();
457
369
 
458
370
  //@ts-ignore
459
371
  node.setAttribute(
460
- '_mc',
372
+ 'data-mc',
461
373
  //@ts-ignore
462
374
  new_mc
463
375
  )
464
376
  });
377
+ };
378
+ };
465
379
 
466
- document.head.querySelector('script[data-name="${elementName}]"')?.remove();
467
- });
380
+ function makeLoadScript( element: string ) {
381
+
382
+ if ( loadingDCs.has( element ) ) return; // already loading
383
+
384
+ loadingDCs.add( element );
385
+
386
+ //console.log( 'makeLoadScript:', element);
387
+ const fileName: string = './' + element.split('-').join('/')+'.js';
388
+
389
+ const se: HTMLScriptElement = document.createElement('script');
468
390
 
469
- addListener( se, 'load', (ev) => {
470
- loadingMCs.delete( element );
391
+ se.setAttribute('src', fileName);
392
+ se.setAttribute('blocking', 'render');
393
+ se.async = true;
394
+ se.setAttribute('type', 'module');
395
+ se.setAttribute( 'data-name', element);
396
+ se.setAttribute( 'loading', '');
397
+
398
+ const loadedPromise = customElements.whenDefined( element );
399
+
400
+ //@ts-ignore
401
+ loadedPromise.then( attachDC( element ) );
402
+
403
+ se.addEventListener( 'load', (ev: Event) => {
404
+ loadingDCs.delete( element );
405
+
406
+ document.head.querySelector(`script[data-name="${element}"]`)?.remove();
471
407
  });
472
408
 
473
- addListener( se, 'error', (ev) => {
474
- console.error('could not load MC code from', fileName);
409
+ se.addEventListener( 'error', (ev: Event) => {
410
+ console.error('could not load DC code from', fileName);
475
411
  });
476
412
 
477
413
  document.head.append(se);
@@ -483,21 +419,26 @@ function loadUndefinedMCs() {
483
419
  [ ...document.querySelectorAll(':not(:defined)') ]
484
420
  .filter( (element) => !!element
485
421
  && !customElements.get(element.tagName.toLowerCase()) // not in CustomElementsRegistry
486
- && !loadingMCs.has(element.tagName.toLowerCase()) // not in loading list
422
+ && !loadingDCs.has(element.tagName.toLowerCase()) // not in loading list
487
423
  )
488
424
  .forEach((el) => {
489
425
  //console.log( 'detected CE', el.tagName.toLowerCase() );
490
- makeLoadScript( el.tagName.toLowerCase() );
426
+ makeLoadScript( el.tagName.toLowerCase() ); // will automatically be instanciated
491
427
  });
492
428
 
493
- // load unresolved MCs defined in _mc attribute
494
- [ ...document.querySelectorAll('[_mc]:not([_mc=""]') ]
429
+ // if defined in _mc attribute: instanciate DCs, load if necessary
430
+ [ ...document.querySelectorAll('[data-mc]:not([data-mc=""]') ]
495
431
  .filter( (element) => !!element )
496
432
  .forEach((el) => {
497
- const _mc = el.getAttribute('_mc')?.split(' ').filter( name => name !== '' );
498
- _mc?.forEach( dc => {
433
+ const _mc = el.getAttribute('data-mc')?.split(' ').filter( name => name !== '' );
434
+ _mc?.forEach( element => {
499
435
  //console.log( 'detected DC', dc );
500
- makeLoadScript( dc );
436
+ const isDefined = customElements.get(element);
437
+ if ( !loadingDCs.has(element) && !isDefined ) {
438
+ makeLoadScript( element );
439
+ } else if ( isDefined ) {
440
+ attachDC(element)();
441
+ }
501
442
  });
502
443
  });
503
444
  }
@@ -526,7 +467,7 @@ function autoload(enable: boolean = true): boolean {
526
467
  return autoloadEnabled;
527
468
  }
528
469
 
529
- (autoload as LooseObject).state = { loadingMCs };
470
+ (autoload as LooseObject).state = loadingDCs;
530
471
 
531
- export { addListener, removeListener, McBase, MC, DC, McEvent, autoload };
472
+ export { McBase, MC, DC, autoload, on, one, off, trigger };
532
473
 
@@ -1 +1 @@
1
- {"version":3,"file":"elements.d.ts","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"AAuCA,wBAAgB,QAAQ,CACvB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;CAAE,GAAG,QAAQ,EACzD,kBAAkB,GAAE,MAAM,EAAO,QA2DjC;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS,CAE3E"}
1
+ {"version":3,"file":"elements.d.ts","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"AAoDA,wBAAgB,QAAQ,CACvB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;CAAE,GAAG,QAAQ,EACzD,kBAAkB,GAAE,MAAM,EAAO,QA2DjC;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS,CAE3E"}
@@ -6,16 +6,22 @@ class CeBaseClass extends HTMLElement {
6
6
  super();
7
7
  }
8
8
  connectedCallback() {
9
- DC.trigger(this, 'Connected');
9
+ this.dispatchEvent(new CustomEvent('_mcConnected'));
10
+ }
11
+ connectedMoveCallback() {
12
+ this.dispatchEvent(new CustomEvent('_mcConnectedMove'));
10
13
  }
11
14
  disconnectedCallback() {
12
- DC.trigger(this, 'Disconnected');
15
+ this.dispatchEvent(new CustomEvent('_mcDisconnected'));
13
16
  }
14
17
  adoptedCallback() {
15
- DC.trigger(this, 'Adopted');
18
+ this.dispatchEvent(new CustomEvent('_mcAdopted'));
16
19
  }
17
20
  attributeChangedCallback(name, oldValue, newValue) {
18
- DC.trigger(this, 'AttributeChanged', { name, oldValue, newValue });
21
+ this.dispatchEvent(new CustomEvent('_mcAttributeChanged', { detail: { name, oldValue, newValue } }));
22
+ }
23
+ formResetCallback() {
24
+ this.dispatchEvent(new CustomEvent('_mcFormReset'));
19
25
  }
20
26
  }
21
27
  function createNamedClass(name, ClassBody) {
@@ -1 +1 @@
1
- {"version":3,"file":"elements.js","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,WAAY,SAAQ,WAAW;IACpC;QACC,KAAK,EAAE,CAAC;IACT,CAAC;IAED,iBAAiB;QACf,EAAU,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACxC,CAAC;IAED,oBAAoB;QAClB,EAAU,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC3C,CAAC;IAED,eAAe;QACb,EAAU,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,wBAAwB,CAAC,IAAY,EAAE,QAAa,EAAE,QAAa;QACjE,EAAU,CAAC,OAAO,CAAC,IAAI,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC7E,CAAC;CACD;AAED,SAAS,gBAAgB,CACxB,IAAY,EACZ,SAAwC;IAExC,OAAO,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,OAAO,CAAC,IAAS;IACxB,OAAO,OAAO,IAAI,KAAK,UAAU;WAC5B,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,QAAQ,CACvB,OAAe,EACf,eAAyD,EACzD,qBAA+B,EAAE;IAEjC,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,4BAA4B,OAAO,uBAAuB,CAAC,CAAC;QACzE,OAAO;IACR,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACd,sEAAsE,CACtE,CAAC;IACH,CAAC;IAED,IAAI,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAGlC,IAAK,CAAC,OAAO,CAAE,eAAe,CAAC,SAAS,CAAC,WAAW,CAAE,EAAE,CAAC;QACxD,cAAc,CAAC,MAAM,CACpB,OAAO,EAEP,eAAe,CACf,CAAC;QACF,OAAO;IACR,CAAC;IAGD,IAAK,CAAC,CAAE,eAAe,CAAC,SAAS,YAAY,MAAM,CAAE,EAAE,CAAC;QACvD,cAAc,CAAC,MAAM,CACpB,OAAO,EAEP,eAAe,CACf,CAAC;QACF,OAAO;IACR,CAAC;IAGD,cAAc,CAAC,MAAM,CACpB,OAAO,EACP,gBAAgB,CACf,IAAI,EACJ,KAAM,SAAQ,WAAW;QACxB,QAAQ,CAAM;QAEd,YAAY,IAAU;YACrB,KAAK,EAAE,CAAC;YAER,MAAM,QAAQ,GAAG,OAAO,CAAE,eAAe,CAAE;gBAE1C,CAAC,CAAC,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;gBACjC,CAAC,CAAC,eAAe,CAAC;YACnB,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,KAAK,kBAAkB;YAC5B,OAAO,kBAAkB,CAAC;QAC3B,CAAC;KACD,CACD,CACD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe;IACpC,OAAO,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"elements.js","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,WAAY,SAAQ,WAAW;IACpC;QACC,KAAK,EAAE,CAAC;IACT,CAAC;IAED,iBAAiB;QAChB,IAAI,CAAC,aAAa,CAAE,IAAI,WAAW,CAAC,cAAc,CAAC,CAAE,CAAC;IACvD,CAAC;IAED,qBAAqB;QACpB,IAAI,CAAC,aAAa,CAAE,IAAI,WAAW,CAAC,kBAAkB,CAAC,CAAE,CAAC;IAC3D,CAAC;IAED,oBAAoB;QACnB,IAAI,CAAC,aAAa,CAAE,IAAI,WAAW,CAAC,iBAAiB,CAAC,CAAE,CAAC;IAC1D,CAAC;IAED,eAAe;QACd,IAAI,CAAC,aAAa,CAAE,IAAI,WAAW,CAAC,YAAY,CAAC,CAAE,CAAC;IACrD,CAAC;IAED,wBAAwB,CAAC,IAAY,EAAE,QAAa,EAAE,QAAa;QAClE,IAAI,CAAC,aAAa,CACjB,IAAI,WAAW,CACd,qBAAqB,EACrB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CACxC,CACD,CAAC;IACH,CAAC;IAED,iBAAiB;QAChB,IAAI,CAAC,aAAa,CAAE,IAAI,WAAW,CAAC,cAAc,CAAC,CAAE,CAAC;IACvD,CAAC;CACD;AAED,SAAS,gBAAgB,CACxB,IAAY,EACZ,SAAwC;IAExC,OAAO,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,OAAO,CAAC,IAAS;IACxB,OAAO,OAAO,IAAI,KAAK,UAAU;WAC5B,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,QAAQ,CACvB,OAAe,EACf,eAAyD,EACzD,qBAA+B,EAAE;IAEjC,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,4BAA4B,OAAO,uBAAuB,CAAC,CAAC;QACzE,OAAO;IACR,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACd,sEAAsE,CACtE,CAAC;IACH,CAAC;IAED,IAAI,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAGlC,IAAK,CAAC,OAAO,CAAE,eAAe,CAAC,SAAS,CAAC,WAAW,CAAE,EAAE,CAAC;QACxD,cAAc,CAAC,MAAM,CACpB,OAAO,EAEP,eAAe,CACf,CAAC;QACF,OAAO;IACR,CAAC;IAGD,IAAK,CAAC,CAAE,eAAe,CAAC,SAAS,YAAY,MAAM,CAAE,EAAE,CAAC;QACvD,cAAc,CAAC,MAAM,CACpB,OAAO,EAEP,eAAe,CACf,CAAC;QACF,OAAO;IACR,CAAC;IAGD,cAAc,CAAC,MAAM,CACpB,OAAO,EACP,gBAAgB,CACf,IAAI,EACJ,KAAM,SAAQ,WAAW;QACxB,QAAQ,CAAM;QAEd,YAAY,IAAU;YACrB,KAAK,EAAE,CAAC;YAER,MAAM,QAAQ,GAAG,OAAO,CAAE,eAAe,CAAE;gBAE1C,CAAC,CAAC,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;gBACjC,CAAC,CAAC,eAAe,CAAC;YACnB,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,KAAK,kBAAkB;YAC5B,OAAO,kBAAkB,CAAC;QAC3B,CAAC;KACD,CACD,CACD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe;IACpC,OAAO,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC"}
@@ -9,19 +9,32 @@ class CeBaseClass extends HTMLElement {
9
9
  }
10
10
 
11
11
  connectedCallback() {
12
- (DC as any).trigger(this, 'Connected');
12
+ this.dispatchEvent( new CustomEvent('_mcConnected') );
13
+ }
14
+
15
+ connectedMoveCallback() {
16
+ this.dispatchEvent( new CustomEvent('_mcConnectedMove') );
13
17
  }
14
18
 
15
19
  disconnectedCallback() {
16
- (DC as any).trigger(this, 'Disconnected');
20
+ this.dispatchEvent( new CustomEvent('_mcDisconnected') );
17
21
  }
18
22
 
19
23
  adoptedCallback() {
20
- (DC as any).trigger(this, 'Adopted');
24
+ this.dispatchEvent( new CustomEvent('_mcAdopted') );
21
25
  }
22
26
 
23
27
  attributeChangedCallback(name: string, oldValue: any, newValue: any) {
24
- (DC as any).trigger(this, 'AttributeChanged', { name, oldValue, newValue });
28
+ this.dispatchEvent(
29
+ new CustomEvent(
30
+ '_mcAttributeChanged',
31
+ { detail: { name, oldValue, newValue } }
32
+ )
33
+ );
34
+ }
35
+
36
+ formResetCallback(){
37
+ this.dispatchEvent( new CustomEvent('_mcFormReset') );
25
38
  }
26
39
  }
27
40
 
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  import { copyGettersSetters } from './helpers.js';
3
- import { DC, addListener } from './MC.js';
3
+ import { DC } from './MC.js';
4
4
  import { observe } from './observables.js';
5
5
  const getInputName = (e) => {
6
6
  return e.tagName.toLowerCase();
@@ -154,7 +154,7 @@ export function formValues(targetObject, propertyName, dom) {
154
154
  observe(targetObject, propertyName);
155
155
  copyGettersSetters(handlers, targetObject[propertyName]);
156
156
  [...dom.querySelectorAll('input, textarea, select')].forEach((input) => {
157
- addListener(input, 'input', (ev) => {
157
+ input.addEventListener('input', (ev) => {
158
158
  targetObject[propertyName].notify();
159
159
  });
160
160
  });