feat(about): admin, oper, group owner all can remove member of group

This commit is contained in:
OldHawk
2017-10-21 13:07:37 +08:00
parent 479376daa1
commit c55fc7f09d
10 changed files with 225 additions and 17 deletions

View File

@@ -29,6 +29,12 @@
uibButtonConfig.activeClass = 'btn-success';
vm.addMemberPopover = {
title: 'ABOUT.ADD_MEMBER_TITLE',
templateUrl: 'add-member.html',
isOpen: false
};
vm.init = function () {
};
@@ -149,6 +155,24 @@
}
};
/**
* isFounder
* @param u
* @param m
* @returns {boolean}
*/
vm.isFounder = function (u, m) {
if (m && u) {
if (m.user._id === u._id) {
return true;
} else {
return false;
}
} else {
return false;
}
};
/**
* getMakerDescContent
* @param m
@@ -158,6 +182,50 @@
return m ? marked(m.desc, {sanitize: true}) : 'NULL';
};
/**
* addMember
*/
vm.addMember = function () {
MakerGroupService.addMember({
_id: vm.maker._id,
_username: vm.addMemberPopover.username
}, function (res) {
vm.maker = res;
NotifycationService.showSuccessNotify('ABOUT.ADD_MEMBER_SUCCESSFULLY');
vm.addMemberPopover.isOpen = false;
}, function (res) {
NotifycationService.showErrorNotify(res.data.message, 'ABOUT.ADD_MEMBER_FAILED');
vm.addMemberPopover.isOpen = false;
});
};
/**
* removeMember
* @param f forum
* @param m moderator
*/
vm.removeMember = function (m, u) {
var modalOptions = {
closeButtonText: $translate.instant('ABOUT.DELETE_CONFIRM_CANCEL'),
actionButtonText: $translate.instant('ABOUT.DELETE_CONFIRM_OK'),
headerText: $translate.instant('ABOUT.DELETE_CONFIRM_HEADER_TEXT'),
bodyText: $translate.instant('ABOUT.DELETE_MEMBER_CONFIRM_BODY_TEXT')
};
ModalConfirmService.showModal({}, modalOptions)
.then(function (result) {
MakerGroupService.removeMember({
_id: m._id,
_username: u.username
}, function (res) {
vm.maker = res;
NotifycationService.showSuccessNotify('ABOUT.REMOVE_MEMBER_SUCCESSFULLY');
}, function (res) {
NotifycationService.showErrorNotify(res.data.message, 'ABOUT.REMOVE_MEMBER_FAILED');
});
});
};
/**
* beginEditMakerDesc
* @param m

View File

@@ -226,9 +226,26 @@
width: 24px;
}
}
.maker-members {
.fa-remove {
cursor: pointer;
color: #888;
&:hover {
color: #fff;
}
}
}
.maker-button {
@media (max-width: @screen-xs-max) {
text-align: left !important;
}
}
}
.add-member-popover {
max-width: 250px;
max-height: 150px;
width: 250px;
height: auto;
}

View File

@@ -27,16 +27,23 @@
params: {
makerId: '@_id'
}
},
addMember: {
method: 'PUT',
url: '/api/makers/:makerId/addMember/:username',
params: {
makerId: '@_id',
username: '@_username'
}
},
removeMember: {
method: 'PUT',
url: '/api/makers/:makerId/removeMember/:username',
params: {
makerId: '@_id',
username: '@_username'
}
}
//,
//addModerator: {
// method: 'PUT',
// url: '/api/admin/forums/:forumId/addModerator/:username',
// params: {
// forumId: '@_id',
// username: '@_username'
// }
//}
});
}
}());

View File

@@ -14,7 +14,9 @@
<li><span class="data-founder">{{'ABOUT.GROUP_FOUNDER' | translate}}{{vm.maker.user.displayName}}</span></li>
<li><i class="fa fa-user-circle-o"> {{vm.maker.members.length}}</i></li>
<li><i class="fa fa-upload"> {{vm.maker.torrent_count}}</i></li>
<li><i class="fa fa-star-half-o"> {{vm.maker.vote_average}}/{{vm.maker.vote_count}}{{ 'TMDB_FIELDS.VOTE_UNIT' | translate}}</i></li>
<li>
<i class="fa fa-star-half-o"> {{vm.maker.vote_average}}/{{vm.maker.vote_count}}{{ 'TMDB_FIELDS.VOTE_UNIT' | translate}}</i>
</li>
</ul>
</div>
<div class="col-sm-4">
@@ -45,11 +47,16 @@
</div>
</div>
<div class="row margin-bottom-20">
<div class="row maker-members margin-bottom-40 margin-top-30">
<div class="col-xs-6 col-sm-3 col-md-2" ng-repeat="u in vm.maker.members">
<div>
<div class="margin-top-10">
<span user-info="u" info-class="maker-avatar" info-avatar></span>
<span user-info="u" info-name></span>
<i class="fa fa-remove"
ng-click="vm.removeMember(vm.maker, u);"
title="{{'ABOUT.REMOVE_MEMBER_TITLE' | translate}}"
ng-if="(vm.user.isOper || vm.isOwner(vm.maker)) && (!vm.isFounder(u, vm.maker))">
</i>
</div>
</div>
</div>
@@ -58,7 +65,15 @@
<div class="col-sm-12">
<div class="maker-button text-right">
<button class="btn btn-width-80" mouse-enter-toggle-class="btn-success" base-class="btn-mt-o"
ng-if="vm.user.isOper || vm.isOwner(vm.maker)" ng-click="vm.beginAddUser(vm.maker)">
ng-if="vm.user.isOper || vm.isOwner(vm.maker)"
uib-popover-template="vm.addMemberPopover.templateUrl"
popover-append-to-body="true"
popover-title="{{vm.addMemberPopover.title | translate}}"
popover-trigger="'outsideClick'"
popover-placement="top"
popover-is-open="vm.addMemberPopover.isOpen"
popover-class="add-member-popover"
ng-click="vm.addMemberPopover.isOpen=true; vm.addMemberPopover.username='';">
{{'ABOUT.BTN_ADD_USER' | translate}}
</button>
<button class="btn btn-width-80" mouse-enter-toggle-class="btn-default" base-class="btn-mt-o"
@@ -240,4 +255,19 @@
</div>
</div>
</div>
<script type="text/ng-template" id="add-member.html">
<form>
<div class="form-group">
<input type="text" ng-model="vm.addMemberPopover.username" class="form-control"
placeholder="{{ 'STATUS_FIELD.USERNAME' | translate }}" autofocus>
</div>
<div class="margin-top-10">
<button class="btn btn-default btn-width-80" ng-disabled="!vm.addMemberPopover.username"
ng-click="vm.addMember();">{{ 'FORUMS.BTN_ADD' | translate }}
</button>
</div>
</form>
</script>
</div>

View File

@@ -171,6 +171,71 @@ exports.rating = function (req, res) {
}
};
/**
* addMember
* @param req
* @param res
*/
exports.addMember = function (req, res) {
var maker = req.maker;
var mu = req.nameuser;
var om = [];
maker.members.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 {
maker.members.push(mu);
maker.save(function (err) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(maker);
}
});
}
};
/**
* removeMember
* @param req
* @param res
* @returns {*}
*/
exports.removeMember = function (req, res) {
var maker = req.maker;
var mu = req.nameuser;
var om = [];
maker.members.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 {
maker.members.splice(om.indexOf(mu._id.toString()), 1);
maker.save(function (err) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(maker);
}
});
}
};
/**
* Maker middleware
*/

