diff --git a/modules/core/client/app/trans-string-en.js b/modules/core/client/app/trans-string-en.js index 66a06ebd..337d4017 100644 --- a/modules/core/client/app/trans-string-en.js +++ b/modules/core/client/app/trans-string-en.js @@ -634,6 +634,12 @@ DELETE_CONFIRM_CANCEL: 'Cancel', DELETE_CONFIRM_HEADER_TEXT: 'Delete Confirm', DELETE_CONFIRM_BODY_TEXT: 'Are you sure want to delete this forum?', + MODERATOR_TITLE: 'Add Moderator', + ADD_MODERATOR_SUCCESSFULLY: 'Add moderator successfully', + ADD_MODERATOR_FAILED: 'Add moderator failed', + REMOVE_MODERATOR_SUCCESSFULLY: 'Remove moderator successfully', + REMOVE_MODERATOR_FAILED: 'Remove moderator failed', + REMOVE_CONFIRM_BODY_TEXT: 'Are you sure want to delete this moderator?', CATEGORY: { AFFAIRS: 'Affairs', DISCUSS: 'Discuss', diff --git a/modules/core/client/app/trans-string-zh.js b/modules/core/client/app/trans-string-zh.js index 93ded9e4..4784905b 100644 --- a/modules/core/client/app/trans-string-zh.js +++ b/modules/core/client/app/trans-string-zh.js @@ -634,6 +634,12 @@ DELETE_CONFIRM_CANCEL: '取消', DELETE_CONFIRM_HEADER_TEXT: '删除确认', DELETE_CONFIRM_BODY_TEXT: '您确定要删除这个版块吗?', + MODERATOR_TITLE: '添加版主', + ADD_MODERATOR_SUCCESSFULLY: '添加版主成功', + ADD_MODERATOR_FAILED: '添加版主失败', + REMOVE_MODERATOR_SUCCESSFULLY: '删除版主成功', + REMOVE_MODERATOR_FAILED: '删除版主失败', + REMOVE_CONFIRM_BODY_TEXT: '您确定要删除该版主吗?', CATEGORY: { AFFAIRS: '站务区', DISCUSS: '讨论区', diff --git a/modules/forums/client/controllers/forums.client.controller.js b/modules/forums/client/controllers/forums.client.controller.js index f423dd10..81477375 100644 --- a/modules/forums/client/controllers/forums.client.controller.js +++ b/modules/forums/client/controllers/forums.client.controller.js @@ -14,6 +14,12 @@ vm.forumsConfig = MeanTorrentConfig.meanTorrentConfig.forumsConfig; vm.user = Authentication.user; + vm.addModeratorPopover = { + title: 'FORUMS.MODERATOR_TITLE', + templateUrl: 'add-moderator.html', + items: [] + }; + /** * init */ @@ -21,6 +27,10 @@ ForumsAdminService.query({}, function (items) { vm.forums = items; console.log(items); + + angular.forEach(vm.forums, function (f) { + vm.addModeratorPopover.items.push(f._id, false); + }); }); }; @@ -130,5 +140,59 @@ } }; + /** + * addModerator + */ + vm.addModerator = function () { + ForumsAdminService.addModerator({ + _id: vm.forum._id, + _username: vm.addModeratorPopover.username + }, function (res) { + NotifycationService.showSuccessNotify('FORUMS.ADD_MODERATOR_SUCCESSFULLY'); + vm.addModeratorPopover.items[vm.forum._id] = false; + vm.init(); + }, function (res) { + NotifycationService.showErrorNotify(res.data.message, 'FORUMS.ADD_MODERATOR_FAILED'); + vm.addModeratorPopover.items[vm.forum._id] = false; + }); + }; + + /** + * addModeratorClicked + * @param idx + */ + vm.addModeratorClicked = function (f) { + vm.addModeratorPopover.username = undefined; + vm.addModeratorPopover.items[f._id] = true; + + vm.forum = f; + }; + + /** + * removeModeratorClicked + * @param f forum + * @param m moderator + */ + vm.removeModeratorClicked = function (f, m) { + var modalOptions = { + closeButtonText: $translate.instant('FORUMS.DELETE_CONFIRM_CANCEL'), + actionButtonText: $translate.instant('FORUMS.DELETE_CONFIRM_OK'), + headerText: $translate.instant('FORUMS.DELETE_CONFIRM_HEADER_TEXT'), + bodyText: $translate.instant('FORUMS.REMOVE_CONFIRM_BODY_TEXT') + }; + + ModalConfirmService.showModal({}, modalOptions) + .then(function (result) { + ForumsAdminService.removeModerator({ + _id: f._id, + _username: m.username + }, function (res) { + NotifycationService.showSuccessNotify('FORUMS.REMOVE_MODERATOR_SUCCESSFULLY'); + vm.init(); + }, function (res) { + NotifycationService.showErrorNotify(res.data.message, 'FORUMS.REMOVE_MODERATOR_FAILED'); + }); + }); + }; } }()); diff --git a/modules/forums/client/less/forum.less b/modules/forums/client/less/forum.less index f4454494..2909192c 100644 --- a/modules/forums/client/less/forum.less +++ b/modules/forums/client/less/forum.less @@ -30,3 +30,10 @@ color: #999; } } + +.add-moderator-popover { + max-width: 250px; + max-height: 150px; + width: 250px; + height: auto; +} diff --git a/modules/forums/client/services/forums.client.service.js b/modules/forums/client/services/forums.client.service.js index 0991999e..ea5804c3 100644 --- a/modules/forums/client/services/forums.client.service.js +++ b/modules/forums/client/services/forums.client.service.js @@ -13,6 +13,22 @@ }, { update: { method: 'PUT' + }, + addModerator: { + method: 'PUT', + url: '/api/admin/forums/:forumId/addModerator/:username', + params: { + forumId: '@_id', + username: '@_username' + } + }, + removeModerator: { + method: 'PUT', + url: '/api/admin/forums/:forumId/removeModerator/:username', + params: { + forumId: '@_id', + username: '@_username' + } } }); } diff --git a/modules/forums/client/views/admin/configure.client.view.html b/modules/forums/client/views/admin/configure.client.view.html index d7c4fff6..5fa57cd5 100644 --- a/modules/forums/client/views/admin/configure.client.view.html +++ b/modules/forums/client/views/admin/configure.client.view.html @@ -22,12 +22,34 @@ -

