@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.
- package/CHANGELOG.md +14 -0
- package/package.json +1 -9
- 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
|
+
"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
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
|
201
|
-
|
|
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 = {
|
|
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
|
|
266
|
-
|
|
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(
|
|
285
|
-
}
|
|
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
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
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 =
|
|
352
|
+
renderReverse = el.getAttribute("render-reverse");
|
|
310
353
|
}
|
|
311
354
|
|
|
312
|
-
let exclude =
|
|
355
|
+
let exclude = el.getAttribute("render-exclude") || "";
|
|
313
356
|
if (exclude) {
|
|
314
357
|
exclude = exclude.replace(/ /g, "").split(",");
|
|
315
358
|
}
|
|
316
|
-
let 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 (!
|
|
322
|
-
|
|
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
|
-
|
|
380
|
+
templateData.clones.delete(key);
|
|
326
381
|
}
|
|
327
382
|
} //
|
|
328
383
|
// else if (index) {
|
|
329
384
|
// updates data that has already been rendered
|
|
330
|
-
//
|
|
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 =
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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 =
|
|
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(
|
|
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(
|
|
395
|
-
clone.keyPath =
|
|
449
|
+
let clone = cloneTemplate(templateData);
|
|
450
|
+
clone.keyPath = templateData.keyPath;
|
|
396
451
|
await renderValues(clone.element, data, key, renderAs);
|
|
397
|
-
insertElement(
|
|
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(
|
|
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 =
|
|
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
|
-
|
|
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.
|
|
686
|
-
|
|
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
|
-
|
|
1194
|
+
|
|
1127
1195
|
let renderedNode = renderedNodes.get(parentElement);
|
|
1128
1196
|
let data;
|
|
1129
|
-
if (renderedNode
|
|
1130
|
-
|
|
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 (
|
|
1133
|
-
|
|
1208
|
+
if (data) {
|
|
1209
|
+
// render({ element: mutation.target, data });
|
|
1134
1210
|
}
|
|
1135
|
-
|
|
1136
|
-
render({ element: mutation.target, data });
|
|
1137
1211
|
}
|
|
1138
1212
|
});
|
|
1139
1213
|
|