115 lines
2.7 KiB
TypeScript
115 lines
2.7 KiB
TypeScript
export interface TeamTaskStateLike {
|
|
status: string;
|
|
reviewState?: string | null;
|
|
kanbanColumn?: string | null;
|
|
deletedAt?: string | null;
|
|
}
|
|
|
|
export type TeamTaskWorkflowColumn = 'review' | 'approved';
|
|
|
|
export function isTeamTaskApproved(task: TeamTaskStateLike): boolean {
|
|
if (isTeamTaskDeleted(task) || task.status === 'pending') {
|
|
return false;
|
|
}
|
|
|
|
if (task.kanbanColumn === 'approved') {
|
|
return true;
|
|
}
|
|
|
|
if (task.kanbanColumn === 'review') {
|
|
return false;
|
|
}
|
|
|
|
return task.reviewState === 'approved';
|
|
}
|
|
|
|
export function isTeamTaskDeleted(task: TeamTaskStateLike): boolean {
|
|
return task.status === 'deleted' || Boolean(task.deletedAt);
|
|
}
|
|
|
|
export function isTeamTaskActivelyWorked(task: TeamTaskStateLike): boolean {
|
|
return (
|
|
task.status === 'in_progress' &&
|
|
getTeamTaskWorkflowColumn(task) !== 'review' &&
|
|
!isTeamTaskApproved(task) &&
|
|
!isTeamTaskDeleted(task)
|
|
);
|
|
}
|
|
|
|
export function isTeamTaskNeedsFixActionable(task: TeamTaskStateLike): boolean {
|
|
return (
|
|
task.reviewState === 'needsFix' &&
|
|
!isTeamTaskDeleted(task) &&
|
|
getTeamTaskWorkflowColumn(task) === undefined
|
|
);
|
|
}
|
|
|
|
export function isTeamTaskFinishedForDependency(task: TeamTaskStateLike): boolean {
|
|
const workflowColumn = getTeamTaskWorkflowColumn(task);
|
|
if (workflowColumn === 'approved') {
|
|
return true;
|
|
}
|
|
if (workflowColumn === 'review' || isTeamTaskNeedsFixActionable(task)) {
|
|
return false;
|
|
}
|
|
return task.status === 'completed';
|
|
}
|
|
|
|
export function isTeamTaskTerminalForActionableWork(task: TeamTaskStateLike): boolean {
|
|
if (isTeamTaskDeleted(task)) {
|
|
return true;
|
|
}
|
|
|
|
const workflowColumn = getTeamTaskWorkflowColumn(task);
|
|
if (workflowColumn === 'approved') {
|
|
return true;
|
|
}
|
|
|
|
if (workflowColumn === 'review' || isTeamTaskNeedsFixActionable(task)) {
|
|
return false;
|
|
}
|
|
return task.status === 'completed';
|
|
}
|
|
|
|
export function isTeamTaskFinalForCompletionNotification(task: TeamTaskStateLike): boolean {
|
|
if (isTeamTaskDeleted(task)) {
|
|
return true;
|
|
}
|
|
|
|
const workflowColumn = getTeamTaskWorkflowColumn(task);
|
|
if (workflowColumn === 'approved') {
|
|
return true;
|
|
}
|
|
|
|
if (workflowColumn === 'review' || isTeamTaskNeedsFixActionable(task)) {
|
|
return false;
|
|
}
|
|
|
|
return task.status === 'completed';
|
|
}
|
|
|
|
export function getTeamTaskWorkflowColumn(
|
|
task: TeamTaskStateLike
|
|
): TeamTaskWorkflowColumn | undefined {
|
|
if (isTeamTaskDeleted(task) || task.status === 'pending') {
|
|
return undefined;
|
|
}
|
|
|
|
if (task.kanbanColumn === 'approved') {
|
|
return 'approved';
|
|
}
|
|
|
|
if (task.kanbanColumn === 'review') {
|
|
return 'review';
|
|
}
|
|
|
|
if (task.reviewState === 'approved') {
|
|
return 'approved';
|
|
}
|
|
|
|
if (task.reviewState === 'review') {
|
|
return 'review';
|
|
}
|
|
|
|
return undefined;
|
|
}
|