@cocreate/render 1.45.4 → 1.45.5

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/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [1.45.5](https://github.com/CoCreate-app/CoCreate-render/compare/v1.45.4...v1.45.5) (2025-11-16)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * improve template rendering logic and error handling in renderTemplate function ([decd034](https://github.com/CoCreate-app/CoCreate-render/commit/decd034e0087981dac3abc15a9f3ee79e7d0870a))
7
+
1
8
  ## [1.45.4](https://github.com/CoCreate-app/CoCreate-render/compare/v1.45.3...v1.45.4) (2025-09-01)
2
9
 
3
10
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cocreate/render",
3
- "version": "1.45.4",
3
+ "version": "1.45.5",
4
4
  "description": "A simple render component in vanilla javascript. Easily configured using HTML5 attributes and/or JavaScript API.",
5
5
  "keywords": [
6
6
  "render",
package/src/index.js CHANGED
@@ -195,7 +195,7 @@ async function render({
195
195
  }
196
196
 
197
197
  let clones = renderedNode.clones; // || renderedNode.template.clones..
198
- if (!clones) {
198
+ if (!clones && renderedNode.template) {
199
199
  clones = renderedNode.template.clones;
200
200
  console.log("renderedNode.template.clones", clones);
201
201
  }
@@ -273,17 +273,25 @@ async function render({
273
273
  async function renderTemplate(template, data, key, index, keyPath) {
274
274
  // if (!key)
275
275
  // key = template.getAttribute('render')
276
-
276
+ if (!(template instanceof HTMLElement)) {
277
+ console.log("template not an element but should be")
278
+ }
277
279
  let templateData = renderedNodes.get(template);
278
280
  if (!templateData) {
279
- templateData = { element: template, clones: new Map() };
281
+ templateData = {element: template, clones: new Map() };
280
282
  renderedNodes.set(template, templateData);
283
+ }
284
+
285
+ if (!templateData.parent && !templateData.source) {
286
+ let parentRender = template.parentElement.closest("[render]")
287
+ if (parentRender || template.source)
288
+ templateData.parent = renderedNodes.get(parentRender) || template.source
289
+ else
290
+ console.log("template parent missing is there no parent or is this an error? and source is", templateData.source)
281
291
  }
282
292
 
283
- templateData.parent =
284
- template.parentElement.closest("[render]") || template.source;
285
- if (templateData.parent) {
286
- templateData.parent = renderedNodes.get(templateData.parent);
293
+ if(!templateData.source && templateData.parent && templateData.parent.source){
294
+ templateData.source = templateData.parent.source
287
295
  }
288
296
 
289
297
  if (!templateData.keyPath) {
@@ -296,28 +304,41 @@ async function renderTemplate(template, data, key, index, keyPath) {
296
304
  }
297
305
  }
298
306
 
299
- template = templateData;
300
-
301
307
  let renderData;
302
308
  if (key) {
303
- renderData = getRenderValue(template.element, data, key);
304
- } else if (Array.isArray(data)) {
309
+ renderData = getRenderValue(templateData.element, data, key);
310
+ }
311
+
312
+ if (!renderData) {
305
313
  renderData = data;
306
314
  }
315
+
316
+ // else if (Array.isArray(data)) {
317
+ // renderData = data;
318
+ // }
319
+
320
+ // if (!renderData && data) {
321
+ // if (Array.isArray(data)) {
322
+ // renderData = data;
323
+ // } else {
324
+ // renderData = [data];
325
+ // }
326
+ // } else return;
327
+
328
+ templateData.renderData = renderData;
329
+ let el = templateData.element;
330
+ if (el.nodeType !== 1) {
331
+ el = templateData.parent.element;
332
+ }
307
333
 
308
- if (!renderData && data) {
309
- if (Array.isArray(data)) {
310
- renderData = data;
311
- } else {
312
- renderData = [data];
313
- }
314
- } else if (!renderData) return;
315
-
316
- let renderAs =
317
- template.element.getAttribute("render-as") ||
318
- template.source.element.getAttribute("render-as") ||
319
- key;
320
- template.renderAs = renderAs;
334
+ let renderAs = templateData.renderAs
335
+ if (!templateData.renderAs) {
336
+ renderAs =
337
+ el.getAttribute("render-as") ||
338
+ el.getAttribute("render") ||
339
+ key;
340
+ templateData.renderAs = renderAs;
341
+ }
321
342
 
322
343
  let renderType;
323
344
  if (templateData.source && templateData.source.element)
@@ -328,28 +349,40 @@ async function renderTemplate(template, data, key, index, keyPath) {
328
349
  renderReverse =
329
350
  templateData.source.element.getAttribute("render-reverse");
330
351
  if (!renderReverse)
331
- renderReverse = template.element.getAttribute("render-reverse");
352
+ renderReverse = el.getAttribute("render-reverse");
332
353
  }
333
354
 
334
- let exclude = template.element.getAttribute("render-exclude") || "";
355
+ let exclude = el.getAttribute("render-exclude") || "";
335
356
  if (exclude) {
336
357
  exclude = exclude.replace(/ /g, "").split(",");
337
358
  }
338
- let reference = template.element.getAttribute("render-reference");
359
+ let reference = el.getAttribute("render-reference");
339
360
 
340
361
  let isInsert = data.$filter && (data.$filter.create || data.$filter.update);
341
362
  if (renderType !== "object") {
342
363
  if ((!isInsert && !index) || data.$filter.overwrite) {
343
- if (!template.clones) template = template.template;
344
- for (const [key, element] of template.clones) {
364
+ if (!templateData.clones) {
365
+ return
366
+ if (templateData.template) {
367
+ templateData.clones = templateData.template.clones
368
+ } else if (templateData.parent && templateData.parent.template) {
369
+ templateData.clones = templateData.parent.template.clones
370
+ }
371
+ }
372
+
373
+ // if (!templateData.clones) {
374
+ // templateData
375
+ // templateData = templateData.templateData;
376
+ // }
377
+ for (const [key, element] of templateData.clones) {
345
378
  renderedNodes.delete(element);
346
379
  element.remove();
347
- template.clones.delete(key);
380
+ templateData.clones.delete(key);
348
381
  }
349
382
  } //
350
383
  // else if (index) {
351
384
  // updates data that has already been rendered
352
- // template.data = dotNotationToObject(renderData, template.data)
385
+ // templateData.data = dotNotationToObject(renderData, templateData.data)
353
386
  // }
354
387
  }
355
388
 
@@ -359,7 +392,7 @@ async function renderTemplate(template, data, key, index, keyPath) {
359
392
 
360
393
  const keys = Object.keys(renderData);
361
394
  for (let i = 0; i < keys.length; i++) {
362
- let clone = template.clones.get(keys[i]);
395
+ let clone = templateData.clones.get(keys[i]);
363
396
  clone = renderedNodes.get(clone);
364
397
 
365
398
  if (
@@ -370,7 +403,7 @@ async function renderTemplate(template, data, key, index, keyPath) {
370
403
  if (clone) {
371
404
  renderedNodes.delete(clone.element);
372
405
  clone.element.remove();
373
- template.clones.delete(keys[i]);
406
+ templateData.clones.delete(keys[i]);
374
407
  }
375
408
  continue;
376
409
  }
@@ -384,26 +417,26 @@ async function renderTemplate(template, data, key, index, keyPath) {
384
417
  let Data = { [renderAs]: { key: keys[i], value, type } };
385
418
 
386
419
  if (!clone) {
387
- clone = cloneTemplate(template);
420
+ clone = cloneTemplate(templateData);
388
421
  } else {
389
422
  if (clone.renderedValue === value) {
390
423
  continue;
391
424
  }
392
425
  }
393
426
  clone.renderedValue = value;
394
- // let clone = cloneTemplate(template);
427
+ // let clone = cloneTemplate(templateData);
395
428
 
396
429
  let renderedKey = key.split(".");
397
430
  renderedKey = renderedKey[renderedKey.length - 1];
398
431
  //renderedKey needs to remove the parent.renderAs/key
399
432
 
400
433
  clone.key = keys[i];
401
- clone.keyPath = template.keyPath + "." + renderedKey;
434
+ clone.keyPath = templateData.keyPath + "." + renderedKey;
402
435
  clone.parentKey = renderedKey;
403
436
  clone.renderKey = key;
404
437
  clone.element.setAttribute("renderedKey", keys[i]);
405
438
  await renderValues(clone.element, Data, keys[i], renderAs);
406
- insertElement(template, clone.element, index);
439
+ insertElement(templateData, clone.element, index);
407
440
  }
408
441
  } else {
409
442
  if (!key && !Array.isArray(renderData)) {
@@ -413,20 +446,20 @@ async function renderTemplate(template, data, key, index, keyPath) {
413
446
  }
414
447
 
415
448
  if (!renderData) {
416
- let clone = cloneTemplate(template);
417
- clone.keyPath = template.keyPath;
449
+ let clone = cloneTemplate(templateData);
450
+ clone.keyPath = templateData.keyPath;
418
451
  await renderValues(clone.element, data, key, renderAs);
419
- insertElement(template, clone.element, index);
452
+ insertElement(templateData, clone.element, index);
420
453
  } else {
421
454
  if (!Array.isArray(renderData)) renderData = [renderData];
422
455
 
423
456
  for (let i = 0; i < renderData.length; i++) {
424
- let clone = cloneTemplate(template);
457
+ let clone = cloneTemplate(templateData);
425
458
 
426
459
  let test = clone.element.getAttribute("render-as");
427
460
  if (test) renderAs = test;
428
461
 
429
- clone.keyPath = template.keyPath || "" + `[${i}]`;
462
+ clone.keyPath = templateData.keyPath || "" + `[${i}]`;
430
463
 
431
464
  let object;
432
465
  if (
@@ -455,6 +488,9 @@ async function renderTemplate(template, data, key, index, keyPath) {
455
488
 
456
489
  let index;
457
490
  if (key !== "data") index = i;
491
+
492
+ clone.renderData = object
493
+ clone.index = index
458
494
  await renderValues(
459
495
  clone.element,
460
496
  object,
@@ -465,7 +501,7 @@ async function renderTemplate(template, data, key, index, keyPath) {
465
501
  index
466
502
  );
467
503
  insertElement(
468
- template,
504
+ templateData,
469
505
  clone.element,
470
506
  index,
471
507
  "",
@@ -713,8 +749,9 @@ async function renderValues(node, data, key, renderAs, keyPath, parent, index) {
713
749
  return;
714
750
  }
715
751
  }
716
- if (node.getAttribute("render") && !node.hasAttribute("render-clone")) {
717
- renderTemplate(node, data);
752
+ if (node.hasAttribute("render") && !node.hasAttribute("render-clone")) {
753
+ let renderKey = node.getAttribute("render") || key
754
+ renderTemplate(node, data, renderKey);
718
755
  } else if (node.childNodes.length > 0) {
719
756
  // Array.from(node.childNodes).forEach(childNode => {
720
757
  for (let childNode of node.childNodes) {
@@ -1157,14 +1194,20 @@ Observer.init({
1157
1194
 
1158
1195
  let renderedNode = renderedNodes.get(parentElement);
1159
1196
  let data;
1160
- if (renderedNode.source) {
1161
- data = renderedNode.source.data;
1197
+ if (renderedNode) {
1198
+ if (renderedNode.renderData) {
1199
+ data = renderedNode.renderData;
1200
+ }
1201
+ } else {
1202
+ let sourceElement = mutation.target.parentElement.closest("[render-query]")
1203
+ let sourceData = sources.get(sourceElement);
1204
+ if (sourceData) {
1205
+ data = sourceData.data;
1206
+ }
1162
1207
  }
1163
- if (renderedNode.template) {
1164
- data = renderedNode.template.source.data;
1208
+ if (data) {
1209
+ // render({ element: mutation.target, data });
1165
1210
  }
1166
-
1167
- render({ element: mutation.target, data });
1168
1211
  }
1169
1212
  });
1170
1213