50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
export type BuildReviewProgressInput = {
|
|
blocking: number;
|
|
individualRequired: number;
|
|
individualReviewed: number;
|
|
groupRequired: number;
|
|
reviewComplete: boolean;
|
|
};
|
|
|
|
export type BuildReviewProgress = {
|
|
blocking: number;
|
|
individualRequired: number;
|
|
individualReviewed: number;
|
|
individualRemaining: number;
|
|
groupRequired: number;
|
|
groupReviewed: number;
|
|
groupRemaining: number;
|
|
required: number;
|
|
reviewed: number;
|
|
remaining: number;
|
|
};
|
|
|
|
function count(value: number): number {
|
|
return Number.isFinite(value) ? Math.max(0, Math.trunc(value)) : 0;
|
|
}
|
|
|
|
export function calculateBuildReviewProgress(input: BuildReviewProgressInput): BuildReviewProgress {
|
|
const blocking = count(input.blocking);
|
|
const individualRequired = count(input.individualRequired);
|
|
const groupRequired = count(input.groupRequired);
|
|
const individualReviewed = input.reviewComplete
|
|
? individualRequired
|
|
: Math.min(individualRequired, count(input.individualReviewed));
|
|
const groupReviewed = input.reviewComplete ? groupRequired : 0;
|
|
const individualRemaining = individualRequired - individualReviewed;
|
|
const groupRemaining = groupRequired - groupReviewed;
|
|
|
|
return {
|
|
blocking,
|
|
individualRequired,
|
|
individualReviewed,
|
|
individualRemaining,
|
|
groupRequired,
|
|
groupReviewed,
|
|
groupRemaining,
|
|
required: individualRequired + groupRequired,
|
|
reviewed: individualReviewed + groupReviewed,
|
|
remaining: individualRemaining + groupRemaining
|
|
};
|
|
}
|