Files
govoplan-campaign/webui/src/features/campaigns/utils/jobDeltas.ts

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 ?? ""));
}