@cocreate/render 1.45.3 → 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.
Files changed (3) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/package.json +1 -9
  3. package/src/index.js +129 -55
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
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
+
8
+ ## [1.45.4](https://github.com/CoCreate-app/CoCreate-render/compare/v1.45.3...v1.45.4) (2025-09-01)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * enhance rendering logic and event dispatching for HTML elements ([0a07d0d](https://github.com/CoCreate-app/CoCreate-render/commit/0a07d0de0a6f8badd583326e0f506527368c2fb3))
14
+
1
15
  ## [1.45.3](https://github.com/CoCreate-app/CoCreate-render/compare/v1.45.2...v1.45.3) (2025-05-01)
2
16
 
3
17
 
package/package.json CHANGED
@@ -1,18 +1,10 @@
1
1
  {
2
2
  "name": "@cocreate/render",
3
- "version": "1.45.3",
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",
7
- "cocreate",
8
- "low-code-framework",
9
- "no-code-framework",
10
- "cocreatejs",
11
- "cocreatejs-component",
12
- "cocreate-framework",
13
- "no-code",
14
7
  "low-code",
15
- "collaborative-framework",
16
8
  "realtime",
17
9
  "realtime-framework",
18
10
  "collaboration",
package/src/index.js CHANGED
@@ -128,10 +128,14 @@ async function render({
128
128
  }
129
129
 
130
130
  if (!key) {
131
- key =
132
- source.getAttribute("render") ||
133
- source.getAttribute("key") ||
134
- data.type;
131
+ if (source instanceof HTMLElement) {
132
+ key =
133
+ source.getAttribute("render") ||
134
+ source.getAttribute("key") ||
135
+ data.type;
136
+ } else {
137
+ key = data.type;
138
+ }
135
139
  if (!key || key === "key") {
136
140
  key = "object";
137
141
  } else if (key === "{}" || (!key && data.method)) {
@@ -191,14 +195,23 @@ async function render({
191
195
  }
192
196
 
193
197
  let clones = renderedNode.clones; // || renderedNode.template.clones..
194
- if (!clones) {
198
+ if (!clones && renderedNode.template) {
195
199
  clones = renderedNode.template.clones;
196
200
  console.log("renderedNode.template.clones", clones);
197
201
  }
198
202
 
199
203
  key = element[i].getAttribute("render") || key;
200
- let renderType =
201
- renderedNode.source.element.getAttribute("render-type");
204
+ let renderedSource = renderedNode.source;
205
+ if (!renderedSource) {
206
+ if (renderedNode.parent && renderedNode.parent.template) {
207
+ renderedSource = renderedNode.parent.template.source;
208
+ }
209
+ }
210
+ let renderType;
211
+ if (renderedSource && renderedSource.element) {
212
+ renderType = renderedSource.element.getAttribute("render-type");
213
+ }
214
+
202
215
  let clone;
203
216
  if (remove) {
204
217
  for (let j = 0; j < data[key].length; j++) {
@@ -250,21 +263,35 @@ async function render({
250
263
  await renderValues(element[i], data, key, renderAs);
251
264
  }
252
265
  }
266
+ // Dispatch input and change events after rendering is complete
267
+ if (source instanceof HTMLElement) {
268
+ source.dispatchEvent(new Event("input"));
269
+ source.dispatchEvent(new Event("change"));
270
+ }
253
271
  }
254
272
 
255
273
  async function renderTemplate(template, data, key, index, keyPath) {
256
274
  // if (!key)
257
275
  // key = template.getAttribute('render')
258
-
276
+ if (!(template instanceof HTMLElement)) {
277
+ console.log("template not an element but should be")
278
+ }
259
279
  let templateData = renderedNodes.get(template);
260
280
  if (!templateData) {
261
- templateData = { element: template, clones: new Map() };
281
+ templateData = {element: template, clones: new Map() };
262
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)
263
291
  }
264
292
 
265
- templateData.parent = template.parentElement.closest("[render]");
266
- if (templateData.parent) {
267
- templateData.parent = renderedNodes.get(templateData.parent);
293
+ if(!templateData.source && templateData.parent && templateData.parent.source){
294
+ templateData.source = templateData.parent.source
268
295
  }
269
296
 
270
297
  if (!templateData.keyPath) {
@@ -277,25 +304,41 @@ async function renderTemplate(template, data, key, index, keyPath) {
277
304
  }
278
305
  }
279
306
 
280
- template = templateData;
281
-
282
307
  let renderData;
283
308
  if (key) {
284
- renderData = getRenderValue(template.element, data, key);
285
- } else if (Array.isArray(data)) {
309
+ renderData = getRenderValue(templateData.element, data, key);
310
+ }
311
+
312
+ if (!renderData) {
286
313
  renderData = data;
287
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
+ }
288
333
 
289
- if (!renderData && data) {
290
- if (Array.isArray(data)) {
291
- renderData = data;
292
- } else {
293
- renderData = [data];
294
- }
295
- } else if (!renderData) return;
296
-
297
- let renderAs = template.element.getAttribute("render-as") || key;
298
- 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
+ }
299
342
 
300
343
  let renderType;
301
344
  if (templateData.source && templateData.source.element)
@@ -306,28 +349,40 @@ async function renderTemplate(template, data, key, index, keyPath) {
306
349
  renderReverse =
307
350
  templateData.source.element.getAttribute("render-reverse");
308
351
  if (!renderReverse)
309
- renderReverse = template.element.getAttribute("render-reverse");
352
+ renderReverse = el.getAttribute("render-reverse");
310
353
  }
311
354
 
312
- let exclude = template.element.getAttribute("render-exclude") || "";
355
+ let exclude = el.getAttribute("render-exclude") || "";
313
356
  if (exclude) {
314
357
  exclude = exclude.replace(/ /g, "").split(",");
315
358
  }
316
- let reference = template.element.getAttribute("render-reference");
359
+ let reference = el.getAttribute("render-reference");
317
360
 
318
361
  let isInsert = data.$filter && (data.$filter.create || data.$filter.update);
319
362
  if (renderType !== "object") {
320
363
  if ((!isInsert && !index) || data.$filter.overwrite) {
321
- if (!template.clones) template = template.template;
322
- 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) {
323
378
  renderedNodes.delete(element);
324
379
  element.remove();
325
- template.clones.delete(key);
380
+ templateData.clones.delete(key);
326
381
  }
327
382
  } //
328
383
  // else if (index) {
329
384
  // updates data that has already been rendered
330
- // template.data = dotNotationToObject(renderData, template.data)
385
+ // templateData.data = dotNotationToObject(renderData, templateData.data)
331
386
  // }
332
387
  }
333
388
 
@@ -337,7 +392,7 @@ async function renderTemplate(template, data, key, index, keyPath) {
337
392
 
338
393
  const keys = Object.keys(renderData);
339
394
  for (let i = 0; i < keys.length; i++) {
340
- let clone = template.clones.get(keys[i]);
395
+ let clone = templateData.clones.get(keys[i]);
341
396
  clone = renderedNodes.get(clone);
342
397
 
343
398
  if (
@@ -348,7 +403,7 @@ async function renderTemplate(template, data, key, index, keyPath) {
348
403
  if (clone) {
349
404
  renderedNodes.delete(clone.element);
350
405
  clone.element.remove();
351
- template.clones.delete(keys[i]);
406
+ templateData.clones.delete(keys[i]);
352
407
  }
353
408
  continue;
354
409
  }
@@ -362,26 +417,26 @@ async function renderTemplate(template, data, key, index, keyPath) {
362
417
  let Data = { [renderAs]: { key: keys[i], value, type } };
363
418
 
364
419
  if (!clone) {
365
- clone = cloneTemplate(template);
420
+ clone = cloneTemplate(templateData);
366
421
  } else {
367
422
  if (clone.renderedValue === value) {
368
423
  continue;
369
424
  }
370
425
  }
371
426
  clone.renderedValue = value;
372
- // let clone = cloneTemplate(template);
427
+ // let clone = cloneTemplate(templateData);
373
428
 
374
429
  let renderedKey = key.split(".");
375
430
  renderedKey = renderedKey[renderedKey.length - 1];
376
431
  //renderedKey needs to remove the parent.renderAs/key
377
432
 
378
433
  clone.key = keys[i];
379
- clone.keyPath = template.keyPath + "." + renderedKey;
434
+ clone.keyPath = templateData.keyPath + "." + renderedKey;
380
435
  clone.parentKey = renderedKey;
381
436
  clone.renderKey = key;
382
437
  clone.element.setAttribute("renderedKey", keys[i]);
383
438
  await renderValues(clone.element, Data, keys[i], renderAs);
384
- insertElement(template, clone.element, index);
439
+ insertElement(templateData, clone.element, index);
385
440
  }
386
441
  } else {
387
442
  if (!key && !Array.isArray(renderData)) {
@@ -391,22 +446,31 @@ async function renderTemplate(template, data, key, index, keyPath) {
391
446
  }
392
447
 
393
448
  if (!renderData) {
394
- let clone = cloneTemplate(template);
395
- clone.keyPath = template.keyPath;
449
+ let clone = cloneTemplate(templateData);
450
+ clone.keyPath = templateData.keyPath;
396
451
  await renderValues(clone.element, data, key, renderAs);
397
- insertElement(template, clone.element, index);
452
+ insertElement(templateData, clone.element, index);
398
453
  } else {
399
454
  if (!Array.isArray(renderData)) renderData = [renderData];
400
455
 
401
456
  for (let i = 0; i < renderData.length; i++) {
402
- let clone = cloneTemplate(template);
457
+ let clone = cloneTemplate(templateData);
403
458
 
404
459
  let test = clone.element.getAttribute("render-as");
405
460
  if (test) renderAs = test;
406
461
 
407
- clone.keyPath = template.keyPath || "" + `[${i}]`;
462
+ clone.keyPath = templateData.keyPath || "" + `[${i}]`;
463
+
464
+ let object;
465
+ if (
466
+ typeof renderData[i] === "object" &&
467
+ renderData[i] !== null
468
+ ) {
469
+ object = { ...renderData[i] };
470
+ } else {
471
+ object = renderData[i];
472
+ }
408
473
 
409
- let object = { ...renderData[i] };
410
474
  for (let j = 0; j < exclude.length; j++)
411
475
  delete object[exclude[j]];
412
476
 
@@ -424,6 +488,9 @@ async function renderTemplate(template, data, key, index, keyPath) {
424
488
 
425
489
  let index;
426
490
  if (key !== "data") index = i;
491
+
492
+ clone.renderData = object
493
+ clone.index = index
427
494
  await renderValues(
428
495
  clone.element,
429
496
  object,
@@ -434,7 +501,7 @@ async function renderTemplate(template, data, key, index, keyPath) {
434
501
  index
435
502
  );
436
503
  insertElement(
437
- template,
504
+ templateData,
438
505
  clone.element,
439
506
  index,
440
507
  "",
@@ -682,8 +749,9 @@ async function renderValues(node, data, key, renderAs, keyPath, parent, index) {
682
749
  return;
683
750
  }
684
751
  }
685
- if (node.getAttribute("render") && !node.hasAttribute("render-clone")) {
686
- renderTemplate(node, data);
752
+ if (node.hasAttribute("render") && !node.hasAttribute("render-clone")) {
753
+ let renderKey = node.getAttribute("render") || key
754
+ renderTemplate(node, data, renderKey);
687
755
  } else if (node.childNodes.length > 0) {
688
756
  // Array.from(node.childNodes).forEach(childNode => {
689
757
  for (let childNode of node.childNodes) {
@@ -1123,17 +1191,23 @@ Observer.init({
1123
1191
  if (mutation.target.hasAttribute("render-clone")) return;
1124
1192
  let parentElement = mutation.target.parentElement.closest("[render]");
1125
1193
  if (!parentElement) return;
1126
- return;
1194
+
1127
1195
  let renderedNode = renderedNodes.get(parentElement);
1128
1196
  let data;
1129
- if (renderedNode.source) {
1130
- 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
+ }
1131
1207
  }
1132
- if (renderedNode.template) {
1133
- data = renderedNode.template.source.data;
1208
+ if (data) {
1209
+ // render({ element: mutation.target, data });
1134
1210
  }
1135
-
1136
- render({ element: mutation.target, data });
1137
1211
  }
1138
1212
  });
1139
1213