@@ -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 )
0 commit comments