in src/EpicRoadmap/redux/selectors/EpicRoadmapGridViewSelector.ts [137:240]
function _getGridItems(
isSubGrid: boolean,
workItemDisplayDetails: IWorkItemDisplayDetails[],
teamFieldName: string,
teamIterations: TeamSettingsIteration[],
displayIterations: TeamSettingsIteration[],
iterationDisplayOptions: IIterationDisplayOptions,
backlogIteration: TeamSettingsIteration,
settingsState: ISettingsState,
progressTrackingCriteria: ProgressTrackingCriteria): { gridWorkItems: IGridWorkItem[]; teamFieldDisplayItems: ITeamFieldDisplayItem[]; separators: IDimension[] } {
const workItemsByTeamField = getWorkItemsByTeamField(workItemDisplayDetails, teamFieldName);
const sortedTeamFields = Object.keys(workItemsByTeamField).sort();
const gridWorkItems: IGridWorkItem[] = [];
const teamFieldDisplayItems: ITeamFieldDisplayItem[] = [];
const separators: IDimension[] = [];
let teamGroupStartRow = 3;
let teamGroupEndRow = -1;
sortedTeamFields.forEach((teamField, teamFieldIndex) => {
// create cards for work items, and only if there are more than one card for work items create card for the teamfield
const orderedWorkItems = workItemsByTeamField[teamField].sort(workItemCompare);
const workItemStartColumn = 2;
let workItemStartRow = teamGroupStartRow;
const childItems = orderedWorkItems.map(workItem => {
if (workItem.id === 11) {
debugger;
}
const { iterationDuration: { startIteration, endIteration } } = workItem;
const iterationsForIndex = !isSubGrid && iterationDisplayOptions ? teamIterations : displayIterations; // isSubGrid ? displayIterations : teamIterations;
let startIterationIndex = iterationsForIndex.findIndex(di => di.id === startIteration.id);
let endIterationIndex = iterationsForIndex.findIndex(di => di.id === endIteration.id);
let crop: CropWorkItem = CropWorkItem.None;
let outofScope = false;
if (iterationDisplayOptions) {
if (startIterationIndex > iterationDisplayOptions.endIndex || endIterationIndex < iterationDisplayOptions.startIndex) {
outofScope = true;
}
if (iterationDisplayOptions.startIndex > startIterationIndex) {
startIterationIndex = 0;
crop = CropWorkItem.Left;
}
else {
startIterationIndex = displayIterations.findIndex(gi => gi.id === startIteration.id);
}
if (endIterationIndex > iterationDisplayOptions.endIndex) {
endIterationIndex = displayIterations.length - 1;
crop = crop === CropWorkItem.Left ? CropWorkItem.Both : CropWorkItem.Right;
}
else {
endIterationIndex = displayIterations.findIndex(gi => gi.id === endIteration.id);
}
}
if (outofScope || startIterationIndex < 0 || endIterationIndex < 0) {
debugger;
return null;
}
if (startIterationIndex < 0) {
startIterationIndex = endIterationIndex = displayIterations.findIndex(i => i.id === backlogIteration.id);
}
const allowOverrideIteration = !isSubGrid && workItem.iterationDuration.startIteration.id !== backlogIteration.id;
const startCol = workItemStartColumn + startIterationIndex;
const endCol = workItemStartColumn + endIterationIndex + 1;
const ret = {
dimension: {
startRow: workItemStartRow,
endRow: workItemStartRow + 1,
startCol,
endCol
},
workItem,
settingsState,
progressIndicator: getProgress(workItem.children, progressTrackingCriteria),
crop,
allowOverrideIteration
};
workItemStartRow++;
return ret;
}).filter(x => !!x);
if (childItems.length > 0) {
gridWorkItems.push(...childItems);
teamGroupEndRow = teamGroupStartRow + childItems.length + 1; // +1 for the separator
if (teamFieldIndex < sortedTeamFields.length - 1) {
separators.push({
startRow: teamGroupEndRow - 1,
endRow: teamGroupEndRow,
startCol: 2,
endCol: displayIterations.length + 2
});
}
teamFieldDisplayItems.push({
dimension: {
startRow: teamGroupStartRow,
startCol: 1,
endRow: teamGroupEndRow,
endCol: 2
},
teamField
});
teamGroupStartRow = teamGroupEndRow;
}
});
return { gridWorkItems, teamFieldDisplayItems, separators };
}