From d04a10225c2e6531fc8172888897fb1b77692fbd Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 15 Sep 2016 09:49:46 -0400 Subject: [PATCH] WIP showing updated flag data, history, updating flag data --- public/src/admin/manage/flags.js | 25 +++++++++++++++++ src/controllers/admin/flags.js | 14 ++++++++++ src/posts/flags.js | 47 +++++++++++++++++++++++++++++++- src/views/admin/manage/flags.tpl | 13 +++++++-- 4 files changed, 96 insertions(+), 3 deletions(-) diff --git a/public/src/admin/manage/flags.js b/public/src/admin/manage/flags.js index 8885d7b8a5..3b235677ca 100644 --- a/public/src/admin/manage/flags.js +++ b/public/src/admin/manage/flags.js @@ -22,6 +22,8 @@ define('admin/manage/flags', [ handleDelete(); handleInfiniteScroll(); handleGraphs(); + + updateFlagDetails(ajaxify.data.posts); handleFormActions(); }; @@ -152,6 +154,29 @@ define('admin/manage/flags', [ }); } + function updateFlagDetails(source) { + // As the flag details are returned in the API, update the form controls to show the correct data + + // Create reference hash for use in this method + source = source.reduce(function(memo, cur) { + memo[cur.pid] = cur.flagData; + return memo; + }, {}); + + components.get('posts/flag').each(function(idx, el) { + var pid = el.getAttribute('data-pid'); + var el = $(el); + + if (source[pid]) { + for(var prop in source[pid]) { + if (source[pid].hasOwnProperty(prop)) { + el.find('[name="' + prop + '"]').val(source[pid][prop]); + } + } + } + }); + } + function handleFormActions() { components.get('posts/flag').find('[component="posts/flag/update"]').on('click', function() { var pid = $(this).parents('[component="posts/flag"]').attr('data-pid'); diff --git a/src/controllers/admin/flags.js b/src/controllers/admin/flags.js index f21cc773ad..61413ce1f0 100644 --- a/src/controllers/admin/flags.js +++ b/src/controllers/admin/flags.js @@ -35,6 +35,20 @@ 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']; diff --git a/src/posts/flags.js b/src/posts/flags.js index ba0196bedf..6a9ad6ecfd 100644 --- a/src/posts/flags.js +++ b/src/posts/flags.js @@ -3,6 +3,7 @@ 'use strict'; var async = require('async'); +var winston = require('winston'); var db = require('../database'); var user = require('../user'); var analytics = require('../analytics'); @@ -171,7 +172,7 @@ module.exports = function(Posts) { }, next); }, posts: function(next) { - Posts.getPostSummaryByPids(pids, uid, {stripTags: false, extraFields: ['flags']}, next); + Posts.getPostSummaryByPids(pids, uid, {stripTags: false, extraFields: ['flags', 'flag:assignee', 'flag:state', 'flag:notes', 'flag:history']}, next); } }, next); }, @@ -190,8 +191,22 @@ module.exports = function(Posts) { } results.posts.forEach(function(post, index) { + var history; + if (post) { post.flagReasons = reasons[index]; + + // Expand flag history + try { + history = JSON.parse(post['flag:history'] || '[]'); + history.map(function(event) { + event.timestampISO = new Date(event.timestamp).toISOString(); + return event; + }); + post['flag:history'] = history; + } catch (e) { + winston.warn('[posts/getFlags] Unable to deserialise post flag history, likely malformed data'); + } } }); @@ -256,6 +271,36 @@ module.exports = function(Posts) { } } + // Append changes to history string + if (changes.length) { + try { + var history = JSON.parse(postData['flag:history'] || '[]'); + + changes.forEach(function(property) { + switch(property) { + case 'assignee': // intentional fall-through + case 'state': + history.unshift({ + type: property, + value: flagObj[property], + timestamp: Date.now() + }); + break; + + case 'notes': + history.unshift({ + type: property, + timestamp: Date.now() + }); + } + }); + + changeset['flag:history'] = JSON.stringify(history); + } catch (e) { + winston.warn('[posts/updateFlagData] Unable to deserialise post flag history, likely malformed data'); + } + } + // Save flag data into post hash Posts.setPostFields(pid, changeset, callback); }); diff --git a/src/views/admin/manage/flags.tpl b/src/views/admin/manage/flags.tpl index 04e7d86d1f..40416d3a70 100644 --- a/src/views/admin/manage/flags.tpl +++ b/src/views/admin/manage/flags.tpl @@ -144,9 +144,18 @@
[[topic:flag_manage_history]]
- +
[[topic:flag_manage_no_history]]
- + + +