@@ -283,6 +283,13 @@ async function renderTemplate(template, data, key, index, keyPath) {
283283 if ( templateData . source && templateData . source . element )
284284 renderType = templateData . source . element . getAttribute ( 'render-type' ) ;
285285
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+
286293 if ( key && ! Array . isArray ( renderData ) || renderType === "object" ) {
287294 if ( renderType && Array . isArray ( renderData ) && renderData . length === 1 )
288295 renderData = renderData [ 0 ]
@@ -356,7 +363,7 @@ async function renderTemplate(template, data, key, index, keyPath) {
356363 if ( key !== 'data' )
357364 index = i
358365 await renderValues ( clone . element , object , key , renderAs , null , null , index ) ;
359- insertElement ( template , clone . element , index ) ;
366+ insertElement ( template , clone . element , index , '' , data , renderReverse ) ;
360367 }
361368 }
362369 }
@@ -400,7 +407,7 @@ function cloneTemplate(template) {
400407 return renderedNode ;
401408}
402409
403- function insertElement ( template , element , index , currentIndex ) {
410+ function insertElement ( template , element , index , currentIndex , data , renderReverse ) {
404411 let eid = element . getAttribute ( 'eid' )
405412 if ( ! eid ) {
406413 eid = uuid . generate ( 6 )
@@ -410,22 +417,54 @@ function insertElement(template, element, index, currentIndex) {
410417 if ( index !== null && index >= 0 ) {
411418 if ( ! template . clones )
412419 template = template . template
413- const clones = Array . from ( template . clones ) ;
420+ // const clones = Array.from(template.clones);
414421
415422 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 ) {
417432 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+
418454 } 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+ }
420466 }
421467
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 ) ;
429468 template . clones = new Map ( clones ) ;
430469 } else {
431470 template . clones . set ( eid , element )
0 commit comments