Skip to content
This repository was archived by the owner on Nov 5, 2023. It is now read-only.

Commit 0cc63fc

Browse files
committed
fix: behave properly when pageProvider returns fewer items than pageSize
1 parent f598b0b commit 0cc63fc

File tree

2 files changed

+35
-10
lines changed

2 files changed

+35
-10
lines changed

src/pipeline.test.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ describe("accumulateAllItems", () => {
179179
it("can extend allItems", () => {
180180
const allItems = accumulateAllItems(
181181
[0, 1, 2, 3, 4, 5],
182-
[{ pageNumber: 1, items: ["a", "b", "c"] }, 10]
182+
[{ pageNumber: 1, items: ["a", "b", "c"] }, 10, 3]
183183
);
184184

185185
expect(allItems).toEqual([
@@ -199,11 +199,29 @@ describe("accumulateAllItems", () => {
199199
it("can shrink allItems", () => {
200200
const allItems = accumulateAllItems(
201201
[0, 1, 2, 3, 4, 5, 6],
202-
[{ pageNumber: 0, items: ["a", "b", "c"] }, 5]
202+
[{ pageNumber: 0, items: ["a", "b", "c"] }, 5, 3]
203203
);
204204

205205
expect(allItems).toEqual(["a", "b", "c", 3, 4]);
206206
});
207+
208+
it("behave properly when pageProvider returns fewer items than pageSize", () => {
209+
const allItems = accumulateAllItems(
210+
[0, 1, 2, 3, 4, 5],
211+
[{ pageNumber: 0, items: ["a", "b"] }, 6, 3]
212+
);
213+
214+
expect(allItems).toEqual(["a", "b", undefined, 3, 4, 5]);
215+
});
216+
217+
it("behave properly when pageProvider returns more items than pageSize", () => {
218+
const allItems = accumulateAllItems(
219+
[0, 1, 2, 3, 4, 5],
220+
[{ pageNumber: 0, items: ["a", "b", "c", "d"] }, 6, 3]
221+
);
222+
223+
expect(allItems).toEqual(["a", "b", "c", 3, 4, 5]);
224+
});
207225
});
208226

209227
describe("getVisibleItems", () => {

src/pipeline.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -146,15 +146,22 @@ export function callPageProvider(
146146

147147
export function accumulateAllItems(
148148
allItems: unknown[],
149-
[{ pageNumber, items }, length]: [ItemsByPage, number]
149+
[{ pageNumber, items }, length, pageSize]: [ItemsByPage, number, number]
150150
): unknown[] {
151+
const allItemsFill = new Array(Math.max(length - allItems.length, 0)).fill(
152+
undefined
153+
);
154+
155+
const pageFill = new Array(Math.max(pageSize - items.length, 0)).fill(
156+
undefined
157+
);
158+
159+
const normalizedItems = concat(slice(0, pageSize, items), pageFill);
160+
151161
return pipe<unknown[][], unknown[], unknown[], unknown[], unknown[]>(
152-
concat(
153-
__,
154-
new Array(Math.max(length - allItems.length, 0)).fill(undefined)
155-
),
156-
remove(pageNumber * items.length, items.length),
157-
insertAll(pageNumber * items.length, items),
162+
concat(__, allItemsFill),
163+
remove(pageNumber * pageSize, pageSize),
164+
insertAll(pageNumber * pageSize, normalizedItems),
158165
slice(0, length)
159166
)(allItems);
160167
}
@@ -335,7 +342,7 @@ export function pipeline({
335342
const replayLength$ = length$.pipe(shareReplay(1));
336343

337344
const allItems$: Observable<unknown[]> = pageProvider$.pipe(
338-
switchMap(() => combineLatest([itemsByPage$, replayLength$])),
345+
switchMap(() => combineLatest([itemsByPage$, replayLength$, pageSize$])),
339346
scan(accumulateAllItems, [])
340347
);
341348

0 commit comments

Comments
 (0)