summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--client/components/boards/boardArchive.js6
-rw-r--r--client/components/boards/boardsList.jade3
-rw-r--r--client/components/boards/boardsList.js16
-rw-r--r--client/components/cards/cardDetails.jade3
-rw-r--r--client/components/cards/cardDetails.js3
-rw-r--r--client/components/users/userHeader.jade3
-rw-r--r--client/components/users/userHeader.js9
-rw-r--r--i18n/en.i18n.json6
-rw-r--r--models/boards.js10
-rw-r--r--models/cards.js6
-rw-r--r--models/lists.js11
-rw-r--r--models/swimlanes.js11
-rw-r--r--models/users.js48
-rw-r--r--server/publications/boards.js1
14 files changed, 129 insertions, 7 deletions
diff --git a/client/components/boards/boardArchive.js b/client/components/boards/boardArchive.js
index 8f4d5434..c8bbb341 100644
--- a/client/components/boards/boardArchive.js
+++ b/client/components/boards/boardArchive.js
@@ -1,9 +1,3 @@
-Template.boardListHeaderBar.events({
- 'click .js-open-archived-board'() {
- Modal.open('archivedBoards');
- },
-});
-
BlazeComponent.extendComponent({
onCreated() {
this.subscribe('archivedBoards');
diff --git a/client/components/boards/boardsList.jade b/client/components/boards/boardsList.jade
index 89852570..e36b8fc6 100644
--- a/client/components/boards/boardsList.jade
+++ b/client/components/boards/boardsList.jade
@@ -36,3 +36,6 @@ template(name="boardListHeaderBar")
a.board-header-btn.js-open-archived-board
i.fa.fa-archive
span {{_ 'archives'}}
+ a.board-header-btn(href="{{pathFor 'board' id=templatesBoardId slug=templatesBoardSlug}}")
+ i.fa.fa-clone
+ span {{_ 'templates'}}
diff --git a/client/components/boards/boardsList.js b/client/components/boards/boardsList.js
index 1ed88146..70dd1143 100644
--- a/client/components/boards/boardsList.js
+++ b/client/components/boards/boardsList.js
@@ -1,5 +1,20 @@
const subManager = new SubsManager();
+Template.boardListHeaderBar.events({
+ 'click .js-open-archived-board'() {
+ Modal.open('archivedBoards');
+ },
+});
+
+Template.boardListHeaderBar.helpers({
+ templatesBoardId() {
+ return Meteor.user().getTemplatesBoard().id;
+ },
+ templatesBoardSlug() {
+ return Meteor.user().getTemplatesBoard().slug;
+ },
+});
+
BlazeComponent.extendComponent({
onCreated() {
Meteor.subscribe('setting');
@@ -9,6 +24,7 @@ BlazeComponent.extendComponent({
return Boards.find({
archived: false,
'members.userId': Meteor.userId(),
+ type: 'board',
}, {
sort: ['title'],
});
diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade
index 25316d04..4d9b2e08 100644
--- a/client/components/cards/cardDetails.jade
+++ b/client/components/cards/cardDetails.jade
@@ -247,6 +247,9 @@ template(name="cardDetailsActionsPopup")
unless archived
li: a.js-archive {{_ 'archive-card'}}
li: a.js-more {{_ 'cardMorePopup-title'}}
+ hr
+ ul.pop-over-list
+ li: a.js-template-card {{_ 'cardTemplatePopup-title'}}
template(name="moveCardPopup")
+boardsAndLists
diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js
index a571e21a..489f28ae 100644
--- a/client/components/cards/cardDetails.js
+++ b/client/components/cards/cardDetails.js
@@ -365,6 +365,9 @@ Template.cardDetailsActionsPopup.events({
if (!err && ret) Popup.close();
});
},
+ 'click .js-template-card' () {
+ console.log('REMOVE Creating template card');
+ },
});
Template.editCardTitleForm.onRendered(function () {
diff --git a/client/components/users/userHeader.jade b/client/components/users/userHeader.jade
index b6e10d8a..a4704933 100644
--- a/client/components/users/userHeader.jade
+++ b/client/components/users/userHeader.jade
@@ -21,6 +21,9 @@ template(name="memberMenuPopup")
li: a.js-go-setting(href="{{pathFor 'setting'}}") {{_ 'admin-panel'}}
hr
ul.pop-over-list
+ li: a(href="{{pathFor 'board' id=templatesBoardId slug=templatesBoardSlug}}") {{_ 'templates'}}
+ hr
+ ul.pop-over-list
li: a.js-logout {{_ 'log-out'}}
template(name="editProfilePopup")
diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js
index 63cbb14f..0978ec75 100644
--- a/client/components/users/userHeader.js
+++ b/client/components/users/userHeader.js
@@ -3,6 +3,15 @@ Template.headerUserBar.events({
'click .js-change-avatar': Popup.open('changeAvatar'),
});
+Template.memberMenuPopup.helpers({
+ templatesBoardId() {
+ return Meteor.user().getTemplatesBoard().id;
+ },
+ templatesBoardSlug() {
+ return Meteor.user().getTemplatesBoard().slug;
+ },
+});
+
Template.memberMenuPopup.events({
'click .js-edit-profile': Popup.open('editProfile'),
'click .js-change-settings': Popup.open('changeSettings'),
diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json
index d4e817ea..4c3f5943 100644
--- a/i18n/en.i18n.json
+++ b/i18n/en.i18n.json
@@ -92,6 +92,7 @@
"restore-board": "Restore Board",
"no-archived-boards": "No Boards in Archive.",
"archives": "Archive",
+ "templates": "Templates",
"assign-member": "Assign member",
"attached": "attached",
"attachment": "Attachment",
@@ -143,6 +144,7 @@
"cardLabelsPopup-title": "Labels",
"cardMembersPopup-title": "Members",
"cardMorePopup-title": "More",
+ "cardTemplatePopup-title": "Create template",
"cards": "Cards",
"cards-count": "Cards",
"casSignIn" : "Sign In with CAS",
@@ -453,6 +455,10 @@
"welcome-swimlane": "Milestone 1",
"welcome-list1": "Basics",
"welcome-list2": "Advanced",
+ "templates-board": "Templates Board",
+ "card-templates-swimlane": "Card Templates Swimlane",
+ "list-templates-swimlane": "List Templates Swimlane",
+ "board-templates-swimlane": "Board Templates Swimlane",
"what-to-do": "What do you want to do?",
"wipLimitErrorPopup-title": "Invalid WIP Limit",
"wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
diff --git a/models/boards.js b/models/boards.js
index 71831a63..a2f4c0a8 100644
--- a/models/boards.js
+++ b/models/boards.js
@@ -304,6 +304,13 @@ Boards.attachSchema(new SimpleSchema({
defaultValue: false,
optional: true,
},
+ type: {
+ /**
+ * The type of board
+ */
+ type: String,
+ defaultValue: 'board',
+ },
}));
@@ -559,6 +566,9 @@ Boards.helpers({
});
},
+ isTemplateBoard() {
+ return this.type === 'template-board';
+ },
});
diff --git a/models/cards.js b/models/cards.js
index ff19a9a0..e9fc453e 100644
--- a/models/cards.js
+++ b/models/cards.js
@@ -246,7 +246,7 @@ Cards.attachSchema(new SimpleSchema({
* type of the card
*/
type: String,
- defaultValue: '',
+ defaultValue: 'cardType-card',
},
linkedId: {
/**
@@ -930,6 +930,10 @@ Cards.helpers({
return this.assignedBy;
}
},
+
+ isTemplateCard() {
+ return this.type === 'template-card';
+ },
});
Cards.mutations({
diff --git a/models/lists.js b/models/lists.js
index 54e7d037..e0040752 100644
--- a/models/lists.js
+++ b/models/lists.js
@@ -107,6 +107,13 @@ Lists.attachSchema(new SimpleSchema({
'saddlebrown', 'paleturquoise', 'mistyrose', 'indigo',
],
},
+ type: {
+ /**
+ * The type of list
+ */
+ type: String,
+ defaultValue: 'list',
+ },
}));
Lists.allow({
@@ -169,6 +176,10 @@ Lists.helpers({
return this.color;
return '';
},
+
+ isTemplateList() {
+ return this.type === 'template-list';
+ },
});
Lists.mutations({
diff --git a/models/swimlanes.js b/models/swimlanes.js
index e2c3925c..bdc9a691 100644
--- a/models/swimlanes.js
+++ b/models/swimlanes.js
@@ -78,6 +78,13 @@ Swimlanes.attachSchema(new SimpleSchema({
}
},
},
+ type: {
+ /**
+ * The type of swimlane
+ */
+ type: String,
+ defaultValue: 'swimlane',
+ },
}));
Swimlanes.allow({
@@ -114,6 +121,10 @@ Swimlanes.helpers({
return this.color;
return '';
},
+
+ isTemplateSwimlane() {
+ return this.type === 'template-swimlane';
+ },
});
Swimlanes.mutations({
diff --git a/models/users.js b/models/users.js
index 0fdf21a8..7bc9e5bf 100644
--- a/models/users.js
+++ b/models/users.js
@@ -159,6 +159,13 @@ Users.attachSchema(new SimpleSchema({
'board-view-cal',
],
},
+ 'profile.templatesBoardId': {
+ /**
+ * Reference to the templates board
+ */
+ type: String,
+ defaultValue: '',
+ },
services: {
/**
* services field of the user
@@ -328,6 +335,13 @@ Users.helpers({
const profile = this.profile || {};
return profile.language || 'en';
},
+
+ getTemplatesBoard() {
+ return {
+ id: this.profile.templatesBoardId,
+ slug: Boards.findOne(this.profile.templatesBoardId).slug,
+ };
+ },
});
Users.mutations({
@@ -701,6 +715,40 @@ if (Meteor.isServer) {
Lists.insert({title: TAPi18n.__(title), boardId, sort: titleIndex}, fakeUser);
});
});
+
+ Boards.insert({
+ title: TAPi18n.__('templates-board'),
+ permission: 'private',
+ type: 'template-container'
+ }, fakeUser, (err, boardId) => {
+
+ // Insert the reference to our templates board
+ Users.update(fakeUserId.get(), {$set: {'profile.templatesBoardId': boardId}});
+
+ // Insert the card templates swimlane
+ Swimlanes.insert({
+ title: TAPi18n.__('card-templates-swimlane'),
+ boardId,
+ sort: 1,
+ type: 'template-container',
+ }, fakeUser);
+
+ // Insert the list templates swimlane
+ Swimlanes.insert({
+ title: TAPi18n.__('list-templates-swimlane'),
+ boardId,
+ sort: 2,
+ type: 'template-container',
+ }, fakeUser);
+
+ // Insert the board templates swimlane
+ Swimlanes.insert({
+ title: TAPi18n.__('board-templates-swimlane'),
+ boardId,
+ sort: 3,
+ type: 'template-container',
+ }, fakeUser);
+ });
});
});
}
diff --git a/server/publications/boards.js b/server/publications/boards.js
index fb4c8c84..71c53612 100644
--- a/server/publications/boards.js
+++ b/server/publications/boards.js
@@ -32,6 +32,7 @@ Meteor.publish('boards', function() {
color: 1,
members: 1,
permission: 1,
+ type: 1,
},
});
});