function _getGridItems()

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