54 lines
1.7 KiB
TypeScript
54 lines
1.7 KiB
TypeScript
import { mergeDeltaRows } from "@govoplan/core-webui";
|
|
import type { CampaignJobsDeltaResponse, CampaignJobsResponse } from "../../../api/campaigns";
|
|
|
|
export function emptyCampaignJobsResponse(): CampaignJobsResponse {
|
|
return {
|
|
jobs: [],
|
|
page: 1,
|
|
page_size: 50,
|
|
total: 0,
|
|
total_unfiltered: 0,
|
|
pages: 0,
|
|
cursor: null,
|
|
next_cursor: null,
|
|
counts: {},
|
|
filtered_counts: {},
|
|
review: {}
|
|
};
|
|
}
|
|
|
|
export function mergeCampaignJobsDelta(current: CampaignJobsResponse, response: CampaignJobsDeltaResponse): CampaignJobsResponse {
|
|
if (response.full) return campaignJobsResponseFromDelta(response);
|
|
return {
|
|
...campaignJobsResponseFromDelta(response),
|
|
jobs: mergeDeltaRows(current.jobs, response.jobs, response.deleted, (row) => String(row.id ?? ""), {
|
|
deletedResourceType: "campaign_job",
|
|
sort: sortJobsByEntry
|
|
}),
|
|
cursor: response.cursor ?? current.cursor,
|
|
next_cursor: response.next_cursor ?? current.next_cursor
|
|
};
|
|
}
|
|
|
|
export function campaignJobsResponseFromDelta(response: CampaignJobsDeltaResponse): CampaignJobsResponse {
|
|
return {
|
|
jobs: response.jobs,
|
|
page: response.page,
|
|
page_size: response.page_size,
|
|
total: response.total,
|
|
total_unfiltered: response.total_unfiltered,
|
|
pages: response.pages,
|
|
cursor: response.cursor,
|
|
next_cursor: response.next_cursor,
|
|
counts: response.counts,
|
|
filtered_counts: response.filtered_counts,
|
|
review: response.review
|
|
};
|
|
}
|
|
|
|
function sortJobsByEntry(left: Record<string, unknown>, right: Record<string, unknown>): number {
|
|
const indexDelta = Number(left.entry_index ?? 0) - Number(right.entry_index ?? 0);
|
|
if (indexDelta !== 0) return indexDelta;
|
|
return String(left.id ?? "").localeCompare(String(right.id ?? ""));
|
|
}
|