@dooboostore/simple-web-component 1.0.29 → 1.0.31
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 +651 -27
- package/dist/cjs/decorators/elementDefine.js +5 -3
- package/dist/cjs/decorators/elementDefine.js.map +2 -2
- package/dist/cjs/decorators/emitCustomEvent.js.map +2 -2
- package/dist/cjs/decorators/index.js +1 -0
- package/dist/cjs/decorators/index.js.map +2 -2
- package/dist/cjs/decorators/setProperty.js +97 -0
- package/dist/cjs/decorators/setProperty.js.map +7 -0
- package/dist/cjs/elements/SwcAppEngine.js +3 -3
- package/dist/cjs/elements/SwcAppEngine.js.map +2 -2
- package/dist/cjs/elements/SwcAppMixin.js +1 -8
- package/dist/cjs/elements/SwcAppMixin.js.map +2 -2
- package/dist/cjs/elements/SwcAsync.js +37 -53
- package/dist/cjs/elements/SwcAsync.js.map +2 -2
- package/dist/cjs/elements/SwcChoose.js +55 -60
- package/dist/cjs/elements/SwcChoose.js.map +2 -2
- package/dist/cjs/elements/SwcIf.js +31 -60
- package/dist/cjs/elements/SwcIf.js.map +2 -2
- package/dist/cjs/elements/SwcLoop.js +20 -43
- package/dist/cjs/elements/SwcLoop.js.map +2 -2
- package/dist/cjs/elements/SwcSubTemplates.js +0 -27
- package/dist/cjs/elements/SwcSubTemplates.js.map +2 -2
- package/dist/cjs/elements/register.js +216 -128
- package/dist/cjs/elements/register.js.map +2 -2
- package/dist/cjs/index.js +2 -1
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/router/ElementRouter.js +1 -8
- package/dist/cjs/router/ElementRouter.js.map +2 -2
- package/dist/cjs/types.js.map +1 -1
- package/dist/cjs/utils/Utils.js +26 -10
- package/dist/cjs/utils/Utils.js.map +2 -2
- package/dist/esm/decorators/elementDefine.js +5 -3
- package/dist/esm/decorators/elementDefine.js.map +2 -2
- package/dist/esm/decorators/emitCustomEvent.js.map +2 -2
- package/dist/esm/decorators/index.js +1 -0
- package/dist/esm/decorators/index.js.map +2 -2
- package/dist/esm/decorators/setProperty.js +78 -0
- package/dist/esm/decorators/setProperty.js.map +7 -0
- package/dist/esm/elements/SwcAppEngine.js +3 -3
- package/dist/esm/elements/SwcAppEngine.js.map +2 -2
- package/dist/esm/elements/SwcAppMixin.js +1 -8
- package/dist/esm/elements/SwcAppMixin.js.map +2 -2
- package/dist/esm/elements/SwcAsync.js +37 -34
- package/dist/esm/elements/SwcAsync.js.map +2 -2
- package/dist/esm/elements/SwcChoose.js +55 -41
- package/dist/esm/elements/SwcChoose.js.map +2 -2
- package/dist/esm/elements/SwcIf.js +31 -41
- package/dist/esm/elements/SwcIf.js.map +2 -2
- package/dist/esm/elements/SwcLoop.js +20 -24
- package/dist/esm/elements/SwcLoop.js.map +2 -2
- package/dist/esm/elements/SwcSubTemplates.js +0 -8
- package/dist/esm/elements/SwcSubTemplates.js.map +2 -2
- package/dist/esm/elements/register.js +216 -128
- package/dist/esm/elements/register.js.map +2 -2
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +2 -2
- package/dist/esm/router/ElementRouter.js +1 -8
- package/dist/esm/router/ElementRouter.js.map +2 -2
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/utils/Utils.js +26 -10
- package/dist/esm/utils/Utils.js.map +2 -2
- package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +105 -13
- package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +4 -4
- package/dist/types/decorators/elementDefine.d.ts.map +1 -1
- package/dist/types/decorators/emitCustomEvent.d.ts.map +1 -1
- package/dist/types/decorators/index.d.ts +1 -0
- package/dist/types/decorators/index.d.ts.map +1 -1
- package/dist/types/decorators/setProperty.d.ts +13 -0
- package/dist/types/decorators/setProperty.d.ts.map +1 -0
- package/dist/types/elements/SwcAppMixin.d.ts.map +1 -1
- package/dist/types/elements/SwcAsync.d.ts +1 -11
- package/dist/types/elements/SwcAsync.d.ts.map +1 -1
- package/dist/types/elements/SwcChoose.d.ts +1 -13
- package/dist/types/elements/SwcChoose.d.ts.map +1 -1
- package/dist/types/elements/SwcIf.d.ts +1 -13
- package/dist/types/elements/SwcIf.d.ts.map +1 -1
- package/dist/types/elements/SwcLoop.d.ts +1 -13
- package/dist/types/elements/SwcLoop.d.ts.map +1 -1
- package/dist/types/elements/SwcSubTemplates.d.ts +6 -6
- package/dist/types/elements/SwcSubTemplates.d.ts.map +1 -1
- package/dist/types/elements/register.d.ts +3 -1
- package/dist/types/elements/register.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/router/ElementRouter.d.ts.map +1 -1
- package/dist/types/types.d.ts +3 -0
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/utils/Utils.d.ts +10 -0
- package/dist/types/utils/Utils.d.ts.map +1 -1
- package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +105 -13
- package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +4 -4
- package/package.json +3 -3
- package/src/decorators/elementDefine.ts +10 -3
- package/src/decorators/emitCustomEvent.ts +1 -0
- package/src/decorators/index.ts +1 -0
- package/src/decorators/setProperty.ts +97 -0
- package/src/elements/SwcAppEngine.ts +3 -3
- package/src/elements/SwcAppMixin.ts +7 -28
- package/src/elements/SwcAsync.ts +46 -30
- package/src/elements/SwcChoose.ts +82 -38
- package/src/elements/SwcIf.ts +38 -38
- package/src/elements/SwcLoop.ts +24 -19
- package/src/elements/SwcSubTemplates.ts +6 -6
- package/src/elements/register.ts +261 -121
- package/src/index.ts +3 -1
- package/src/router/ElementRouter.ts +1 -12
- package/src/types.ts +3 -1
- package/src/utils/Utils.ts +40 -19
|
@@ -16,34 +16,32 @@ class SwcAsync extends HTMLTemplateElement {
|
|
|
16
16
|
this._nodes = [];
|
|
17
17
|
this._value = null;
|
|
18
18
|
}
|
|
19
|
-
_resolvePortal() {
|
|
20
|
-
const portalScript = this.getAttribute("on-get-portal");
|
|
21
|
-
if (!portalScript)
|
|
22
|
-
return this.parentElement;
|
|
23
|
-
const win = this.ownerDocument?.defaultView || window;
|
|
24
|
-
const res = FunctionUtils.executeReturn({
|
|
25
|
-
script: portalScript,
|
|
26
|
-
context: this,
|
|
27
|
-
args: SwcUtils.getHelperAndHostSet(win, this)
|
|
28
|
-
});
|
|
29
|
-
if (res instanceof HTMLElement)
|
|
30
|
-
return res;
|
|
31
|
-
if (typeof res === "string")
|
|
32
|
-
return win.document.querySelector(res);
|
|
33
|
-
return this.parentElement;
|
|
34
|
-
}
|
|
35
19
|
_executeCloneCallback(attr, args) {
|
|
36
20
|
const script = this.getAttribute(attr);
|
|
37
21
|
if (!script)
|
|
38
22
|
return;
|
|
39
23
|
FunctionUtils.execute({ script, context: this, args });
|
|
40
24
|
}
|
|
41
|
-
refresh() {
|
|
42
|
-
|
|
43
|
-
if (!
|
|
25
|
+
refresh(valueAttr) {
|
|
26
|
+
valueAttr ?? (valueAttr = this.getAttribute("value"));
|
|
27
|
+
if (!valueAttr) {
|
|
28
|
+
this.render("default");
|
|
44
29
|
return;
|
|
45
|
-
|
|
46
|
-
|
|
30
|
+
}
|
|
31
|
+
if (valueAttr.startsWith("{{") && valueAttr.endsWith("}}")) {
|
|
32
|
+
const script = valueAttr.slice(2, -2).trim();
|
|
33
|
+
const win = this.ownerDocument?.defaultView || window;
|
|
34
|
+
const result = FunctionUtils.executeReturn({
|
|
35
|
+
script,
|
|
36
|
+
context: this,
|
|
37
|
+
args: SwcUtils.getHelperAndHostSet(win, this)
|
|
38
|
+
});
|
|
39
|
+
this.executeAsync(result);
|
|
40
|
+
} else {
|
|
41
|
+
this.executeAsync(valueAttr);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
executeAsync(result) {
|
|
47
45
|
if (result instanceof Promise) {
|
|
48
46
|
this.render("loading");
|
|
49
47
|
result.then((v) => {
|
|
@@ -57,7 +55,7 @@ class SwcAsync extends HTMLTemplateElement {
|
|
|
57
55
|
}
|
|
58
56
|
render(state) {
|
|
59
57
|
this.cleanup();
|
|
60
|
-
const portal = this.
|
|
58
|
+
const portal = this.parentElement;
|
|
61
59
|
if (!portal)
|
|
62
60
|
return;
|
|
63
61
|
const win = this.ownerDocument?.defaultView || window;
|
|
@@ -69,16 +67,24 @@ class SwcAsync extends HTMLTemplateElement {
|
|
|
69
67
|
const elements = this._nodes.filter((n) => n.nodeType === 1);
|
|
70
68
|
const groupArgs = { ...helperSet, $value: this._value, $nodes: this._nodes, $elements: elements, $firstElement: elements[0], $state: state };
|
|
71
69
|
this._nodes.forEach((n, nodeIdx) => {
|
|
72
|
-
if (n instanceof HTMLElement)
|
|
73
|
-
n.__swc_host = this;
|
|
74
70
|
this._executeCloneCallback("on-clone-node", { ...groupArgs, $node: n, $nodeIndex: nodeIdx, $isElement: n.nodeType === 1 });
|
|
71
|
+
if (n instanceof HTMLElement) {
|
|
72
|
+
Array.from(n.attributes).forEach((attr) => {
|
|
73
|
+
const value = attr.value || "";
|
|
74
|
+
if (value.startsWith("{{") && value.endsWith("}}")) {
|
|
75
|
+
const script = value.slice(2, -2).trim();
|
|
76
|
+
const result = FunctionUtils.executeReturn({
|
|
77
|
+
script,
|
|
78
|
+
context: n,
|
|
79
|
+
args: groupArgs
|
|
80
|
+
});
|
|
81
|
+
n.setAttribute(attr.name, String(result));
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
75
85
|
});
|
|
76
86
|
this._executeCloneCallback("on-clone-nodes", groupArgs);
|
|
77
|
-
|
|
78
|
-
portal.insertBefore(clone, this.nextSibling);
|
|
79
|
-
} else {
|
|
80
|
-
portal.appendChild(clone);
|
|
81
|
-
}
|
|
87
|
+
portal.insertBefore(clone, this.nextSibling);
|
|
82
88
|
}
|
|
83
89
|
}
|
|
84
90
|
cleanup() {
|
|
@@ -93,12 +99,9 @@ class SwcAsync extends HTMLTemplateElement {
|
|
|
93
99
|
}
|
|
94
100
|
}
|
|
95
101
|
__decorate([
|
|
96
|
-
changedAttributeHost("
|
|
102
|
+
changedAttributeHost("value"),
|
|
97
103
|
__metadata("design:type", Function),
|
|
98
|
-
__metadata("design:paramtypes", []),
|
|
104
|
+
__metadata("design:paramtypes", [String]),
|
|
99
105
|
__metadata("design:returntype", void 0)
|
|
100
106
|
], SwcAsync.prototype, "refresh", null);
|
|
101
|
-
export {
|
|
102
|
-
SwcAsync
|
|
103
|
-
};
|
|
104
107
|
//# sourceMappingURL=SwcAsync.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/elements/SwcAsync.ts"],
|
|
4
|
-
"sourcesContent": ["import { changedAttributeHost } from '../decorators/changedAttributeHost';\nimport { SwcUtils } from '../utils/Utils';\nimport { FunctionUtils } from '@dooboostore/core';\n\
|
|
5
|
-
"mappings": ";;;;;;;;;AAAA,SAAS,4BAA4B;AACrC,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;
|
|
4
|
+
"sourcesContent": ["import { changedAttributeHost } from '../decorators/changedAttributeHost';\nimport { SwcUtils } from '../utils/Utils';\nimport { FunctionUtils } from '@dooboostore/core';\n\nclass SwcAsync extends HTMLTemplateElement {\n private _nodes: Node[] = [];\n private _value: any = null;\n\n private _executeCloneCallback(attr: string, args: any) {\n const script = this.getAttribute(attr);\n if (!script) return;\n FunctionUtils.execute({ script, context: this, args });\n }\n\n @changedAttributeHost('value')\n private refresh(valueAttr?: string | null) {\n valueAttr ??= this.getAttribute('value');\n if (!valueAttr) {\n this.render('default');\n return;\n }\n\n // {{ }} 브레이스로 감싸진 값은 스크립트 실행\n if (valueAttr.startsWith('{{') && valueAttr.endsWith('}}')) {\n const script = valueAttr.slice(2, -2).trim();\n const win = this.ownerDocument?.defaultView || window;\n const result = FunctionUtils.executeReturn({ \n script, \n context: this, \n args: SwcUtils.getHelperAndHostSet(win, this) \n });\n\n this.executeAsync(result);\n } else {\n // 일반 문자열 값 또는 직접 Promise 속성\n this.executeAsync(valueAttr);\n }\n }\n\n private executeAsync(result: any) {\n if (result instanceof Promise) {\n this.render('loading');\n result\n .then(v => {\n this._value = v;\n this.render('success');\n })\n .catch(e => this.render('error'));\n } else {\n this._value = result;\n this.render('success');\n }\n }\n\n private render(state: string) {\n this.cleanup();\n const portal = this.parentElement;\n if (!portal) return;\n\n const win = this.ownerDocument?.defaultView || window;\n const helperSet = SwcUtils.getHelperAndHostSet(win, this);\n\n const t = this.content.querySelector(`template[is=\"swc-${state}\"]`) as HTMLTemplateElement;\n if (t) {\n const clone = t.content.cloneNode(true) as DocumentFragment;\n this._nodes = Array.from(clone.childNodes);\n const elements = this._nodes.filter(n => n.nodeType === 1) as HTMLElement[];\n const groupArgs = { ...helperSet, $value: this._value, $nodes: this._nodes, $elements: elements, $firstElement: elements[0], $state: state };\n\n // 부모 체인을 정상적으로 유지하기 위해 __swc_host 할당 제거\n this._nodes.forEach((n, nodeIdx) => {\n // if (n instanceof HTMLElement) (n as any).__swc_host = this; // 제거: 부모 체인 유지\n this._executeCloneCallback('on-clone-node', { ...groupArgs, $node: n, $nodeIndex: nodeIdx, $isElement: n.nodeType === 1 });\n\n // Attribute {{ }} 치환 - SwcChoose처럼 동적 치환\n if (n instanceof HTMLElement) {\n Array.from(n.attributes).forEach(attr => {\n const value = attr.value || '';\n if (value.startsWith('{{') && value.endsWith('}}')) {\n const script = value.slice(2, -2).trim();\n const result = FunctionUtils.executeReturn({\n script,\n context: n,\n args: groupArgs\n });\n n.setAttribute(attr.name, String(result));\n }\n });\n }\n });\n\n this._executeCloneCallback('on-clone-nodes', groupArgs);\n\n portal.insertBefore(clone, this.nextSibling);\n }\n }\n\n private cleanup() {\n this._nodes.forEach(n => n.parentElement?.removeChild(n));\n this._nodes = [];\n }\n\n connectedCallback() {\n this.refresh();\n }\n disconnectedCallback() {\n this.cleanup();\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;AAAA,SAAS,4BAA4B;AACrC,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAE9B,MAAM,iBAAiB,oBAAmB;EAA1C,cAAA;;AACU,SAAA,SAAiB,CAAA;AACjB,SAAA,SAAc;EAsGxB;EApGU,sBAAsB,MAAc,MAAS;AACnD,UAAM,SAAS,KAAK,aAAa,IAAI;AACrC,QAAI,CAAC;AAAQ;AACb,kBAAc,QAAQ,EAAE,QAAQ,SAAS,MAAM,KAAI,CAAE;EACvD;EAGQ,QAAQ,WAAyB;AACvC,kBAAA,YAAc,KAAK,aAAa,OAAO;AACvC,QAAI,CAAC,WAAW;AACd,WAAK,OAAO,SAAS;AACrB;IACF;AAGA,QAAI,UAAU,WAAW,IAAI,KAAK,UAAU,SAAS,IAAI,GAAG;AAC1D,YAAM,SAAS,UAAU,MAAM,GAAG,EAAE,EAAE,KAAI;AAC1C,YAAM,MAAM,KAAK,eAAe,eAAe;AAC/C,YAAM,SAAS,cAAc,cAAc;QACzC;QACA,SAAS;QACT,MAAM,SAAS,oBAAoB,KAAK,IAAI;OAC7C;AAED,WAAK,aAAa,MAAM;IAC1B,OAAO;AAEL,WAAK,aAAa,SAAS;IAC7B;EACF;EAEQ,aAAa,QAAW;AAC9B,QAAI,kBAAkB,SAAS;AAC7B,WAAK,OAAO,SAAS;AACrB,aACG,KAAK,OAAI;AACR,aAAK,SAAS;AACd,aAAK,OAAO,SAAS;MACvB,CAAC,EACA,MAAM,OAAK,KAAK,OAAO,OAAO,CAAC;IACpC,OAAO;AACL,WAAK,SAAS;AACd,WAAK,OAAO,SAAS;IACvB;EACF;EAEQ,OAAO,OAAa;AAC1B,SAAK,QAAO;AACZ,UAAM,SAAS,KAAK;AACpB,QAAI,CAAC;AAAQ;AAEb,UAAM,MAAM,KAAK,eAAe,eAAe;AAC/C,UAAM,YAAY,SAAS,oBAAoB,KAAK,IAAI;AAExD,UAAM,IAAI,KAAK,QAAQ,cAAc,oBAAoB,KAAK,IAAI;AAClE,QAAI,GAAG;AACL,YAAM,QAAQ,EAAE,QAAQ,UAAU,IAAI;AACtC,WAAK,SAAS,MAAM,KAAK,MAAM,UAAU;AACzC,YAAM,WAAW,KAAK,OAAO,OAAO,OAAK,EAAE,aAAa,CAAC;AACzD,YAAM,YAAY,EAAE,GAAG,WAAW,QAAQ,KAAK,QAAQ,QAAQ,KAAK,QAAQ,WAAW,UAAU,eAAe,SAAS,CAAC,GAAG,QAAQ,MAAK;AAG1I,WAAK,OAAO,QAAQ,CAAC,GAAG,YAAW;AAEjC,aAAK,sBAAsB,iBAAiB,EAAE,GAAG,WAAW,OAAO,GAAG,YAAY,SAAS,YAAY,EAAE,aAAa,EAAC,CAAE;AAGzH,YAAI,aAAa,aAAa;AAC5B,gBAAM,KAAK,EAAE,UAAU,EAAE,QAAQ,UAAO;AACtC,kBAAM,QAAQ,KAAK,SAAS;AAC5B,gBAAI,MAAM,WAAW,IAAI,KAAK,MAAM,SAAS,IAAI,GAAG;AAClD,oBAAM,SAAS,MAAM,MAAM,GAAG,EAAE,EAAE,KAAI;AACtC,oBAAM,SAAS,cAAc,cAAc;gBACzC;gBACA,SAAS;gBACT,MAAM;eACP;AACD,gBAAE,aAAa,KAAK,MAAM,OAAO,MAAM,CAAC;YAC1C;UACF,CAAC;QACH;MACF,CAAC;AAED,WAAK,sBAAsB,kBAAkB,SAAS;AAEtD,aAAO,aAAa,OAAO,KAAK,WAAW;IAC7C;EACF;EAEQ,UAAO;AACb,SAAK,OAAO,QAAQ,OAAK,EAAE,eAAe,YAAY,CAAC,CAAC;AACxD,SAAK,SAAS,CAAA;EAChB;EAEA,oBAAiB;AACf,SAAK,QAAO;EACd;EACA,uBAAoB;AAClB,SAAK,QAAO;EACd;;AA5FQ,WAAA;EADP,qBAAqB,OAAO;;;;;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -15,6 +15,7 @@ class SwcChoose extends HTMLTemplateElement {
|
|
|
15
15
|
super(...arguments);
|
|
16
16
|
this._nodes = [];
|
|
17
17
|
this._value = null;
|
|
18
|
+
this._previousTemplate = null;
|
|
18
19
|
}
|
|
19
20
|
get value() {
|
|
20
21
|
return this._value;
|
|
@@ -23,70 +24,86 @@ class SwcChoose extends HTMLTemplateElement {
|
|
|
23
24
|
this._value = nv;
|
|
24
25
|
this.render();
|
|
25
26
|
}
|
|
26
|
-
_resolvePortal() {
|
|
27
|
-
const portalScript = this.getAttribute("on-get-portal");
|
|
28
|
-
if (!portalScript)
|
|
29
|
-
return this.parentElement;
|
|
30
|
-
const win = this.ownerDocument?.defaultView || window;
|
|
31
|
-
const res = FunctionUtils.executeReturn({
|
|
32
|
-
script: portalScript,
|
|
33
|
-
context: this,
|
|
34
|
-
args: SwcUtils.getHelperAndHostSet(win, this)
|
|
35
|
-
});
|
|
36
|
-
if (res instanceof HTMLElement)
|
|
37
|
-
return res;
|
|
38
|
-
if (typeof res === "string")
|
|
39
|
-
return win.document.querySelector(res);
|
|
40
|
-
return this.parentElement;
|
|
41
|
-
}
|
|
42
27
|
_executeCloneCallback(attr, args) {
|
|
43
28
|
const script = this.getAttribute(attr);
|
|
44
29
|
if (!script)
|
|
45
30
|
return;
|
|
46
31
|
FunctionUtils.execute({ script, context: this, args });
|
|
47
32
|
}
|
|
48
|
-
refresh() {
|
|
49
|
-
|
|
50
|
-
if (
|
|
33
|
+
refresh(valueAttr) {
|
|
34
|
+
valueAttr ?? (valueAttr = this.getAttribute("value"));
|
|
35
|
+
if (valueAttr === null) {
|
|
51
36
|
this.value = null;
|
|
52
37
|
return;
|
|
53
38
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
39
|
+
if (valueAttr.startsWith("{{") && valueAttr.endsWith("}}")) {
|
|
40
|
+
const script = valueAttr.slice(2, -2).trim();
|
|
41
|
+
const win = this.ownerDocument?.defaultView || window;
|
|
42
|
+
const helperAndHostSet = SwcUtils.getHelperAndHostSet(win, SwcUtils.findNearestSwcHost(this));
|
|
43
|
+
const result = FunctionUtils.executeReturn({ script, context: this, args: helperAndHostSet });
|
|
44
|
+
this.value = result;
|
|
45
|
+
} else {
|
|
46
|
+
this.value = valueAttr;
|
|
47
|
+
}
|
|
57
48
|
}
|
|
58
49
|
render() {
|
|
59
|
-
this.cleanup();
|
|
60
|
-
const portal = this._resolvePortal();
|
|
61
|
-
if (!portal)
|
|
62
|
-
return;
|
|
63
50
|
const win = this.ownerDocument?.defaultView || window;
|
|
64
51
|
const helperSet = SwcUtils.getHelperAndHostSet(win, this);
|
|
65
52
|
const templates = Array.from(this.content.querySelectorAll("template"));
|
|
66
53
|
let selected = null;
|
|
67
54
|
for (const t of templates) {
|
|
68
|
-
if (t.getAttribute("is") === "swc-when"
|
|
69
|
-
|
|
70
|
-
|
|
55
|
+
if (t.getAttribute("is") === "swc-when") {
|
|
56
|
+
let matches = false;
|
|
57
|
+
const value = t.getAttribute("value") || "";
|
|
58
|
+
if (value.startsWith("{{") && value.endsWith("}}")) {
|
|
59
|
+
const script = value.slice(2, -2).trim();
|
|
60
|
+
const result = FunctionUtils.executeReturn({
|
|
61
|
+
script,
|
|
62
|
+
context: t,
|
|
63
|
+
args: { ...helperSet, $value: this._value }
|
|
64
|
+
});
|
|
65
|
+
matches = result === true;
|
|
66
|
+
} else {
|
|
67
|
+
matches = String(value) === String(this._value);
|
|
68
|
+
}
|
|
69
|
+
if (matches) {
|
|
70
|
+
selected = t;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
71
73
|
}
|
|
72
74
|
}
|
|
73
75
|
const target = selected || this.content.querySelector('template[is="swc-otherwise"]');
|
|
76
|
+
const targetHasSkipIfSame = target?.hasAttribute("skip-if-same");
|
|
77
|
+
const shouldSkip = (this.hasAttribute("skip-if-same") || targetHasSkipIfSame) && this._previousTemplate === target;
|
|
78
|
+
if (shouldSkip) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
this.cleanup();
|
|
82
|
+
this._previousTemplate = target;
|
|
74
83
|
if (target) {
|
|
75
84
|
const clone = target.content.cloneNode(true);
|
|
76
85
|
this._nodes = Array.from(clone.childNodes);
|
|
77
86
|
const elements = this._nodes.filter((n) => n.nodeType === 1);
|
|
78
87
|
const groupArgs = { ...helperSet, $value: this._value, $nodes: this._nodes, $elements: elements, $firstElement: elements[0] };
|
|
79
88
|
this._nodes.forEach((n, nodeIdx) => {
|
|
80
|
-
if (n instanceof HTMLElement)
|
|
81
|
-
n.__swc_host = this;
|
|
82
89
|
this._executeCloneCallback("on-clone-node", { ...groupArgs, $node: n, $nodeIndex: nodeIdx, $isElement: n.nodeType === 1 });
|
|
90
|
+
if (n instanceof HTMLElement) {
|
|
91
|
+
Array.from(n.attributes).forEach((attr) => {
|
|
92
|
+
const value = attr.value || "";
|
|
93
|
+
if (value.startsWith("{{") && value.endsWith("}}")) {
|
|
94
|
+
const script = value.slice(2, -2).trim();
|
|
95
|
+
const result = FunctionUtils.executeReturn({
|
|
96
|
+
script,
|
|
97
|
+
context: n,
|
|
98
|
+
args: { ...groupArgs, $value: this._value }
|
|
99
|
+
});
|
|
100
|
+
n.setAttribute(attr.name, String(result));
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
83
104
|
});
|
|
84
105
|
this._executeCloneCallback("on-clone-nodes", groupArgs);
|
|
85
|
-
|
|
86
|
-
portal.insertBefore(clone, this.nextSibling);
|
|
87
|
-
} else {
|
|
88
|
-
portal.appendChild(clone);
|
|
89
|
-
}
|
|
106
|
+
this.parentElement?.insertBefore(clone, this.nextSibling);
|
|
90
107
|
}
|
|
91
108
|
}
|
|
92
109
|
cleanup() {
|
|
@@ -101,12 +118,9 @@ class SwcChoose extends HTMLTemplateElement {
|
|
|
101
118
|
}
|
|
102
119
|
}
|
|
103
120
|
__decorate([
|
|
104
|
-
changedAttributeHost("
|
|
121
|
+
changedAttributeHost("value"),
|
|
105
122
|
__metadata("design:type", Function),
|
|
106
|
-
__metadata("design:paramtypes", []),
|
|
123
|
+
__metadata("design:paramtypes", [String]),
|
|
107
124
|
__metadata("design:returntype", void 0)
|
|
108
125
|
], SwcChoose.prototype, "refresh", null);
|
|
109
|
-
export {
|
|
110
|
-
SwcChoose
|
|
111
|
-
};
|
|
112
126
|
//# sourceMappingURL=SwcChoose.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/elements/SwcChoose.ts"],
|
|
4
|
-
"sourcesContent": ["import { changedAttributeHost } from '../decorators/changedAttributeHost';\nimport { SwcUtils } from '../utils/Utils';\nimport { FunctionUtils } from '@dooboostore/core';\n\
|
|
5
|
-
"mappings": ";;;;;;;;;AAAA,SAAS,4BAA4B;AACrC,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;
|
|
4
|
+
"sourcesContent": ["import { changedAttributeHost } from '../decorators/changedAttributeHost';\nimport { SwcUtils } from '../utils/Utils';\nimport { FunctionUtils } from '@dooboostore/core';\nimport { SwcChooseInterface } from '../types';\n\nclass SwcChoose extends HTMLTemplateElement implements SwcChooseInterface {\n private _nodes: Node[] = [];\n private _value: any = null;\n private _previousTemplate: HTMLTemplateElement | null = null;\n\n get value(): any {\n return this._value;\n }\n set value(nv: any) {\n this._value = nv;\n this.render();\n }\n\n private _executeCloneCallback(attr: string, args: any) {\n const script = this.getAttribute(attr);\n if (!script) return;\n FunctionUtils.execute({ script, context: this, args });\n }\n\n @changedAttributeHost('value')\n refresh(valueAttr?: string | null) {\n valueAttr ??= this.getAttribute('value');\n if (valueAttr === null) {\n this.value = null;\n return;\n }\n\n // {{ }} 브레이스로 감싸진 값은 스크립트 실행\n if (valueAttr.startsWith('{{') && valueAttr.endsWith('}}')) {\n const script = valueAttr.slice(2, -2).trim();\n const win = this.ownerDocument?.defaultView || window;\n const helperAndHostSet = SwcUtils.getHelperAndHostSet(win, SwcUtils.findNearestSwcHost(this));\n // console.log('vvvvvvvvvvvvvvvvvv323', helperAndHostSet);\n const result = FunctionUtils.executeReturn({ script, context: this, args: helperAndHostSet });\n this.value = result;\n // console.log('----------vv', this.value);\n } else {\n // 일반 문자열 값\n this.value = valueAttr;\n }\n }\n\n private render() {\n // console.log('-------------', this.value);\n const win = this.ownerDocument?.defaultView || window;\n const helperSet = SwcUtils.getHelperAndHostSet(win, this);\n const templates = Array.from(this.content.querySelectorAll('template'));\n let selected: HTMLTemplateElement | null = null;\n\n for (const t of templates) {\n if (t.getAttribute('is') === 'swc-when') {\n let matches = false;\n const value = t.getAttribute('value') || '';\n\n // {{ }} 브레이스로 감싸진 값은 스크립트 실행\n if (value.startsWith('{{') && value.endsWith('}}')) {\n const script = value.slice(2, -2).trim();\n const result = FunctionUtils.executeReturn({\n script,\n context: t,\n args: { ...helperSet, $value: this._value }\n });\n // console.log('rrrrrrrrrrrrrr', result);\n matches = result === true;\n } else {\n // 일반 문자열 비교 (기존 방식)\n matches = String(value) === String(this._value);\n }\n\n if (matches) {\n selected = t;\n break;\n }\n }\n }\n\n const target = selected || (this.content.querySelector('template[is=\"swc-otherwise\"]') as HTMLTemplateElement);\n\n // skip-if-same attribute가 있고 이전과 같은 template이면 렌더링 스킵\n // 최상위 skip-if-same 또는 각 when/otherwise의 skip-if-same 체크\n const targetHasSkipIfSame = target?.hasAttribute('skip-if-same');\n const shouldSkip = (this.hasAttribute('skip-if-same') || targetHasSkipIfSame) && this._previousTemplate === target;\n if (shouldSkip) {\n return;\n }\n\n this.cleanup();\n this._previousTemplate = target;\n\n if (target) {\n const clone = target.content.cloneNode(true) as DocumentFragment;\n this._nodes = Array.from(clone.childNodes);\n const elements = this._nodes.filter(n => n.nodeType === 1) as HTMLElement[];\n const groupArgs = { ...helperSet, $value: this._value, $nodes: this._nodes, $elements: elements, $firstElement: elements[0] };\n\n // 복제된 최상위 요소들은 SwcChoose의 직접 자식이 될 것이므로 __swc_host 설정 안 함\n this._nodes.forEach((n, nodeIdx) => {\n // if (n instanceof HTMLElement) (n as any).__swc_host = this; // 제거: 부모 체인 유지\n this._executeCloneCallback('on-clone-node', { ...groupArgs, $node: n, $nodeIndex: nodeIdx, $isElement: n.nodeType === 1 });\n\n // Attribute {{ }} 치환 - HTML string 차원에서 동적 치환\n if (n instanceof HTMLElement) {\n Array.from(n.attributes).forEach(attr => {\n const value = attr.value || '';\n if (value.startsWith('{{') && value.endsWith('}}')) {\n const script = value.slice(2, -2).trim();\n const result = FunctionUtils.executeReturn({\n script,\n context: n,\n args: { ...groupArgs, $value: this._value }\n });\n n.setAttribute(attr.name, String(result));\n }\n });\n }\n });\n\n this._executeCloneCallback('on-clone-nodes', groupArgs);\n\n this.parentElement?.insertBefore(clone, this.nextSibling);\n // if (portal === this.parentElement) {\n // portal.insertBefore(clone, this.nextSibling);\n // } else {\n // portal.appendChild(clone);\n // }\n }\n }\n\n private cleanup() {\n this._nodes.forEach(n => n.parentElement?.removeChild(n));\n this._nodes = [];\n }\n\n connectedCallback() {\n this.refresh();\n }\n disconnectedCallback() {\n this.cleanup();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -23,49 +23,34 @@ class SwcIf extends HTMLTemplateElement {
|
|
|
23
23
|
this._value = Boolean(nv);
|
|
24
24
|
this.render();
|
|
25
25
|
}
|
|
26
|
-
_resolvePortal() {
|
|
27
|
-
const portalScript = this.getAttribute("on-get-portal");
|
|
28
|
-
if (!portalScript)
|
|
29
|
-
return this.parentElement;
|
|
30
|
-
const win = this.ownerDocument?.defaultView || window;
|
|
31
|
-
const res = FunctionUtils.executeReturn({
|
|
32
|
-
script: portalScript,
|
|
33
|
-
context: this,
|
|
34
|
-
args: SwcUtils.getHelperAndHostSet(win, this)
|
|
35
|
-
});
|
|
36
|
-
if (res instanceof HTMLElement)
|
|
37
|
-
return res;
|
|
38
|
-
if (typeof res === "string")
|
|
39
|
-
return win.document.querySelector(res);
|
|
40
|
-
return this.parentElement;
|
|
41
|
-
}
|
|
42
26
|
_executeCloneCallback(attr, args) {
|
|
43
27
|
const script = this.getAttribute(attr);
|
|
44
28
|
if (!script)
|
|
45
29
|
return;
|
|
46
30
|
FunctionUtils.execute({ script, context: this, args });
|
|
47
31
|
}
|
|
48
|
-
refreshValue() {
|
|
49
|
-
|
|
50
|
-
if (
|
|
32
|
+
refreshValue(valueAttr) {
|
|
33
|
+
valueAttr ?? (valueAttr = this.getAttribute("value"));
|
|
34
|
+
if (valueAttr === null) {
|
|
51
35
|
this.value = false;
|
|
52
36
|
return;
|
|
53
37
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
38
|
+
if (valueAttr.startsWith("{{") && valueAttr.endsWith("}}")) {
|
|
39
|
+
const script = valueAttr.slice(2, -2).trim();
|
|
40
|
+
const win = this.ownerDocument?.defaultView || window;
|
|
41
|
+
const result = FunctionUtils.executeReturn({
|
|
42
|
+
script,
|
|
43
|
+
context: this,
|
|
44
|
+
args: SwcUtils.getHelperAndHostSet(win, this)
|
|
45
|
+
});
|
|
46
|
+
this.value = result;
|
|
62
47
|
} else {
|
|
63
|
-
this.value =
|
|
48
|
+
this.value = Boolean(valueAttr);
|
|
64
49
|
}
|
|
65
50
|
}
|
|
66
51
|
render() {
|
|
67
52
|
this.cleanup();
|
|
68
|
-
const portal = this.
|
|
53
|
+
const portal = this.parentElement;
|
|
69
54
|
if (!portal)
|
|
70
55
|
return;
|
|
71
56
|
const win = this.ownerDocument?.defaultView || window;
|
|
@@ -85,16 +70,24 @@ class SwcIf extends HTMLTemplateElement {
|
|
|
85
70
|
const elements = this._nodes.filter((n) => n.nodeType === 1);
|
|
86
71
|
const groupArgs = { ...helperSet, $value: this._value, $nodes: this._nodes, $elements: elements, $firstElement: elements[0] };
|
|
87
72
|
this._nodes.forEach((node, nodeIdx) => {
|
|
88
|
-
if (node instanceof HTMLElement)
|
|
89
|
-
node.__swc_host = this;
|
|
90
73
|
this._executeCloneCallback("on-clone-node", { ...groupArgs, $node: node, $nodeIndex: nodeIdx, $isElement: node.nodeType === 1 });
|
|
74
|
+
if (node instanceof HTMLElement) {
|
|
75
|
+
Array.from(node.attributes).forEach((attr) => {
|
|
76
|
+
const value = attr.value || "";
|
|
77
|
+
if (value.startsWith("{{") && value.endsWith("}}")) {
|
|
78
|
+
const script = value.slice(2, -2).trim();
|
|
79
|
+
const result = FunctionUtils.executeReturn({
|
|
80
|
+
script,
|
|
81
|
+
context: node,
|
|
82
|
+
args: { ...groupArgs, $value: this._value }
|
|
83
|
+
});
|
|
84
|
+
node.setAttribute(attr.name, String(result));
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
91
88
|
});
|
|
92
89
|
this._executeCloneCallback("on-clone-nodes", groupArgs);
|
|
93
|
-
|
|
94
|
-
portal.insertBefore(clone, this.nextSibling);
|
|
95
|
-
} else {
|
|
96
|
-
portal.appendChild(clone);
|
|
97
|
-
}
|
|
90
|
+
portal.insertBefore(clone, this.nextSibling);
|
|
98
91
|
}
|
|
99
92
|
}
|
|
100
93
|
cleanup() {
|
|
@@ -109,12 +102,9 @@ class SwcIf extends HTMLTemplateElement {
|
|
|
109
102
|
}
|
|
110
103
|
}
|
|
111
104
|
__decorate([
|
|
112
|
-
changedAttributeHost("
|
|
105
|
+
changedAttributeHost("value"),
|
|
113
106
|
__metadata("design:type", Function),
|
|
114
|
-
__metadata("design:paramtypes", []),
|
|
107
|
+
__metadata("design:paramtypes", [String]),
|
|
115
108
|
__metadata("design:returntype", void 0)
|
|
116
109
|
], SwcIf.prototype, "refreshValue", null);
|
|
117
|
-
export {
|
|
118
|
-
SwcIf
|
|
119
|
-
};
|
|
120
110
|
//# sourceMappingURL=SwcIf.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/elements/SwcIf.ts"],
|
|
4
|
-
"sourcesContent": ["import { changedAttributeHost } from '../decorators/changedAttributeHost';\nimport { SwcUtils } from '../utils/Utils';\nimport { FunctionUtils } from '@dooboostore/core';\n\
|
|
5
|
-
"mappings": ";;;;;;;;;AAAA,SAAS,4BAA4B;AACrC,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;
|
|
4
|
+
"sourcesContent": ["import { changedAttributeHost } from '../decorators/changedAttributeHost';\nimport { SwcUtils } from '../utils/Utils';\nimport { FunctionUtils } from '@dooboostore/core';\n\nclass SwcIf extends HTMLTemplateElement {\n private _value = false;\n private _nodes: Node[] = [];\n\n get value(): boolean {\n return this._value;\n }\n set value(nv: any) {\n this._value = Boolean(nv);\n this.render();\n }\n\n private _executeCloneCallback(attr: string, args: any) {\n const script = this.getAttribute(attr);\n if (!script) return;\n FunctionUtils.execute({ script, context: this, args });\n }\n\n @changedAttributeHost('value')\n private refreshValue(valueAttr?: string | null) {\n valueAttr ??= this.getAttribute('value');\n if (valueAttr === null) {\n this.value = false;\n return;\n }\n\n // {{ }} 브레이스로 감싸진 값은 스크립트 실행\n if (valueAttr.startsWith('{{') && valueAttr.endsWith('}}')) {\n const script = valueAttr.slice(2, -2).trim();\n const win = this.ownerDocument?.defaultView || window;\n const result = FunctionUtils.executeReturn({\n script,\n context: this,\n args: SwcUtils.getHelperAndHostSet(win, this)\n });\n this.value = result;\n } else {\n // 일반 문자열 값\n this.value = Boolean(valueAttr);\n }\n }\n\n private render() {\n this.cleanup();\n const portal = this.parentElement;\n if (!portal) return;\n\n const win = this.ownerDocument?.defaultView || window;\n const helperSet = SwcUtils.getHelperAndHostSet(win, this);\n\n let targetTpl: HTMLTemplateElement | null = null;\n if (this._value) {\n targetTpl = this;\n } else {\n targetTpl = this.content.querySelector('template[is=\"swc-default\"]') as HTMLTemplateElement;\n }\n\n if (targetTpl) {\n const clone = targetTpl.content.cloneNode(true) as DocumentFragment;\n // If it's the host template, remove sub-templates from clone\n if (targetTpl === this) {\n clone.querySelectorAll('template[is^=\"swc-\"]').forEach(t => t.remove());\n }\n\n this._nodes = Array.from(clone.childNodes);\n const elements = this._nodes.filter(n => n.nodeType === 1) as HTMLElement[];\n const groupArgs = { ...helperSet, $value: this._value, $nodes: this._nodes, $elements: elements, $firstElement: elements[0] };\n\n // 부모 체인을 정상적으로 유지하기 위해 __swc_host 할당 제거\n this._nodes.forEach((node, nodeIdx) => {\n // if (node instanceof HTMLElement) (node as any).__swc_host = this; // 제거: 부모 체인 유지\n this._executeCloneCallback('on-clone-node', { ...groupArgs, $node: node, $nodeIndex: nodeIdx, $isElement: node.nodeType === 1 });\n\n // Attribute {{ }} 치환 - SwcChoose처럼 동적 치환\n if (node instanceof HTMLElement) {\n Array.from(node.attributes).forEach(attr => {\n const value = attr.value || '';\n if (value.startsWith('{{') && value.endsWith('}}')) {\n const script = value.slice(2, -2).trim();\n const result = FunctionUtils.executeReturn({\n script,\n context: node,\n args: { ...groupArgs, $value: this._value }\n });\n node.setAttribute(attr.name, String(result));\n }\n });\n }\n });\n\n this._executeCloneCallback('on-clone-nodes', groupArgs);\n\n portal.insertBefore(clone, this.nextSibling);\n }\n }\n\n private cleanup() {\n this._nodes.forEach(n => n.parentElement?.removeChild(n));\n this._nodes = [];\n }\n\n connectedCallback() {\n this.refreshValue();\n }\n disconnectedCallback() {\n this.cleanup();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -23,22 +23,6 @@ class SwcLoop extends HTMLTemplateElement {
|
|
|
23
23
|
this._value = Array.isArray(nv) ? [...nv] : [];
|
|
24
24
|
this.render();
|
|
25
25
|
}
|
|
26
|
-
_resolvePortal() {
|
|
27
|
-
const portalScript = this.getAttribute("on-get-portal");
|
|
28
|
-
if (!portalScript)
|
|
29
|
-
return this.parentElement;
|
|
30
|
-
const win = this.ownerDocument?.defaultView || window;
|
|
31
|
-
const res = FunctionUtils.executeReturn({
|
|
32
|
-
script: portalScript,
|
|
33
|
-
context: this,
|
|
34
|
-
args: SwcUtils.getHelperAndHostSet(win, this)
|
|
35
|
-
});
|
|
36
|
-
if (res instanceof HTMLElement)
|
|
37
|
-
return res;
|
|
38
|
-
if (typeof res === "string")
|
|
39
|
-
return win.document.querySelector(res);
|
|
40
|
-
return this.parentElement;
|
|
41
|
-
}
|
|
42
26
|
_executeCloneCallback(attr, args) {
|
|
43
27
|
const script = this.getAttribute(attr);
|
|
44
28
|
if (!script)
|
|
@@ -50,11 +34,14 @@ class SwcLoop extends HTMLTemplateElement {
|
|
|
50
34
|
this._nodeGroups = [];
|
|
51
35
|
}
|
|
52
36
|
refreshValue() {
|
|
53
|
-
|
|
37
|
+
let script = this.getAttribute("value");
|
|
54
38
|
if (!script) {
|
|
55
39
|
this.value = [];
|
|
56
40
|
return;
|
|
57
41
|
}
|
|
42
|
+
if (script.startsWith("{{") && script.endsWith("}}")) {
|
|
43
|
+
script = script.slice(2, -2).trim();
|
|
44
|
+
}
|
|
58
45
|
const win = this.ownerDocument?.defaultView || window;
|
|
59
46
|
const res = FunctionUtils.executeReturn({
|
|
60
47
|
script,
|
|
@@ -69,7 +56,7 @@ class SwcLoop extends HTMLTemplateElement {
|
|
|
69
56
|
}
|
|
70
57
|
render() {
|
|
71
58
|
this._cleanup();
|
|
72
|
-
const portal = this.
|
|
59
|
+
const portal = this.parentElement;
|
|
73
60
|
if (!portal)
|
|
74
61
|
return;
|
|
75
62
|
const win = this.ownerDocument?.defaultView || window;
|
|
@@ -92,9 +79,21 @@ class SwcLoop extends HTMLTemplateElement {
|
|
|
92
79
|
const elements = nodes.filter((n) => n.nodeType === 1);
|
|
93
80
|
const groupArgs = { ...helperSet, $item: item, $index: index, $value: this._value, $nodes: nodes, $elements: elements, $firstElement: elements[0] };
|
|
94
81
|
nodes.forEach((node, nodeIdx) => {
|
|
95
|
-
if (node instanceof HTMLElement)
|
|
96
|
-
node.__swc_host = this;
|
|
97
82
|
this._executeCloneCallback("on-clone-node", { ...groupArgs, $node: node, $nodeIndex: nodeIdx, $isElement: node.nodeType === 1 });
|
|
83
|
+
if (node instanceof HTMLElement) {
|
|
84
|
+
Array.from(node.attributes).forEach((attr) => {
|
|
85
|
+
const value = attr.value || "";
|
|
86
|
+
if (value.startsWith("{{") && value.endsWith("}}")) {
|
|
87
|
+
const script = value.slice(2, -2).trim();
|
|
88
|
+
const result = FunctionUtils.executeReturn({
|
|
89
|
+
script,
|
|
90
|
+
context: node,
|
|
91
|
+
args: groupArgs
|
|
92
|
+
});
|
|
93
|
+
node.setAttribute(attr.name, String(result));
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
98
97
|
});
|
|
99
98
|
this._executeCloneCallback("on-clone-nodes", groupArgs);
|
|
100
99
|
this._nodeGroups.push(nodes);
|
|
@@ -115,12 +114,9 @@ class SwcLoop extends HTMLTemplateElement {
|
|
|
115
114
|
}
|
|
116
115
|
}
|
|
117
116
|
__decorate([
|
|
118
|
-
changedAttributeHost("
|
|
117
|
+
changedAttributeHost("value"),
|
|
119
118
|
__metadata("design:type", Function),
|
|
120
119
|
__metadata("design:paramtypes", []),
|
|
121
120
|
__metadata("design:returntype", void 0)
|
|
122
121
|
], SwcLoop.prototype, "refreshValue", null);
|
|
123
|
-
export {
|
|
124
|
-
SwcLoop
|
|
125
|
-
};
|
|
126
122
|
//# sourceMappingURL=SwcLoop.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/elements/SwcLoop.ts"],
|
|
4
|
-
"sourcesContent": ["import { changedAttributeHost } from '../decorators/changedAttributeHost';\nimport { SwcUtils } from '../utils/Utils';\nimport { FunctionUtils } from '@dooboostore/core';\n\
|
|
5
|
-
"mappings": ";;;;;;;;;AAAA,SAAS,4BAA4B;AACrC,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;
|
|
4
|
+
"sourcesContent": ["import { changedAttributeHost } from '../decorators/changedAttributeHost';\nimport { SwcUtils } from '../utils/Utils';\nimport { FunctionUtils } from '@dooboostore/core';\n\nclass SwcLoop extends HTMLTemplateElement {\n private _value: any[] = [];\n private _nodeGroups: Node[][] = [];\n\n get value(): any[] {\n return this._value;\n }\n set value(nv: any[]) {\n this._value = Array.isArray(nv) ? [...nv] : [];\n this.render();\n }\n\n\n\n private _executeCloneCallback(attr: string, args: any) {\n const script = this.getAttribute(attr);\n if (!script) return;\n FunctionUtils.execute({ script, context: this, args });\n }\n\n private _cleanup() {\n this._nodeGroups.forEach(nodes => nodes.forEach(n => n.parentElement?.removeChild(n)));\n this._nodeGroups = [];\n }\n\n @changedAttributeHost('value')\n private refreshValue() {\n let script = this.getAttribute('value');\n if (!script) {\n this.value = [];\n return;\n }\n // Parse {{ }} braces\n if (script.startsWith('{{') && script.endsWith('}}')) {\n script = script.slice(2, -2).trim();\n }\n const win = this.ownerDocument?.defaultView || window;\n const res = FunctionUtils.executeReturn({\n script,\n context: this,\n args: SwcUtils.getHelperAndHostSet(win, this)\n });\n\n if (res instanceof Promise) {\n res.then(v => (this.value = v)).catch(() => (this.value = []));\n } else {\n this.value = res;\n }\n }\n\n render() {\n this._cleanup();\n const portal = this.parentElement;\n if (!portal) return;\n\n const win = this.ownerDocument?.defaultView || window;\n const helperSet = SwcUtils.getHelperAndHostSet(win, this);\n const fragment = win.document.createDocumentFragment();\n\n if (this._value.length === 0) {\n const defaultTpl = this.content.querySelector('template[is=\"swc-default\"]') as HTMLTemplateElement;\n if (defaultTpl) {\n const clone = defaultTpl.content.cloneNode(true);\n const nodes = Array.from(clone.childNodes);\n this._nodeGroups.push(nodes);\n fragment.appendChild(clone);\n }\n } else {\n this._value.forEach((item, index) => {\n const clone = this.content.cloneNode(true) as DocumentFragment;\n // Filter out sub-templates\n const subTemplates = clone.querySelectorAll('template[is^=\"swc-\"]');\n subTemplates.forEach(t => t.remove());\n\n const nodes = Array.from(clone.childNodes);\n const elements = nodes.filter(n => n.nodeType === 1) as HTMLElement[];\n\n const groupArgs = { ...helperSet, $item: item, $index: index, $value: this._value, $nodes: nodes, $elements: elements, $firstElement: elements[0] };\n\n nodes.forEach((node, nodeIdx) => {\n this._executeCloneCallback('on-clone-node', { ...groupArgs, $node: node, $nodeIndex: nodeIdx, $isElement: node.nodeType === 1 });\n\n // Attribute {{ }} 치환 - SwcChoose처럼 동적 치환\n if (node instanceof HTMLElement) {\n Array.from(node.attributes).forEach(attr => {\n const value = attr.value || '';\n if (value.startsWith('{{') && value.endsWith('}}')) {\n const script = value.slice(2, -2).trim();\n const result = FunctionUtils.executeReturn({\n script,\n context: node,\n args: groupArgs\n });\n node.setAttribute(attr.name, String(result));\n }\n });\n }\n });\n\n this._executeCloneCallback('on-clone-nodes', groupArgs);\n this._nodeGroups.push(nodes);\n fragment.appendChild(clone);\n });\n }\n\n if (portal === this.parentElement) {\n portal.insertBefore(fragment, this.nextSibling);\n } else {\n portal.appendChild(fragment);\n }\n }\n\n connectedCallback() {\n this.refreshValue();\n }\n disconnectedCallback() {\n this._cleanup();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -10,12 +10,4 @@ class SwcOtherwise extends HTMLTemplateElement {
|
|
|
10
10
|
}
|
|
11
11
|
class SwcDefault extends HTMLTemplateElement {
|
|
12
12
|
}
|
|
13
|
-
export {
|
|
14
|
-
SwcDefault,
|
|
15
|
-
SwcError,
|
|
16
|
-
SwcLoading,
|
|
17
|
-
SwcOtherwise,
|
|
18
|
-
SwcSuccess,
|
|
19
|
-
SwcWhen
|
|
20
|
-
};
|
|
21
13
|
//# sourceMappingURL=SwcSubTemplates.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/elements/SwcSubTemplates.ts"],
|
|
4
|
-
"sourcesContent": ["
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["class SwcLoading extends HTMLTemplateElement {}\nclass SwcError extends HTMLTemplateElement {}\nclass SwcSuccess extends HTMLTemplateElement {}\nclass SwcWhen extends HTMLTemplateElement {}\nclass SwcOtherwise extends HTMLTemplateElement {}\nclass SwcDefault extends HTMLTemplateElement {}\n"],
|
|
5
|
+
"mappings": "AAAA,MAAM,mBAAmB,oBAAoB;AAAC;AAC9C,MAAM,iBAAiB,oBAAoB;AAAC;AAC5C,MAAM,mBAAmB,oBAAoB;AAAC;AAC9C,MAAM,gBAAgB,oBAAoB;AAAC;AAC3C,MAAM,qBAAqB,oBAAoB;AAAC;AAChD,MAAM,mBAAmB,oBAAoB;AAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|