@twobirds/microcomponents 0.0.84 → 0.0.86
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -6
- package/assets/documentation/MC.md +60 -81
- package/assets/documentation/elements.md +6 -9
- package/assets/documentation/observables.md +97 -11
- package/assets/test/{my-tag.css → myButton.css} +4 -4
- package/assets/test/test.html +1 -1
- package/dist/MC.d.ts +6 -9
- package/dist/MC.d.ts.map +1 -1
- package/dist/MC.js +40 -73
- package/dist/MC.min.js +40 -73
- package/dist/MC.ts +67 -114
- package/dist/elements.min.js +1 -1
- package/dist/formValues.min.js +1 -1
- package/dist/microcomponents.min.js +1 -1
- package/dist/observables.min.js +1 -1
- package/package.json +2 -2
- package/public/MC.d.ts +6 -9
- package/public/MC.d.ts.map +1 -1
- package/public/MC.js +40 -73
- package/public/MC.js.map +1 -1
- package/public/MC.min.js +40 -73
- package/public/MC.ts +67 -114
- package/public/documentation/MC.md +60 -81
- package/public/documentation/elements.md +6 -9
- package/public/documentation/observables.md +97 -11
- package/public/elements.min.js +1 -1
- package/public/formValues.min.js +1 -1
- package/public/microcomponents.min.js +1 -1
- package/public/observables.min.js +1 -1
- package/public/src/MC.d.ts +6 -9
- package/public/src/MC.d.ts.map +1 -1
- package/public/src/MC.js +40 -73
- package/public/src/MC.js.map +1 -1
- package/public/src/MC.ts +67 -114
- package/public/src/test/test/grandparent.js +1 -1
- package/public/src/test/test/testform.js +1 -1
- package/public/src/test/test.js +23 -31
- package/public/src/test/test.js.map +1 -1
- package/public/src/test/test.ts +61 -72
- package/public/test/MC.d.ts +6 -9
- package/public/test/MC.d.ts.map +1 -1
- package/public/test/MC.js +40 -73
- package/public/test/MC.min.js +40 -73
- package/public/test/MC.ts +67 -114
- package/public/test/elements.min.js +1 -1
- package/public/test/formValues.min.js +1 -1
- package/public/test/microcomponents.min.js +1 -1
- package/public/test/{my-tag.css → myButton.css} +4 -4
- package/public/test/observables.min.js +1 -1
- package/public/test/test/grandparent.js +1 -1
- package/public/test/test/testform.js +1 -1
- package/public/test/test.html +1 -1
- package/public/test/test.js +23 -31
- package/public/test/test.js.map +1 -1
- package/public/test/test.ts +61 -72
- package/public/typedoc/assets/navigation.js +1 -1
- package/public/typedoc/assets/search.js +1 -1
- package/public/typedoc/classes/MC.DC.html +3 -4
- package/public/typedoc/classes/MC.MC.html +2 -4
- package/public/typedoc/classes/MC.McBase.html +2 -2
- package/public/typedoc/functions/MC.autoload.html +1 -1
- package/public/typedoc/functions/MC.off.html +1 -1
- package/public/typedoc/functions/MC.on.html +1 -1
- package/public/typedoc/functions/MC.one.html +1 -1
- package/public/typedoc/functions/MC.trigger.html +1 -0
- package/public/typedoc/functions/elements.defineCE.html +1 -1
- package/public/typedoc/functions/elements.getCE.html +1 -1
- package/public/typedoc/functions/formValues.formValues.html +1 -1
- package/public/typedoc/functions/observables.observe.html +1 -1
- package/public/typedoc/index.html +21 -10
- package/public/typedoc/interfaces/MC.HTMLMcElement.html +2 -2
- package/public/typedoc/modules/MC.html +3 -3
- package/public/typedoc/modules/elements.html +1 -1
- package/public/typedoc/modules/formValues.html +1 -1
- package/public/typedoc/modules/observables.html +1 -1
- package/public/typedoc/types/observables.Observable.html +1 -1
- package/src/MC.ts +67 -114
- package/src/test/test.ts +61 -72
package/public/src/test/test.ts
CHANGED
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
getCE,
|
|
6
6
|
observe,
|
|
7
7
|
Observable,
|
|
8
|
+
HTMLMcElement,
|
|
8
9
|
} from '../microcomponents.js';
|
|
9
10
|
|
|
10
11
|
class Translator extends DC {
|
|
@@ -39,83 +40,71 @@ class Translator extends DC {
|
|
|
39
40
|
|
|
40
41
|
(that.Translation as Observable).bind(translationTargetObject);
|
|
41
42
|
|
|
42
|
-
that.target.setAttribute('language', 'en');
|
|
43
|
-
|
|
44
43
|
(that.Language as Observable).notify();
|
|
45
44
|
}
|
|
46
45
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
class MyButton extends DC {
|
|
49
|
+
#template: string = '{lang.click} {counter}';
|
|
50
|
+
|
|
51
|
+
#languages = {
|
|
52
|
+
en: {
|
|
53
|
+
click: 'click me',
|
|
54
|
+
},
|
|
55
|
+
de: {
|
|
56
|
+
click: 'klick mich',
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
Dom: LooseObject = {};
|
|
61
|
+
|
|
62
|
+
constructor(target: HTMLElement) {
|
|
63
|
+
super(target);
|
|
64
|
+
|
|
65
|
+
// render
|
|
66
|
+
target.innerHTML = this.#template;
|
|
67
|
+
|
|
68
|
+
// state
|
|
69
|
+
this.Dom = { counter: 0 };
|
|
70
|
+
|
|
71
|
+
// state: convert all props defined so far into observables
|
|
72
|
+
observe(this);
|
|
73
|
+
|
|
74
|
+
// add translator
|
|
75
|
+
DC.add(
|
|
76
|
+
target,
|
|
77
|
+
'Translator',
|
|
78
|
+
new Translator(target, this.#languages, target)
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
// bind Dom to target
|
|
82
|
+
(this.Dom as Observable).bind(this.target);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
onClick(ev: Event) {
|
|
86
|
+
// console.log('button.myButton onClick()');
|
|
87
|
+
const c = this.Dom.counter++;
|
|
88
|
+
ev.stopPropagation();
|
|
89
|
+
(this.target as HTMLElement).classList.remove('clicked');
|
|
90
|
+
(this.target as HTMLElement).classList.add( this.Dom.counter > 9 ? 'overClicked' : 'clicked' );
|
|
55
91
|
}
|
|
56
92
|
}
|
|
57
93
|
|
|
94
|
+
function makeButton(): HTMLMcElement {
|
|
95
|
+
const
|
|
96
|
+
button = document.createElement('button');
|
|
97
|
+
button.classList.add('myButton');
|
|
98
|
+
DC.add( button, 'MyButton', new MyButton(button) );
|
|
99
|
+
return button as unknown as HTMLMcElement;
|
|
100
|
+
}
|
|
101
|
+
|
|
58
102
|
defineCE(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
class MyTag extends DC {
|
|
62
|
-
#template: string = '<button>{lang.click} {counter}</button>';
|
|
63
|
-
|
|
64
|
-
#languages = {
|
|
65
|
-
en: {
|
|
66
|
-
click: 'click me',
|
|
67
|
-
},
|
|
68
|
-
de: {
|
|
69
|
-
click: 'klick mich',
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
Dom: LooseObject = {};
|
|
74
|
-
|
|
75
|
-
constructor(target: HTMLElement) {
|
|
76
|
-
super(target);
|
|
77
|
-
|
|
78
|
-
let that = this; // minifier help
|
|
79
|
-
|
|
80
|
-
// render
|
|
81
|
-
target.innerHTML = this.#template;
|
|
82
|
-
|
|
83
|
-
// add translator
|
|
84
|
-
DC.add(
|
|
85
|
-
target,
|
|
86
|
-
'translator',
|
|
87
|
-
new Translator(target, that.#languages, target)
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
oneInit(ev: CustomEvent) {
|
|
92
|
-
let that = this;
|
|
93
|
-
|
|
94
|
-
// state
|
|
95
|
-
that.Dom = { counter: 0 };
|
|
96
|
-
|
|
97
|
-
// state: convert all props defined so far into observables
|
|
98
|
-
observe(that);
|
|
99
|
-
|
|
100
|
-
// bind Dom to target
|
|
101
|
-
(that.Dom as Observable).bind(that.target);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
onClick(ev: CustomEvent) {
|
|
105
|
-
const that = this,
|
|
106
|
-
c = that.Dom.counter++;
|
|
107
|
-
(ev.detail.data as PointerEvent).stopPropagation();
|
|
108
|
-
(that.target as HTMLElement).classList.remove('clicked');
|
|
109
|
-
(that.target as HTMLElement).classList.add(
|
|
110
|
-
that.Dom.counter > 9 ? 'overClicked' : 'clicked'
|
|
111
|
-
);
|
|
112
|
-
}
|
|
113
|
-
},
|
|
114
|
-
['language']
|
|
103
|
+
'make-button',
|
|
104
|
+
makeButton
|
|
115
105
|
);
|
|
116
106
|
|
|
117
|
-
let
|
|
118
|
-
fragment = new DocumentFragment();
|
|
107
|
+
let fragment = new DocumentFragment();
|
|
119
108
|
|
|
120
109
|
/*
|
|
121
110
|
stress test
|
|
@@ -126,7 +115,7 @@ let start = new Date().getTime(),
|
|
|
126
115
|
|
|
127
116
|
// create 1000 elements
|
|
128
117
|
for (let x = 0; x < max; x++) {
|
|
129
|
-
fragment.append(
|
|
118
|
+
fragment.append( (getCE('make-button') as Function)());
|
|
130
119
|
}
|
|
131
120
|
|
|
132
121
|
let end = new Date().getTime();
|
|
@@ -148,14 +137,14 @@ setTimeout(() => {
|
|
|
148
137
|
'font-weight: bold; color: black;',
|
|
149
138
|
'font-weight: normal;',
|
|
150
139
|
max,
|
|
151
|
-
max *
|
|
140
|
+
max * 2,
|
|
152
141
|
'font-weight: bold; color: blue;',
|
|
153
142
|
end - start
|
|
154
143
|
);
|
|
155
144
|
|
|
156
145
|
//document.body.appendChild(new MyTag());
|
|
157
146
|
|
|
158
|
-
let element = document.querySelector('
|
|
147
|
+
let element = document.querySelector('button');
|
|
159
148
|
|
|
160
149
|
console.log(
|
|
161
150
|
"\n\n%cInspect this tag:%c \n( ...to see the inner structure in the '._mc' property )\n\n %O %c %s",
|
|
@@ -184,5 +173,5 @@ setTimeout(() => {
|
|
|
184
173
|
);
|
|
185
174
|
|
|
186
175
|
// will trigger the event on all micro components contained in <my-tag>
|
|
187
|
-
|
|
176
|
+
( element as unknown as HTMLMcElement )._mc?.trigger('doSomething');
|
|
188
177
|
}, 1000);
|
package/public/test/MC.d.ts
CHANGED
|
@@ -10,27 +10,24 @@ declare class McBase {
|
|
|
10
10
|
private _target;
|
|
11
11
|
constructor(target?: {
|
|
12
12
|
[key: string]: any;
|
|
13
|
-
}
|
|
13
|
+
});
|
|
14
14
|
get target(): any;
|
|
15
15
|
}
|
|
16
16
|
declare class MC extends McBase {
|
|
17
17
|
constructor(target?: any);
|
|
18
|
-
static trigger: typeof trigger;
|
|
19
|
-
trigger(ev: string, data?: any, bubble?: string): void;
|
|
20
18
|
}
|
|
21
19
|
declare class DC extends McBase {
|
|
22
20
|
constructor(target: HTMLElement, debug?: boolean);
|
|
23
21
|
static add: Function;
|
|
24
22
|
static remove: Function;
|
|
25
|
-
static trigger: Function;
|
|
26
23
|
off(eventName: string, handler: EventListenerOrEventListenerObject): void;
|
|
27
24
|
on(eventName: string, handler: EventListenerOrEventListenerObject): void;
|
|
28
25
|
one(eventName: string, handler: EventListenerOrEventListenerObject): void;
|
|
29
|
-
trigger(
|
|
30
|
-
parent(
|
|
31
|
-
ancestors(
|
|
32
|
-
children(
|
|
33
|
-
descendants(
|
|
26
|
+
trigger(eventName: string, data?: any, bubble?: string): void;
|
|
27
|
+
parent(): DC | null;
|
|
28
|
+
ancestors(): DC[] | null;
|
|
29
|
+
children(): DC[] | null;
|
|
30
|
+
descendants(): DC[] | null;
|
|
34
31
|
}
|
|
35
32
|
declare function autoload(enable?: boolean): boolean;
|
|
36
33
|
export { McBase, MC, DC, autoload, on, one, off, trigger };
|
package/public/test/MC.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MC.d.ts","sourceRoot":"","sources":["../src/MC.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAiB3C,MAAM,WAAW,aAAc,SAAQ,WAAW;IACjD,GAAG,EAAE,WAAW,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"MC.d.ts","sourceRoot":"","sources":["../src/MC.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAiB3C,MAAM,WAAW,aAAc,SAAQ,WAAW;IACjD,GAAG,EAAE,WAAW,CAAC;CACjB;AAmED,iBAAS,GAAG,CAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,kCAAkC,QAE1F;AAED,iBAAS,EAAE,CAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,kCAAkC,EAAE,IAAI,GAAE,OAAe,QAEhH;AAED,iBAAS,GAAG,CAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,kCAAkC,QAE1F;AAGD,iBAAS,OAAO,CACf,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,WAAW,GAAG,MAAM,EAC3B,IAAI,GAAE,GAAQ,EACd,MAAM,GAAE,MAAY,QAepB;AA+ED,cAAM,MAAM;IACX,OAAO,CAAC,OAAO,CAAe;gBAElB,MAAM,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE;IAU3C,IAAI,MAAM,IAAI,GAAG,CAEhB;CAED;AAED,cAAM,EAAG,SAAQ,MAAM;gBACV,MAAM,CAAC,EAAE,GAAG;CAGxB;AAED,cAAM,EAAG,SAAQ,MAAM;gBACV,MAAM,EAAE,WAAW,EAAE,KAAK,GAAE,OAAe;IAIvD,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAO;IAC3B,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAU;IAGjC,GAAG,CAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,kCAAkC;IAInE,EAAE,CAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,kCAAkC;IAIlE,GAAG,CAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,kCAAkC;IAInE,OAAO,CAAE,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,GAAQ,EAAE,MAAM,GAAE,MAAY;IAKhE,MAAM,IAAI,EAAE,GAAG,IAAI;IAOnB,SAAS,IAAI,EAAE,EAAE,GAAG,IAAI;IAgBxB,QAAQ,IAAI,EAAE,EAAE,GAAG,IAAI;IAMvB,WAAW,IAAI,EAAE,EAAE,GAAG,IAAI;CAS1B;AAiHD,iBAAS,QAAQ,CAAC,MAAM,GAAE,OAAc,GAAG,OAAO,CAmBjD;AAID,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC"}
|
package/public/test/MC.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
|
|
2
|
+
const isBrowser = new Function('try {return this===window;}catch(e){ return false;}');
|
|
3
3
|
function getNativeEventNames(domNode) {
|
|
4
4
|
let nativeEventNames = [];
|
|
5
5
|
if (isBrowser()) {
|
|
@@ -9,51 +9,13 @@ function getNativeEventNames(domNode) {
|
|
|
9
9
|
}
|
|
10
10
|
return nativeEventNames;
|
|
11
11
|
}
|
|
12
|
-
function getMicroComponents(elements, search) {
|
|
13
|
-
let mcValues = [];
|
|
14
|
-
elements.forEach((e) => {
|
|
15
|
-
if (e) {
|
|
16
|
-
if (e instanceof HTMLElement) {
|
|
17
|
-
const _mc = e?._mc;
|
|
18
|
-
if (!search && _mc) {
|
|
19
|
-
mcValues = mcValues.concat(Object.values(e._mc));
|
|
20
|
-
}
|
|
21
|
-
else if (search && _mc && _mc[search]) {
|
|
22
|
-
mcValues.push(_mc[search]);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
return mcValues;
|
|
28
|
-
}
|
|
29
|
-
function traverseNodes(node, search, firstonly = true) {
|
|
30
|
-
let mcValues = [];
|
|
31
|
-
while (node) {
|
|
32
|
-
if (node._mc) {
|
|
33
|
-
if (!search) {
|
|
34
|
-
mcValues = mcValues.concat(Object.values(node._mc));
|
|
35
|
-
}
|
|
36
|
-
else if (search && node._mc[search]) {
|
|
37
|
-
mcValues.push(node._mc[search]);
|
|
38
|
-
}
|
|
39
|
-
if (firstonly)
|
|
40
|
-
return mcValues;
|
|
41
|
-
}
|
|
42
|
-
node = node.parentNode;
|
|
43
|
-
}
|
|
44
|
-
return mcValues;
|
|
45
|
-
}
|
|
46
12
|
function isDOM(element) {
|
|
47
13
|
return element && element instanceof HTMLElement;
|
|
48
14
|
}
|
|
49
15
|
function add(target, key, element = {}) {
|
|
50
16
|
let node = target;
|
|
51
17
|
if (!node._mc) {
|
|
52
|
-
let debug = DC?.debug;
|
|
53
|
-
DC.debug = false;
|
|
54
18
|
node._mc = new DC(target);
|
|
55
|
-
DC.debug = debug;
|
|
56
|
-
delete node._mc._mc;
|
|
57
19
|
}
|
|
58
20
|
const _mc = node._mc;
|
|
59
21
|
if (key.length && !_mc[key]) {
|
|
@@ -62,7 +24,7 @@ function add(target, key, element = {}) {
|
|
|
62
24
|
target.setAttribute('data-mc', '');
|
|
63
25
|
}
|
|
64
26
|
}
|
|
65
|
-
return
|
|
27
|
+
return node;
|
|
66
28
|
}
|
|
67
29
|
function remove(target, key) {
|
|
68
30
|
if (!key)
|
|
@@ -79,9 +41,9 @@ function remove(target, key) {
|
|
|
79
41
|
return;
|
|
80
42
|
}
|
|
81
43
|
function init(element) {
|
|
82
|
-
if (element.constructor === DC)
|
|
83
|
-
return;
|
|
84
44
|
setTimeout(() => {
|
|
45
|
+
if (element.constructor === DC)
|
|
46
|
+
return;
|
|
85
47
|
element.trigger('Init');
|
|
86
48
|
}, 0);
|
|
87
49
|
}
|
|
@@ -122,7 +84,7 @@ function bubbleEvent(domNode, ev) {
|
|
|
122
84
|
.map((c) => c?.target));
|
|
123
85
|
targets.forEach((target) => {
|
|
124
86
|
if (target)
|
|
125
|
-
|
|
87
|
+
target._mc.trigger(target, ev);
|
|
126
88
|
});
|
|
127
89
|
}
|
|
128
90
|
}, 0);
|
|
@@ -138,13 +100,16 @@ function autoAttachListeners(element) {
|
|
|
138
100
|
typeof that.constructor.prototype[key] === 'function')
|
|
139
101
|
.forEach((key) => {
|
|
140
102
|
let once = /^one/.test(key), withoutOnOne = key.replace(/^on[e]{0,1}/, ''), nativeEventName = withoutOnOne.toLowerCase();
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
103
|
+
if (('on' + nativeEventName) in target) {
|
|
104
|
+
let listener = (ev) => {
|
|
105
|
+
that[key](ev);
|
|
106
|
+
};
|
|
145
107
|
target.addEventListener(nativeEventName, listener);
|
|
146
108
|
}
|
|
147
109
|
else {
|
|
110
|
+
let listener = (ev) => {
|
|
111
|
+
that[key](ev);
|
|
112
|
+
};
|
|
148
113
|
on(target, withoutOnOne, listener, once);
|
|
149
114
|
}
|
|
150
115
|
});
|
|
@@ -154,13 +119,15 @@ function getMcChildNodes(domNode) {
|
|
|
154
119
|
const id = Math.random().toString().replace('.', '');
|
|
155
120
|
const selector = '[data-mc]:not([temp_id="' + id + '"] [data-mc] [data-mc])';
|
|
156
121
|
domNode.setAttribute('temp_id', id);
|
|
157
|
-
const
|
|
122
|
+
const mcArray = [...domNode.querySelectorAll(selector)]
|
|
123
|
+
.filter((e) => !!e._mc)
|
|
124
|
+
.map(e => e._mc);
|
|
158
125
|
domNode.removeAttribute('temp_id');
|
|
159
|
-
return
|
|
126
|
+
return mcArray.length ? mcArray : null;
|
|
160
127
|
}
|
|
161
128
|
class McBase {
|
|
162
129
|
_target;
|
|
163
|
-
constructor(target
|
|
130
|
+
constructor(target) {
|
|
164
131
|
let element = this;
|
|
165
132
|
this._target = new WeakRef(target || {});
|
|
166
133
|
init(element);
|
|
@@ -174,9 +141,6 @@ class MC extends McBase {
|
|
|
174
141
|
constructor(target) {
|
|
175
142
|
super(target);
|
|
176
143
|
}
|
|
177
|
-
static trigger = trigger;
|
|
178
|
-
trigger(ev, data = {}, bubble = 'l') {
|
|
179
|
-
}
|
|
180
144
|
}
|
|
181
145
|
class DC extends McBase {
|
|
182
146
|
constructor(target, debug = false) {
|
|
@@ -184,7 +148,6 @@ class DC extends McBase {
|
|
|
184
148
|
}
|
|
185
149
|
static add = add;
|
|
186
150
|
static remove = remove;
|
|
187
|
-
static trigger = trigger;
|
|
188
151
|
off(eventName, handler) {
|
|
189
152
|
off(this.target, eventName, handler);
|
|
190
153
|
}
|
|
@@ -194,36 +157,40 @@ class DC extends McBase {
|
|
|
194
157
|
one(eventName, handler) {
|
|
195
158
|
one(this.target, eventName, handler);
|
|
196
159
|
}
|
|
197
|
-
trigger(
|
|
198
|
-
|
|
199
|
-
}
|
|
160
|
+
trigger(eventName, data = {}, bubble = 'l') {
|
|
161
|
+
trigger(this.target, eventName, data, bubble);
|
|
200
162
|
}
|
|
201
|
-
parent(
|
|
163
|
+
parent() {
|
|
202
164
|
let target = this.target;
|
|
203
165
|
if (!isDOM(target))
|
|
204
|
-
return
|
|
205
|
-
return
|
|
166
|
+
return null;
|
|
167
|
+
return target.closest('[data-mc]')?._mc || null;
|
|
206
168
|
}
|
|
207
|
-
ancestors(
|
|
208
|
-
let
|
|
209
|
-
if (!isDOM(
|
|
169
|
+
ancestors() {
|
|
170
|
+
let currentNode = this?.target, result = [];
|
|
171
|
+
if (!isDOM(currentNode))
|
|
210
172
|
return [];
|
|
211
|
-
|
|
173
|
+
while (currentNode = (currentNode.closest('[data-mc]'))) {
|
|
174
|
+
if (currentNode?._mc) {
|
|
175
|
+
result.push(currentNode?._mc);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return result.length ? result : null;
|
|
212
179
|
}
|
|
213
|
-
children(
|
|
180
|
+
children() {
|
|
214
181
|
let target = this?.target;
|
|
215
182
|
if (!isDOM(target))
|
|
216
|
-
return
|
|
217
|
-
|
|
218
|
-
const mcValues = getMicroComponents([...myDomElements], search);
|
|
219
|
-
return mcValues;
|
|
183
|
+
return null;
|
|
184
|
+
return getMcChildNodes(target);
|
|
220
185
|
}
|
|
221
|
-
descendants(
|
|
222
|
-
|
|
186
|
+
descendants() {
|
|
187
|
+
const target = this?.target;
|
|
223
188
|
if (!isDOM(target))
|
|
224
189
|
return [];
|
|
225
|
-
const
|
|
226
|
-
|
|
190
|
+
const mcArray = [...target.querySelectorAll('[data-mc]')]
|
|
191
|
+
.filter((e) => !!e._mc)
|
|
192
|
+
.map(e => e._mc);
|
|
193
|
+
return mcArray.length ? mcArray : null;
|
|
227
194
|
}
|
|
228
195
|
}
|
|
229
196
|
const loadingDCs = new Set();
|
package/public/test/MC.min.js
CHANGED
|
@@ -56,7 +56,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
56
56
|
/* harmony export */ trigger: () => (/* binding */ trigger)
|
|
57
57
|
/* harmony export */ });
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
const isBrowser = new Function('try {return this===window;}catch(e){ return false;}');
|
|
60
60
|
function getNativeEventNames(domNode) {
|
|
61
61
|
let nativeEventNames = [];
|
|
62
62
|
if (isBrowser()) {
|
|
@@ -66,51 +66,13 @@ function getNativeEventNames(domNode) {
|
|
|
66
66
|
}
|
|
67
67
|
return nativeEventNames;
|
|
68
68
|
}
|
|
69
|
-
function getMicroComponents(elements, search) {
|
|
70
|
-
let mcValues = [];
|
|
71
|
-
elements.forEach((e) => {
|
|
72
|
-
if (e) {
|
|
73
|
-
if (e instanceof HTMLElement) {
|
|
74
|
-
const _mc = e?._mc;
|
|
75
|
-
if (!search && _mc) {
|
|
76
|
-
mcValues = mcValues.concat(Object.values(e._mc));
|
|
77
|
-
}
|
|
78
|
-
else if (search && _mc && _mc[search]) {
|
|
79
|
-
mcValues.push(_mc[search]);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
return mcValues;
|
|
85
|
-
}
|
|
86
|
-
function traverseNodes(node, search, firstonly = true) {
|
|
87
|
-
let mcValues = [];
|
|
88
|
-
while (node) {
|
|
89
|
-
if (node._mc) {
|
|
90
|
-
if (!search) {
|
|
91
|
-
mcValues = mcValues.concat(Object.values(node._mc));
|
|
92
|
-
}
|
|
93
|
-
else if (search && node._mc[search]) {
|
|
94
|
-
mcValues.push(node._mc[search]);
|
|
95
|
-
}
|
|
96
|
-
if (firstonly)
|
|
97
|
-
return mcValues;
|
|
98
|
-
}
|
|
99
|
-
node = node.parentNode;
|
|
100
|
-
}
|
|
101
|
-
return mcValues;
|
|
102
|
-
}
|
|
103
69
|
function isDOM(element) {
|
|
104
70
|
return element && element instanceof HTMLElement;
|
|
105
71
|
}
|
|
106
72
|
function add(target, key, element = {}) {
|
|
107
73
|
let node = target;
|
|
108
74
|
if (!node._mc) {
|
|
109
|
-
let debug = DC?.debug;
|
|
110
|
-
DC.debug = false;
|
|
111
75
|
node._mc = new DC(target);
|
|
112
|
-
DC.debug = debug;
|
|
113
|
-
delete node._mc._mc;
|
|
114
76
|
}
|
|
115
77
|
const _mc = node._mc;
|
|
116
78
|
if (key.length && !_mc[key]) {
|
|
@@ -119,7 +81,7 @@ function add(target, key, element = {}) {
|
|
|
119
81
|
target.setAttribute('data-mc', '');
|
|
120
82
|
}
|
|
121
83
|
}
|
|
122
|
-
return
|
|
84
|
+
return node;
|
|
123
85
|
}
|
|
124
86
|
function remove(target, key) {
|
|
125
87
|
if (!key)
|
|
@@ -136,9 +98,9 @@ function remove(target, key) {
|
|
|
136
98
|
return;
|
|
137
99
|
}
|
|
138
100
|
function init(element) {
|
|
139
|
-
if (element.constructor === DC)
|
|
140
|
-
return;
|
|
141
101
|
setTimeout(() => {
|
|
102
|
+
if (element.constructor === DC)
|
|
103
|
+
return;
|
|
142
104
|
element.trigger('Init');
|
|
143
105
|
}, 0);
|
|
144
106
|
}
|
|
@@ -179,7 +141,7 @@ function bubbleEvent(domNode, ev) {
|
|
|
179
141
|
.map((c) => c?.target));
|
|
180
142
|
targets.forEach((target) => {
|
|
181
143
|
if (target)
|
|
182
|
-
|
|
144
|
+
target._mc.trigger(target, ev);
|
|
183
145
|
});
|
|
184
146
|
}
|
|
185
147
|
}, 0);
|
|
@@ -195,13 +157,16 @@ function autoAttachListeners(element) {
|
|
|
195
157
|
typeof that.constructor.prototype[key] === 'function')
|
|
196
158
|
.forEach((key) => {
|
|
197
159
|
let once = /^one/.test(key), withoutOnOne = key.replace(/^on[e]{0,1}/, ''), nativeEventName = withoutOnOne.toLowerCase();
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
160
|
+
if (('on' + nativeEventName) in target) {
|
|
161
|
+
let listener = (ev) => {
|
|
162
|
+
that[key](ev);
|
|
163
|
+
};
|
|
202
164
|
target.addEventListener(nativeEventName, listener);
|
|
203
165
|
}
|
|
204
166
|
else {
|
|
167
|
+
let listener = (ev) => {
|
|
168
|
+
that[key](ev);
|
|
169
|
+
};
|
|
205
170
|
on(target, withoutOnOne, listener, once);
|
|
206
171
|
}
|
|
207
172
|
});
|
|
@@ -211,13 +176,15 @@ function getMcChildNodes(domNode) {
|
|
|
211
176
|
const id = Math.random().toString().replace('.', '');
|
|
212
177
|
const selector = '[data-mc]:not([temp_id="' + id + '"] [data-mc] [data-mc])';
|
|
213
178
|
domNode.setAttribute('temp_id', id);
|
|
214
|
-
const
|
|
179
|
+
const mcArray = [...domNode.querySelectorAll(selector)]
|
|
180
|
+
.filter((e) => !!e._mc)
|
|
181
|
+
.map(e => e._mc);
|
|
215
182
|
domNode.removeAttribute('temp_id');
|
|
216
|
-
return
|
|
183
|
+
return mcArray.length ? mcArray : null;
|
|
217
184
|
}
|
|
218
185
|
class McBase {
|
|
219
186
|
_target;
|
|
220
|
-
constructor(target
|
|
187
|
+
constructor(target) {
|
|
221
188
|
let element = this;
|
|
222
189
|
this._target = new WeakRef(target || {});
|
|
223
190
|
init(element);
|
|
@@ -231,9 +198,6 @@ class MC extends McBase {
|
|
|
231
198
|
constructor(target) {
|
|
232
199
|
super(target);
|
|
233
200
|
}
|
|
234
|
-
static trigger = trigger;
|
|
235
|
-
trigger(ev, data = {}, bubble = 'l') {
|
|
236
|
-
}
|
|
237
201
|
}
|
|
238
202
|
class DC extends McBase {
|
|
239
203
|
constructor(target, debug = false) {
|
|
@@ -241,7 +205,6 @@ class DC extends McBase {
|
|
|
241
205
|
}
|
|
242
206
|
static add = add;
|
|
243
207
|
static remove = remove;
|
|
244
|
-
static trigger = trigger;
|
|
245
208
|
off(eventName, handler) {
|
|
246
209
|
off(this.target, eventName, handler);
|
|
247
210
|
}
|
|
@@ -251,36 +214,40 @@ class DC extends McBase {
|
|
|
251
214
|
one(eventName, handler) {
|
|
252
215
|
one(this.target, eventName, handler);
|
|
253
216
|
}
|
|
254
|
-
trigger(
|
|
255
|
-
|
|
256
|
-
}
|
|
217
|
+
trigger(eventName, data = {}, bubble = 'l') {
|
|
218
|
+
trigger(this.target, eventName, data, bubble);
|
|
257
219
|
}
|
|
258
|
-
parent(
|
|
220
|
+
parent() {
|
|
259
221
|
let target = this.target;
|
|
260
222
|
if (!isDOM(target))
|
|
261
|
-
return
|
|
262
|
-
return
|
|
223
|
+
return null;
|
|
224
|
+
return target.closest('[data-mc]')?._mc || null;
|
|
263
225
|
}
|
|
264
|
-
ancestors(
|
|
265
|
-
let
|
|
266
|
-
if (!isDOM(
|
|
226
|
+
ancestors() {
|
|
227
|
+
let currentNode = this?.target, result = [];
|
|
228
|
+
if (!isDOM(currentNode))
|
|
267
229
|
return [];
|
|
268
|
-
|
|
230
|
+
while (currentNode = (currentNode.closest('[data-mc]'))) {
|
|
231
|
+
if (currentNode?._mc) {
|
|
232
|
+
result.push(currentNode?._mc);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return result.length ? result : null;
|
|
269
236
|
}
|
|
270
|
-
children(
|
|
237
|
+
children() {
|
|
271
238
|
let target = this?.target;
|
|
272
239
|
if (!isDOM(target))
|
|
273
|
-
return
|
|
274
|
-
|
|
275
|
-
const mcValues = getMicroComponents([...myDomElements], search);
|
|
276
|
-
return mcValues;
|
|
240
|
+
return null;
|
|
241
|
+
return getMcChildNodes(target);
|
|
277
242
|
}
|
|
278
|
-
descendants(
|
|
279
|
-
|
|
243
|
+
descendants() {
|
|
244
|
+
const target = this?.target;
|
|
280
245
|
if (!isDOM(target))
|
|
281
246
|
return [];
|
|
282
|
-
const
|
|
283
|
-
|
|
247
|
+
const mcArray = [...target.querySelectorAll('[data-mc]')]
|
|
248
|
+
.filter((e) => !!e._mc)
|
|
249
|
+
.map(e => e._mc);
|
|
250
|
+
return mcArray.length ? mcArray : null;
|
|
284
251
|
}
|
|
285
252
|
}
|
|
286
253
|
const loadingDCs = new Set();
|