89 lines
2.5 KiB
TypeScript
89 lines
2.5 KiB
TypeScript
import {
|
|
getRunningWorkflowDefinition,
|
|
getRunningWorkflowState
|
|
} from "../data/running-workflows";
|
|
import type {
|
|
ScheduledConditionRecord
|
|
} from "../types";
|
|
|
|
export type ConditionStepTickerItem = {
|
|
id: string;
|
|
title: string;
|
|
detail: string;
|
|
};
|
|
|
|
export type ConditionStepTickerView = {
|
|
title: string;
|
|
progressLabel: string;
|
|
progressValue: number;
|
|
currentStep: ConditionStepTickerItem | null;
|
|
};
|
|
|
|
export type TickerStackCard = {
|
|
condition: ScheduledConditionRecord;
|
|
view: ConditionStepTickerView;
|
|
stackIndex: number;
|
|
};
|
|
|
|
const TICKER_STACK_DEPTH = 3;
|
|
|
|
export function selectTickerCondition(
|
|
runningConditions: ScheduledConditionRecord[],
|
|
rotationIndex: number
|
|
): ScheduledConditionRecord | null {
|
|
if (runningConditions.length === 0) {
|
|
return null;
|
|
}
|
|
|
|
return runningConditions[rotationIndex % runningConditions.length] ?? runningConditions[0] ?? null;
|
|
}
|
|
|
|
export function createVisibleTickerCards(
|
|
runningConditions: ScheduledConditionRecord[],
|
|
rotationIndex: number,
|
|
nowMs: number
|
|
): TickerStackCard[] {
|
|
if (runningConditions.length === 0) {
|
|
return [];
|
|
}
|
|
|
|
const visibleCount = Math.min(runningConditions.length, TICKER_STACK_DEPTH);
|
|
|
|
return Array.from({ length: visibleCount }, (_, stackIndex) => {
|
|
const conditionIndex = (rotationIndex + stackIndex) % runningConditions.length;
|
|
const condition = runningConditions[conditionIndex] ?? runningConditions[0];
|
|
|
|
return {
|
|
condition,
|
|
view: createConditionStepView(condition, nowMs, runningConditions.length),
|
|
stackIndex
|
|
};
|
|
});
|
|
}
|
|
|
|
function createConditionStepView(
|
|
condition: ScheduledConditionRecord,
|
|
nowMs: number,
|
|
runningConditionCount: number
|
|
): ConditionStepTickerView {
|
|
const workflow = getRunningWorkflowDefinition(condition);
|
|
const workflowState = getRunningWorkflowState(condition, workflow, nowMs);
|
|
const currentStep = workflow.steps[workflowState.currentStepIndex];
|
|
const currentStepItem: ConditionStepTickerItem | null = currentStep
|
|
? {
|
|
id: currentStep.id,
|
|
title: `步骤 ${workflowState.currentStepIndex + 1}/${workflow.steps.length} ${currentStep.title}`,
|
|
detail: currentStep.detail
|
|
}
|
|
: null;
|
|
|
|
return {
|
|
title: runningConditionCount > 1
|
|
? `${workflow.title} · ${condition.title} · ${runningConditionCount} 个执行中`
|
|
: `${workflow.title} · ${condition.title}`,
|
|
progressLabel: `${workflowState.progress}%`,
|
|
progressValue: workflowState.progress,
|
|
currentStep: currentStepItem
|
|
};
|
|
}
|