diff --git a/public/src/admin/manage/category-analytics.js b/public/src/admin/manage/category-analytics.js new file mode 100644 index 0000000000..52a24ecfeb --- /dev/null +++ b/public/src/admin/manage/category-analytics.js @@ -0,0 +1,109 @@ +"use strict"; +/*global config, define, app, socket, ajaxify, bootbox, templates, Chart, utils */ + +define('admin/manage/category-analytics', [], function() { + var CategoryAnalytics = {}; + + CategoryAnalytics.init = function() { + var hourlyCanvas = document.getElementById('pageviews:hourly'), + dailyCanvas = document.getElementById('pageviews:daily'), + topicsCanvas = document.getElementById('topics:daily'), + postsCanvas = document.getElementById('posts:daily'), + hourlyLabels = utils.getHoursArray().map(function(text, idx) { + return idx % 3 ? '' : text; + }), + dailyLabels = utils.getDaysArray().map(function(text, idx) { + return idx % 3 ? '' : text; + }); + + if (utils.isMobile()) { + Chart.defaults.global.showTooltips = false; + } + + var data = { + 'pageviews:hourly': { + labels: hourlyLabels, + datasets: [ + { + label: "", + fillColor: "rgba(186,139,175,0.2)", + strokeColor: "rgba(186,139,175,1)", + pointColor: "rgba(186,139,175,1)", + pointStrokeColor: "#fff", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(186,139,175,1)", + data: ajaxify.data.analytics['pageviews:hourly'] + } + ] + }, + 'pageviews:daily': { + labels: dailyLabels, + datasets: [ + { + label: "", + fillColor: "rgba(151,187,205,0.2)", + strokeColor: "rgba(151,187,205,1)", + pointColor: "rgba(151,187,205,1)", + pointStrokeColor: "#fff", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(151,187,205,1)", + data: ajaxify.data.analytics['pageviews:daily'] + } + ] + }, + 'topics:daily': { + labels: dailyLabels.slice(-7), + datasets: [ + { + label: "", + fillColor: "rgba(171,70,66,0.2)", + strokeColor: "rgba(171,70,66,1)", + pointColor: "rgba(171,70,66,1)", + pointStrokeColor: "#fff", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(171,70,66,1)", + data: ajaxify.data.analytics['topics:daily'] + } + ] + }, + 'posts:daily': { + labels: dailyLabels.slice(-7), + datasets: [ + { + label: "", + fillColor: "rgba(161,181,108,0.2)", + strokeColor: "rgba(161,181,108,1)", + pointColor: "rgba(161,181,108,1)", + pointStrokeColor: "#fff", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(161,181,108,1)", + data: ajaxify.data.analytics['posts:daily'] + } + ] + }, + }; + + hourlyCanvas.width = $(hourlyCanvas).parent().width(); + dailyCanvas.width = $(dailyCanvas).parent().width(); + topicsCanvas.width = $(topicsCanvas).parent().width(); + postsCanvas.width = $(postsCanvas).parent().width(); + new Chart(hourlyCanvas.getContext('2d')).Line(data['pageviews:hourly'], { + responsive: true, + animation: false + }); + new Chart(dailyCanvas.getContext('2d')).Line(data['pageviews:daily'], { + responsive: true, + animation: false + }); + new Chart(topicsCanvas.getContext('2d')).Line(data['topics:daily'], { + responsive: true, + animation: false + }); + new Chart(postsCanvas.getContext('2d')).Line(data['posts:daily'], { + responsive: true, + animation: false + }); + }; + + return CategoryAnalytics; +}); \ No newline at end of file diff --git a/public/src/admin/manage/category.js b/public/src/admin/manage/category.js index d20ffc80e9..289afa0de4 100644 --- a/public/src/admin/manage/category.js +++ b/public/src/admin/manage/category.js @@ -154,12 +154,6 @@ define('admin/manage/category', [ }); Category.setupPrivilegeTable(); - - if (window.location.hash === '#analytics') { - Category.setupGraphs(); - } else { - $('a[href="#analytics"]').on('shown.bs.tab', Category.setupGraphs); - } }; Category.setupPrivilegeTable = function() { @@ -360,106 +354,5 @@ define('admin/manage/category', [ }); }; - Category.setupGraphs = function() { - var hourlyCanvas = document.getElementById('pageviews:hourly'), - dailyCanvas = document.getElementById('pageviews:daily'), - topicsCanvas = document.getElementById('topics:daily'), - postsCanvas = document.getElementById('posts:daily'), - hourlyLabels = utils.getHoursArray().map(function(text, idx) { - return idx % 3 ? '' : text; - }), - dailyLabels = utils.getDaysArray().map(function(text, idx) { - return idx % 3 ? '' : text; - }); - - if (utils.isMobile()) { - Chart.defaults.global.showTooltips = false; - } - - var data = { - 'pageviews:hourly': { - labels: hourlyLabels, - datasets: [ - { - label: "", - fillColor: "rgba(186,139,175,0.2)", - strokeColor: "rgba(186,139,175,1)", - pointColor: "rgba(186,139,175,1)", - pointStrokeColor: "#fff", - pointHighlightFill: "#fff", - pointHighlightStroke: "rgba(186,139,175,1)", - data: ajaxify.data.analytics['pageviews:hourly'] - } - ] - }, - 'pageviews:daily': { - labels: dailyLabels, - datasets: [ - { - label: "", - fillColor: "rgba(151,187,205,0.2)", - strokeColor: "rgba(151,187,205,1)", - pointColor: "rgba(151,187,205,1)", - pointStrokeColor: "#fff", - pointHighlightFill: "#fff", - pointHighlightStroke: "rgba(151,187,205,1)", - data: ajaxify.data.analytics['pageviews:daily'] - } - ] - }, - 'topics:daily': { - labels: dailyLabels.slice(-7), - datasets: [ - { - label: "", - fillColor: "rgba(171,70,66,0.2)", - strokeColor: "rgba(171,70,66,1)", - pointColor: "rgba(171,70,66,1)", - pointStrokeColor: "#fff", - pointHighlightFill: "#fff", - pointHighlightStroke: "rgba(171,70,66,1)", - data: ajaxify.data.analytics['topics:daily'] - } - ] - }, - 'posts:daily': { - labels: dailyLabels.slice(-7), - datasets: [ - { - label: "", - fillColor: "rgba(161,181,108,0.2)", - strokeColor: "rgba(161,181,108,1)", - pointColor: "rgba(161,181,108,1)", - pointStrokeColor: "#fff", - pointHighlightFill: "#fff", - pointHighlightStroke: "rgba(161,181,108,1)", - data: ajaxify.data.analytics['posts:daily'] - } - ] - }, - }; - - hourlyCanvas.width = $(hourlyCanvas).parent().width(); - dailyCanvas.width = $(dailyCanvas).parent().width(); - topicsCanvas.width = $(topicsCanvas).parent().width(); - postsCanvas.width = $(postsCanvas).parent().width(); - new Chart(hourlyCanvas.getContext('2d')).Line(data['pageviews:hourly'], { - responsive: true, - animation: false - }); - new Chart(dailyCanvas.getContext('2d')).Line(data['pageviews:daily'], { - responsive: true, - animation: false - }); - new Chart(topicsCanvas.getContext('2d')).Line(data['topics:daily'], { - responsive: true, - animation: false - }); - new Chart(postsCanvas.getContext('2d')).Line(data['posts:daily'], { - responsive: true, - animation: false - }); - }; - return Category; }); \ No newline at end of file diff --git a/src/controllers/admin/categories.js b/src/controllers/admin/categories.js index 31bd44bd49..5444a087ea 100644 --- a/src/controllers/admin/categories.js +++ b/src/controllers/admin/categories.js @@ -14,31 +14,38 @@ var categoriesController = {}; categoriesController.get = function(req, res, next) { async.parallel({ category: async.apply(categories.getCategories, [req.params.category_id], req.user.uid), - privileges: async.apply(privileges.categories.list, req.params.category_id), - analytics: async.apply(analytics.getCategoryAnalytics, req.params.category_id) + privileges: async.apply(privileges.categories.list, req.params.category_id) }, function(err, data) { if (err) { return next(err); } - plugins.fireHook('filter:admin.category.get', { req: req, res: res, category: data.category[0], privileges: data.privileges, analytics: data.analytics }, function(err, data) { + plugins.fireHook('filter:admin.category.get', { req: req, res: res, category: data.category[0], privileges: data.privileges }, function(err, data) { if (err) { return next(err); } data.category.name = translator.escape(data.category.name); res.render('admin/manage/category', { category: data.category, - privileges: data.privileges, - analytics: data.analytics + privileges: data.privileges }); }); }); }; categoriesController.getAll = function(req, res, next) { - //Categories list will be rendered on client side with recursion, etc. + // Categories list will be rendered on client side with recursion, etc. res.render('admin/manage/categories', {}); }; +categoriesController.getAnalytics = function(req, res, next) { + async.parallel({ + name: async.apply(categories.getCategoryField, req.params.category_id, 'name'), + analytics: async.apply(analytics.getCategoryAnalytics, req.params.category_id) + }, function(err, data) { + res.render('admin/manage/category-analytics', data); + }); +}; + module.exports = categoriesController; diff --git a/src/routes/admin.js b/src/routes/admin.js index 56c97ff1f2..6ce4fb5f48 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -52,6 +52,7 @@ function addRoutes(router, middleware, controllers) { router.get('/manage/categories', middlewares, controllers.admin.categories.getAll); router.get('/manage/categories/:category_id', middlewares, controllers.admin.categories.get); + router.get('/manage/categories/:category_id/analytics', middlewares, controllers.admin.categories.getAnalytics); router.get('/manage/tags', middlewares, controllers.admin.tags.get); router.get('/manage/flags', middlewares, controllers.admin.flags.get); diff --git a/src/views/admin/manage/category-analytics.tpl b/src/views/admin/manage/category-analytics.tpl new file mode 100644 index 0000000000..eb02abd141 --- /dev/null +++ b/src/views/admin/manage/category-analytics.tpl @@ -0,0 +1,53 @@ + Back to Categories List + +
+ +
++ +
++ +
++ +
+- Figure 1 – Hourly page views for this category -
-- Figure 2 – Daily page views for this category -
-- Figure 3 – Daily topics created in this category -
-- Figure 4 – Daily posts made in this category -
-