From b73a09f9f2d3f24d091bea9c409f04afe2b9ec05 Mon Sep 17 00:00:00 2001 From: ghiscoding Date: Thu, 7 May 2026 14:00:54 -0400 Subject: [PATCH 1/2] fix: use numeric sort in deleteItems to prevent data loss --- packages/common/src/core/slickDataview.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/common/src/core/slickDataview.ts b/packages/common/src/core/slickDataview.ts index a0e4182dd..000396778 100755 --- a/packages/common/src/core/slickDataview.ts +++ b/packages/common/src/core/slickDataview.ts @@ -751,7 +751,7 @@ export class SlickDataView implements CustomD } // Remove from back to front - indexesToDelete.sort(); + indexesToDelete.sort((a, b) => a - b); for (let i = indexesToDelete.length - 1; i >= 0; --i) { this.items.splice(indexesToDelete[i], 1); } From b31d6b125c3d3f13403883b29ff301278067a98d Mon Sep 17 00:00:00 2001 From: ghiscoding Date: Thu, 7 May 2026 14:12:36 -0400 Subject: [PATCH 2/2] chore: add unit test to cover the fix --- .../src/core/__tests__/slickDataView.spec.ts | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/packages/common/src/core/__tests__/slickDataView.spec.ts b/packages/common/src/core/__tests__/slickDataView.spec.ts index 984da2aab..770b5a6b9 100644 --- a/packages/common/src/core/__tests__/slickDataView.spec.ts +++ b/packages/common/src/core/__tests__/slickDataView.spec.ts @@ -216,6 +216,29 @@ describe('SlickDatView core file', () => { expect(dv.getItems()).toEqual([{ id: 0, name: 'John', age: 20 }]); expect(refreshSpy).toHaveBeenCalled(); }); + + test('delete multiple items with multi-digit indices in correct numeric order', () => { + const refreshSpy = vi.spyOn(dv, 'refresh'); + const items = [ + { id: 0, name: 'Item0' }, + { id: 1, name: 'Item1' }, + { id: 2, name: 'Item2' }, + { id: 3, name: 'Item3' }, + { id: 10, name: 'Item10' }, + { id: 20, name: 'Item20' }, + ]; + + dv.setItems(items); + dv.deleteItems([20, 2, 10]); // Non-sequential, multi-digit indices + + // Should delete items at indices 2, 10, 20 (Item2, Item10, Item20) + expect(dv.getItems()).toEqual([ + { id: 0, name: 'Item0' }, + { id: 1, name: 'Item1' }, + { id: 3, name: 'Item3' }, + ]); + expect(refreshSpy).toHaveBeenCalled(); + }); }); describe('deleteItems()', () => {