feat(maker): admin oper can create maker group for user now, in user manager page

This commit is contained in:
OldHawk
2017-10-19 18:44:22 +08:00
parent 7eb4a45522
commit 18f3af75cb
25 changed files with 541 additions and 35 deletions

View File

@@ -6,10 +6,10 @@
.controller('UserController', UserController);
UserController.$inject = ['$scope', '$state', '$window', 'Authentication', 'userResolve', 'Notification', 'NotifycationService', 'MeanTorrentConfig',
'AdminService', 'ScoreLevelService', 'DebugConsoleService', 'TorrentGetInfoServices'];
'AdminService', 'ScoreLevelService', 'DebugConsoleService', 'TorrentGetInfoServices', 'SideOverlay', 'MakerGroupService'];
function UserController($scope, $state, $window, Authentication, user, Notification, NotifycationService, MeanTorrentConfig,
AdminService, ScoreLevelService, mtDebug, TorrentGetInfoServices) {
AdminService, ScoreLevelService, mtDebug, TorrentGetInfoServices, SideOverlay, MakerGroupService) {
var vm = this;
vm.TGI = TorrentGetInfoServices;
vm.authentication = Authentication;
@@ -26,6 +26,7 @@
vm.scoreLevelData = ScoreLevelService.getScoreLevelJson(vm.user.score);
vm.searchTags = [];
vm.maker = {};
vm.setUserScorePopover = {
title: 'SCORE_TITLE',
@@ -45,6 +46,7 @@
isOpen: false
};
mtDebug.info(vm.user);
/**
* remove
* @param user
@@ -151,6 +153,51 @@
}
};
/**
* showMakerGroup
* @param evt
*/
vm.showMakerGroup = function (evt) {
vm.maker = {};
SideOverlay.open(evt, 'makerSlide');
};
/**
* hideTagsPopup
*/
vm.hideMakerPopup = function () {
SideOverlay.close(null, 'makerSlide');
};
/**
* createMakerGroup
*/
vm.createMakerGroup = function () {
vm.maker.userId = vm.user._id;
var maker = new MakerGroupService(vm.maker);
mtDebug.info(maker);
maker.$save(function (response) {
successCallback(response);
}, function (errorResponse) {
errorCallback(errorResponse);
});
function successCallback(res) {
vm.maker = {};
vm.user = res;
NotifycationService.showSuccessNotify('ABOUT.MAKER_CREATE_SUCCESSFULLY');
SideOverlay.close(null, 'makerSlide');
}
function errorCallback(res) {
vm.maker = {};
NotifycationService.showErrorNotify(res.data.message, 'ABOUT.MAKER_CREATE_FAILED');
}
};
/**
* onUserRoleChanged
* admin set user`s role

View File

@@ -72,13 +72,26 @@
<dd class="h-line">
<mark>{{ vm.user.roles[0] }}</mark>
<div class="pull-right" ng-if="vm.authentication.user.username != vm.user.username && vm.authentication.user.isAdmin">
<select ng-model="vm.selectedRole" ng-change="vm.onUserRoleChanged();">
<select class="width-100" ng-model="vm.selectedRole" ng-change="vm.onUserRoleChanged();">
<option ng-repeat="r in vm.userRolesConfig" value="{{r}}">{{ r }}
</option>
</select>
</div>
</dd>
<dt class="h-line">{{ 'STATUS_FIELD.MAKER' | translate}}</dt>
<dd class="h-line">
<span ng-class="maker-list" ng-repeat="m in vm.user.makers">{{m.name}}</span>
<span ng-if="vm.user.makers.length==0">-</span>
<div class="pull-right"
ng-if="vm.authentication.user.isOper && vm.user.makers.length==0">
<button class="btn btn-default btn-xs btn-width-100" ng-click="vm.showMakerGroup($event);">
{{'STATUS_FIELD.BTN_CREATE_MAKER' | translate}}
</button>
</div>
</dd>
<dt class="h-line">{{ 'STATUS_FIELD.STATUS' | translate}}</dt>
<dd class="h-line">
<span ng-class="{'span-banned': vm.user.status == 'banned'}">{{ 'STATUS_FIELD.' + vm.user.status.toUpperCase() | translate }}</span>
@@ -233,6 +246,25 @@
</div>
</div>
<div id="makerSlide" side-overlay="right" side-class="maker-side-overlay" side-close-on-esc side-modal>
<h4 translate="ABOUT.FORM_MAKER_FOR" translate-values="{name: vm.user.displayName}"></h4>
<div class="maker-form">
<input type="text" class="form-control" id="name" placeholder="{{'ABOUT.FORM_MAKER_NAME' | translate}}"
ng-model="vm.maker.name" autofocus>
<textarea class="form-control" id="desc" placeholder="{{'ABOUT.FORM_MAKER_DESC' | translate}}"
ng-model="vm.maker.desc"></textarea>
</div>
<div class="bottom-control">
<button class="btn btn-success btn-width-100"
ng-disabled="!vm.maker.name || !vm.maker.desc"
ng-click="vm.createMakerGroup();">{{ 'BUTTON_SAVE' | translate }}
</button>
<button class="btn btn-default btn-width-100" ng-click="vm.hideMakerPopup();">{{ 'BUTTON_CANCEL' | translate }}</button>
</div>
</div>
<script type="text/ng-template" id="set-user-score.html">
<form class="form-inline set-score-popover-form text-center">
<div class="form-group">

View File

@@ -56,6 +56,12 @@
<mark>{{ vm.user.roles[0] }}</mark>
</dd>
<dt class="h-line">{{ 'STATUS_FIELD.MAKER' | translate}}</dt>
<dd class="h-line">
<span ng-class="maker-list" ng-repeat="m in vm.user.makers">{{m.name}}</span>
<span ng-if="vm.user.makers.length==0">-</span>
</dd>
<dt class="h-line">{{ 'STATUS_FIELD.SCORE' | translate}}</dt>
<dd class="h-line">
<span class="text-score">{{ vm.user.score }}</span> <span score-level="vm.scoreLevelData.currLevel"></span> <a

View File

@@ -54,6 +54,12 @@
<mark>{{ vm.user.roles[0] }}</mark>
</dd>
<dt class="h-line">{{ 'STATUS_FIELD.MAKER' | translate}}</dt>
<dd class="h-line">
<span ng-class="maker-list" ng-repeat="m in vm.user.makers">{{m.name}}</span>
<span ng-if="vm.user.makers.length==0">-</span>
</dd>
<dt class="h-line">{{ 'STATUS_FIELD.STATUS' | translate}}</dt>
<dd class="h-line">
<span ng-class="{'span-banned': vm.user.status == 'banned'}">{{ 'STATUS_FIELD.' + vm.user.status.toUpperCase() | translate }}</span>

View File

@@ -22,6 +22,7 @@ module.exports = function () {
email: usernameOrEmail.toLowerCase()
}]
}).populate('invited_by', 'username displayName profileImageURL')
.populate('makers', 'name')
.exec(function (err, user) {
console.log(user);
if (err) {

View File

@@ -22,9 +22,11 @@ module.exports = function (app) {
passport.deserializeUser(function (id, done) {
User.findOne({
_id: id
}, '-salt -password').populate('invited_by', 'username displayName profileImageURL').exec(function (err, user) {
done(err, user);
});
}, '-salt -password')
.populate('invited_by', 'username displayName profileImageURL')
.populate('makers', 'name').exec(function (err, user) {
done(err, user);
});
});
// Initialize strategies

View File

@@ -155,6 +155,7 @@ exports.list = function (req, res) {
User.find(condition, '-salt -password -providerData')
.sort('-created')
.populate('invited_by', 'username displayName profileImageURL isVip uploaded downloaded')
.populate('makers', 'name')
.skip(skip)
.limit(limit)
.exec(function (err, users) {
@@ -508,14 +509,17 @@ exports.userByID = function (req, res, next, id) {
});
}
User.findById(id, '-salt -password -providerData').populate('invited_by', 'username displayName profileImageURL').exec(function (err, user) {
if (err) {
return next(err);
} else if (!user) {
return next(new Error('Failed to load user ' + id));
}
User.findById(id, '-salt -password -providerData')
.populate('invited_by', 'username displayName profileImageURL')
.populate('makers', 'name')
.exec(function (err, user) {
if (err) {
return next(err);
} else if (!user) {
return next(new Error('Failed to load user ' + id));
}
req.model = user;
next();
});
req.model = user;
next();
});
};

View File

@@ -19,14 +19,17 @@ exports.userByID = function (req, res, next, id) {
User.findOne({
_id: id
}).populate('invited_by', 'username displayName profileImageURL').exec(function (err, user) {
if (err) {
return next(err);
} else if (!user) {
return next(new Error('Failed to load User ' + id));
}
})
.populate('invited_by', 'username displayName profileImageURL')
.populate('makers', 'name')
.exec(function (err, user) {
if (err) {
return next(err);
} else if (!user) {
return next(new Error('Failed to load User ' + id));
}
req.profile = user;
next();
});
req.profile = user;
next();
});
};

View File

@@ -200,6 +200,11 @@ var UserSchema = new Schema({
type: Schema.Types.ObjectId,
ref: 'User'
},
makers: [{
type: Schema.Types.ObjectId,
ref: 'Maker'
}],
created: {
type: Date,
default: Date.now