Skip to content

Commit 1a9959b

Browse files
committed
ix: Refactor queryElements function to accept an object for element parameter
- Previously the queryElements function accepted a single parameter for the element. - This commit refactors the queryElements function to accept an object with element and prefix properties. - This change allows for more flexibility when querying elements with specific prefixes.
1 parent dd657d2 commit 1a9959b

File tree

1 file changed

+102
-92
lines changed

1 file changed

+102
-92
lines changed

src/index.js

Lines changed: 102 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,108 @@ function init(element) {
2626
}
2727
}
2828

29+
function render({ source, element, data, key, index, currentIndex, update, remove }) {
30+
if (!element) {
31+
if (source) {
32+
element = queryElements({ element: source, prefix: 'render' })
33+
if (!element && source.children.length > 0) {
34+
for (const child of source.children) {
35+
if (child.matches('template, [template], .template, [render]')) {
36+
element = child;
37+
break; // Found the desired element, no need to continue the loop
38+
}
39+
}
40+
}
41+
42+
if (!element) {
43+
element = source.querySelector('template, [template], .template, [render]');
44+
}
45+
}
46+
47+
if (!element) return;
48+
}
49+
50+
if (source) {
51+
let sourceData = sources.get(source)
52+
if (!sourceData) {
53+
sourceData = { element: source, data }
54+
sources.set(source, sourceData)
55+
}
56+
57+
source = sourceData
58+
if (!source.data)
59+
source.data = data
60+
} else if (data)
61+
source = { data }
62+
63+
if (data.filter) {
64+
index = index || data.filter.index
65+
update = update || data.filter.update
66+
remove = remove || data.filter.remove
67+
}
68+
69+
if (!Array.isArray(element) && !(element instanceof HTMLCollection) && !(element instanceof NodeList))
70+
element = [element]
71+
72+
for (let i = 0; i < element.length; i++) {
73+
if (!key)
74+
key = element[i].getAttribute('render')
75+
76+
let renderedNode = renderedNodes.get(element[i])
77+
if (source) {
78+
if (!renderedNode) {
79+
renderedNode = { element: element[i], source, clones: new Map(), renderAs: new Map() }
80+
renderedNodes.set(element[i], renderedNode)
81+
}
82+
}
83+
84+
if (remove) {
85+
if (renderedNode.source) {
86+
if (key)
87+
renderedNode.source.data[key].splice(index, 1)
88+
else {
89+
90+
}
91+
}
92+
93+
let clone = Array.from(renderedNode.clones)[index]
94+
if (!clone) return
95+
96+
renderedNode.clones.delete(clone[0])
97+
renderedNodes.delete(clone[1])
98+
clone[1].remove()
99+
} else if (key) {
100+
if (update) {
101+
let clone
102+
103+
if (!currentIndex)
104+
currentIndex = data.filter.currentIndex
105+
106+
if (currentIndex >= 0)
107+
clone = Array.from(renderedNode.clones)[currentIndex]
108+
else
109+
clone = Array.from(renderedNode.clones)[index]
110+
111+
if (!clone) return
112+
113+
renderValues(clone[1], data);
114+
if (currentIndex >= 0)
115+
insertElement(renderedNode, clone[1], index, currentIndex)
116+
}
117+
118+
// TODO: if $auto here every subsequent clone will have same value, not replacing here will apply unique value to each clone
119+
if (key === '$auto')
120+
key = key.replace(/\$auto/g, uuid.generate(6));
121+
122+
element[i].setAttribute('render', key);
123+
124+
renderTemplate(element[i], data, key, index);
125+
} else
126+
renderValues(element[i], data);
127+
128+
}
129+
130+
}
29131

30132
function renderTemplate(template, data, key, index, keyPath) {
31133
if (!key)
@@ -474,98 +576,6 @@ function getRenderValue(node, data, key, renderAs) {
474576
// render({ source, selector, element, data, key, index, update, remove })
475577
// }
476578

477-
function render({ source, element, data, key, index, currentIndex, update, remove }) {
478-
if (!element) {
479-
if (source) {
480-
element = queryElements(source, 'render')
481-
if (!element)
482-
element = source.querySelector('template, [template], .template', '[render]')
483-
}
484-
485-
if (!element) return;
486-
}
487-
488-
if (source) {
489-
let sourceData = sources.get(source)
490-
if (!sourceData) {
491-
sourceData = { element: source, data }
492-
sources.set(source, sourceData)
493-
}
494-
495-
source = sourceData
496-
if (!source.data)
497-
source.data = data
498-
} else if (data)
499-
source = { data }
500-
501-
if (data.filter) {
502-
index = index || data.filter.index
503-
update = update || data.filter.update
504-
remove = remove || data.filter.remove
505-
}
506-
507-
if (!Array.isArray(element) && !(element instanceof HTMLCollection) && !(element instanceof NodeList))
508-
element = [element]
509-
510-
for (let i = 0; i < element.length; i++) {
511-
if (!key)
512-
key = element[i].getAttribute('render')
513-
514-
let renderedNode = renderedNodes.get(element[i])
515-
if (source) {
516-
if (!renderedNode) {
517-
renderedNode = { element: element[i], source, clones: new Map(), renderAs: new Map() }
518-
renderedNodes.set(element[i], renderedNode)
519-
}
520-
}
521-
522-
if (remove) {
523-
if (renderedNode.source) {
524-
if (key)
525-
renderedNode.source.data[key].splice(index, 1)
526-
else {
527-
528-
}
529-
}
530-
531-
let clone = Array.from(renderedNode.clones)[index]
532-
if (!clone) return
533-
534-
renderedNode.clones.delete(clone[0])
535-
renderedNodes.delete(clone[1])
536-
clone[1].remove()
537-
} else if (key) {
538-
if (update) {
539-
let clone
540-
541-
if (!currentIndex)
542-
currentIndex = data.filter.currentIndex
543-
544-
if (currentIndex >= 0)
545-
clone = Array.from(renderedNode.clones)[currentIndex]
546-
else
547-
clone = Array.from(renderedNode.clones)[index]
548-
549-
if (!clone) return
550-
551-
renderValues(clone[1], data);
552-
if (currentIndex >= 0)
553-
insertElement(renderedNode, clone[1], index, currentIndex)
554-
}
555-
556-
// TODO: if $auto here every subsequent clone will have same value, not replacing here will apply unique value to each clone
557-
if (key === '$auto')
558-
key = key.replace(/\$auto/g, uuid.generate(6));
559-
560-
element[i].setAttribute('render', key);
561-
562-
renderTemplate(element[i], data, key, index);
563-
} else
564-
renderValues(element[i], data);
565-
566-
}
567-
568-
}
569579

570580
function renderKey(element, params) {
571581
// TODO: custom render-keys

0 commit comments

Comments
 (0)