Skip to content

Commit f688f61

Browse files
committed
feat: render-reverse attribute to trigger reverse rendering for chats , etc
1 parent 3381479 commit f688f61

File tree

1 file changed

+51
-12
lines changed

1 file changed

+51
-12
lines changed

src/index.js

+51-12
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)