UNPKG

agneta-platform

Version:

Agneta Platform - Integrate and customize business applications

531 lines (401 loc) 12.1 kB
/* Copyright 2017 Agneta Network Applications, LLC. * * Source file: portal/website/source/manager/history.js * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /*global moment*/ /*global Chart*/ /*global UAParser*/ (function() { var app = angular.module('MainApp'); var chart; var formats = { month: 'MMMM', dayOfYear: 'ddd DD', hourOfYear: 'ha' }; app.controller('HistoryCtrl', function($scope, $ocLazyLoad, $rootScope, $mdDialog, $mdSidenav, $timeout, Production_Activity_Count, Activity_Count, Production_Activity_Item, Portal, Activity_Item) { var Model_Count = $rootScope.isProduction() ? Production_Activity_Count : Activity_Count; var Model_Item = $rootScope.isProduction() ? Production_Activity_Item : Activity_Item; $scope.$on('productionMode', function(evt, enabled) { if (enabled) { Model_Count = Production_Activity_Count; Model_Item = Production_Activity_Item; } else { Model_Count = Activity_Count; Model_Item = Activity_Item; } $scope.loadTotals(); }); //----------------------------------------- var feedData; var utc; $scope.page = { feedSelected: null }; $scope.type = 'view_page'; ///////////////////////////////////////////////////////////// $scope.selectFeed = function(feed) { $scope.page.feedSelected = feed; $scope.loadTotals(); }; ///////////////////////////////////////////////////////////// var socketListeners = []; var timeOffset = parseInt(moment().utcOffset() / 60); $scope.loadTotals = function() { if ((!$scope.page.feedSelected && !$scope.type) || !$scope.page.periodSelected) { return; } for (var key in socketListeners) { Portal.socket.removeAllListeners(socketListeners[key]); } socketListeners = []; utc = moment().utc(); utc.hours(0); utc.minutes(0); utc.seconds(0); $scope.progressMode = 'indeterminate'; var chartData = { datasets: [] }; if ($scope.page.feedSelected) { return Model_Count.totals({ feed: $scope.page.feedSelected.id, period: $scope.page.periodSelected, value: $scope.page.valueSelected }) .$promise .then(function(result) { $scope.progressMode = 'determinate'; result.color = $scope.page.feedSelected.color; onLoaded(result); loadLabels(result, result.counts); addFeed(result); updateChart(); }); } else if ($scope.type) { var query = { type: $scope.type, period: $scope.page.periodSelected, value: $scope.page.valueSelected }; return Model_Count.totalsByType(query) .$promise .then(function(result) { if (!result.feeds.length) { $scope.feeds = null; return; } onLoaded(result); loadLabels(result, result.feeds[0].counts); for (var i in result.feeds) { var feed = result.feeds[i]; addFeed(feed); } updateChart(); $scope.feeds = result.feeds; }) .finally(function() { $scope.progressMode = 'determinate'; }); } function onLoaded(res) { feedData = res; } function loadLabels(res, counts) { var labels = []; var offset = 0; switch (res.unit) { case 'hourOfYear': offset += timeOffset; break; } for (var index in counts) { var count = counts[index]; var key = count.key + offset; var label = utc[res.unit](key).format(formats[res.unit]); labels.push(label); } chartData.labels = labels; } function feedValues(res) { var values = []; for (var key in res.counts) { var count = res.counts[key]; values.push(count.total); } return values; } function addFeed(res) { var values = feedValues(res); var rgb = res.color.join(','); var dataset = { fill: true, type: 'line', backgroundColor: 'rgba(' + rgb + ',.4)', borderColor: 'rgba(' + rgb + ',.7)', borderCapStyle: 'butt', borderDash: [], borderDashOffset: 0.0, borderJoinStyle: 'miter', data: values, }; if (!res.$promise) { res.rgb = rgb; dataset.label = res.title || res.value; } // var listener = 'feed-update:' + res.id; socketListeners.push(listener); Portal.socket.on(listener, function() { Model_Count.totals({ feed: res.id, period: $scope.page.periodSelected, value: $scope.page.valueSelected }) .$promise .then(function(result) { dataset.data = feedValues(result); chart.update(); res.total = result.total; //console.log('update!', result); }); }); // chartData.datasets.push(dataset); } function updateChart() { initChart(chartData); } }; $scope.onChartClick = function(e) { var activeElm = chart.getElementAtEvent(e); if (!activeElm.length) { return; } activeElm = activeElm[0]; var count; if (feedData.feeds) { count = feedData.feeds[0].counts[activeElm._index]; } else { count = feedData.counts[activeElm._index]; } if (!feedData.subUnit) { $mdDialog.show({ clickOutsideToClose: true, templateUrl: agneta.partial('activities'), locals: { data: { feed: $scope.page.feedSelected.id, unit: feedData.unit, value: count.key } }, controller: 'ActivitiesCtrl' }); return; } $scope.page.periodSelected = feedData.unit; $scope.unit = feedData.subUnit; $scope.changedPeriod(count.key); }; //------------------------------------------------------ $scope.showActivities = function(feed) { $mdDialog.open({ partial: 'activities', data: { feed: feed.id, unit: $scope.page.periodSelected, value: $scope.page.valueSelected, Model_Item: Model_Item }, controller: 'ActivitiesCtrl' }); }; //------------------------------------------------------ $scope.changeType = function(type) { $scope.type = type; $scope.changedType(); }; $scope.changedType = function() { $scope.page.feedSelected = null; $scope.loadTotals(); }; $scope.changedPeriod = function(_value) { //////////////////////////////////////////////////////////// var value; var values = []; var now = moment(); var tmp = moment(); var i; switch ($scope.page.periodSelected) { case 'year': for (i = 0; i < 10; i++) { var id = now.year() - i; values.push({ id: id, label: id }); } value = now.year(); break; case 'month': for (i = 0; i < 12; i++) { values.push({ id: i, label: tmp.month(i).format('MMMM') }); } value = now.month(); break; case 'dayOfYear': var start = tmp.date(1).dayOfYear(); var end = tmp.endOf('month').dayOfYear() + 1; for (i = start; i < end; i++) { values.push({ id: i, label: tmp.dayOfYear(i).format('DD dddd') }); } value = now.dayOfYear(); break; } $scope.values = values; $scope.page.valueSelected = _value || value; $scope.loadTotals(); }; }); function initChart(data) { if (chart) { chart.clear(); chart.destroy(); } var ctx = document.getElementById('manager-history-canvas') .getContext('2d'); chart = new Chart(ctx, { type: 'line', data: data, options: { responsive: true, pan: { enabled: true, mode: 'x' }, zoom: { enabled: true, mode: 'x', }, scales: { xAxes: [{ stacked: true }], yAxes: [{ ticks: { min: 0, suggestedMin: 1, maxTicksLimit: 6 } }] }, tooltips: { bodyFontSize: 16, xPadding: 6, yPadding: 14, callbacks: { title: function() {}, label: function(tooltipItems, data) { var datasetLabel = data.datasets[tooltipItems.datasetIndex].label; if (datasetLabel) { return datasetLabel + ': ' + tooltipItems.yLabel; } return tooltipItems.yLabel; } } }, legend: { display: false, labels: {} } } }); } /////////////////////////////////////////////////////////////////////////// app.controller('ActivitiesCtrl', function($rootScope, $scope, $mdDialog, $controller, data) { angular.extend(this, $controller('DialogCtrl', { $scope: $scope })); $scope.loading = true; var time = moment().utc().dayOfYear(data.value); $scope.time = time; data.Model_Item.latest(data) .$promise .then(function(result) { $scope.loading = false; $scope.data = result; }); $scope.modal = function(activity) { $mdDialog.open({ nested: true, partial: activity.modal, data: { activity: activity, Model_Item: data.Model_Item } }); }; $scope.loadActivity = function(activity) { $mdDialog.open({ nested: true, partial: 'activity', data: { activity: activity, Model_Item: data.Model_Item }, controller: 'ActivityCtrl' }); }; }); /////////////////////////////////////////////////////////////////////////// app.controller('ActivityCtrl', function($rootScope, $scope, $mdDialog, $controller, data) { angular.extend(this, $controller('DialogCtrl', { $scope: $scope })); $scope.loading = true; data.Model_Item.details({ id: data.activity.id }) .$promise .then(function(result) { $scope.loading = false; if (!result) { return; } $scope.title = data.activity.title; $scope.time = result.time; //------------------------------------------ if (result.data.request) { var agent = result.data.request.agent; var parser = new UAParser(); parser.setUA(agent); agent = parser.getResult(); angular.extend(result.data.request, { browser: agent.browser.name + ' ' + agent.browser.major, device: agent.device.name, os: agent.os.name }); } $scope.data = result.data; }); }); })();