added uid to flag history, fixed loading on IS, worked around tjs bug

v1.18.x
Julian Lam 9 years ago
parent 4e6b2555d0
commit b12607b1de

@ -49,7 +49,7 @@
"flag_manage_update": "Update Flag Status",
"flag_manage_history_assignee": "Assigned to %1",
"flag_manage_history_state": "Updated state to %1",
"flag_manage_history_notes": "Updates flag notes",
"flag_manage_history_notes": "Updated flag notes",
"deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.",

@ -31,4 +31,8 @@
.user-icon-style(24px, 1.5rem);
}
}
[component="posts/flag/history"] .avatar {
margin-right: 1rem;
}
}

@ -24,7 +24,8 @@ define('admin/manage/flags', [
handleGraphs();
updateFlagDetails(ajaxify.data.posts);
handleFormActions();
components.get('posts/flags').on('click', '[component="posts/flag/update"]', updateFlag);
};
function handleDismiss() {
@ -93,10 +94,14 @@ define('admin/manage/flags', [
after: $('[data-next]').attr('data-next')
}, function(data, done) {
if (data.posts && data.posts.length) {
app.parseAndTranslate('admin/manage/flags', 'posts', {posts: data.posts}, function(html) {
app.parseAndTranslate('admin/manage/flags', 'posts', {
posts: data.posts,
assignees: ajaxify.data.assignees
}, function(html) {
$('[data-next]').attr('data-next', data.next);
$('.post-container').append(html);
html.find('img:not(.not-responsive)').addClass('img-responsive');
updateFlagDetails(data.posts);
done();
});
} else {
@ -177,17 +182,15 @@ define('admin/manage/flags', [
});
}
function handleFormActions() {
components.get('posts/flag').find('[component="posts/flag/update"]').on('click', function() {
var pid = $(this).parents('[component="posts/flag"]').attr('data-pid');
var formData = $($(this).parents('form').get(0)).serializeArray();
function updateFlag() {
var pid = $(this).parents('[component="posts/flag"]').attr('data-pid');
var formData = $($(this).parents('form').get(0)).serializeArray();
socket.emit('posts.updateFlag', {
pid: pid,
data: formData
}, function(err) {
console.log(arguments);
});
socket.emit('posts.updateFlag', {
pid: pid,
data: formData
}, function(err) {
console.log(arguments);
});
}

@ -35,20 +35,6 @@ flagsController.get = function(req, res, next) {
return next(err);
}
// Parse out flag data into its own object inside each post hash
results.posts = results.posts.map(function(postObj) {
for(var prop in postObj) {
postObj.flagData = postObj.flagData || {};
if (postObj.hasOwnProperty(prop) && prop.startsWith('flag:')) {
postObj.flagData[prop.slice(5)] = postObj[prop];
delete postObj[prop];
}
}
return postObj;
});
// Minimise data set for assignees so tjs does less work
results.assignees = results.assignees.map(function(userObj) {
var keep = ['uid', 'username'];

@ -201,7 +201,42 @@ module.exports = function(Posts) {
next(null, results.posts);
});
},
async.apply(Posts.expandFlagHistory)
async.apply(Posts.expandFlagHistory),
function(posts, next) {
// Parse out flag data into its own object inside each post hash
posts = posts.map(function(postObj) {
for(var prop in postObj) {
postObj.flagData = postObj.flagData || {};
if (postObj.hasOwnProperty(prop) && prop.startsWith('flag:')) {
postObj.flagData[prop.slice(5)] = postObj[prop];
if (prop === 'flag:state') {
switch(postObj[prop]) {
case 'open':
postObj.flagData.labelClass = 'info';
break;
case 'wip':
postObj.flagData.labelClass = 'warning';
break;
case 'resolved':
postObj.flagData.labelClass = 'success';
break;
case 'rejected':
postObj.flagData.labelClass = 'danger';
break;
}
}
delete postObj[prop];
}
}
return postObj;
});
setImmediate(next.bind(null, null, posts));
}
], callback);
}
@ -231,11 +266,12 @@ module.exports = function(Posts) {
], callback);
};
Posts.updateFlagData = function(pid, flagObj, callback) {
Posts.updateFlagData = function(uid, pid, flagObj, callback) {
// Retrieve existing flag data to compare for history-saving purposes
var changes = [];
var changeset = {};
var prop;
Posts.getPostData(pid, function(err, postData) {
// Track new additions
for(prop in flagObj) {
@ -270,6 +306,7 @@ module.exports = function(Posts) {
case 'assignee': // intentional fall-through
case 'state':
history.unshift({
uid: uid,
type: property,
value: flagObj[property],
timestamp: Date.now()
@ -278,6 +315,7 @@ module.exports = function(Posts) {
case 'notes':
history.unshift({
uid: uid,
type: property,
timestamp: Date.now()
});
@ -308,21 +346,37 @@ module.exports = function(Posts) {
async.map(history, function(event, next) {
event.timestampISO = new Date(event.timestamp).toISOString();
if (event.type === 'assignee') {
user.getUserField(parseInt(event.value, 10), 'username', function(err, username) {
if (err) {
return next(err);
}
async.parallel([
function(next) {
user.getUserFields(event.uid, ['username', 'picture'], function(err, userData) {
if (err) {
return next(err);
}
event.label = username || 'Unknown user';
next(null, event);
});
} else if (event.type === 'state') {
event.label = '[[topic:flag_manage_state_' + event.value + ']]';
setImmediate(next.bind(null, null, event));
} else {
setImmediate(next.bind(null, null, event));
}
event.user = userData;
next();
});
},
function(next) {
if (event.type === 'assignee') {
user.getUserField(parseInt(event.value, 10), 'username', function(err, username) {
if (err) {
return next(err);
}
event.label = username || 'Unknown user';
next(null);
});
} else if (event.type === 'state') {
event.label = '[[topic:flag_manage_state_' + event.value + ']]';
setImmediate(next);
} else {
setImmediate(next);
}
}
], function(err) {
next(err, event);
})
}, function(err, history) {
post['flag:history'] = history;
next(null, post);

@ -189,7 +189,7 @@ module.exports = function(SocketPosts) {
return memo;
}, payload);
next(null, data.pid, payload);
next(null, socket.uid, data.pid, payload);
},
async.apply(posts.updateFlagData)
], callback);

@ -56,13 +56,13 @@
<div class="panel-heading" role="tab">
<h4 class="panel-title">
<a role="button" data-toggle="collapse" data-parent="#accordion" href="#flag-pid-{posts.pid}" aria-expanded="true" aria-controls="flag-pid-{posts.pid}">
<span class="label <!-- IF ../flag.labelClassName -->{../flag.labelClassName}<!-- ELSE -->label-info<!-- ENDIF ../flag.labelClassName -->">[[topic:flag_manage_state_<!-- IF ../flag.state -->{../flag.state}<!-- ELSE -->open<!-- ENDIF ../flag.state -->]]</span>
<span class="label <!-- IF ../flagData.labelClass -->label-{../flagData.labelClass}<!-- ELSE -->label-info<!-- ENDIF ../flagData.labelClass -->">[[topic:flag_manage_state_<!-- IF ../flagData.state -->{../flagData.state}<!-- ELSE -->open<!-- ENDIF ../flagData.state -->]]</span>
&nbsp;[[topic:flag_manage_title, {posts.category.name}]]
<small><span class="timeago" title="{posts.timestampISO}"></span></small>
</a>
</h4>
</div>
<div id="flag-pid-{posts.pid}" class="panel-collapse collapse<!-- IF @first --> in<!-- ENDIF @first -->" role="tabpanel">
<div id="flag-pid-{posts.pid}" class="panel-collapse collapse" role="tabpanel">
<div class="panel-body">
<div class="row" data-pid="{posts.pid}" data-tid="{posts.topic.tid}">
<div class="col-sm-8">
@ -102,7 +102,7 @@
<div class="user-icon" style="background-color: {../user.icon:bgColor};">{../user.icon:text}</div>
<!-- ENDIF ../user.picture -->
{../user.username}
</a>: "{../reason}"
</a>: "{posts.flagReasons.reason}"
</li>
<!-- END posts.flagReasons -->
</ul>
@ -122,7 +122,7 @@
<select class="form-control" id="{posts.pid}-assignee" name="assignee">
<option value="">No Assignee</option>
<!-- BEGIN assignees -->
<option value="{../uid}">{../username}</option>
<option value="{assignees.uid}">{assignees.username}</option>
<!-- END assignees -->
</select>
</div>
@ -147,11 +147,16 @@
<!-- IF !posts.flagData.history.length -->
<div class="alert alert-info">[[topic:flag_manage_no_history]]</div>
<!-- ELSE -->
<ul class="list-group">
<ul class="list-group" component="posts/flag/history">
<!-- BEGIN posts.flagData.history -->
<li class="list-group-item">
<div class="pull-right"><small><span class="timeago" title="{../timestampISO}"></span></small></div>
[[topic:flag_manage_history_{../type}, {../label}]]
<div class="pull-right"><small><span class="timeago" title="{posts.flagData.history.timestampISO}"></span></small></div>
<!-- IF ../user.picture -->
<img class="avatar avatar-sm avatar-rounded" src="{../user.picture}" title="{../user.username}" />
<!-- ELSE -->
<div class="avatar avatar-sm avatar-rounded" style="background-color: {../user.icon:bgColor};" title="{../user.username}">{../user.icon:text}</div>
<!-- ENDIF ../user.picture -->
[[topic:flag_manage_history_{posts.flagData.history.type}, {posts.flagData.history.label}]]
</li>
<!-- END posts.flagData.history -->
</ul>

Loading…
Cancel
Save