@cocreate/render 1.41.5 → 1.42.1

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,18 @@
1
+ ## [1.42.1](https://github.com/CoCreate-app/CoCreate-render/compare/v1.42.0...v1.42.1) (2024-11-02)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * handeling of render-as $auto ([017dd71](https://github.com/CoCreate-app/CoCreate-render/commit/017dd71b400ed202aacd425eb63d76fdb7f9a968))
7
+ * observer taget has been renamed to selector ([adbd2c9](https://github.com/CoCreate-app/CoCreate-render/commit/adbd2c9768f439189da40ae1fcdaa333fff2f2da))
8
+
9
+ # [1.42.0](https://github.com/CoCreate-app/CoCreate-render/compare/v1.41.5...v1.42.0) (2024-09-21)
10
+
11
+
12
+ ### Features
13
+
14
+ * render-reverse attribute to trigger reverse rendering for chats , etc ([f688f61](https://github.com/CoCreate-app/CoCreate-render/commit/f688f61ae4446a18356515c6d88d6bd8cc0be142))
15
+
1
16
  ## [1.41.5](https://github.com/CoCreate-app/CoCreate-render/compare/v1.41.4...v1.41.5) (2024-08-24)
2
17
 
3
18
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cocreate/render",
3
- "version": "1.41.5",
3
+ "version": "1.42.1",
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]
@@ -342,6 +349,11 @@ async function renderTemplate(template, data, key, index, keyPath) {
342
349
 
343
350
  for (let i = 0; i < renderData.length; i++) {
344
351
  let clone = cloneTemplate(template);
352
+
353
+ let test = clone.element.getAttribute('render-as')
354
+ if (test)
355
+ renderAs = test
356
+
345
357
  clone.keyPath = template.keyPath || '' + `[${i}]`
346
358
 
347
359
  let object
@@ -356,7 +368,7 @@ async function renderTemplate(template, data, key, index, keyPath) {
356
368
  if (key !== 'data')
357
369
  index = i
358
370
  await renderValues(clone.element, object, key, renderAs, null, null, index);
359
- insertElement(template, clone.element, index);
371
+ insertElement(template, clone.element, index, '', data, renderReverse);
360
372
  }
361
373
  }
362
374
  }
@@ -379,7 +391,8 @@ function cloneTemplate(template) {
379
391
  clone.setAttribute('render-clone', '');
380
392
 
381
393
  let renderAs = clone.getAttribute('render-as')
382
- if (renderAs) {
394
+ if (renderAs === '$auto') {
395
+ renderAs = uuid.generate(6)
383
396
  clone = clone.outerHTML.replace(/\$auto/g, renderAs);
384
397
  }
385
398
 
@@ -400,7 +413,7 @@ function cloneTemplate(template) {
400
413
  return renderedNode;
401
414
  }
402
415
 
403
- function insertElement(template, element, index, currentIndex) {
416
+ function insertElement(template, element, index, currentIndex, data, renderReverse) {
404
417
  let eid = element.getAttribute('eid')
405
418
  if (!eid) {
406
419
  eid = uuid.generate(6)
@@ -410,22 +423,54 @@ function insertElement(template, element, index, currentIndex) {
410
423
  if (index !== null && index >= 0) {
411
424
  if (!template.clones)
412
425
  template = template.template
413
- const clones = Array.from(template.clones);
426
+ // const clones = Array.from(template.clones);
414
427
 
415
428
  let item
416
- if (currentIndex) {
429
+ if (!currentIndex && currentIndex !== 0) {
430
+ if (template.clones.has(eid))
431
+ return
432
+ item = [eid, element];
433
+ }
434
+
435
+ const clones = Array.from(template.clones);
436
+
437
+ if (currentIndex || currentIndex === 0) {
417
438
  item = clones.splice(currentIndex, 1)[0];
439
+ }
440
+
441
+ if (data && data.$filter && data.$filter.startingIndex)
442
+ index += data.$filter.startingIndex
443
+ clones.splice(index, 0, item); // Insert item into clones at the specified index
444
+
445
+ if (renderReverse) {
446
+ // Chat-specific logic: reverse rendering but still inserting based on sorting
447
+
448
+ // If we're rendering in reverse order, we want to respect the insertion index
449
+ if (clones[index + 1] && clones[index + 1][1] !== element) {
450
+ // Insert before the next element (reverse order means newer items come before older ones)
451
+ clones[index + 1][1].insertAdjacentElement('afterend', element);
452
+ } else if (clones[index] && clones[index][1] !== element) {
453
+ // Insert after the current element if there's no next element
454
+ clones[index][1].insertAdjacentElement('beforeend', element);
455
+ } else {
456
+ // Fallback: insert before the template if clones are empty or undefined
457
+ template.element.insertAdjacentElement('afterend', element);
458
+ }
459
+
418
460
  } else {
419
- item = [eid, element];
461
+ // Non-chat logic: handle ascending or descending order as usual
462
+ if (clones[index + 1] && clones[index + 1][1] !== element) {
463
+ // Insert before the next element
464
+ clones[index + 1][1].insertAdjacentElement('beforebegin', element);
465
+ } else if (clones[index] && clones[index][1] !== element) {
466
+ // Insert after the current element if there's no next element
467
+ clones[index][1].insertAdjacentElement('afterend', element);
468
+ } else {
469
+ // Fallback: insert before the template if clones are empty or undefined
470
+ template.element.insertAdjacentElement('beforebegin', element);
471
+ }
420
472
  }
421
473
 
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
474
  template.clones = new Map(clones);
430
475
  } else {
431
476
  template.clones.set(eid, element)
@@ -841,7 +886,7 @@ Actions.init({
841
886
  Observer.init({
842
887
  name: 'render',
843
888
  observe: ['addedNodes'],
844
- target: elementSelector,
889
+ selector: elementSelector,
845
890
  callback: function (mutation) {
846
891
  init(mutation.target)
847
892
  }
@@ -862,7 +907,7 @@ Observer.init({
862
907
  Observer.init({
863
908
  name: 'render',
864
909
  observe: ['addedNodes'],
865
- target: '[render]',
910
+ selector: '[render]',
866
911
  callback: function (mutation) {
867
912
  if (mutation.target.hasAttribute('render-clone'))
868
913
  return
@@ -884,7 +929,7 @@ Observer.init({
884
929
  // Observer.init({
885
930
  // name: 'render',
886
931
  // observe: ['addedNodes'],
887
- // target: '[render-clone]',
932
+ // selector: '[render-clone]',
888
933
  // callback: function (mutation) {
889
934
  // let renderedNode = renderedNodes.get(mutation.target)
890
935
  // if (!renderedNode) return
@@ -917,7 +962,7 @@ Observer.init({
917
962
  Observer.init({
918
963
  name: 'renderNodesRemoved',
919
964
  observe: ['removedNodes'],
920
- target: '[render-clone]',
965
+ selector: '[render-clone]',
921
966
  callback: function (mutation) {
922
967
  if (mutation.target.parentElement) return
923
968
  let renderedNode = renderedNodes.get(mutation.target)