diff options
-rw-r--r-- | client/components/lists/listHeader.jade | 1 | ||||
-rw-r--r-- | client/components/lists/listHeader.js | 68 | ||||
-rw-r--r-- | models/import.js | 98 |
3 files changed, 112 insertions, 55 deletions
diff --git a/client/components/lists/listHeader.jade b/client/components/lists/listHeader.jade index 597e2bbd..922ac27b 100644 --- a/client/components/lists/listHeader.jade +++ b/client/components/lists/listHeader.jade @@ -35,7 +35,6 @@ template(name="listImportCardPopup") form label | {{_ 'card-json'}} - //+editor(class="js-card-json" autofocus=true) textarea.js-card-json(placeholder="{{_ 'card-json-placeholder'}}" autofocus) input.primary.wide(type="submit" value="{{_ 'import'}}") diff --git a/client/components/lists/listHeader.js b/client/components/lists/listHeader.js index c4cace08..9aa26194 100644 --- a/client/components/lists/listHeader.js +++ b/client/components/lists/listHeader.js @@ -54,63 +54,23 @@ Template.listImportCardPopup.events({ // 1. get the json data out of the form and parse it evt.preventDefault(); const jsonData = $(evt.currentTarget).find('textarea').val(); - const data = JSON.parse(jsonData); - // 2. map all fields for the card to create const firstCardDom = $(`#js-list-${this._id} .js-minicard:first`).get(0); const sortIndex = Utils.calculateIndex(null, firstCardDom).base; - const cardToCreate = { - title: data.name, - description: data.desc, - listId: this._id, - boardId: this.boardId, - userId: Meteor.userId(), - sort: sortIndex, - archived: data.closed, - }; - // 3. map labels - data.labels.forEach((current) => { - const color = current.color; - const name = current.name; - const existingLabel = this.board().getLabel(name, color); - let labelId = undefined; - if (existingLabel) { - labelId = existingLabel._id; - } else { - let labelCreated = this.board().addLabel(name, color); - // XXX currently mutations return no value so we have to fetch the label we just created - // waiting on https://github.com/mquandalle/meteor-collection-mutations/issues/1 to remove... - labelCreated = this.board().getLabel(name, color); - labelId = labelCreated._id; - } - if(labelId) { - if (!cardToCreate.labelIds) { - cardToCreate.labelIds = []; - } - cardToCreate.labelIds.push(labelId); - } - }); - // 4. insert new card into list - const _id = Cards.insert(cardToCreate); - // 5. parse actions and add comments - data.actions.forEach((current) => { - if(current.type === 'commentCard') { - const commentToCreate = { - boardId: this.boardId, - cardId: _id, - userId: Meteor.userId(), - text: current.data.text, - }; - CardComments.insert(commentToCreate); - } - // XXX add other type of activities? + try { + const trelloCard = JSON.parse(jsonData); + const cardId = Meteor.call('importTrelloCard', trelloCard, this._id, sortIndex); + // In case the filter is active we need to add the newly inserted card in + // the list of exceptions -- cards that are not filtered. Otherwise the + // card will disappear instantly. + // See https://github.com/wekan/wekan/issues/80 + Filter.addException(cardId); Popup.close(); - }); - - // In case the filter is active we need to add the newly inserted card in - // the list of exceptions -- cards that are not filtered. Otherwise the - // card will disappear instantly. - // See https://github.com/wekan/wekan/issues/80 - Filter.addException(_id); + } catch(e) { + // XXX handle error + // this.error.set('avatar-too-big'); + console.log('Invalid JSON'); + return; + } }, }); diff --git a/models/import.js b/models/import.js new file mode 100644 index 00000000..83559078 --- /dev/null +++ b/models/import.js @@ -0,0 +1,98 @@ +Meteor.methods({ + /** + * + */ + importTrelloCard(trelloCard, listId, sortIndex) { + DateString = Match.Where(function (dateAsString) { + check(dateAsString, String); + //const date = new Date(dateAsString); + //return (date.toString() !== 'Invalid Date') && !isNan(date); + return moment(dateAsString, moment.ISO_8601).isValid(); + }); + + check(trelloCard, Match.ObjectIncluding({ + name: String, + desc: String, + closed: Boolean, + dateLastActivity: DateString, + labels: [Match.ObjectIncluding({ + name: String, + color: String, + })], + actions: [Match.ObjectIncluding({ + type: String, + date: DateString, + data: Object, + })], + members: [Object], + })); + check(listId, String); + check(sortIndex, Number); + + const list = Lists.findOne(listId); + if(!list) { + throw 'exception-list-doesNotExist'; + } + + // XXX check we are allowed to run method + + // 1. map all fields for the card to create + const dateOfImport = new Date(); + // XXX parse trelloCard.actions to determine creation date + const cardToCreate = { + title: trelloCard.name, + description: trelloCard.desc, + listId: list._id, + boardId: list.boardId, + userId: Meteor.userId(), + sort: sortIndex, + archived: trelloCard.closed, + // XXX dateOfImport + createdAt: dateOfImport, + dateLastActivity: dateOfImport, + }; + // 2. map labels + trelloCard.labels.forEach((currentLabel) => { + const color = currentLabel.color; + const name = currentLabel.name; + const existingLabel = list.board().getLabel(name, color); + let labelId = undefined; + if (existingLabel) { + labelId = existingLabel._id; + } else { + let labelCreated = list.board().addLabel(name, color); + // XXX currently mutations return no value so we have to fetch the label we just created + // waiting on https://github.com/mquandalle/meteor-collection-mutations/issues/1 to remove... + labelCreated = list.board().getLabel(name, color); + labelId = labelCreated._id; + } + if(labelId) { + if (!cardToCreate.labelIds) { + cardToCreate.labelIds = []; + } + cardToCreate.labelIds.push(labelId); + } + }); + // 3. insert new card into list + // XXX replace with direct MongoDB inserts + const _id = Cards.direct.insert(cardToCreate); + // XXX then add import activity + // 4. parse actions and add comments + trelloCard.actions.forEach((currentAction) => { + if(currentAction.type === 'commentCard') { + const commentToCreate = { + boardId: list.boardId, + cardId: _id, + userId: Meteor.userId(), + text: currentAction.data.text, + createdAt: currentAction.date, + }; + // console.log(commentToCreate); + CardComments.direct.insert(commentToCreate); + } + // XXX add other type of activities? + // XXX look for createCard to set create date > no do it BEFORE saving + }); + return _id; + }, +}); |