{{f.name}} R[Edit]

+

{{f.name}} R + [Edit] +

{{f.order}} - + +
+ {{m.username}} [ + - ] + +
+
+ [ + + + ] + +
+ @@ -106,5 +128,19 @@ + + diff --git a/modules/forums/server/controllers/forums.admin.server.controller.js b/modules/forums/server/controllers/forums.admin.server.controller.js index f3c2f3da..d3205308 100644 --- a/modules/forums/server/controllers/forums.admin.server.controller.js +++ b/modules/forums/server/controllers/forums.admin.server.controller.js @@ -74,6 +74,65 @@ exports.update = function (req, res) { }); }; +/** + * addModerator + * @param req + * @param res + */ +exports.addModerator = function (req, res) { + var forum = req.forum; + var mu = req.nameuser; + + var om = []; + forum.moderators.forEach(function (m) { + om.push(m._id.toString()); + }); + + if (om.indexOf(mu._id.toString()) >= 0) { + return res.status(422).send({ + message: 'username "' + mu.username + '" already exist!' + }); + } else { + forum.moderators.push(mu); + forum.save(function (err) { + if (err) { + return res.status(422).send({ + message: errorHandler.getErrorMessage(err) + }); + } else { + res.json(forum); + } + }); + } +}; + +exports.removeModerator = function (req, res) { + var forum = req.forum; + var mu = req.nameuser; + + var om = []; + forum.moderators.forEach(function (m) { + om.push(m._id.toString()); + }); + + if (om.indexOf(mu._id.toString()) < 0) { + return res.status(422).send({ + message: 'username "' + mu.username + '" not exist!' + }); + } else { + forum.moderators.splice(om.indexOf(mu._id.toString()), 1); + forum.save(function (err) { + if (err) { + return res.status(422).send({ + message: errorHandler.getErrorMessage(err) + }); + } else { + res.json(forum); + } + }); + } +}; + /** * delete forum * @param req @@ -119,3 +178,24 @@ exports.forumByID = function (req, res, next, id) { }); }; +/** + * Invitation middleware + */ +exports.userByUsername = function (req, res, next, uname) { + User.findOne({ + username: uname + }) + .select('username displayName profileImageURL uploaded downloaded') + .exec(function (err, user) { + if (err) { + return next(err); + } else if (!user) { + return res.status(404).send({ + message: 'No user with that username has been found' + }); + } + req.nameuser = user; + next(); + }); +}; + diff --git a/modules/forums/server/policies/forums.admin.server.policy.js b/modules/forums/server/policies/forums.admin.server.policy.js index 845b9f01..b961008c 100644 --- a/modules/forums/server/policies/forums.admin.server.policy.js +++ b/modules/forums/server/policies/forums.admin.server.policy.js @@ -18,7 +18,9 @@ exports.invokeRolesPolicies = function () { roles: ['admin', 'oper'], allows: [ {resources: '/api/admin/forums', permissions: '*'}, - {resources: '/api/admin/forums/:forumId', permissions: '*'} + {resources: '/api/admin/forums/:forumId', permissions: '*'}, + {resources: '/api/admin/forums/:forumId/addModerator/:username', permissions: '*'}, + {resources: '/api/admin/forums/:forumId/removeModerator/:username', permissions: '*'} ] }, { diff --git a/modules/forums/server/routes/forums.admin.server.routes.js b/modules/forums/server/routes/forums.admin.server.routes.js index 7b55b363..bac4b8e6 100644 --- a/modules/forums/server/routes/forums.admin.server.routes.js +++ b/modules/forums/server/routes/forums.admin.server.routes.js @@ -17,6 +17,14 @@ module.exports = function (app) { .put(forums.update) .delete(forums.delete); + // Single article routes + app.route('/api/admin/forums/:forumId/addModerator/:username').all(forumsPolicy.isAllowed) + .put(forums.addModerator); + // Single article routes + app.route('/api/admin/forums/:forumId/removeModerator/:username').all(forumsPolicy.isAllowed) + .put(forums.removeModerator); + // Finish by binding the article middleware app.param('forumId', forums.forumByID); + app.param('username', forums.userByUsername); }; diff --git a/modules/invitations/client/controllers/invitations.client.controller.js b/modules/invitations/client/controllers/invitations.client.controller.js index 7cc62dc1..9691b985 100644 --- a/modules/invitations/client/controllers/invitations.client.controller.js +++ b/modules/invitations/client/controllers/invitations.client.controller.js @@ -55,6 +55,10 @@ }); }; + /** + * sendClicked + * @param idx + */ vm.sendClicked = function (idx) { vm.invitePopover.email = undefined; vm.invitePopover.items[idx].isOpen = true;