From 50b0dade2d54307bfebe23afeb96fd1285ad2a85 Mon Sep 17 00:00:00 2001 From: Louis Lagrange Date: Sun, 26 Aug 2018 21:41:31 +0200 Subject: [PATCH] Handle multiple doing columns --- src/modules/cards/sagas.js | 32 +++++++++++++------ .../adapter/ProjectScrumbleToAppAdapter.js | 11 +++++-- src/types/Project.js | 10 ++++-- src/types/Scrumble/common.js | 2 +- 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/modules/cards/sagas.js b/src/modules/cards/sagas.js index e31e6d8..022fce5 100644 --- a/src/modules/cards/sagas.js +++ b/src/modules/cards/sagas.js @@ -89,18 +89,30 @@ export function* fetchNotDoneCards(): Generator<*, *, *> { if (!currentProject || !currentProject.columnMapping) yield cancel(); // fetch in parallel - const cardsCalls = yield all( - Object.values(currentProject.columnMapping).map( - id => - // if it's not the active sprint, there's no cards that are not done - !isCurrentSprintActive ? all([]) : call(Trello.getCardsFromList, token.trello, id) - ) - ); + const columnsNames = []; + const columnsCalls = []; + const createCall = (columnId: string) => + !isCurrentSprintActive ? all([]) : call(Trello.getCardsFromList, token.trello, columnId); + Object.entries(currentProject.columnMapping).forEach(([columnName, columnId]) => { + if (typeof columnId === 'string') { + columnsNames.push(columnName); + columnsCalls.push(createCall(columnId)); + } else { + // $FlowFixMe: this is an array + columnId.forEach(subColumnId => { + columnsNames.push(columnName); + columnsCalls.push(createCall(subColumnId)); + }); + } + }); + + const columnsCallsResults = yield all(columnsCalls); let cards = {}; - let i = 0; - for (let key of Object.keys(currentProject.columnMapping)) { - cards[key] = adaptCardsFromTrello(cardsCalls[i++]); + for (let i = 0; i < columnsNames.length; i++) { + const columnName = columnsNames[i]; + const newCards = columnsCallsResults[i]; + cards[columnName] = (cards[columnName] || []).concat(adaptCardsFromTrello(newCards)); } yield put(putCards(cards)); diff --git a/src/services/adapter/ProjectScrumbleToAppAdapter.js b/src/services/adapter/ProjectScrumbleToAppAdapter.js index 4ccc274..bb3b33c 100644 --- a/src/services/adapter/ProjectScrumbleToAppAdapter.js +++ b/src/services/adapter/ProjectScrumbleToAppAdapter.js @@ -1,10 +1,15 @@ // @flow -import type { ProjectType } from '../../types'; -import type { ScrumbleProjectType } from '../../types/Scrumble'; +import type { ProjectType, ColumnMappingType } from '../../types'; +import type { ScrumbleProjectType, ScrumbleColumnMappingType } from '../../types/Scrumble'; + +const retroCompatibleScrumbleColumnMapping = (scrumbleColumnMapping: ScrumbleColumnMappingType): ColumnMappingType => ({ + ...scrumbleColumnMapping, + doing: typeof scrumbleColumnMapping.doing === 'string' ? [scrumbleColumnMapping.doing] : scrumbleColumnMapping.doing, +}); export default (project: ScrumbleProjectType): ProjectType => ({ id: project.id, boardId: project.boardId, name: project.name, - columnMapping: project.columnMapping, + columnMapping: retroCompatibleScrumbleColumnMapping(project.columnMapping), }); diff --git a/src/types/Project.js b/src/types/Project.js index 8c33239..3611ef3 100644 --- a/src/types/Project.js +++ b/src/types/Project.js @@ -1,5 +1,4 @@ -import type { ScrumbleColumnMappingType } from './Scrumble'; - +// @flow export type ProjectType = {| id: number, boardId: string, @@ -7,4 +6,9 @@ export type ProjectType = {| columnMapping: ColumnMappingType, |}; -type ColumnMappingType = ScrumbleColumnMappingType; +type ColumnMappingType = {| + blocked: string, + doing: string[], + sprint: string, + toValidate: string, +|}; diff --git a/src/types/Scrumble/common.js b/src/types/Scrumble/common.js index 7552aaf..7297173 100644 --- a/src/types/Scrumble/common.js +++ b/src/types/Scrumble/common.js @@ -1,6 +1,6 @@ export type ScrumbleColumnMappingType = { blocked: string, - doing: string, + doing: string | string[], sprint: string, toValidate: string, };