From ade3c02122d262c72bd7c4fd1cbcab8e136184ba Mon Sep 17 00:00:00 2001 From: Pouyan Savoli Date: Fri, 25 Aug 2017 02:59:20 +0200 Subject: Create custom fields creation UI added to Board Menu, Model in progress --- models/customFields.js | 116 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 models/customFields.js (limited to 'models/customFields.js') diff --git a/models/customFields.js b/models/customFields.js new file mode 100644 index 00000000..75ee55e8 --- /dev/null +++ b/models/customFields.js @@ -0,0 +1,116 @@ +CustomFields = new Mongo.Collection('customFields'); + +CustomFields.attachSchema(new SimpleSchema({ + boardId: { + type: String, + }, + name: { + type: String, + }, + type: { + type: String, + }, + showOnCard: { + type: Boolean, + } +})); + +CustomFields.allow({ + insert(userId, doc) { + return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); + }, + update(userId, doc) { + return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); + }, + remove(userId, doc) { + return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); + }, + fetch: ['boardId'], +}); + +// not sure if we need this? +//CustomFields.hookOptions.after.update = { fetchPrevious: false }; + +function customFieldCreation(userId, doc){ + Activities.insert({ + userId, + activityType: 'createCustomField', + boardId: doc.boardId, + customFieldId: doc._id, + }); +} + +if (Meteor.isServer) { + // Comments are often fetched within a card, so we create an index to make these + // queries more efficient. + Meteor.startup(() => { + CardComments._collection._ensureIndex({ cardId: 1, createdAt: -1 }); + }); + + CustomFields.after.insert((userId, doc) => { + customFieldCreation(userId, doc); + }); + + CustomFields.after.remove((userId, doc) => { + const activity = Activities.findOne({ customFieldId: doc._id }); + if (activity) { + Activities.remove(activity._id); + } + }); +} + +//CUSTOM FIELD REST API +if (Meteor.isServer) { + JsonRoutes.add('GET', '/api/boards/:boardId/custom-fields', function (req, res, next) { + Authentication.checkUserId( req.userId); + const paramBoardId = req.params.boardId; + JsonRoutes.sendResult(res, { + code: 200, + data: CustomFields.find({ boardId: paramBoardId }) + }); + }); + + JsonRoutes.add('GET', '/api/boards/:boardId/comments/:customFieldId', function (req, res, next) { + Authentication.checkUserId( req.userId); + const paramBoardId = req.params.boardId; + const paramCustomFieldId = req.params.customFieldId; + JsonRoutes.sendResult(res, { + code: 200, + data: CustomFields.findOne({ _id: paramCustomFieldId, boardId: paramBoardId }), + }); + }); + + JsonRoutes.add('POST', '/api/boards/:boardId/custom-fields', function (req, res, next) { + Authentication.checkUserId( req.userId); + const paramBoardId = req.params.boardId; + const id = CustomFields.direct.insert({ + name: req.body.name, + type: req.body.type, + showOnCard: req.body.showOnCard, + boardId: paramBoardId, + }); + + const customField = CustomFields.findOne({_id: id, cardId:paramCardId, boardId: paramBoardId }); + customFieldCreation(req.body.authorId, customField); + + JsonRoutes.sendResult(res, { + code: 200, + data: { + _id: id, + }, + }); + }); + + JsonRoutes.add('DELETE', '/api/boards/:boardId/custom-fields/:customFieldId', function (req, res, next) { + Authentication.checkUserId( req.userId); + const paramBoardId = req.params.boardId; + const id = req.params.customFieldId; + CustomFields.remove({ _id: id, boardId: paramBoardId }); + JsonRoutes.sendResult(res, { + code: 200, + data: { + _id: id, + }, + }); + }); +} -- cgit v1.2.3-1-g7c22 From afd87e3caa1fedbe8fe5dbaefa485fee1ed85c71 Mon Sep 17 00:00:00 2001 From: Pouyan Savoli Date: Sun, 27 Aug 2017 22:31:24 +0200 Subject: many custom fields model and UI enhancements --- models/customFields.js | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) (limited to 'models/customFields.js') diff --git a/models/customFields.js b/models/customFields.js index 75ee55e8..5e76db35 100644 --- a/models/customFields.js +++ b/models/customFields.js @@ -25,7 +25,7 @@ CustomFields.allow({ remove(userId, doc) { return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); }, - fetch: ['boardId'], + fetch: ['userId', 'boardId'], }); // not sure if we need this? @@ -41,21 +41,18 @@ function customFieldCreation(userId, doc){ } if (Meteor.isServer) { - // Comments are often fetched within a card, so we create an index to make these - // queries more efficient. - Meteor.startup(() => { - CardComments._collection._ensureIndex({ cardId: 1, createdAt: -1 }); - }); + /*Meteor.startup(() => { + CustomFields._collection._ensureIndex({ boardId: 1}); + });*/ CustomFields.after.insert((userId, doc) => { customFieldCreation(userId, doc); }); CustomFields.after.remove((userId, doc) => { - const activity = Activities.findOne({ customFieldId: doc._id }); - if (activity) { - Activities.remove(activity._id); - } + Activities.remove({ + customFieldId: doc._id, + }); }); } @@ -70,7 +67,7 @@ if (Meteor.isServer) { }); }); - JsonRoutes.add('GET', '/api/boards/:boardId/comments/:customFieldId', function (req, res, next) { + JsonRoutes.add('GET', '/api/boards/:boardId/custom-fields/:customFieldId', function (req, res, next) { Authentication.checkUserId( req.userId); const paramBoardId = req.params.boardId; const paramCustomFieldId = req.params.customFieldId; @@ -90,7 +87,7 @@ if (Meteor.isServer) { boardId: paramBoardId, }); - const customField = CustomFields.findOne({_id: id, cardId:paramCardId, boardId: paramBoardId }); + const customField = CustomFields.findOne({_id: id, boardId: paramBoardId }); customFieldCreation(req.body.authorId, customField); JsonRoutes.sendResult(res, { -- cgit v1.2.3-1-g7c22 From 3753337d60e17e5e72ec071aa4a1b28e36297d15 Mon Sep 17 00:00:00 2001 From: Pouyan Savoli Date: Mon, 18 Sep 2017 00:46:17 +0200 Subject: dropdown items --- models/customFields.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'models/customFields.js') diff --git a/models/customFields.js b/models/customFields.js index 5e76db35..8b0abef4 100644 --- a/models/customFields.js +++ b/models/customFields.js @@ -9,6 +9,24 @@ CustomFields.attachSchema(new SimpleSchema({ }, type: { type: String, + allowedValues: ['text', 'number', 'checkbox', 'date', 'dropdown'] + }, + settings: { + type: Object, + }, + 'settings.dropdownItems': { + type: [Object], + optional: true + }, + 'settings.dropdownItems.$': { + type: new SimpleSchema({ + _id: { + type: String, + }, + name: { + type: String, + }, + }) }, showOnCard: { type: Boolean, @@ -83,6 +101,7 @@ if (Meteor.isServer) { const id = CustomFields.direct.insert({ name: req.body.name, type: req.body.type, + settings: req.body.settings, showOnCard: req.body.showOnCard, boardId: paramBoardId, }); -- cgit v1.2.3-1-g7c22 From 9184bf394629607bbaed8120004d90a21510315b Mon Sep 17 00:00:00 2001 From: IgnatzHome Date: Thu, 17 May 2018 21:06:52 +0200 Subject: removing checkbox type --- models/customFields.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'models/customFields.js') diff --git a/models/customFields.js b/models/customFields.js index 8b0abef4..57875b6e 100644 --- a/models/customFields.js +++ b/models/customFields.js @@ -9,7 +9,7 @@ CustomFields.attachSchema(new SimpleSchema({ }, type: { type: String, - allowedValues: ['text', 'number', 'checkbox', 'date', 'dropdown'] + allowedValues: ['text', 'number', 'date', 'dropdown'] }, settings: { type: Object, -- cgit v1.2.3-1-g7c22 From d6cfac0122dc5e6819c82f73c728488e0600cb70 Mon Sep 17 00:00:00 2001 From: Ignatz Date: Fri, 18 May 2018 10:24:51 +0200 Subject: linter corrections --- models/customFields.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'models/customFields.js') diff --git a/models/customFields.js b/models/customFields.js index 57875b6e..6c5fe7c4 100644 --- a/models/customFields.js +++ b/models/customFields.js @@ -9,14 +9,14 @@ CustomFields.attachSchema(new SimpleSchema({ }, type: { type: String, - allowedValues: ['text', 'number', 'date', 'dropdown'] + allowedValues: ['text', 'number', 'date', 'dropdown'], }, settings: { type: Object, }, 'settings.dropdownItems': { type: [Object], - optional: true + optional: true, }, 'settings.dropdownItems.$': { type: new SimpleSchema({ @@ -26,11 +26,11 @@ CustomFields.attachSchema(new SimpleSchema({ name: { type: String, }, - }) + }), }, showOnCard: { type: Boolean, - } + }, })); CustomFields.allow({ @@ -76,16 +76,16 @@ if (Meteor.isServer) { //CUSTOM FIELD REST API if (Meteor.isServer) { - JsonRoutes.add('GET', '/api/boards/:boardId/custom-fields', function (req, res, next) { + JsonRoutes.add('GET', '/api/boards/:boardId/custom-fields', function (req, res) { Authentication.checkUserId( req.userId); const paramBoardId = req.params.boardId; JsonRoutes.sendResult(res, { code: 200, - data: CustomFields.find({ boardId: paramBoardId }) + data: CustomFields.find({ boardId: paramBoardId }), }); }); - JsonRoutes.add('GET', '/api/boards/:boardId/custom-fields/:customFieldId', function (req, res, next) { + JsonRoutes.add('GET', '/api/boards/:boardId/custom-fields/:customFieldId', function (req, res) { Authentication.checkUserId( req.userId); const paramBoardId = req.params.boardId; const paramCustomFieldId = req.params.customFieldId; @@ -95,7 +95,7 @@ if (Meteor.isServer) { }); }); - JsonRoutes.add('POST', '/api/boards/:boardId/custom-fields', function (req, res, next) { + JsonRoutes.add('POST', '/api/boards/:boardId/custom-fields', function (req, res) { Authentication.checkUserId( req.userId); const paramBoardId = req.params.boardId; const id = CustomFields.direct.insert({ @@ -117,7 +117,7 @@ if (Meteor.isServer) { }); }); - JsonRoutes.add('DELETE', '/api/boards/:boardId/custom-fields/:customFieldId', function (req, res, next) { + JsonRoutes.add('DELETE', '/api/boards/:boardId/custom-fields/:customFieldId', function (req, res) { Authentication.checkUserId( req.userId); const paramBoardId = req.params.boardId; const id = req.params.customFieldId; -- cgit v1.2.3-1-g7c22