@cocreate/render 1.41.4 → 1.42.0

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,17 @@
1
+ # [1.42.0](https://github.com/CoCreate-app/CoCreate-render/compare/v1.41.5...v1.42.0) (2024-09-21)
2
+
3
+
4
+ ### Features
5
+
6
+ * render-reverse attribute to trigger reverse rendering for chats , etc ([f688f61](https://github.com/CoCreate-app/CoCreate-render/commit/f688f61ae4446a18356515c6d88d6bd8cc0be142))
7
+
8
+ ## [1.41.5](https://github.com/CoCreate-app/CoCreate-render/compare/v1.41.4...v1.41.5) (2024-08-24)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * handling of array index ([3a7cae6](https://github.com/CoCreate-app/CoCreate-render/commit/3a7cae6270af70497356cd88e0287ae4d1740d0f))
14
+
1
15
  ## [1.41.4](https://github.com/CoCreate-app/CoCreate-render/compare/v1.41.3...v1.41.4) (2024-06-23)
2
16
 
3
17
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cocreate/render",
3
- "version": "1.41.4",
3
+ "version": "1.42.0",
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
@@ -283,6 +283,13 @@ async function renderTemplate(template, data, key, index, keyPath) {
283
283
  if (templateData.source && templateData.source.element)
284
284
  renderType = templateData.source.element.getAttribute('render-type');
285
285
 
286
+ let renderReverse
287
+ if (templateData.source && templateData.source.element) {
288
+ renderReverse = templateData.source.element.getAttribute('render-reverse');
289
+ if (!renderReverse)
290
+ renderReverse = template.element.getAttribute('render-reverse');
291
+ }
292
+
286
293
  if (key && !Array.isArray(renderData) || renderType === "object") {
287
294
  if (renderType && Array.isArray(renderData) && renderData.length === 1)
288
295
  renderData = renderData[0]
@@ -356,7 +363,7 @@ async function renderTemplate(template, data, key, index, keyPath) {
356
363
  if (key !== 'data')
357
364
  index = i
358
365
  await renderValues(clone.element, object, key, renderAs, null, null, index);
359
- insertElement(template, clone.element, index);
366
+ insertElement(template, clone.element, index, '', data, renderReverse);
360
367
  }
361
368
  }
362
369
  }
@@ -400,7 +407,7 @@ function cloneTemplate(template) {
400
407
  return renderedNode;
401
408
  }
402
409
 
403
- function insertElement(template, element, index, currentIndex) {
410
+ function insertElement(template, element, index, currentIndex, data, renderReverse) {
404
411
  let eid = element.getAttribute('eid')
405
412
  if (!eid) {
406
413
  eid = uuid.generate(6)
@@ -410,22 +417,54 @@ function insertElement(template, element, index, currentIndex) {
410
417
  if (index !== null && index >= 0) {
411
418
  if (!template.clones)
412
419
  template = template.template
413
- const clones = Array.from(template.clones);
420
+ // const clones = Array.from(template.clones);
414
421
 
415
422
  let item
416
- if (currentIndex) {
423
+ if (!currentIndex && currentIndex !== 0) {
424
+ if (template.clones.has(eid))
425
+ return
426
+ item = [eid, element];
427
+ }
428
+
429
+ const clones = Array.from(template.clones);
430
+
431
+ if (currentIndex || currentIndex === 0) {
417
432
  item = clones.splice(currentIndex, 1)[0];
433
+ }
434
+
435
+ if (data.$filter && data.$filter.startingIndex)
436
+ index += data.$filter.startingIndex
437
+ clones.splice(index, 0, item); // Insert item into clones at the specified index
438
+
439
+ if (renderReverse) {
440
+ // Chat-specific logic: reverse rendering but still inserting based on sorting
441
+
442
+ // If we're rendering in reverse order, we want to respect the insertion index
443
+ if (clones[index + 1] && clones[index + 1][1] !== element) {
444
+ // Insert before the next element (reverse order means newer items come before older ones)
445
+ clones[index + 1][1].insertAdjacentElement('afterend', element);
446
+ } else if (clones[index] && clones[index][1] !== element) {
447
+ // Insert after the current element if there's no next element
448
+ clones[index][1].insertAdjacentElement('beforeend', element);
449
+ } else {
450
+ // Fallback: insert before the template if clones are empty or undefined
451
+ template.element.insertAdjacentElement('afterend', element);
452
+ }
453
+
418
454
  } else {
419
- item = [eid, element];
455
+ // Non-chat logic: handle ascending or descending order as usual
456
+ if (clones[index + 1] && clones[index + 1][1] !== element) {
457
+ // Insert before the next element
458
+ clones[index + 1][1].insertAdjacentElement('beforebegin', element);
459
+ } else if (clones[index] && clones[index][1] !== element) {
460
+ // Insert after the current element if there's no next element
461
+ clones[index][1].insertAdjacentElement('afterend', element);
462
+ } else {
463
+ // Fallback: insert before the template if clones are empty or undefined
464
+ template.element.insertAdjacentElement('beforebegin', element);
465
+ }
420
466
  }
421
467
 
422
- clones.splice(index, 0, item);
423
- if (clones[index + 1] && clones[index][1] !== element)
424
- clones[index][1].insertAdjacentElement('beforebegin', element);
425
- else if (clones[index] && clones[index][1] !== element)
426
- clones[index][1].insertAdjacentElement('afterend', element);
427
- else
428
- template.element.insertAdjacentElement('beforebegin', element);
429
468
  template.clones = new Map(clones);
430
469
  } else {
431
470
  template.clones.set(eid, element)
@@ -615,8 +654,9 @@ async function renderValue(node, data, placeholder, renderAs, renderedNode, inde
615
654
  let value;
616
655
  try {
617
656
 
618
- if (match[1] === 'index' && index >= 0) { // {[]} - Dot-notation
657
+ if (match[1] === 'index' && index >= 0) { // {{index}} - index
619
658
  value = index
659
+ match[0] = '{{' + match[1] + '}}'
620
660
  } else if (match[1].startsWith('[') && match[1].endsWith(']')) { // {[]} - Dot-notation
621
661
  match[1] = match[1].slice(1, -1);
622
662
  value = getRenderValue(node, data, match[1], renderAs);