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;
}