mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-19 15:48:04 +01:00
[#1673] challenges: better tag-syncing, show tag bull-horn
This commit is contained in:
@@ -68,6 +68,7 @@ habitrpg.controller("ChallengesCtrl", ['$scope', 'User', 'Challenges', 'Notifica
|
|||||||
Notification.text('Challenge Created');
|
Notification.text('Challenge Created');
|
||||||
$scope.discard();
|
$scope.discard();
|
||||||
$scope.challenges = Challenges.Challenge.query();
|
$scope.challenges = Challenges.Challenge.query();
|
||||||
|
User.sync();
|
||||||
} else {
|
} else {
|
||||||
// TODO figure out a more elegant way about this
|
// TODO figure out a more elegant way about this
|
||||||
//challenge._editing = false;
|
//challenge._editing = false;
|
||||||
|
|||||||
@@ -35,19 +35,14 @@ var syncChalToUser = function(chal, user) {
|
|||||||
challenge: true
|
challenge: true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
tags = {};
|
|
||||||
tags[chal._id] = true;
|
|
||||||
|
|
||||||
// Sync new tasks and updated tasks
|
// Sync new tasks and updated tasks
|
||||||
_.each(chal.tasks, function(task){
|
_.each(chal.tasks, function(task){
|
||||||
var type = task.type;
|
var userTask = user.tasks[task.id] || (user[task.type+'s'].push(task), user.tasks[task.id]); //user[task.type+'s'][user[task.type+'s'].length-1]
|
||||||
_.defaults(task, {tags: tags, challenge:{}});
|
userTask.challenge = {id:chal._id};
|
||||||
_.defaults(task.challenge, {id:chal._id});
|
userTask.tags = userTask.tags || {};
|
||||||
if (user.tasks[task.id]) {
|
userTask.tags[chal._id] = true;
|
||||||
_.merge(user.tasks[task.id], keepAttrs(task));
|
_.merge(userTask, keepAttrs(task));
|
||||||
} else {
|
|
||||||
user[type+'s'].push(task);
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
// Flag deleted tasks as "broken"
|
// Flag deleted tasks as "broken"
|
||||||
@@ -122,7 +117,6 @@ api.create = function(req, res){
|
|||||||
var waterfall = [];
|
var waterfall = [];
|
||||||
if (+req.body.prize < 0) return res.json(401, {err: 'Challenge prize must be >= 0'});
|
if (+req.body.prize < 0) return res.json(401, {err: 'Challenge prize must be >= 0'});
|
||||||
if (+req.body.prize > 0) {
|
if (+req.body.prize > 0) {
|
||||||
var net = 0;
|
|
||||||
waterfall = [
|
waterfall = [
|
||||||
function(cb){
|
function(cb){
|
||||||
Group.findById(req.body.group).select('balance leader').exec(cb);
|
Group.findById(req.body.group).select('balance leader').exec(cb);
|
||||||
@@ -133,7 +127,7 @@ api.create = function(req, res){
|
|||||||
if (req.body.prize > (user.balance*4 + groupBalance*4))
|
if (req.body.prize > (user.balance*4 + groupBalance*4))
|
||||||
return cb("Challenge.prize > (your gems + group balance). Purchase more gems or lower prize amount.s")
|
return cb("Challenge.prize > (your gems + group balance). Purchase more gems or lower prize amount.s")
|
||||||
|
|
||||||
net = req.body.prize/4; // I really should have stored user.balance as gems rather than dollars... stupid...
|
var net = req.body.prize/4; // I really should have stored user.balance as gems rather than dollars... stupid...
|
||||||
|
|
||||||
// user is group leader, and group has balance. Subtract from that first, then take the rest from user
|
// user is group leader, and group has balance. Subtract from that first, then take the rest from user
|
||||||
if (groupBalance > 0) {
|
if (groupBalance > 0) {
|
||||||
@@ -143,23 +137,31 @@ api.create = function(req, res){
|
|||||||
group.balance = 0;
|
group.balance = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
group.save(cb)
|
|
||||||
},
|
|
||||||
function(group, numRows, cb) {
|
|
||||||
user.balance -= net;
|
user.balance -= net;
|
||||||
user.save(cb);
|
group.save(cb)
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
async.waterfall(waterfall, function(err){
|
waterfall = waterfall.concat([
|
||||||
if (err) return res.json(401, {err:err});
|
function() { // if we're dealing with prize above, arguemnts will be `group, numRows, cb` - else `cb`
|
||||||
var challenge = new Challenge(req.body); // FIXME sanitize
|
var cb = arguments[arguments.length-1];
|
||||||
challenge.members.push(user._id);
|
var challenge = new Challenge(req.body); // FIXME sanitize
|
||||||
challenge.save(function(err, saved){
|
challenge.members.push(user._id);
|
||||||
if (err) return res.json(500, {err:err});
|
challenge.save(cb);
|
||||||
Group.update({_id:saved.group}, {$addToSet:{challenges:saved._id}}) // fixme error-check, and also better to do in middleware?
|
},
|
||||||
res.json(saved);
|
function(chal, num, cb) {
|
||||||
});
|
// Auto-join creator to challenge (see members.push above)
|
||||||
|
syncChalToUser(chal, user);
|
||||||
|
user.save(function(err){
|
||||||
|
if (err) return cb(err);
|
||||||
|
cb(null, chal);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
async.waterfall(waterfall, function(err, chal){
|
||||||
|
if (err) return res.json(500, {err:err});
|
||||||
|
Group.update({_id:chal.group}, {$addToSet:{challenges:chal._id}}) // fixme error-check, and also better to do in middleware?
|
||||||
|
res.json(chal);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -243,6 +245,7 @@ function closeChal(cid, broken, cb) {
|
|||||||
function(users, cb2) {
|
function(users, cb2) {
|
||||||
var parallel = [];
|
var parallel = [];
|
||||||
_.each(users, function(user){
|
_.each(users, function(user){
|
||||||
|
_.find(user.tags, {id:cid}).challenge = undefined;
|
||||||
_.each(user.tasks, function(task){
|
_.each(user.tasks, function(task){
|
||||||
if (task.challenge && task.challenge.id == removed._id) {
|
if (task.challenge && task.challenge.id == removed._id) {
|
||||||
_.merge(task.challenge, broken);
|
_.merge(task.challenge, broken);
|
||||||
|
|||||||
@@ -183,9 +183,9 @@ var UserSchema = new Schema({
|
|||||||
},
|
},
|
||||||
tags: [
|
tags: [
|
||||||
{
|
{
|
||||||
// FIXME use refs?
|
|
||||||
id: String,
|
id: String,
|
||||||
name: String
|
name: String,
|
||||||
|
challenge: String
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,9 @@
|
|||||||
span.add-on.tag-editing-pill
|
span.add-on.tag-editing-pill
|
||||||
a.pull-right(ng-click='delete(tag,$index)')
|
a.pull-right(ng-click='delete(tag,$index)')
|
||||||
i.icon-trash
|
i.icon-trash
|
||||||
a(ng-hide='_editing && !tag.challenge', data-tag-id='{{tag.id}}', ng-click='toggleFilter(tag)') {{tag.name}}
|
a(ng-hide='_editing', ng-click='toggleFilter(tag)')
|
||||||
|
i.icon-bullhorn(ng-if="tag.challenge")
|
||||||
|
| {{tag.name}}
|
||||||
li
|
li
|
||||||
form.form-inline(ng-show='_editing', ng-submit='createTag(_newTag)')
|
form.form-inline(ng-show='_editing', ng-submit='createTag(_newTag)')
|
||||||
.input-append.tag-editing
|
.input-append.tag-editing
|
||||||
|
|||||||
Reference in New Issue
Block a user