summaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
authorMaxime Quandalle <maxime@quandalle.com>2015-10-16 17:49:25 +0200
committerMaxime Quandalle <maxime@quandalle.com>2015-10-16 17:49:25 +0200
commit6dedf673d5bde58c8d6ca439825cbf84303a3b4e (patch)
tree727279f4431d54ab6ea330fbc5b4b80540b7f549 /models
parent15ebfa63c61694e4aa60e0f9c5047f678d6cf0c4 (diff)
downloadwekan-6dedf673d5bde58c8d6ca439825cbf84303a3b4e.tar.gz
wekan-6dedf673d5bde58c8d6ca439825cbf84303a3b4e.tar.bz2
wekan-6dedf673d5bde58c8d6ca439825cbf84303a3b4e.zip
Prevent duplicate board labels
43de3b8 did prevent empty labels with the same color, but we also want to prevent label with the same non-empty name and same color because the rationale is identical.
Diffstat (limited to 'models')
-rw-r--r--models/boards.js33
-rw-r--r--models/import.js40
2 files changed, 31 insertions, 42 deletions
diff --git a/models/boards.js b/models/boards.js
index fd0212c5..d7d40251 100644
--- a/models/boards.js
+++ b/models/boards.js
@@ -135,29 +135,26 @@ Boards.mutations({
},
addLabel(name, color) {
- const _id = Random.id(6);
-
- // If an empty label of a given color already exists we don't want to create
- // an other one because they would be indistinguishable in the UI (they
- // would still have different `_id` but that is not exposed to the user).
- if (name === '' && this.getLabel(name, color)) {
- return {};
+ // If label with the same name and color already exists we don't want to
+ // create another one because they would be indistinguishable in the UI
+ // (they would still have different `_id` but that is not exposed to the
+ // user).
+ if (!this.getLabel(name, color)) {
+ const _id = Random.id(6);
+ return { $push: {labels: { _id, name, color }}};
}
- return { $push: {labels: { _id, name, color }}};
},
editLabel(labelId, name, color) {
- const labelIndex = this.labelIndex(labelId);
-
- if (name === '' && this.getLabel(name, color)) {
- return {};
+ if (!this.getLabel(name, color)) {
+ const labelIndex = this.labelIndex(labelId);
+ return {
+ $set: {
+ [`labels.${labelIndex}.name`]: name,
+ [`labels.${labelIndex}.color`]: color,
+ },
+ };
}
- return {
- $set: {
- [`labels.${labelIndex}.name`]: name,
- [`labels.${labelIndex}.color`]: color,
- },
- };
},
removeLabel(labelId) {
diff --git a/models/import.js b/models/import.js
index 4fe4b478..e1f77efc 100644
--- a/models/import.js
+++ b/models/import.js
@@ -24,16 +24,17 @@ Meteor.methods({
}));
check(listId, String);
check(sortIndex, Number);
- } catch(e) {
+ } catch (e) {
throw new Meteor.Error('error-json-schema');
}
- // 2. check parameters are ok from a business point of view (exist & authorized)
+ // 2. check parameters are ok from a business point of view (exist &
+ // authorized)
const list = Lists.findOne(listId);
- if(!list) {
+ if (!list) {
throw new Meteor.Error('error-list-doesNotExist');
}
- if(Meteor.isServer) {
+ if (Meteor.isServer) {
if (!allowIsBoardMember(Meteor.userId(), Boards.findOne(list.boardId))) {
throw new Meteor.Error('error-board-notAMember');
}
@@ -48,6 +49,7 @@ Meteor.methods({
createdAt: dateOfImport,
dateLastActivity: dateOfImport,
description: trelloCard.desc,
+ labelIds: [],
listId: list._id,
sort: sortIndex,
title: trelloCard.name,
@@ -59,29 +61,18 @@ Meteor.methods({
const creationAction = trelloCard.actions.find((action) => {
return action.type === 'createCard';
});
- if(creationAction) {
+ if (creationAction) {
cardToCreate.createdAt = creationAction.date;
}
// 5. map labels - create missing ones
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 = [];
- }
+ const { name, color } = currentLabel;
+ // `addLabel` won't create dublicate labels (ie labels with the same name
+ // and color) so here it is used more in a "enforceLabelExistence" way.
+ list.board().addLabel(name, color);
+ const { _id: labelId } = list.board().getLabel(name, color);
+ if (labelId) {
cardToCreate.labelIds.push(labelId);
}
});
@@ -99,13 +90,14 @@ Meteor.methods({
system: 'Trello',
url: trelloCard.url,
},
- // we attribute the import to current user, not the one from the original card
+ // we attribute the import to current user, not the one from the original
+ // card
userId: Meteor.userId(),
});
// 7. parse actions and add comments
trelloCard.actions.forEach((currentAction) => {
- if(currentAction.type === 'commentCard') {
+ if (currentAction.type === 'commentCard') {
const commentToCreate = {
boardId: list.boardId,
cardId,