Skip to content

Commit 94e5385

Browse files
committed
fix: rendering object key
1 parent 465425e commit 94e5385

File tree

1 file changed

+133
-101
lines changed

1 file changed

+133
-101
lines changed

src/index.js

Lines changed: 133 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -95,57 +95,65 @@ async function render({
9595
update,
9696
remove
9797
}) {
98-
let Data = { ...data };
98+
if (!data || (!source && !data)) {
99+
return;
100+
}
101+
99102
if (!element) {
100-
if (source) {
101-
if (source.hasAttribute("render-query")) {
102-
element = queryElements({ element: source, prefix: "render" });
103+
if (source instanceof HTMLElement) {
104+
if (selector || (selector = source.getAttribute("render-query"))) {
105+
element = queryElements({
106+
element: source,
107+
selector
108+
});
103109
} else if (source.children.length > 0) {
104-
for (const child of source.children) {
105-
if (
106-
child.matches(
107-
"template, [template], .template, [render]"
108-
)
109-
) {
110-
element = child;
111-
break; // Found the desired element, no need to continue the loop.
112-
}
113-
}
114-
}
115-
116-
if (!element) {
117-
element = source.querySelector(
118-
"template, [template], .template, [render]"
110+
element = Array.from(source.children).find((child) =>
111+
child.matches("template, [template], .template, [render]")
119112
);
113+
if (!element) {
114+
element = source.querySelector(
115+
"template, [template], .template, [render]"
116+
);
117+
}
120118
}
121-
} else if (selector) element = queryElements({ selector });
119+
} else if (selector) {
120+
element = queryElements({
121+
selector
122+
});
123+
}
122124

123-
if (!element || (Array.isArray(element) && !element.length)) return;
125+
if (!element || (Array.isArray(element) && !element.length)) {
126+
return;
127+
}
124128
}
125129

126-
if (source) {
127-
if (!key) {
128-
key = source.getAttribute("render") || source.getAttribute("key");
129-
if (!key) {
130-
key = data.type;
131-
if (key == "key") key = "object";
132-
else if (!key && data.method) key = data.method.split(".")[0];
133-
else if (!key) return;
134-
} else if (key == "{}") key = "object";
130+
if (!key) {
131+
key =
132+
source.getAttribute("render") ||
133+
source.getAttribute("key") ||
134+
data.type;
135+
if (!key || key === "key") {
136+
key = "object";
137+
} else if (key === "{}" || (!key && data.method)) {
138+
key = data.method ? data.method.split(".")[0] : undefined;
135139
}
136-
let sourceData = sources.get(source);
137-
if (!sourceData) {
138-
sourceData = { element: source, Data };
139-
sources.set(source, sourceData);
140+
if (!key) {
141+
return;
140142
}
143+
}
141144

142-
source = sourceData;
143-
if (!source.data) {
144-
source.data = Data;
145-
}
146-
} else if (data) {
147-
source = { Data };
145+
let sourceData = sources.get(source);
146+
if (!sourceData) {
147+
sourceData = { element: source, data: { ...data } };
148+
sources.set(source, sourceData);
149+
} else if (sourceData.data) {
150+
sourceData.data = { ...data };
151+
} else {
152+
// TODO: Most effiecientway to comapre too objects or array of objects
153+
if (data === sourceData.data) return;
154+
sourceData.data = { ...data };
148155
}
156+
149157
if (data.$filter) {
150158
index = index || data.$filter.startingIndex || data.$filter.index;
151159
update = update || data.$filter.update;
@@ -156,42 +164,41 @@ async function render({
156164
!Array.isArray(element) &&
157165
!(element instanceof HTMLCollection) &&
158166
!(element instanceof NodeList)
159-
)
167+
) {
160168
element = [element];
169+
}
161170

162171
for (let i = 0; i < element.length; i++) {
163-
key = element[i].getAttribute("render") || key;
164-
165172
let renderedNode = renderedNodes.get(element[i]);
166-
if (
167-
renderedNode &&
168-
renderedNode.clones &&
169-
renderedNode.source &&
170-
renderedNode.source.element
171-
) {
172-
let limit =
173-
renderedNode.source.element.getAttribute("render-limit");
174-
if (limit && renderedNode.clones.size >= parseInt(limit)) continue;
175-
}
176-
177-
if (source) {
178-
if (!renderedNode) {
179-
renderedNode = {
180-
element: element[i],
181-
source,
182-
clones: new Map(),
183-
renderAs: new Map()
184-
};
185-
renderedNodes.set(element[i], renderedNode);
173+
if (renderedNode) {
174+
if (
175+
renderedNode.clones &&
176+
renderedNode.source &&
177+
renderedNode.source.element
178+
) {
179+
let limit =
180+
renderedNode.source.element.getAttribute("render-limit");
181+
if (limit && renderedNode.clones.size >= parseInt(limit))
182+
continue;
186183
}
184+
} else {
185+
renderedNode = {
186+
element: element[i],
187+
source: sourceData,
188+
clones: new Map()
189+
};
190+
renderedNodes.set(element[i], renderedNode);
187191
}
188192

189-
let clones = renderedNode.clones; // || renderedNode.template.clones
193+
let clones = renderedNode.clones; // || renderedNode.template.clones..
190194
if (!clones) {
191195
clones = renderedNode.template.clones;
192196
console.log("renderedNode.template.clones", clones);
193197
}
194198

199+
key = element[i].getAttribute("render") || key;
200+
let renderType =
201+
renderedNode.source.element.getAttribute("render-type");
195202
let clone;
196203
if (remove) {
197204
for (let j = 0; j < data[key].length; j++) {
@@ -209,7 +216,10 @@ async function render({
209216
renderedNodes.delete(clone);
210217
clone.remove();
211218
}
212-
} else if ((key && Array.isArray(data[key])) || Array.isArray(data)) {
219+
} else if (
220+
(key && (Array.isArray(data[key]) || renderType)) ||
221+
Array.isArray(data)
222+
) {
213223
if (update) {
214224
for (let j = 0; j < data[key].length; j++) {
215225
if (key === "object") {
@@ -253,48 +263,36 @@ async function renderTemplate(template, data, key, index, keyPath) {
253263
}
254264

255265
templateData.parent = template.parentElement.closest("[render]");
256-
if (templateData.parent)
266+
if (templateData.parent) {
257267
templateData.parent = renderedNodes.get(templateData.parent);
268+
}
258269

259270
if (!templateData.keyPath) {
260-
if (keyPath) templateData.keyPath = keyPath;
261-
else if (templateData.parent && templateData.parent.keyPath)
271+
if (keyPath) {
272+
templateData.keyPath = keyPath;
273+
} else if (templateData.parent && templateData.parent.keyPath) {
262274
templateData.keyPath = templateData.parent.keyPath;
263-
else if (key) templateData.keyPath = key;
275+
} else if (key) {
276+
templateData.keyPath = key;
277+
}
264278
}
265279

266280
template = templateData;
267281

268282
let renderData;
269-
if (key) renderData = getRenderValue(template.element, data, key);
270-
else if (Array.isArray(data)) renderData = data;
271-
272-
if (!renderData && data)
273-
if (Array.isArray(data)) renderData = data;
274-
else renderData = [data];
275-
else if (!renderData) return;
283+
if (key) {
284+
renderData = getRenderValue(template.element, data, key);
285+
} else if (Array.isArray(data)) {
286+
renderData = data;
287+
}
276288

277-
let isInsert = data.$filter && (data.$filter.create || data.$filter.update);
278-
if ((!isInsert && !index) || data.$filter.overwrite) {
279-
if (!template.clones) template = template.template;
280-
for (const [key, element] of template.clones) {
281-
renderedNodes.delete(element);
282-
element.remove();
283-
template.clones.delete(key);
289+
if (!renderData && data) {
290+
if (Array.isArray(data)) {
291+
renderData = data;
292+
} else {
293+
renderData = [data];
284294
}
285-
// if (renderedNodes.size) {
286-
// for (let [element] of renderedNodes) {
287-
// element.remove()
288-
// }
289-
// renderedNodes.clear();
290-
// }
291-
292-
// template.data = renderData
293-
}
294-
// else if (index) {
295-
// updates data that has already been rendered
296-
// template.data = dotNotationToObject(renderData, template.data)
297-
// }
295+
} else if (!renderData) return;
298296

299297
let renderAs = template.element.getAttribute("render-as") || key;
300298
template.renderAs = renderAs;
@@ -317,18 +315,43 @@ async function renderTemplate(template, data, key, index, keyPath) {
317315
}
318316
let reference = template.element.getAttribute("render-reference");
319317

318+
let isInsert = data.$filter && (data.$filter.create || data.$filter.update);
319+
if (renderType !== "object") {
320+
if ((!isInsert && !index) || data.$filter.overwrite) {
321+
if (!template.clones) template = template.template;
322+
for (const [key, element] of template.clones) {
323+
renderedNodes.delete(element);
324+
element.remove();
325+
template.clones.delete(key);
326+
}
327+
} //
328+
// else if (index) {
329+
// updates data that has already been rendered
330+
// template.data = dotNotationToObject(renderData, template.data)
331+
// }
332+
}
333+
320334
if ((key && !Array.isArray(renderData)) || renderType === "object") {
321335
if (renderType && Array.isArray(renderData) && renderData.length === 1)
322336
renderData = renderData[0];
323337

324338
const keys = Object.keys(renderData);
325339
for (let i = 0; i < keys.length; i++) {
326-
if (exclude.includes(keys[i])) continue;
340+
let clone = template.clones.get(keys[i]);
341+
clone = renderedNodes.get(clone);
342+
327343
if (
328-
reference === "false" &&
329-
["$storage", "$database", "$array"].includes(key)
330-
)
344+
exclude.includes(keys[i]) ||
345+
(reference === "false" &&
346+
["$storage", "$database", "$array"].includes(key))
347+
) {
348+
if (clone) {
349+
renderedNodes.delete(clone.element);
350+
clone.element.remove();
351+
template.clones.delete(keys[i]);
352+
}
331353
continue;
354+
}
332355

333356
let value = renderData[keys[i]];
334357
let type = "string";
@@ -338,7 +361,16 @@ async function renderTemplate(template, data, key, index, keyPath) {
338361

339362
let Data = { [renderAs]: { key: keys[i], value, type } };
340363

341-
let clone = cloneTemplate(template);
364+
if (!clone) {
365+
clone = cloneTemplate(template);
366+
} else {
367+
if (clone.renderedValue === value) {
368+
continue;
369+
}
370+
}
371+
clone.renderedValue = value;
372+
// let clone = cloneTemplate(template);
373+
342374
let renderedKey = key.split(".");
343375
renderedKey = renderedKey[renderedKey.length - 1];
344376
//renderedKey needs to remove the parent.renderAs/key

0 commit comments

Comments
 (0)