75 lines
2.3 KiB
TypeScript
75 lines
2.3 KiB
TypeScript
import { formatBoardTaskActivityTaskLabel } from './boardTaskActivityLabels';
|
|
|
|
import type {
|
|
BoardTaskActivityAction,
|
|
BoardTaskActivityActor,
|
|
BoardTaskActivityActorContext,
|
|
BoardTaskActivityLinkKind,
|
|
BoardTaskActivityTaskRef,
|
|
} from '../types/team';
|
|
|
|
interface BoardTaskActivityPresentationInput {
|
|
action?: BoardTaskActivityAction;
|
|
actor: BoardTaskActivityActor;
|
|
actorContext: BoardTaskActivityActorContext;
|
|
task: BoardTaskActivityTaskRef;
|
|
linkKind: BoardTaskActivityLinkKind;
|
|
}
|
|
|
|
export function describeBoardTaskActivityActorLabel(actor: BoardTaskActivityActor): string {
|
|
if (actor.memberName) {
|
|
return actor.memberName;
|
|
}
|
|
if (actor.role === 'lead' || actor.isSidechain === false) {
|
|
return 'lead session';
|
|
}
|
|
return 'unknown actor';
|
|
}
|
|
|
|
function relationshipContextLabel(action: BoardTaskActivityAction | undefined): string | null {
|
|
const peerTaskLabel = formatBoardTaskActivityTaskLabel(action?.peerTask);
|
|
if (!peerTaskLabel) return null;
|
|
|
|
switch (action?.relationshipPerspective) {
|
|
case 'incoming':
|
|
return `from ${peerTaskLabel}`;
|
|
case 'outgoing':
|
|
return `to ${peerTaskLabel}`;
|
|
default:
|
|
return `with ${peerTaskLabel}`;
|
|
}
|
|
}
|
|
|
|
export function describeBoardTaskActivityContextLines(
|
|
input: BoardTaskActivityPresentationInput
|
|
): string[] {
|
|
const parts: string[] = [];
|
|
|
|
const relationshipContext = relationshipContextLabel(input.action);
|
|
if (relationshipContext) {
|
|
parts.push(relationshipContext);
|
|
}
|
|
|
|
if (input.actorContext.relation === 'other_active_task') {
|
|
const activeTaskLabel = formatBoardTaskActivityTaskLabel(input.actorContext.activeTask);
|
|
if (activeTaskLabel) {
|
|
parts.push(`while working on ${activeTaskLabel}`);
|
|
} else {
|
|
parts.push('while another task was active');
|
|
}
|
|
} else if (input.actorContext.relation === 'ambiguous') {
|
|
parts.push('while multiple task scopes were active');
|
|
} else if (input.actorContext.relation === 'idle' && input.linkKind !== 'execution') {
|
|
parts.push('without an active task scope');
|
|
}
|
|
|
|
if (input.task.resolution === 'deleted') {
|
|
parts.push('task is deleted');
|
|
} else if (input.task.resolution === 'ambiguous') {
|
|
parts.push('task resolution is ambiguous');
|
|
} else if (input.task.resolution === 'unresolved') {
|
|
parts.push('task could not be resolved');
|
|
}
|
|
|
|
return parts;
|
|
}
|