diff options
-rw-r--r-- | client/components/import/import.js | 10 | ||||
-rw-r--r-- | models/import.js | 73 |
2 files changed, 82 insertions, 1 deletions
diff --git a/client/components/import/import.js b/client/components/import/import.js index f15185ed..a2972562 100644 --- a/client/components/import/import.js +++ b/client/components/import/import.js @@ -28,7 +28,7 @@ const ImportPopup = BlazeComponent.extendComponent({ this.setError(error.error); } else { Filter.addException(response); - Popup.close(); + this.onFinish(response); } } ); @@ -43,6 +43,10 @@ const ImportPopup = BlazeComponent.extendComponent({ setError(error) { this.error.set(error); }, + + onFinish() { + Popup.close(); + } }); ImportPopup.extendComponent({ @@ -76,5 +80,9 @@ ImportPopup.extendComponent({ getLabel() { return 'import-board-trello-instruction'; }, + + onFinish(response) { + Utils.goBoardId(response); + }, }).register('boardImportBoardPopup'); diff --git a/models/import.js b/models/import.js index e81dd42a..e0badc66 100644 --- a/models/import.js +++ b/models/import.js @@ -1,3 +1,72 @@ +const trelloCreator = { + // the object creation dates, indexed by Trello id (so we only parse actions once!) + createdAt: { + board: null, + cards: {}, + lists: {}, + }, + + // the labels we created, indexed by Trello id (to map when importing cards) + labels: {}, + + /** + * must call parseActions before calling this one + */ + createBoard(trelloBoard, dateOfImport) { + const createdAt = this.createdAt.board; + const boardToCreate = { + archived: trelloBoard.closed, + // XXX map from Trello colors + color: Boards.simpleSchema()._schema.color.allowedValues[0], + createdAt, + labels: [], + members: [{ + userId: Meteor.userId(), + isAdmin: true, + isActive: true, + }], + // XXX make a more robust mapping algorithm? + permission: trelloBoard.prefs.permissionLevel, + slug: getSlug(trelloBoard.name) || 'board', + stars: 0, + title: trelloBoard.name, + }; + trelloBoard.labels.forEach((label) => { + labelToCreate = { + _id: Random.id(6), + color: label.color, + name: label.name, + }; + // we need to remember them by Trello ID, as this is the only ref we have when importing cards + this.labels[label.id] = labelToCreate; + boardToCreate.labels.push(labelToCreate); + }); + const boardId = Boards.direct.insert(boardToCreate); + return boardId; + }, + + parseActions(trelloActions) { + trelloActions.forEach((action) =>{ + switch (action.type) { + case 'createBoard': + this.createdAt.board = action.date; + break; + case 'createCard': + const cardId = action.data.card.id; + this.createdAt.cards[cardId] = action.date; + break; + case 'createList': + const listId = action.data.list.id; + this.createdAt.lists[listId] = action.date; + break; + default: + // do nothing + break; + } + }); + } +} + Meteor.methods({ importTrelloCard(trelloCard, data) { // 1. check parameters are ok from a syntax point of view @@ -141,5 +210,9 @@ Meteor.methods({ // 2. check parameters are ok from a business point of view (exist & authorized) // XXX check we are allowed // 3. create all elements + const dateOfImport = new Date(); + trelloCreator.parseActions(trelloBoard.actions); + const boardId = trelloCreator.createBoard(trelloBoard, dateOfImport); + return boardId; }, }); |