function getWorkItemIterationDuration()

in src/FeatureTimeline/redux/selectors/workItemHierarchySelector.ts [155:203]


function getWorkItemIterationDuration(
    children: IWorkItemDisplayDetails[],
    projectId: string,
    teamId: string,
    input: IFeatureTimelineRawState,
    id: number,
    workItem: WorkItem) {

    let iterationDuration = getIterationDurationFromChildren(children);

    const allIterations = getTeamIterations(projectId, teamId, UIStatus.Default, input);

    const teamSettings = input.teamSetting.teamSetting[projectId][teamId];

    // if the start/end iteration is overridden use that value
    if (input.savedOverriddenIterations &&
        input.savedOverriddenIterations[id]) {
        const si = input.savedOverriddenIterations[id].startIterationId;
        const ei = input.savedOverriddenIterations[id].endIterationId;
        const overridedBy = input.savedOverriddenIterations[id].user;
        const startIteration = allIterations.find(i => i.id === si);
        const endIteration = allIterations.find(i => i.id === ei);

        if (startIteration && endIteration) {
            const childrenAreOutofBounds = areChildrenOutOfBounds(startIteration, endIteration, iterationDuration, allIterations);
            let kindMessage = "User specified start and end iteration.";
            iterationDuration = { startIteration, endIteration, kind: IterationDurationKind.UserOverridden, overridedBy, kindMessage, childrenAreOutofBounds };
        }
    }

    // if null use workItems start/end iteration
    if (workItem && (!iterationDuration.startIteration || !iterationDuration.endIteration)) {
        const iterationPath = workItem.fields["System.IterationPath"];
        const iteration = allIterations.find((i) => i.path === iterationPath);
        iterationDuration.startIteration = iteration;
        iterationDuration.endIteration = iteration;
        iterationDuration.kind = IterationDurationKind.Self;
        iterationDuration.kindMessage = "Work Items own iteration.";
    }

    // If still null take currentIteration
    if (!iterationDuration.startIteration || !iterationDuration.endIteration) {
        iterationDuration.startIteration = teamSettings.backlogIteration;
        iterationDuration.endIteration = teamSettings.backlogIteration;
        iterationDuration.kind = IterationDurationKind.BacklogIteration;
        iterationDuration.kindMessage = "Using backlog iteration";
    }
    return iterationDuration;
}