View File

@@ -18,7 +18,9 @@ exports.invokeRolesPolicies = function () {
{resources: '/api/makers', permissions: '*'},
{resources: '/api/makers/create/:userId', permissions: '*'},
{resources: '/api/makers/:makerId', permissions: '*'},
{resources: '/api/makers/:makerId/rating', permissions: '*'}
{resources: '/api/makers/:makerId/rating', permissions: '*'},
{resources: '/api/makers/:makerId/addMember/:username', permissions: '*'},
{resources: '/api/makers/:makerId/removeMember/:username', permissions: '*'}
]
}, {
roles: ['user'],

View File

@@ -21,5 +21,10 @@ module.exports = function (app) {
app.route('/api/makers/:makerId/rating').all(aboutPolicy.isAllowed)
.put(maker.rating);
app.route('/api/makers/:makerId/addMember/:username').all(aboutPolicy.isAllowed)
.put(maker.addMember);
app.route('/api/makers/:makerId/removeMember/:username').all(aboutPolicy.isAllowed)
.put(maker.removeMember);
app.param('makerId', maker.makerByID);
};

View File

@@ -487,10 +487,17 @@
DELETE_CONFIRM_CANCEL: 'Cancel',
DELETE_CONFIRM_HEADER_TEXT: 'Delete Confirm',
DELETE_CONFIRM_BODY_TEXT: 'Are you sure want to delete this maker group?',
DELETE_MEMBER_CONFIRM_BODY_TEXT: 'Are you sure want to delete the member from this group?',
DELETE_SUCCESSFULLY: 'Maker group deleted successfully',
DELETE_FAILED: 'Maker group deleted failed',
RATING_SUCCESSFULLY: 'Rating for maker group successfully',
RATING_FAILED: 'Rating for maker group failed'
RATING_FAILED: 'Rating for maker group failed',
ADD_MEMBER_TITLE: 'Add Member',
ADD_MEMBER_SUCCESSFULLY: 'Add group member successfully',
ADD_MEMBER_FAILED: 'Add group member failed',
REMOVE_MEMBER_SUCCESSFULLY: 'Remove group member successfully',
REMOVE_MEMBER_FAILED: 'Remove group member failed',
REMOVE_MEMBER_TITLE: 'Remove this member'
},
//collections views

View File

@@ -487,10 +487,17 @@
DELETE_CONFIRM_CANCEL: '取消',
DELETE_CONFIRM_HEADER_TEXT: '删除确认',
DELETE_CONFIRM_BODY_TEXT: '您确定要删除这个资源压制小组?',
DELETE_MEMBER_CONFIRM_BODY_TEXT: '您确定要从小组删除这个成员?',
DELETE_SUCCESSFULLY: '资源压制小组删除成功',
DELETE_FAILED: '资源压制小组删除失败',
RATING_SUCCESSFULLY: '为资源压制小组评分成功',
RATING_FAILED: '为资源压制小组评分失败'
RATING_FAILED: '为资源压制小组评分失败',
ADD_MEMBER_TITLE: '添加小组成员',
ADD_MEMBER_SUCCESSFULLY: '添加小组成员成功',
ADD_MEMBER_FAILED: '添加小组成员失败',
REMOVE_MEMBER_SUCCESSFULLY: '删除小组成员成功',
REMOVE_MEMBER_FAILED: '删除小组成员失败',
REMOVE_MEMBER_TITLE: '删除小组成员'
},
//collections views

View File

@@ -196,7 +196,7 @@ exports.userByUsername = function (req, res, next, uname) {
if (err) {
return next(err);
} else if (!user) {
return res.status(404).send({
return res.status(422).send({
message: 'No user with that username has been found'
});
}