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_update": "Update Flag Status",
"flag_manage_history_assignee": "Assigned to %1", "flag_manage_history_assignee": "Assigned to %1",
"flag_manage_history_state": "Updated state 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.", "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); .user-icon-style(24px, 1.5rem);
} }
} }
[component="posts/flag/history"] .avatar {
margin-right: 1rem;
}
} }

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

@ -35,20 +35,6 @@ flagsController.get = function(req, res, next) {
return next(err); 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 // Minimise data set for assignees so tjs does less work
results.assignees = results.assignees.map(function(userObj) { results.assignees = results.assignees.map(function(userObj) {
var keep = ['uid', 'username']; var keep = ['uid', 'username'];

@ -201,7 +201,42 @@ module.exports = function(Posts) {
next(null, results.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); ], callback);
} }
@ -231,11 +266,12 @@ module.exports = function(Posts) {
], callback); ], callback);
}; };
Posts.updateFlagData = function(pid, flagObj, callback) { Posts.updateFlagData = function(uid, pid, flagObj, callback) {
// Retrieve existing flag data to compare for history-saving purposes // Retrieve existing flag data to compare for history-saving purposes
var changes = []; var changes = [];
var changeset = {}; var changeset = {};
var prop; var prop;
Posts.getPostData(pid, function(err, postData) { Posts.getPostData(pid, function(err, postData) {
// Track new additions // Track new additions
for(prop in flagObj) { for(prop in flagObj) {
@ -270,6 +306,7 @@ module.exports = function(Posts) {
case 'assignee': // intentional fall-through case 'assignee': // intentional fall-through
case 'state': case 'state':
history.unshift({ history.unshift({
uid: uid,
type: property, type: property,
value: flagObj[property], value: flagObj[property],
timestamp: Date.now() timestamp: Date.now()
@ -278,6 +315,7 @@ module.exports = function(Posts) {
case 'notes': case 'notes':
history.unshift({ history.unshift({
uid: uid,
type: property, type: property,
timestamp: Date.now() timestamp: Date.now()
}); });
@ -308,21 +346,37 @@ module.exports = function(Posts) {
async.map(history, function(event, next) { async.map(history, function(event, next) {
event.timestampISO = new Date(event.timestamp).toISOString(); event.timestampISO = new Date(event.timestamp).toISOString();
if (event.type === 'assignee') { async.parallel([
user.getUserField(parseInt(event.value, 10), 'username', function(err, username) { function(next) {
if (err) { user.getUserFields(event.uid, ['username', 'picture'], function(err, userData) {
return next(err); if (err) {
} return next(err);
}
event.label = username || 'Unknown user'; event.user = userData;
next(null, event); next();
}); });
} else if (event.type === 'state') { },
event.label = '[[topic:flag_manage_state_' + event.value + ']]'; function(next) {
setImmediate(next.bind(null, null, event)); if (event.type === 'assignee') {
} else { user.getUserField(parseInt(event.value, 10), 'username', function(err, username) {
setImmediate(next.bind(null, null, event)); 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) { }, function(err, history) {
post['flag:history'] = history; post['flag:history'] = history;
next(null, post); next(null, post);

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

@ -56,13 +56,13 @@
<div class="panel-heading" role="tab"> <div class="panel-heading" role="tab">
<h4 class="panel-title"> <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}"> <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}]] &nbsp;[[topic:flag_manage_title, {posts.category.name}]]
<small><span class="timeago" title="{posts.timestampISO}"></span></small> <small><span class="timeago" title="{posts.timestampISO}"></span></small>
</a> </a>
</h4> </h4>
</div> </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="panel-body">
<div class="row" data-pid="{posts.pid}" data-tid="{posts.topic.tid}"> <div class="row" data-pid="{posts.pid}" data-tid="{posts.topic.tid}">
<div class="col-sm-8"> <div class="col-sm-8">
@ -102,7 +102,7 @@
<div class="user-icon" style="background-color: {../user.icon:bgColor};">{../user.icon:text}</div> <div class="user-icon" style="background-color: {../user.icon:bgColor};">{../user.icon:text}</div>
<!-- ENDIF ../user.picture --> <!-- ENDIF ../user.picture -->
{../user.username} {../user.username}
</a>: "{../reason}" </a>: "{posts.flagReasons.reason}"
</li> </li>
<!-- END posts.flagReasons --> <!-- END posts.flagReasons -->
</ul> </ul>
@ -122,7 +122,7 @@
<select class="form-control" id="{posts.pid}-assignee" name="assignee"> <select class="form-control" id="{posts.pid}-assignee" name="assignee">
<option value="">No Assignee</option> <option value="">No Assignee</option>
<!-- BEGIN assignees --> <!-- BEGIN assignees -->
<option value="{../uid}">{../username}</option> <option value="{assignees.uid}">{assignees.username}</option>
<!-- END assignees --> <!-- END assignees -->
</select> </select>
</div> </div>
@ -147,11 +147,16 @@
<!-- IF !posts.flagData.history.length --> <!-- IF !posts.flagData.history.length -->
<div class="alert alert-info">[[topic:flag_manage_no_history]]</div> <div class="alert alert-info">[[topic:flag_manage_no_history]]</div>
<!-- ELSE --> <!-- ELSE -->
<ul class="list-group"> <ul class="list-group" component="posts/flag/history">
<!-- BEGIN posts.flagData.history --> <!-- BEGIN posts.flagData.history -->
<li class="list-group-item"> <li class="list-group-item">
<div class="pull-right"><small><span class="timeago" title="{../timestampISO}"></span></small></div> <div class="pull-right"><small><span class="timeago" title="{posts.flagData.history.timestampISO}"></span></small></div>
[[topic:flag_manage_history_{../type}, {../label}]] <!-- 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> </li>
<!-- END posts.flagData.history --> <!-- END posts.flagData.history -->
</ul> </ul>

Loading…
Cancel
Save