From b1030ae0668dc2d77416381ad59a7a0b9580ce28 Mon Sep 17 00:00:00 2001 From: Joshua Sprey Date: Fri, 11 Dec 2020 10:22:35 +0100 Subject: [PATCH 1/2] (#14) Implements EasyRedmine Widgets for adf-framework Implements the `My Issues` and `Custom Queries` Widgets for EasyRedmine based on the available Redmine Widgets. Currently the `Chart` is not considered and cannot be used for EasyRedmine. --- dist/adf-widget-redmine.js | 1109 ++++++++++-------- dist/adf-widget-redmine.min.js | 2 +- gulpfile.js | 28 +- package-lock.json | 744 ++++++++++++ package.json | 1 + sample/index.html | 52 +- src/main/chart/chartController.js | 104 +- src/main/chart/edit/editChartController.js | 245 ++-- src/main/chart/service.js | 114 +- src/main/issues/edit/easyedit.html | 32 + src/main/issues/edit/editIssuesController.js | 52 +- src/main/issues/issueController.js | 75 +- src/main/redmine.js | 192 +-- src/main/service.js | 333 +++--- 14 files changed, 2033 insertions(+), 1050 deletions(-) create mode 100644 src/main/issues/edit/easyedit.html diff --git a/dist/adf-widget-redmine.js b/dist/adf-widget-redmine.js index 0e14cf3..1932d5d 100644 --- a/dist/adf-widget-redmine.js +++ b/dist/adf-widget-redmine.js @@ -1,615 +1,714 @@ (function(window, undefined) {'use strict'; -angular.module('adf.widget.redmine', ['adf.provider', 'chart.js', 'ui.bootstrap.datepicker']) - .constant('redmineEndpoint', 'http://localhost:3000/') - .config(["dashboardProvider", function (dashboardProvider) { - var category = 'Redmine'; - - var editIssues = { - templateUrl: '{widgetsPath}/redmine/src/main/issues/edit/edit.html', - controller: 'editIssuesController', +function createCustomQueriesEditController(isEasy) { + return { + templateUrl: isEasy ? '{widgetsPath}/redmine/src/main/issues/edit/easyedit.html' : '{widgetsPath}/redmine/src/main/issues/edit/edit.html', + controller: isEasy ? 'easyEditIssuesController' : 'editIssuesController', + controllerAs: 'vm', + resolve: { + /** @ngInject **/ + projects: ["redmineService", "easyRedmineService", function (redmineService, easyRedmineService) { + if (isEasy) { + return easyRedmineService.getProjects(); + } else { + return redmineService.getProjects(); + } + }], + /** @ngInject **/ + customQueries: ["redmineService", "easyRedmineService", function (redmineService, easyRedmineService) { + if (isEasy) { + return easyRedmineService.getCustomQueries().then(function (data){ + return data.easy_queries; + }); + } else { + return redmineService.getCustomQueries().then(function (data){ + return data.queries; + }); + } + }] + } + }; +} + +function createChartEditController(isEasy) { + return { + templateUrl: '{widgetsPath}/redmine/src/main/chart/edit/edit.html', + controller: isEasy ? 'easyEditChartController' : 'editChartController', + controllerAs: 'vm', + resolve: { + /** @ngInject **/ + projects: ["redmineService", "easyRedmineService", function (redmineService, easyRedmineService) { + if (isEasy) { + return easyRedmineService.getProjects(); + } else { + return redmineService.getProjects(); + } + }] + } + }; +} + +function createCustomQueriesWidget(dashboardProvider, widgetID, title, category, isEasy) { + dashboardProvider + .widget(widgetID, { + title: title, + description: 'Displays issues from a custom query', + category: category, + templateUrl: '{widgetsPath}/redmine/src/main/issues/view.html', + controller: isEasy ? 'easyIssueController' : 'issueController', controllerAs: 'vm', resolve: { /** @ngInject **/ - projects: ["redmineService", function (redmineService) { - return redmineService.getProjects(); + issues: ["redmineService", "easyRedmineService", "config", function (redmineService, easyRedmineService, config) { + if (config.customQuery) { + if (isEasy) { + return easyRedmineService.getIssuesByQueryId(config.customQuery.id, config.project.id); + } else { + return redmineService.getIssuesByQueryId(config.customQuery.id, config.customQuery.project_id); + } + } }] - } - }; - - var editChart = { - templateUrl: '{widgetsPath}/redmine/src/main/chart/edit/edit.html', - controller: 'editChartController', + }, + edit: createCustomQueriesEditController(isEasy) + }); +} + +function createMyIssuesWidget(dashboardProvider, widgetID, title, category, isEasy) { + dashboardProvider + .widget(widgetID, { + title: title, + description: 'Displays all issues assigned to me', + category: category, + templateUrl: '{widgetsPath}/redmine/src/main/issues/view.html', + controller: isEasy ? 'easyIssueController' : 'issueController', controllerAs: 'vm', resolve: { /** @ngInject **/ - projects: ["redmineService", function (redmineService) { - return redmineService.getProjects(); + issues: ["redmineService", "easyRedmineService", function (redmineService, easyRedmineService) { + if (isEasy) { + return easyRedmineService.getMyIssues(); + } else { + return redmineService.getMyIssues(); + } }] } - }; - - dashboardProvider - .widget('redmine-custom-queries', { - title: 'Redmine Custom Queries', - description: 'Displays Issues from a Custom Query', - category: category, - templateUrl: '{widgetsPath}/redmine/src/main/issues/view.html', - controller: 'IssueController', - controllerAs: 'vm', - resolve: { - /** @ngInject **/ - issues: ["redmineService", "config", function (redmineService, config) { - if(config.customQuery){ - return redmineService.getIssuesByQueryId(config.customQuery.id, config.customQuery.project_id); + }); +} + +function createChartWidget(dashboardProvider, widgetID, title, category, isEasy) { + dashboardProvider + .widget(widgetID, { + title: title, + description: 'Displays a burnup or burndown chart', + category: category, + templateUrl: '{widgetsPath}/redmine/src/main/chart/view.html', + controller: isEasy ? 'easyChartController' : 'chartController', + controllerAs: 'vm', + resolve: { + /** @ngInject **/ + chartData: ["chartDataService", "easyChartDataService", "config", function (chartDataService, easyChartDataService, config) { + if (config.project) { + if (isEasy) { + return easyChartDataService.getChartData(config); + } else { + return chartDataService.getChartData(config); } + } + }] + }, + edit: createChartEditController(isEasy) + }); - }] - }, - edit: editIssues - }); +} - dashboardProvider - .widget('redmine-my-issues', { - title: 'My Redmine Issues', - description: 'Displays all issues assigned to me', - category: category, - templateUrl: '{widgetsPath}/redmine/src/main/issues/view.html', - controller: 'IssueController', - controllerAs: 'vm', - resolve: { - /** @ngInject **/ - issues: ["redmineService", function (redmineService) { - return redmineService.getMyIssues(); - }] - } - }); - // widget is currently broken - dashboardProvider - .widget('redmine-chart', { - title: 'Redmine Chart', - description: 'Displays a burnup or burndown chart', - category: category, - templateUrl: '{widgetsPath}/redmine/src/main/chart/view.html', - controller: 'ChartController', - controllerAs: 'vm', - resolve: { - chartData: ["chartDataService", "config", function (chartDataService, config) { - if(config.project) { - return chartDataService.getChartData(config); - } - }] - }, - edit: editChart - }); +angular.module('adf.widget.redmine', ['adf.provider', 'chart.js', 'ui.bootstrap.datepicker']) + .constant('redmineEndpoint', 'http://192.168.56.2/redmine/') + .constant('redmineRedirectEndpoint', null) + .config(["dashboardProvider", function (dashboardProvider) { + var category = 'Redmine'; + + // Create widgets + createMyIssuesWidget(dashboardProvider, 'redmine-my-issues', 'My Issues', category, false); + createCustomQueriesWidget(dashboardProvider, 'redmine-custom-queries', 'Custom Queries', category, false); + createChartWidget(dashboardProvider, 'redmine-chart', 'Chart', category, false); + }]); + +angular.module('adf.widget.easyredmine', ['adf.provider', 'chart.js', 'ui.bootstrap.datepicker']) + .constant('easyRedmineEndpoint', 'http://192.168.56.2/easyredmine/') + .constant('easyRedmineRedirectEndpoint', null) + .config(["dashboardProvider", function (dashboardProvider) { + var category = 'EasyRedmine'; + // Create widgets + createMyIssuesWidget(dashboardProvider, 'easyredmine-my-issues', 'My Issues', category, true); + createCustomQueriesWidget(dashboardProvider, 'easyredmine-custom-queries', 'Custom Queries', category, true); + createChartWidget(dashboardProvider, 'easyredmine-chart', 'Chart', category, true); }]); +angular.module("adf.widget.easyredmine").run(["$templateCache", function($templateCache) {$templateCache.put("{widgetsPath}/redmine/src/main/chart/view.html","
Please configure the widget
"); +$templateCache.put("{widgetsPath}/redmine/src/main/issues/view.html","
Please configure the widget
No issues found
ID ↓TrackerStatusPrioritySubjectAssignee
#{{issue.id}}{{issue.tracker.name}}{{issue.status.name}}{{issue.priority.name}}{{issue.subject}}{{issue.assigned_to.name}}
"); +$templateCache.put("{widgetsPath}/redmine/src/main/chart/edit/edit.html","

can be used instead an ID to fetch all issues from the logged in user. Leave empty if you want to see all issues.\">
Show ideal line

"); +$templateCache.put("{widgetsPath}/redmine/src/main/issues/edit/easyedit.html","
Show closed issues
  • {{entry.name}}
  • "); +$templateCache.put("{widgetsPath}/redmine/src/main/issues/edit/edit.html","
    Show closed issues
  • {{entry.name}}
  • ");}]); angular.module("adf.widget.redmine").run(["$templateCache", function($templateCache) {$templateCache.put("{widgetsPath}/redmine/src/main/chart/view.html","
    Please configure the widget
    "); $templateCache.put("{widgetsPath}/redmine/src/main/issues/view.html","
    Please configure the widget
    No issues found
    ID ↓TrackerStatusPrioritySubjectAssignee
    #{{issue.id}}{{issue.tracker.name}}{{issue.status.name}}{{issue.priority.name}}{{issue.subject}}{{issue.assigned_to.name}}
    "); $templateCache.put("{widgetsPath}/redmine/src/main/chart/edit/edit.html","

    can be used instead an ID to fetch all issues from the logged in user. Leave empty if you want to see all issues.\">
    Show ideal line

    "); +$templateCache.put("{widgetsPath}/redmine/src/main/issues/edit/easyedit.html","
    Show closed issues
  • {{entry.name}}
  • "); $templateCache.put("{widgetsPath}/redmine/src/main/issues/edit/edit.html","
    Show closed issues
  • {{entry.name}}
  • ");}]); -angular.module('adf.widget.redmine') - .controller('editIssuesController', ["projects", "config", "redmineService", function(projects, config, redmineService){ - var vm = this; - - vm.possibleColumns = { - 'id':{'name':'ID', 'show': true}, - 'tracker':{'name':'Tracker','show': true}, - 'status':{'name':'Status','show': true}, - 'subject':{'name':'Subject','show': true}, - 'assignee':{'name':'Assignee','show': true}, - 'priority':{'name':'Priority','show': true} - }; - - redmineService.getCustomQueries().then(function(data){ - if (data && data.queries){ - vm.customQueries = data.queries; - }else{ - vm.customQueries = null; - } - }); - - - if(angular.equals({},config)) { - config.columns=vm.possibleColumns; - config.project=''; - config.assigned_to_id='me'; - config.showClosed=false; - } - - vm.projects = projects; - }]); - - +function createEditIssueController(vm, projects, customQueries, config){ + vm.possibleColumns = { + 'id':{'name':'ID', 'show': true}, + 'tracker':{'name':'Tracker','show': true}, + 'status':{'name':'Status','show': true}, + 'subject':{'name':'Subject','show': true}, + 'assignee':{'name':'Assignee','show': true}, + 'priority':{'name':'Priority','show': true} + }; + + if(angular.equals({},config)) { + config.columns=vm.possibleColumns; + config.customQuery=''; + config.project=''; + config.assigned_to_id='me'; + config.showClosed=false; + } + + vm.projects = projects; + vm.customQueries = customQueries; +} angular.module('adf.widget.redmine') - .controller('editChartController', ["projects", "config", "chartDataService", "redmineService", function (projects, config, chartDataService, redmineService) { - var vm = this; - vm.config = config; - vm.projects = projects; - // functions - vm.addFilter = addFilter; - vm.converStringsToDateObjects = converStringsToDateObjects; - vm.toggleMin = toggleMin; - vm.open1 = function () { - vm.popup1.opened = true; - }; - - vm.open2 = function () { - vm.popup2.opened = true; - }; - vm.updateVersions = updateVersions; - vm.checkUpdates = checkUpdates; - vm.updateVersionEnd = updateVersionEnd; - vm.updateTracker = updateTracker; - - // init stuff - vm.filters = [ - { id: 'version', name: 'Fixed Version' }, - { id: 'assigned', name: 'Assigned to' }, - { id: 'tracker', name: 'Tracker' } - ] - - if (!vm.config.timespan) { - vm.config.timespan = {}; - } - - vm.inlineOptions = { - customClass: getDayClass, - minDate: new Date(), - showWeeks: true - }; - - if (!vm.dateOptions) { - vm.dateOptions = { - formatYear: 'yy', - startingDay: 1 - }; - } + .controller('editIssuesController', ["projects", "customQueries", "config", function (projects, customQueries, config) { + return createEditIssueController(this, projects, customQueries, config); + }]); +angular.module('adf.widget.easyredmine') + .controller('easyEditIssuesController', ["projects", "customQueries", "config", function (projects, customQueries, config) { + return createEditIssueController(this, projects, customQueries, config); + }]); - vm.formats = ['yyyy-MM-dd', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate']; - vm.format = vm.formats[0]; - vm.altInputFormats = ['M!/d!/yyyy']; - vm.popup1 = { - opened: false - }; - vm.popup2 = { - opened: false +function createEditChartController(vm, projects, config, chartDataService, apiService) { + vm.config = config; + vm.projects = projects; + // functions + vm.addFilter = addFilter; + vm.converStringsToDateObjects = converStringsToDateObjects; + vm.toggleMin = toggleMin; + vm.open1 = function () { + vm.popup1.opened = true; + }; + + vm.open2 = function () { + vm.popup2.opened = true; + }; + vm.updateVersions = updateVersions; + vm.checkUpdates = checkUpdates; + vm.updateVersionEnd = updateVersionEnd; + vm.updateTracker = updateTracker; + + // init stuff + vm.filters = [ + {id: 'version', name: 'Fixed Version'}, + {id: 'assigned', name: 'Assigned to'}, + {id: 'tracker', name: 'Tracker'} + ] + + if (!vm.config.timespan) { + vm.config.timespan = {}; + } + + vm.inlineOptions = { + customClass: getDayClass, + minDate: new Date(), + showWeeks: true + }; + + if (!vm.dateOptions) { + vm.dateOptions = { + formatYear: 'yy', + startingDay: 1 }; - - // calls - vm.toggleMin(); - vm.converStringsToDateObjects(); - - function addFilter(filter) { - if (filter === 'version') { - vm.config.filterWithVersion = true; - } else if (filter === 'assigned') { - vm.config.filterWithAssigned = true; - } else if (filter === 'tracker') { - vm.config.filterWithTracker = true; - } - vm.filterToAdd = 'none'; - } - - function converStringsToDateObjects() { - if (vm.config.timespan.fromDateTime) { - vm.config.timespan.fromDateTime = new Date(vm.config.timespan.fromDateTime); - vm.config.timespan.toDateTime = new Date(vm.config.timespan.toDateTime); - } - } - - function toggleMin() { - vm.inlineOptions.minDate = vm.inlineOptions.minDate ? null : new Date(); - vm.dateOptions.minDate = vm.inlineOptions.minDate; - } - - function updateVersions() { - if (vm.config.project) { - if (vm.config.project === 'All') { - vm.versions = []; - return; - } - redmineService.getVersions(angular.fromJson(vm.config.project).identifier).then(function (versions) { - vm.versions = versions; - }); + } + + vm.formats = ['yyyy-MM-dd', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate']; + vm.format = vm.formats[0]; + vm.altInputFormats = ['M!/d!/yyyy']; + + vm.popup1 = { + opened: false + }; + + vm.popup2 = { + opened: false + }; + + // calls + vm.toggleMin(); + vm.converStringsToDateObjects(); + + function addFilter(filter) { + if (filter === 'version') { + vm.config.filterWithVersion = true; + } else if (filter === 'assigned') { + vm.config.filterWithAssigned = true; + } else if (filter === 'tracker') { + vm.config.filterWithTracker = true; + } + vm.filterToAdd = 'none'; + } + + function converStringsToDateObjects() { + if (vm.config.timespan.fromDateTime) { + vm.config.timespan.fromDateTime = new Date(vm.config.timespan.fromDateTime); + vm.config.timespan.toDateTime = new Date(vm.config.timespan.toDateTime); + } + } + + function toggleMin() { + vm.inlineOptions.minDate = vm.inlineOptions.minDate ? null : new Date(); + vm.dateOptions.minDate = vm.inlineOptions.minDate; + } + + function updateVersions() { + if (vm.config.project) { + if (vm.config.project === 'All') { + vm.versions = []; + return; } + apiService.getVersions(angular.fromJson(vm.config.project).identifier).then(function (versions) { + vm.versions = versions; + }); } + } - function checkUpdates() { - if (vm.config.filterWithVersion) { - vm.updateVersions(); - } + function checkUpdates() { + if (vm.config.filterWithVersion) { + vm.updateVersions(); } + } - function updateVersionEnd() { - vm.config.timespan.toDateTime = new Date(angular.fromJson(vm.config.version).due_date); - var date = new Date(vm.config.timespan.toDateTime); - vm.config.timespan.fromDateTime = date.setDate(date.getDate() - 14); - } + function updateVersionEnd() { + vm.config.timespan.toDateTime = new Date(angular.fromJson(vm.config.version).due_date); + var date = new Date(vm.config.timespan.toDateTime); + vm.config.timespan.fromDateTime = date.setDate(date.getDate() - 14); + } - function updateTracker() { - redmineService.getTrackers().then(function (trackers) { - vm.trackers = trackers; - }); - } + function updateTracker() { + apiService.getTrackers().then(function (trackers) { + vm.trackers = trackers; + }); + } - function getDayClass(data) { - var date = data.date, - mode = data.mode; - if (mode === 'day') { - var dayToCheck = new Date(date).setHours(0, 0, 0, 0); + function getDayClass(data) { + var date = data.date, + mode = data.mode; + if (mode === 'day') { + var dayToCheck = new Date(date).setHours(0, 0, 0, 0); - for (var i = 0; i < vm.events.length; i++) { - var currentDay = new Date(vm.events[i].date).setHours(0, 0, 0, 0); + for (var i = 0; i < vm.events.length; i++) { + var currentDay = new Date(vm.events[i].date).setHours(0, 0, 0, 0); - if (dayToCheck === currentDay) { - return vm.events[i].status; - } + if (dayToCheck === currentDay) { + return vm.events[i].status; } } - return ''; } + return ''; + } +} - }]); - +angular.module('adf.widget.redmine').controller('editChartController', ["projects", "config", "chartDataService", "redmineService", function (projects, config, chartDataService, redmineService) { + return createEditChartController(this, projects, config, chartDataService, redmineService); +}]); +angular.module('adf.widget.easyredmine').controller('easyEditChartController', ["projects", "config", "easyChartDataService", "easyRedmineService", function (projects, config, easyChartDataService, easyRedmineService) { + return createEditChartController(this, projects, config, easyChartDataService, easyRedmineService); +}]); -angular.module('adf.widget.redmine') - .controller('IssueController', ["issues", "config", "redmineService", function (issues, config, redmineService) { - var vm = this; - if (config){ - vm.config = config; - } +function createIssueController(vm, issues, config, apiService) { + if (config) { + vm.config = config; + } + + if (!config.columns) { + vm.config = { + columns: { + 'id': {'name': 'ID', 'show': true}, + 'tracker': {'name': 'Tracker', 'show': true}, + 'status': {'name': 'Status', 'show': true}, + 'subject': {'name': 'Subject', 'show': true}, + 'assignee': {'name': 'Assignee', 'show': false}, + 'priority': {'name': 'Priority', 'show': true} + }, + assigned_to_id: 'me' + }; + } - if (!config.columns){ - vm.config = { - columns: { - 'id':{'name':'ID', 'show': true}, - 'tracker':{'name':'Tracker','show': true}, - 'status':{'name':'Status','show': true}, - 'subject':{'name':'Subject','show': true}, - 'assignee':{'name':'Assignee','show': false}, - 'priority':{'name':'Priority','show': true} - }, - assigned_to_id: 'me' - }; + if (issues) { + vm.issues = issues; + if (issues.issues) { + vm.issues = vm.issues.issues; } + } - if (issues){ - vm.issues = issues; - if (issues.issues){ - vm.issues = vm.issues.issues; - } - } + var redirectEndpoint = apiService.getRedmineRedirectEndpoint(); + if (!redirectEndpoint) { + redirectEndpoint = apiService.getRedmineEndpoint(); + } + vm.issueUrl = redirectEndpoint + 'issues/'; - var redirectEndpoint = redmineService.getRedmineRedirectEndpoint(); - if (!redirectEndpoint) { - redirectEndpoint = redmineService.getRedmineEndpoint(); - } - vm.issueUrl = redirectEndpoint + 'issues/'; + vm.order = 'id'; - vm.order = 'id'; + vm.changeOrder = function (order) { + vm.order = order; + vm.reverse = !vm.reverse; + }; - vm.changeOrder = function(order){ - vm.order = order; - vm.reverse = !vm.reverse; - }; +} +angular.module('adf.widget.redmine') + .controller('issueController', ["issues", "config", "redmineService", function (issues, config, redmineService) { + return createIssueController(this, issues, config, redmineService); }]); +angular.module('adf.widget.easyredmine') + .controller('easyIssueController', ["issues", "config", "easyRedmineService", function (issues, config, easyRedmineService) { + return createIssueController(this, issues, config, easyRedmineService); + }]); -angular.module('adf.widget.redmine') - .factory('chartDataService', ["$q", "redmineService", function ($q, redmineService) { - function moveNewOpenIssues(allIssues, openIssues, date) { - for (var i = 0; i < allIssues.length; i++) { - var createDate = new Date(allIssues[i].created_on); - if (createDate.getTime() <= date.getTime()) { - openIssues.push(allIssues[i]); - allIssues.splice(i, 1); - i--; - } +function createChartDataService($q, apiService) { + function moveNewOpenIssues(allIssues, openIssues, date) { + for (var i = 0; i < allIssues.length; i++) { + var createDate = new Date(allIssues[i].created_on); + if (createDate.getTime() <= date.getTime()) { + openIssues.push(allIssues[i]); + allIssues.splice(i, 1); + i--; } } + } - function removeNewClosedIssues(openIssues, date) { - for (var i = 0; i < openIssues.length; i++) { - if (openIssues[i].closed_on) { - var closeDate = new Date(openIssues[i].closed_on); - if (closeDate.getTime() <= date.getTime()) { - openIssues.splice(i, 1); - i--; - } + function removeNewClosedIssues(openIssues, date) { + for (var i = 0; i < openIssues.length; i++) { + if (openIssues[i].closed_on) { + var closeDate = new Date(openIssues[i].closed_on); + if (closeDate.getTime() <= date.getTime()) { + openIssues.splice(i, 1); + i--; } } } - - function calculateOpenIssuesPerDay(from, to, issues, config) { - var timeDiff = Math.abs(from.getTime() - to.getTime()); - var pointThinningRate = timeDiff / config.numberPoints; - var numberAllIssues = issues.length; - var idealIssuesPerInterval = numberAllIssues / timeDiff; - var idealData = []; - var openIssues = []; - var values = []; - while ((from.getTime() <= to.getTime())) { - moveNewOpenIssues(issues, openIssues, from); - removeNewClosedIssues(openIssues, from); - var value = {x: from.toISOString(),y:openIssues.length}; - values.push(value); - if (config.showIdeal) { - var idealValue = Math.round((numberAllIssues - idealData.length * idealIssuesPerInterval * pointThinningRate)*100)/100; - var ideal = {x: from.toISOString(),y:idealValue}; - idealData.push(ideal); - } - from.setTime(from.getTime() + pointThinningRate); - } - var valueSets = [values]; + } + + function calculateOpenIssuesPerDay(from, to, issues, config) { + var timeDiff = Math.abs(from.getTime() - to.getTime()); + var pointThinningRate = timeDiff / config.numberPoints; + var numberAllIssues = issues.length; + var idealIssuesPerInterval = numberAllIssues / timeDiff; + var idealData = []; + var openIssues = []; + var values = []; + while ((from.getTime() <= to.getTime())) { + moveNewOpenIssues(issues, openIssues, from); + removeNewClosedIssues(openIssues, from); + var value = {x: from.toISOString(), y: openIssues.length}; + values.push(value); if (config.showIdeal) { - valueSets.push(idealData); + var idealValue = Math.round((numberAllIssues - idealData.length * idealIssuesPerInterval * pointThinningRate) * 100) / 100; + var ideal = {x: from.toISOString(), y: idealValue}; + idealData.push(ideal); } - return valueSets; + from.setTime(from.getTime() + pointThinningRate); } - - function getChartData(config) { - return redmineService.getIssuesForChart(config).then(function (issues) { - config.numberPoints = 50; - var from = new Date(config.timespan.fromDateTime); - var to = new Date(config.timespan.toDateTime); - return calculateOpenIssuesPerDay(from, to, issues, config); - }); + var valueSets = [values]; + if (config.showIdeal) { + valueSets.push(idealData); } + return valueSets; + } - return { - getChartData: getChartData - }; + function getChartData(config) { + return apiService.getIssuesForChart(config).then(function (issues) { + config.numberPoints = 50; + var from = new Date(config.timespan.fromDateTime); + var to = new Date(config.timespan.toDateTime); + return calculateOpenIssuesPerDay(from, to, issues, config); + }); + } + + return { + getChartData: getChartData + }; +} + +angular.module('adf.widget.redmine') + .factory('chartDataService', ["$q", "redmineService", function ($q, redmineService) { + return createChartDataService($q, redmineService); }]); +angular.module('adf.widget.easyredmine') + .factory('easyChartDataService', ["$q", "easyRedmineService", function ($q, easyRedmineService) { + return createChartDataService($q, easyRedmineService); + }]); -angular.module('adf.widget.redmine') - .controller('ChartController', ["chartData", "config", function (chartData, config) { - var vm = this; - vm.config = config; - var options = { - scales: { - yAxes: [ - { - id: 'y-axis-1', +function createChartController(vm, chartData, config) { + vm.config = config; + var options = { + scales: { + yAxes: [ + { + id: 'y-axis-1', + display: true, + position: 'left', + scaleLabel: { display: true, - position: 'left', - scaleLabel: { - display: true, - labelString: 'Open Issues' - } + labelString: 'Open Issues' } - ], - xAxes: [ - { - id: 'x-axis-1', - type: 'time', time: { - displayFormats: { - day: 'D.MMM', - week: 'D.MMM', - month: 'MMM/YY', - quarter: '[Q]Q - YYYY', - year: 'YYYY' - } + } + ], + xAxes: [ + { + id: 'x-axis-1', + type: 'time', time: { + displayFormats: { + day: 'D.MMM', + week: 'D.MMM', + month: 'MMM/YY', + quarter: '[Q]Q - YYYY', + year: 'YYYY' } } - ] - }, - legend: { - display: true, - position: "bottom" - }, - responsive: true - }; - - vm.chart = { - data: chartData, - series: [], - class: "chart-line", - options: options - }; - - if (vm.config.project && vm.config.project !== 'All') { - vm.chart.series.push(angular.fromJson(vm.config.project).name); - } else { - vm.chart.series.push("All Projects"); - } - - if (vm.config.showIdeal) { - vm.chart.series.push("Ideal"); - } + } + ] + }, + legend: { + display: true, + position: "bottom" + }, + responsive: true + }; + + vm.chart = { + data: chartData, + series: [], + class: "chart-line", + options: options + }; + + if (vm.config.project && vm.config.project !== 'All') { + vm.chart.series.push(angular.fromJson(vm.config.project).name); + } else { + vm.chart.series.push("All Projects"); + } + + if (vm.config.showIdeal) { + vm.chart.series.push("Ideal"); + } +} +angular.module('adf.widget.redmine') + .controller('chartController', ["chartData", "config", function (chartData, config) { + return createChartController(this, chartData, config); }]); +angular.module('adf.widget.easyredmine') + .controller('easyChartController', ["chartData", "config", function (chartData, config) { + return createChartController(this, chartData, config); + }]); -angular.module('adf.widget.redmine') - .factory('redmineService', ["$http", "redmineEndpoint", "redmineRedirectEndpoint", "$q", function ($http, redmineEndpoint, redmineRedirectEndpoint, $q) { - - function extractData(response) { - return response.data; - } - - function request(param) { - return $http.get(redmineEndpoint + param).then(extractData); - } - function getProjects() { - return request('projects.json').then(function (data) { - return data.projects; - }); - } +function apiService($http, apiEndpoint, apiEndpointRedirect, $q) { + function extractData(response) { + return response.data; + } - function getVersions(project) { - return request('projects/' + project + '/versions.json').then(function (data) { - return data.versions; - }); - } + function request(param) { + return $http.get(apiEndpoint + param).then(extractData); + } - function getIssues(config) { - var params = generateGeneralIssuesParameters(config); - var limit = config.limit ? config.limit : Number.MAX_SAFE_INTEGER; - return getIssuesWithParamsAndLimit(params, limit); - } + function getProjects() { + return request('projects.json').then(function (data) { + return data.projects; + }); + } - function getIssuesForChart(config) { - var allIssues = []; - var limit = config.limit ? config.limit : Number.MAX_SAFE_INTEGER; - var params1 = generateParametersForIssuesOpenOnEnd(config); - var params2 = generateParametersForIssuesClosedBetweenStartAndEnd(config); - var params3 = generateParametersForIssuesOpen(config); - return $q.all([getIssuesWithParamsAndLimit(params1, limit), getIssuesWithParamsAndLimit(params2, limit), - getIssuesWithParamsAndLimit(params3, limit)]).then(function(responses){ - angular.forEach(responses, function (issues) { - angular.forEach(issues, function (issue) { - allIssues.push(issue); - }); + function getVersions(project) { + return request('projects/' + project + '/versions.json').then(function (data) { + return data.versions; + }); + } + + function getIssues(config) { + var params = generateGeneralIssuesParameters(config); + var limit = config.limit ? config.limit : Number.MAX_SAFE_INTEGER; + return getIssuesWithParamsAndLimit(params, limit); + } + + function getIssuesForChart(config) { + var allIssues = []; + var limit = config.limit ? config.limit : Number.MAX_SAFE_INTEGER; + var params1 = generateParametersForIssuesOpenOnEnd(config); + var params2 = generateParametersForIssuesClosedBetweenStartAndEnd(config); + var params3 = generateParametersForIssuesOpen(config); + return $q.all([getIssuesWithParamsAndLimit(params1, limit), getIssuesWithParamsAndLimit(params2, limit), + getIssuesWithParamsAndLimit(params3, limit)]).then(function (responses) { + angular.forEach(responses, function (issues) { + angular.forEach(issues, function (issue) { + allIssues.push(issue); }); - return allIssues; }); - } + return allIssues; + }); + } - function getIssuesWithParamsAndLimit(params, limit){ - var allIssues = []; - return collectPageIssues(params, 0).then(function (issues) { - angular.forEach(issues.issues, function (issue) { - allIssues.push(issue); - }); - var requests = []; - for (var i = 100; i < issues.total_count && i < limit; i = i + 100) { - requests.push(collectPageIssues(params, i)); - } - if (params.length > 0) { - return $q.all(requests).then(function (responses) { - angular.forEach(responses, function (response) { - angular.forEach(response.issues, function (issue) { - allIssues.push(issue); - }); + function getIssuesWithParamsAndLimit(params, limit) { + var allIssues = []; + return collectPageIssues(params, 0).then(function (issues) { + angular.forEach(issues.issues, function (issue) { + allIssues.push(issue); + }); + var requests = []; + for (var i = 100; i < issues.total_count && i < limit; i = i + 100) { + requests.push(collectPageIssues(params, i)); + } + if (params.length > 0) { + return $q.all(requests).then(function (responses) { + angular.forEach(responses, function (response) { + angular.forEach(response.issues, function (issue) { + allIssues.push(issue); }); - return allIssues; }); - } else { return allIssues; - } - }); - } - - function collectPageIssues(params, offset) { - return request('issues.json' + params + '&offset=' + offset).then(function (issues) { - return issues; - }); - } + }); + } else { + return allIssues; + } + }); + } - function generateParametersForIssuesOpenOnEnd(data) { - var params = generateGeneralIssuesParameters(data); + function collectPageIssues(params, offset) { + return request('issues.json' + params + '&offset=' + offset).then(function (issues) { + return issues; + }); + } + + function generateParametersForIssuesOpenOnEnd(data) { + var params = generateGeneralIssuesParameters(data); + params += '&status_id=*'; + var toDate = new Date(data.timespan.toDateTime); + params += '&created_on=<=' + dateToYMD(toDate); + params += '&closed_on=>=' + dateToYMD(toDate); + return params; + } + + function generateParametersForIssuesOpen(data) { + var params = generateGeneralIssuesParameters(data); + params += '&status_id=open'; + var toDate = new Date(data.timespan.toDateTime); + params += '&created_on=<=' + dateToYMD(toDate); + return params; + } + + function generateParametersForIssuesClosedBetweenStartAndEnd(data) { + var params = generateGeneralIssuesParameters(data); + params += '&status_id=*'; + var fromDate = new Date(data.timespan.fromDateTime); + var toDate = new Date(data.timespan.toDateTime); + params += '&closed_on=><' + dateToYMD(fromDate) + '|' + dateToYMD(toDate); + return params; + } + + function generateGeneralIssuesParameters(data) { + var params = '?limit=100&sort=created_on'; + if (data.project && data.project !== "All") { + params += '&project_id=' + angular.fromJson(data.project).id; + } + if (data.filterWithAssigned && data.assigned_to_id) { + params += '&assigned_to_id=' + data.assigned_to_id; + } + if (data.showClosed) { params += '&status_id=*'; - var toDate = new Date(data.timespan.toDateTime); - params += '&created_on=<=' + dateToYMD(toDate); - params += '&closed_on=>=' + dateToYMD(toDate); - return params; } - - function generateParametersForIssuesOpen(data) { - var params = generateGeneralIssuesParameters(data); - params += '&status_id=open'; - var toDate = new Date(data.timespan.toDateTime); - params += '&created_on=<=' + dateToYMD(toDate); - return params; + if (data.filterWithVersion && data.version) { + params += '&fixed_version_id=' + angular.fromJson(data.version).id; } - - function generateParametersForIssuesClosedBetweenStartAndEnd(data) { - var params = generateGeneralIssuesParameters(data); - params += '&status_id=*'; - var fromDate = new Date(data.timespan.fromDateTime); - var toDate = new Date(data.timespan.toDateTime); - params += '&closed_on=><' + dateToYMD(fromDate) + '|' + dateToYMD(toDate); - return params; + if (data.filterWithTracker && data.tracker) { + params += '&tracker_id=' + angular.fromJson(data.tracker).id; } + return params; + } - function generateGeneralIssuesParameters(data) { - var params = '?limit=100&sort=created_on'; - if (data.project && data.project !== "All") { - params += '&project_id=' + angular.fromJson(data.project).id; - } - if (data.filterWithAssigned && data.assigned_to_id) { - params += '&assigned_to_id=' + data.assigned_to_id; - } - if (data.showClosed) { - params += '&status_id=*'; - } - if (data.filterWithVersion && data.version) { - params += '&fixed_version_id=' + angular.fromJson(data.version).id; - } - if (data.filterWithTracker && data.tracker) { - params += '&tracker_id='+angular.fromJson(data.tracker).id; - } - return params; - } + function dateToYMD(date) { + var d = date.getDate(); + var m = date.getMonth() + 1; + var y = date.getFullYear(); + return '' + y + '-' + (m <= 9 ? '0' + m : m) + '-' + (d <= 9 ? '0' + d : d); + } - function dateToYMD(date) { - var d = date.getDate(); - var m = date.getMonth() + 1; - var y = date.getFullYear(); - return '' + y + '-' + (m <= 9 ? '0' + m : m) + '-' + (d <= 9 ? '0' + d : d); - } + function getCustomQueries() { + return request('queries.json?limit=100'); + } - function getCustomQueries() { - return request('queries.json?limit=100'); - } + function getIssuesByQueryId(queryId, projectId) { + return request('issues.json?query_id=' + queryId + '&project_id=' + projectId).then(function (data) { + return data.issues; + }); + } - function getIssuesByQueryId(queryId, projectId) { - return request('issues.json?query_id=' + queryId + '&project_id=' + projectId).then(function(data){ - return data.issues; - }); - } + function getRedmineEndpoint() { + return apiEndpoint; + } - function getRedmineEndpoint(){ - return redmineEndpoint; - } + function getRedmineRedirectEndpoint() { + return apiEndpointRedirect; + } - function getRedmineRedirectEndpoint(){ - return redmineRedirectEndpoint; - } + function getTrackers() { + return request('trackers.json').then(function (data) { + return data.trackers; + }); + } - function getTrackers() { - return request('trackers.json').then(function (data) { - return data.trackers; - }); - } + function getMyIssues() { + return request('issues.json?assigned_to_id=me').then(function (data) { + return data; + }); + } + + return { + getIssues: getIssues, + getIssuesForChart: getIssuesForChart, + getProjects: getProjects, + getVersions: getVersions, + getCustomQueries: getCustomQueries, + getIssuesByQueryId: getIssuesByQueryId, + getRedmineEndpoint: getRedmineEndpoint, + getRedmineRedirectEndpoint: getRedmineRedirectEndpoint, + getTrackers: getTrackers, + getMyIssues: getMyIssues + }; +} - function getMyIssues(){ - return request('issues.json?assigned_to_id=me').then(function(data){ - return data; - }); - } - return { - getIssues: getIssues, - getIssuesForChart: getIssuesForChart, - getProjects: getProjects, - getVersions: getVersions, - getCustomQueries: getCustomQueries, - getIssuesByQueryId: getIssuesByQueryId, - getRedmineEndpoint: getRedmineEndpoint, - getRedmineRedirectEndpoint: getRedmineRedirectEndpoint, - getTrackers: getTrackers, - getMyIssues : getMyIssues - }; +angular.module('adf.widget.redmine') + .factory('redmineService', ["$http", "redmineEndpoint", "redmineRedirectEndpoint", "$q", function ($http, redmineEndpoint, redmineRedirectEndpoint, $q) { + return apiService($http, redmineEndpoint, redmineRedirectEndpoint, $q); + }]); + +angular.module('adf.widget.easyredmine') + .factory('easyRedmineService', ["$http", "easyRedmineEndpoint", "easyRedmineRedirectEndpoint", "$q", function ($http, easyRedmineEndpoint, easyRedmineRedirectEndpoint, $q) { + return apiService($http, easyRedmineEndpoint, easyRedmineRedirectEndpoint, $q); }]); -})(window); \ No newline at end of file +})(window); diff --git a/dist/adf-widget-redmine.min.js b/dist/adf-widget-redmine.min.js index 0b44c66..8864a30 100644 --- a/dist/adf-widget-redmine.min.js +++ b/dist/adf-widget-redmine.min.js @@ -1 +1 @@ -!function(e,t){"use strict";angular.module("adf.widget.redmine",["adf.provider","chart.js","ui.bootstrap.datepicker"]).constant("redmineEndpoint","http://localhost:3000/").config(["dashboardProvider",function(e){var t="Redmine",n={templateUrl:"{widgetsPath}/redmine/src/main/issues/edit/edit.html",controller:"editIssuesController",controllerAs:"vm",resolve:{projects:["redmineService",function(e){return e.getProjects()}]}},i={templateUrl:"{widgetsPath}/redmine/src/main/chart/edit/edit.html",controller:"editChartController",controllerAs:"vm",resolve:{projects:["redmineService",function(e){return e.getProjects()}]}};e.widget("redmine-custom-queries",{title:"Redmine Custom Queries",description:"Displays Issues from a Custom Query",category:t,templateUrl:"{widgetsPath}/redmine/src/main/issues/view.html",controller:"IssueController",controllerAs:"vm",resolve:{issues:["redmineService","config",function(e,t){if(t.customQuery)return e.getIssuesByQueryId(t.customQuery.id,t.customQuery.project_id)}]},edit:n}),e.widget("redmine-my-issues",{title:"My Redmine Issues",description:"Displays all issues assigned to me",category:t,templateUrl:"{widgetsPath}/redmine/src/main/issues/view.html",controller:"IssueController",controllerAs:"vm",resolve:{issues:["redmineService",function(e){return e.getMyIssues()}]}}),e.widget("redmine-chart",{title:"Redmine Chart",description:"Displays a burnup or burndown chart",category:t,templateUrl:"{widgetsPath}/redmine/src/main/chart/view.html",controller:"ChartController",controllerAs:"vm",resolve:{chartData:["chartDataService","config",function(e,t){if(t.project)return e.getChartData(t)}]},edit:i})}]),angular.module("adf.widget.redmine").run(["$templateCache",function(e){e.put("{widgetsPath}/redmine/src/main/chart/view.html",'
    Please configure the widget
    '),e.put("{widgetsPath}/redmine/src/main/issues/view.html",'
    Please configure the widget
    No issues found
    ID ↓TrackerStatusPrioritySubjectAssignee
    #{{issue.id}}{{issue.tracker.name}}{{issue.status.name}}{{issue.priority.name}}{{issue.subject}}{{issue.assigned_to.name}}
    '),e.put("{widgetsPath}/redmine/src/main/chart/edit/edit.html",'

    Show ideal line

    '),e.put("{widgetsPath}/redmine/src/main/issues/edit/edit.html",'
    Show closed issues
  • {{entry.name}}
  • ')}]),angular.module("adf.widget.redmine").controller("editIssuesController",["projects","config","redmineService",function(e,t,n){var i=this;i.possibleColumns={id:{name:"ID",show:!0},tracker:{name:"Tracker",show:!0},status:{name:"Status",show:!0},subject:{name:"Subject",show:!0},assignee:{name:"Assignee",show:!0},priority:{name:"Priority",show:!0}},n.getCustomQueries().then(function(e){e&&e.queries?i.customQueries=e.queries:i.customQueries=null}),angular.equals({},t)&&(t.columns=i.possibleColumns,t.project="",t.assigned_to_id="me",t.showClosed=!1),i.projects=e}]),angular.module("adf.widget.redmine").controller("editChartController",["projects","config","chartDataService","redmineService",function(e,t,n,i){function r(e){"version"===e?m.config.filterWithVersion=!0:"assigned"===e?m.config.filterWithAssigned=!0:"tracker"===e&&(m.config.filterWithTracker=!0),m.filterToAdd="none"}function s(){m.config.timespan.fromDateTime&&(m.config.timespan.fromDateTime=new Date(m.config.timespan.fromDateTime),m.config.timespan.toDateTime=new Date(m.config.timespan.toDateTime))}function o(){m.inlineOptions.minDate=m.inlineOptions.minDate?null:new Date,m.dateOptions.minDate=m.inlineOptions.minDate}function a(){if(m.config.project){if("All"===m.config.project)return void(m.versions=[]);i.getVersions(angular.fromJson(m.config.project).identifier).then(function(e){m.versions=e})}}function c(){m.config.filterWithVersion&&m.updateVersions()}function l(){m.config.timespan.toDateTime=new Date(angular.fromJson(m.config.version).due_date);var e=new Date(m.config.timespan.toDateTime);m.config.timespan.fromDateTime=e.setDate(e.getDate()-14)}function u(){i.getTrackers().then(function(e){m.trackers=e})}function d(e){var t=e.date,n=e.mode;if("day"===n)for(var i=new Date(t).setHours(0,0,0,0),r=0;r0?i.all(s).then(function(e){return angular.forEach(e,function(e){angular.forEach(e.issues,function(e){n.push(e)})}),n}):n})}function d(e,t){return s("issues.json"+e+"&offset="+t).then(function(e){return e})}function m(e){var t=f(e);t+="&status_id=*";var n=new Date(e.timespan.toDateTime);return t+="&created_on=<="+h(n),t+="&closed_on=>="+h(n)}function g(e){var t=f(e);t+="&status_id=open";var n=new Date(e.timespan.toDateTime);return t+="&created_on=<="+h(n)}function p(e){var t=f(e);t+="&status_id=*";var n=new Date(e.timespan.fromDateTime),i=new Date(e.timespan.toDateTime);return t+="&closed_on=><"+h(n)+"|"+h(i)}function f(e){var t="?limit=100&sort=created_on";return e.project&&"All"!==e.project&&(t+="&project_id="+angular.fromJson(e.project).id),e.filterWithAssigned&&e.assigned_to_id&&(t+="&assigned_to_id="+e.assigned_to_id),e.showClosed&&(t+="&status_id=*"),e.filterWithVersion&&e.version&&(t+="&fixed_version_id="+angular.fromJson(e.version).id),e.filterWithTracker&&e.tracker&&(t+="&tracker_id="+angular.fromJson(e.tracker).id),t}function h(e){var t=e.getDate(),n=e.getMonth()+1,i=e.getFullYear();return""+i+"-"+(n<=9?"0"+n:n)+"-"+(t<=9?"0"+t:t)}function v(){return s("queries.json?limit=100")}function y(e,t){return s("issues.json?query_id="+e+"&project_id="+t).then(function(e){return e.issues})}function b(){return t}function w(){return n}function k(){return s("trackers.json").then(function(e){return e.trackers})}function D(){return s("issues.json?assigned_to_id=me").then(function(e){return e})}return{getIssues:c,getIssuesForChart:l,getProjects:o,getVersions:a,getCustomQueries:v,getIssuesByQueryId:y,getRedmineEndpoint:b,getRedmineRedirectEndpoint:w,getTrackers:k,getMyIssues:D}}])}(window); \ No newline at end of file +!function(e,t){"use strict";function n(e){return{templateUrl:"{widgetsPath}/redmine/src/main/issues/edit/edit.html",controller:e?"easyEditIssuesController":"editIssuesController",controllerAs:"vm",resolve:{projects:["redmineService","easyRedmineService",function(t,n){return e?n.getProjects():t.getProjects()}]}}}function i(e){return{templateUrl:"{widgetsPath}/redmine/src/main/chart/edit/edit.html",controller:e?"easyEditChartController":"editChartController",controllerAs:"vm",resolve:{projects:["redmineService","easyRedmineService",function(t,n){return e?n.getProjects():t.getProjects()}]}}}function r(e,t,i,r,s){e.widget(t,{title:i,description:"Displays Issues from a Custom Query",category:r,templateUrl:"{widgetsPath}/redmine/src/main/issues/view.html",controller:s?"easyIssueController":"issueController",controllerAs:"vm",resolve:{issues:["redmineService","easyRedmineService","config",function(e,t,n){if(n.customQuery)return s?t.getIssuesByQueryId(n.customQuery.id,n.customQuery.project_id):e.getIssuesByQueryId(n.customQuery.id,n.customQuery.project_id)}]},edit:n(s)})}function s(e,t,n,i,r){e.widget(t,{title:n,description:"Displays all issues assigned to me",category:i,templateUrl:"{widgetsPath}/redmine/src/main/issues/view.html",controller:r?"easyIssueController":"issueController",controllerAs:"vm",resolve:{issues:["redmineService","easyRedmineService",function(e,t){return r?t.getMyIssues():e.getMyIssues()}]}})}function o(e,t,n,r,s){e.widget(t,{title:n,description:"Displays a burnup or burndown chart",category:r,templateUrl:"{widgetsPath}/redmine/src/main/chart/view.html",controller:s?"easyChartController":"chartController",controllerAs:"vm",resolve:{chartData:["chartDataService","easyChartDataService","config",function(e,t,n){if(n.project)return s?t.getChartData(n):e.getChartData(n)}]},edit:i(s)})}function a(e,t,n,i){e.possibleColumns={id:{name:"ID",show:!0},tracker:{name:"Tracker",show:!0},status:{name:"Status",show:!0},subject:{name:"Subject",show:!0},assignee:{name:"Assignee",show:!0},priority:{name:"Priority",show:!0}},i.getCustomQueries().then(function(t){e.customQueries=null,t&&t.queries?e.customQueries=t.queries:t&&t.easy_queries&&(e.customQueries=t.easy_queries)}),angular.equals({},n)&&(n.columns=e.possibleColumns,n.project="",n.assigned_to_id="me",n.showClosed=!1),e.projects=t}function c(e,t,n,i){n&&(e.config=n),n.columns||(e.config={columns:{id:{name:"ID",show:!0},tracker:{name:"Tracker",show:!0},status:{name:"Status",show:!0},subject:{name:"Subject",show:!0},assignee:{name:"Assignee",show:!1},priority:{name:"Priority",show:!0}},assigned_to_id:"me"}),t&&(e.issues=t,t.issues&&(e.issues=e.issues.issues));var r=i.getRedmineRedirectEndpoint();r||(r=i.getRedmineEndpoint()),e.issueUrl=r+"issues/",e.order="id",e.changeOrder=function(t){e.order=t,e.reverse=!e.reverse}}function l(e,t){function n(e,t,n){for(var i=0;i0?i.all(s).then(function(e){return angular.forEach(e,function(e){angular.forEach(e.issues,function(e){n.push(e)})}),n}):n})}function d(e,t){return s("issues.json"+e+"&offset="+t).then(function(e){return e})}function m(e){var t=f(e);t+="&status_id=*";var n=new Date(e.timespan.toDateTime);return t+="&created_on=<="+v(n),t+="&closed_on=>="+v(n)}function g(e){var t=f(e);t+="&status_id=open";var n=new Date(e.timespan.toDateTime);return t+="&created_on=<="+v(n)}function p(e){var t=f(e);t+="&status_id=*";var n=new Date(e.timespan.fromDateTime),i=new Date(e.timespan.toDateTime);return t+="&closed_on=><"+v(n)+"|"+v(i)}function f(e){var t="?limit=100&sort=created_on";return e.project&&"All"!==e.project&&(t+="&project_id="+angular.fromJson(e.project).id),e.filterWithAssigned&&e.assigned_to_id&&(t+="&assigned_to_id="+e.assigned_to_id),e.showClosed&&(t+="&status_id=*"),e.filterWithVersion&&e.version&&(t+="&fixed_version_id="+angular.fromJson(e.version).id),e.filterWithTracker&&e.tracker&&(t+="&tracker_id="+angular.fromJson(e.tracker).id),t}function v(e){var t=e.getDate(),n=e.getMonth()+1,i=e.getFullYear();return""+i+"-"+(n<=9?"0"+n:n)+"-"+(t<=9?"0"+t:t)}function h(){return s("queries.json?limit=100")}function y(e,t){return s("issues.json?query_id="+e+"&project_id="+t).then(function(e){return e.issues})}function b(){return t}function w(){return n}function k(){return s("trackers.json").then(function(e){return e.trackers})}function j(){return s("issues.json?assigned_to_id=me").then(function(e){return e})}return{getIssues:c,getIssuesForChart:l,getProjects:o,getVersions:a,getCustomQueries:h,getIssuesByQueryId:y,getRedmineEndpoint:b,getRedmineRedirectEndpoint:w,getTrackers:k,getMyIssues:j}}angular.module("adf.widget.redmine",["adf.provider","chart.js","ui.bootstrap.datepicker"]).constant("redmineEndpoint","http://192.168.56.2/redmine/").constant("redmineRedirectEndpoint",null).config(["dashboardProvider",function(e){var t="Redmine";s(e,"redmine-my-issues","My Redmine Issues",t,!1),r(e,"redmine-custom-queries","Redmine Custom Queries",t,!1),o(e,"redmine-chart","Redmine Chart",t,!1)}]),angular.module("adf.widget.easyredmine",["adf.provider","chart.js","ui.bootstrap.datepicker"]).constant("easyRedmineEndpoint","http://192.168.56.2/easyredmine/").constant("easyRedmineRedirectEndpoint",null).config(["dashboardProvider",function(e){var t="EasyRedmine";s(e,"easyredmine-my-issues","My EasyRedmine Issues",t,!0),r(e,"easyredmine-custom-queries","EasyRedmine Custom Queries",t,!0),o(e,"easyredmine-chart","EasyRedmine Chart",t,!0)}]),angular.module("adf.widget.easyredmine").run(["$templateCache",function(e){e.put("{widgetsPath}/redmine/src/main/chart/view.html",'
    Please configure the widget
    '),e.put("{widgetsPath}/redmine/src/main/issues/view.html",'
    Please configure the widget
    No issues found
    ID ↓TrackerStatusPrioritySubjectAssignee
    #{{issue.id}}{{issue.tracker.name}}{{issue.status.name}}{{issue.priority.name}}{{issue.subject}}{{issue.assigned_to.name}}
    '),e.put("{widgetsPath}/redmine/src/main/chart/edit/edit.html",'

    Show ideal line

    '),e.put("{widgetsPath}/redmine/src/main/issues/edit/edit.html",'
    Show closed issues
  • {{entry.name}}
  • ')}]),angular.module("adf.widget.redmine").run(["$templateCache",function(e){e.put("{widgetsPath}/redmine/src/main/chart/view.html",'
    Please configure the widget
    '),e.put("{widgetsPath}/redmine/src/main/issues/view.html",'
    Please configure the widget
    No issues found
    ID ↓TrackerStatusPrioritySubjectAssignee
    #{{issue.id}}{{issue.tracker.name}}{{issue.status.name}}{{issue.priority.name}}{{issue.subject}}{{issue.assigned_to.name}}
    '),e.put("{widgetsPath}/redmine/src/main/chart/edit/edit.html",'

    Show ideal line

    '),e.put("{widgetsPath}/redmine/src/main/issues/edit/edit.html",'
    Show closed issues
  • {{entry.name}}
  • ')}]),angular.module("adf.widget.redmine").controller("editIssuesController",["projects","config","redmineService",function(e,t,n){return a(this,e,t,n)}]),angular.module("adf.widget.easyredmine").controller("easyEditIssuesController",["projects","config","easyRedmineService",function(e,t,n){return a(this,e,t,n)}]),angular.module("adf.widget.redmine").controller("editChartController",["projects","config","chartDataService","redmineService",function(e,t,n,i){function r(e){"version"===e?m.config.filterWithVersion=!0:"assigned"===e?m.config.filterWithAssigned=!0:"tracker"===e&&(m.config.filterWithTracker=!0),m.filterToAdd="none"}function s(){m.config.timespan.fromDateTime&&(m.config.timespan.fromDateTime=new Date(m.config.timespan.fromDateTime),m.config.timespan.toDateTime=new Date(m.config.timespan.toDateTime))}function o(){m.inlineOptions.minDate=m.inlineOptions.minDate?null:new Date,m.dateOptions.minDate=m.inlineOptions.minDate}function a(){if(m.config.project){if("All"===m.config.project)return void(m.versions=[]);i.getVersions(angular.fromJson(m.config.project).identifier).then(function(e){m.versions=e})}}function c(){m.config.filterWithVersion&&m.updateVersions()}function l(){m.config.timespan.toDateTime=new Date(angular.fromJson(m.config.version).due_date);var e=new Date(m.config.timespan.toDateTime);m.config.timespan.fromDateTime=e.setDate(e.getDate()-14)}function u(){i.getTrackers().then(function(e){m.trackers=e})}function d(e){var t=e.date,n=e.mode;if("day"===n)for(var i=new Date(t).setHours(0,0,0,0),r=0;r angular - .module('adfWidgetSample', ['adf', 'adf.widget.redmine', 'LocalStorageModule']) - .config(function(dashboardProvider, localStorageServiceProvider){ - localStorageServiceProvider.setPrefix('adf.redmine'); - dashboardProvider.structure('1', { + .module('adfWidgetSample', ['adf', 'adf.widget.redmine', 'adf.widget.easyredmine', 'LocalStorageModule']) + .config(function(dashboardProvider, localStorageServiceProvider){ + localStorageServiceProvider.setPrefix('adf.redmine'); + dashboardProvider.structure('1', { rows: [{ columns: [{ styleClass: 'col-md-12', @@ -61,29 +61,29 @@ }] }] }) - .structure('4-8', { - rows: [{ - columns: [{ - styleClass: 'col-md-4', - widgets: [] - }, { - styleClass: 'col-md-8', - widgets: [] + .structure('4-8', { + rows: [{ + columns: [{ + styleClass: 'col-md-4', + widgets: [] + }, { + styleClass: 'col-md-8', + widgets: [] + }] }] - }] - }) - }).controller('dashboardController', function($scope, localStorageService){ - var model = localStorageService.get('widgetSampleDashboard'); - if (!model){ - model = {}; - } - $scope.dashboard = { - model: model - }; - $scope.$on('adfDashboardChanged', function (event, name, model) { - localStorageService.set(name, model); - }); - }); + }) + }).controller('dashboardController', function($scope, localStorageService){ + var model = localStorageService.get('widgetSampleDashboard'); + if (!model){ + model = {}; + } + $scope.dashboard = { + model: model + }; + $scope.$on('adfDashboardChanged', function (event, name, model) { + localStorageService.set(name, model); + }); + }); diff --git a/src/main/chart/chartController.js b/src/main/chart/chartController.js index ea4b9c0..ce6cc02 100644 --- a/src/main/chart/chartController.js +++ b/src/main/chart/chartController.js @@ -1,60 +1,66 @@ 'use strict'; -angular.module('adf.widget.redmine') - .controller('ChartController', function (chartData, config) { - - var vm = this; - vm.config = config; - var options = { - scales: { - yAxes: [ - { - id: 'y-axis-1', +function createChartController(vm, chartData, config) { + vm.config = config; + var options = { + scales: { + yAxes: [ + { + id: 'y-axis-1', + display: true, + position: 'left', + scaleLabel: { display: true, - position: 'left', - scaleLabel: { - display: true, - labelString: 'Open Issues' - } + labelString: 'Open Issues' } - ], - xAxes: [ - { - id: 'x-axis-1', - type: 'time', time: { - displayFormats: { - day: 'D.MMM', - week: 'D.MMM', - month: 'MMM/YY', - quarter: '[Q]Q - YYYY', - year: 'YYYY' - } + } + ], + xAxes: [ + { + id: 'x-axis-1', + type: 'time', time: { + displayFormats: { + day: 'D.MMM', + week: 'D.MMM', + month: 'MMM/YY', + quarter: '[Q]Q - YYYY', + year: 'YYYY' } } - ] - }, - legend: { - display: true, - position: "bottom" - }, - responsive: true - }; + } + ] + }, + legend: { + display: true, + position: "bottom" + }, + responsive: true + }; - vm.chart = { - data: chartData, - series: [], - class: "chart-line", - options: options - }; + vm.chart = { + data: chartData, + series: [], + class: "chart-line", + options: options + }; - if (vm.config.project && vm.config.project !== 'All') { - vm.chart.series.push(angular.fromJson(vm.config.project).name); - } else { - vm.chart.series.push("All Projects"); - } + if (vm.config.project && vm.config.project !== 'All') { + vm.chart.series.push(angular.fromJson(vm.config.project).name); + } else { + vm.chart.series.push("All Projects"); + } - if (vm.config.showIdeal) { - vm.chart.series.push("Ideal"); - } + if (vm.config.showIdeal) { + vm.chart.series.push("Ideal"); + } +} + +angular.module('adf.widget.redmine') + .controller('chartController', function (chartData, config) { + return createChartController(this, chartData, config); + }); +angular.module('adf.widget.easyredmine') + .controller('easyChartController', function (chartData, config) { + return createChartController(this, chartData, config); }); diff --git a/src/main/chart/edit/editChartController.js b/src/main/chart/edit/editChartController.js index 9a28855..37ed751 100644 --- a/src/main/chart/edit/editChartController.js +++ b/src/main/chart/edit/editChartController.js @@ -1,136 +1,139 @@ 'use strict'; -angular.module('adf.widget.redmine') - .controller('editChartController', function (projects, config, chartDataService, redmineService) { - var vm = this; - vm.config = config; - vm.projects = projects; - // functions - vm.addFilter = addFilter; - vm.converStringsToDateObjects = converStringsToDateObjects; - vm.toggleMin = toggleMin; - vm.open1 = function () { - vm.popup1.opened = true; +function createEditChartController(vm, projects, config, chartDataService, apiService) { + vm.config = config; + vm.projects = projects; + // functions + vm.addFilter = addFilter; + vm.converStringsToDateObjects = converStringsToDateObjects; + vm.toggleMin = toggleMin; + vm.open1 = function () { + vm.popup1.opened = true; + }; + + vm.open2 = function () { + vm.popup2.opened = true; + }; + vm.updateVersions = updateVersions; + vm.checkUpdates = checkUpdates; + vm.updateVersionEnd = updateVersionEnd; + vm.updateTracker = updateTracker; + + // init stuff + vm.filters = [ + {id: 'version', name: 'Fixed Version'}, + {id: 'assigned', name: 'Assigned to'}, + {id: 'tracker', name: 'Tracker'} + ] + + if (!vm.config.timespan) { + vm.config.timespan = {}; + } + + vm.inlineOptions = { + customClass: getDayClass, + minDate: new Date(), + showWeeks: true + }; + + if (!vm.dateOptions) { + vm.dateOptions = { + formatYear: 'yy', + startingDay: 1 }; - - vm.open2 = function () { - vm.popup2.opened = true; - }; - vm.updateVersions = updateVersions; - vm.checkUpdates = checkUpdates; - vm.updateVersionEnd = updateVersionEnd; - vm.updateTracker = updateTracker; - - // init stuff - vm.filters = [ - { id: 'version', name: 'Fixed Version' }, - { id: 'assigned', name: 'Assigned to' }, - { id: 'tracker', name: 'Tracker' } - ] - - if (!vm.config.timespan) { - vm.config.timespan = {}; - } - - vm.inlineOptions = { - customClass: getDayClass, - minDate: new Date(), - showWeeks: true - }; - - if (!vm.dateOptions) { - vm.dateOptions = { - formatYear: 'yy', - startingDay: 1 - }; - } - - - vm.formats = ['yyyy-MM-dd', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate']; - vm.format = vm.formats[0]; - vm.altInputFormats = ['M!/d!/yyyy']; - - vm.popup1 = { - opened: false - }; - - vm.popup2 = { - opened: false - }; - - // calls - vm.toggleMin(); - vm.converStringsToDateObjects(); - - function addFilter(filter) { - if (filter === 'version') { - vm.config.filterWithVersion = true; - } else if (filter === 'assigned') { - vm.config.filterWithAssigned = true; - } else if (filter === 'tracker') { - vm.config.filterWithTracker = true; - } - vm.filterToAdd = 'none'; + } + + vm.formats = ['yyyy-MM-dd', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate']; + vm.format = vm.formats[0]; + vm.altInputFormats = ['M!/d!/yyyy']; + + vm.popup1 = { + opened: false + }; + + vm.popup2 = { + opened: false + }; + + // calls + vm.toggleMin(); + vm.converStringsToDateObjects(); + + function addFilter(filter) { + if (filter === 'version') { + vm.config.filterWithVersion = true; + } else if (filter === 'assigned') { + vm.config.filterWithAssigned = true; + } else if (filter === 'tracker') { + vm.config.filterWithTracker = true; } + vm.filterToAdd = 'none'; + } - function converStringsToDateObjects() { - if (vm.config.timespan.fromDateTime) { - vm.config.timespan.fromDateTime = new Date(vm.config.timespan.fromDateTime); - vm.config.timespan.toDateTime = new Date(vm.config.timespan.toDateTime); - } - } - - function toggleMin() { - vm.inlineOptions.minDate = vm.inlineOptions.minDate ? null : new Date(); - vm.dateOptions.minDate = vm.inlineOptions.minDate; - } - - function updateVersions() { - if (vm.config.project) { - if (vm.config.project === 'All') { - vm.versions = []; - return; - } - redmineService.getVersions(angular.fromJson(vm.config.project).identifier).then(function (versions) { - vm.versions = versions; - }); - } + function converStringsToDateObjects() { + if (vm.config.timespan.fromDateTime) { + vm.config.timespan.fromDateTime = new Date(vm.config.timespan.fromDateTime); + vm.config.timespan.toDateTime = new Date(vm.config.timespan.toDateTime); } - - function checkUpdates() { - if (vm.config.filterWithVersion) { - vm.updateVersions(); + } + + function toggleMin() { + vm.inlineOptions.minDate = vm.inlineOptions.minDate ? null : new Date(); + vm.dateOptions.minDate = vm.inlineOptions.minDate; + } + + function updateVersions() { + if (vm.config.project) { + if (vm.config.project === 'All') { + vm.versions = []; + return; } - } - - function updateVersionEnd() { - vm.config.timespan.toDateTime = new Date(angular.fromJson(vm.config.version).due_date); - var date = new Date(vm.config.timespan.toDateTime); - vm.config.timespan.fromDateTime = date.setDate(date.getDate() - 14); - } - - function updateTracker() { - redmineService.getTrackers().then(function (trackers) { - vm.trackers = trackers; + apiService.getVersions(angular.fromJson(vm.config.project).identifier).then(function (versions) { + vm.versions = versions; }); } + } - function getDayClass(data) { - var date = data.date, - mode = data.mode; - if (mode === 'day') { - var dayToCheck = new Date(date).setHours(0, 0, 0, 0); - - for (var i = 0; i < vm.events.length; i++) { - var currentDay = new Date(vm.events[i].date).setHours(0, 0, 0, 0); - - if (dayToCheck === currentDay) { - return vm.events[i].status; - } + function checkUpdates() { + if (vm.config.filterWithVersion) { + vm.updateVersions(); + } + } + + function updateVersionEnd() { + vm.config.timespan.toDateTime = new Date(angular.fromJson(vm.config.version).due_date); + var date = new Date(vm.config.timespan.toDateTime); + vm.config.timespan.fromDateTime = date.setDate(date.getDate() - 14); + } + + function updateTracker() { + apiService.getTrackers().then(function (trackers) { + vm.trackers = trackers; + }); + } + + function getDayClass(data) { + var date = data.date, + mode = data.mode; + if (mode === 'day') { + var dayToCheck = new Date(date).setHours(0, 0, 0, 0); + + for (var i = 0; i < vm.events.length; i++) { + var currentDay = new Date(vm.events[i].date).setHours(0, 0, 0, 0); + + if (dayToCheck === currentDay) { + return vm.events[i].status; } } - return ''; } + return ''; + } +} - }); +angular.module('adf.widget.redmine').controller('editChartController', function (projects, config, chartDataService, redmineService) { + return createEditChartController(this, projects, config, chartDataService, redmineService); +}); +angular.module('adf.widget.easyredmine').controller('easyEditChartController', function (projects, config, easyChartDataService, easyRedmineService) { + return createEditChartController(this, projects, config, easyChartDataService, easyRedmineService); +}); diff --git a/src/main/chart/service.js b/src/main/chart/service.js index 9909fd6..97ea763 100644 --- a/src/main/chart/service.js +++ b/src/main/chart/service.js @@ -1,68 +1,76 @@ 'use strict'; -angular.module('adf.widget.redmine') - .factory('chartDataService', function ($q, redmineService) { - - function moveNewOpenIssues(allIssues, openIssues, date) { - for (var i = 0; i < allIssues.length; i++) { - var createDate = new Date(allIssues[i].created_on); - if (createDate.getTime() <= date.getTime()) { - openIssues.push(allIssues[i]); - allIssues.splice(i, 1); - i--; - } +function createChartDataService($q, apiService) { + function moveNewOpenIssues(allIssues, openIssues, date) { + for (var i = 0; i < allIssues.length; i++) { + var createDate = new Date(allIssues[i].created_on); + if (createDate.getTime() <= date.getTime()) { + openIssues.push(allIssues[i]); + allIssues.splice(i, 1); + i--; } } + } - function removeNewClosedIssues(openIssues, date) { - for (var i = 0; i < openIssues.length; i++) { - if (openIssues[i].closed_on) { - var closeDate = new Date(openIssues[i].closed_on); - if (closeDate.getTime() <= date.getTime()) { - openIssues.splice(i, 1); - i--; - } + function removeNewClosedIssues(openIssues, date) { + for (var i = 0; i < openIssues.length; i++) { + if (openIssues[i].closed_on) { + var closeDate = new Date(openIssues[i].closed_on); + if (closeDate.getTime() <= date.getTime()) { + openIssues.splice(i, 1); + i--; } } } + } - function calculateOpenIssuesPerDay(from, to, issues, config) { - var timeDiff = Math.abs(from.getTime() - to.getTime()); - var pointThinningRate = timeDiff / config.numberPoints; - var numberAllIssues = issues.length; - var idealIssuesPerInterval = numberAllIssues / timeDiff; - var idealData = []; - var openIssues = []; - var values = []; - while ((from.getTime() <= to.getTime())) { - moveNewOpenIssues(issues, openIssues, from); - removeNewClosedIssues(openIssues, from); - var value = {x: from.toISOString(),y:openIssues.length}; - values.push(value); - if (config.showIdeal) { - var idealValue = Math.round((numberAllIssues - idealData.length * idealIssuesPerInterval * pointThinningRate)*100)/100; - var ideal = {x: from.toISOString(),y:idealValue}; - idealData.push(ideal); - } - from.setTime(from.getTime() + pointThinningRate); - } - var valueSets = [values]; + function calculateOpenIssuesPerDay(from, to, issues, config) { + var timeDiff = Math.abs(from.getTime() - to.getTime()); + var pointThinningRate = timeDiff / config.numberPoints; + var numberAllIssues = issues.length; + var idealIssuesPerInterval = numberAllIssues / timeDiff; + var idealData = []; + var openIssues = []; + var values = []; + while ((from.getTime() <= to.getTime())) { + moveNewOpenIssues(issues, openIssues, from); + removeNewClosedIssues(openIssues, from); + var value = {x: from.toISOString(), y: openIssues.length}; + values.push(value); if (config.showIdeal) { - valueSets.push(idealData); + var idealValue = Math.round((numberAllIssues - idealData.length * idealIssuesPerInterval * pointThinningRate) * 100) / 100; + var ideal = {x: from.toISOString(), y: idealValue}; + idealData.push(ideal); } - return valueSets; + from.setTime(from.getTime() + pointThinningRate); } - - function getChartData(config) { - return redmineService.getIssuesForChart(config).then(function (issues) { - config.numberPoints = 50; - var from = new Date(config.timespan.fromDateTime); - var to = new Date(config.timespan.toDateTime); - return calculateOpenIssuesPerDay(from, to, issues, config); - }); + var valueSets = [values]; + if (config.showIdeal) { + valueSets.push(idealData); } + return valueSets; + } + + function getChartData(config) { + return apiService.getIssuesForChart(config).then(function (issues) { + config.numberPoints = 50; + var from = new Date(config.timespan.fromDateTime); + var to = new Date(config.timespan.toDateTime); + return calculateOpenIssuesPerDay(from, to, issues, config); + }); + } + + return { + getChartData: getChartData + }; +} + +angular.module('adf.widget.redmine') + .factory('chartDataService', function ($q, redmineService) { + return createChartDataService($q, redmineService); + }); - return { - getChartData: getChartData - }; +angular.module('adf.widget.easyredmine') + .factory('easyChartDataService', function ($q, easyRedmineService) { + return createChartDataService($q, easyRedmineService); }); diff --git a/src/main/issues/edit/easyedit.html b/src/main/issues/edit/easyedit.html new file mode 100644 index 0000000..3d08d26 --- /dev/null +++ b/src/main/issues/edit/easyedit.html @@ -0,0 +1,32 @@ +
    +
    + + +
    +
    + + + +
    +
    + + Show closed issues +
    +
    + +
  • + + {{entry.name}} +
  • +
    +
    diff --git a/src/main/issues/edit/editIssuesController.js b/src/main/issues/edit/editIssuesController.js index 36da1f5..275b17a 100644 --- a/src/main/issues/edit/editIssuesController.js +++ b/src/main/issues/edit/editIssuesController.js @@ -1,33 +1,33 @@ 'use strict'; -angular.module('adf.widget.redmine') - .controller('editIssuesController', function(projects, config, redmineService){ - var vm = this; - - vm.possibleColumns = { - 'id':{'name':'ID', 'show': true}, - 'tracker':{'name':'Tracker','show': true}, - 'status':{'name':'Status','show': true}, - 'subject':{'name':'Subject','show': true}, - 'assignee':{'name':'Assignee','show': true}, - 'priority':{'name':'Priority','show': true} - }; +function createEditIssueController(vm, projects, customQueries, config){ + vm.possibleColumns = { + 'id':{'name':'ID', 'show': true}, + 'tracker':{'name':'Tracker','show': true}, + 'status':{'name':'Status','show': true}, + 'subject':{'name':'Subject','show': true}, + 'assignee':{'name':'Assignee','show': true}, + 'priority':{'name':'Priority','show': true} + }; - redmineService.getCustomQueries().then(function(data){ - if (data && data.queries){ - vm.customQueries = data.queries; - }else{ - vm.customQueries = null; - } - }); + if(angular.equals({},config)) { + config.columns=vm.possibleColumns; + config.customQuery=''; + config.project=''; + config.assigned_to_id='me'; + config.showClosed=false; + } + vm.projects = projects; + vm.customQueries = customQueries; +} - if(angular.equals({},config)) { - config.columns=vm.possibleColumns; - config.project=''; - config.assigned_to_id='me'; - config.showClosed=false; - } +angular.module('adf.widget.redmine') + .controller('editIssuesController', function (projects, customQueries, config) { + return createEditIssueController(this, projects, customQueries, config); + }); - vm.projects = projects; +angular.module('adf.widget.easyredmine') + .controller('easyEditIssuesController', function (projects, customQueries, config) { + return createEditIssueController(this, projects, customQueries, config); }); diff --git a/src/main/issues/issueController.js b/src/main/issues/issueController.js index 6b6dae6..361f528 100644 --- a/src/main/issues/issueController.js +++ b/src/main/issues/issueController.js @@ -1,45 +1,52 @@ 'use strict'; -angular.module('adf.widget.redmine') - .controller('IssueController', function (issues, config, redmineService) { - var vm = this; +function createIssueController(vm, issues, config, apiService) { + if (config) { + vm.config = config; + } + + if (!config.columns) { + vm.config = { + columns: { + 'id': {'name': 'ID', 'show': true}, + 'tracker': {'name': 'Tracker', 'show': true}, + 'status': {'name': 'Status', 'show': true}, + 'subject': {'name': 'Subject', 'show': true}, + 'assignee': {'name': 'Assignee', 'show': false}, + 'priority': {'name': 'Priority', 'show': true} + }, + assigned_to_id: 'me' + }; + } - if (config){ - vm.config = config; + if (issues) { + vm.issues = issues; + if (issues.issues) { + vm.issues = vm.issues.issues; } + } - if (!config.columns){ - vm.config = { - columns: { - 'id':{'name':'ID', 'show': true}, - 'tracker':{'name':'Tracker','show': true}, - 'status':{'name':'Status','show': true}, - 'subject':{'name':'Subject','show': true}, - 'assignee':{'name':'Assignee','show': false}, - 'priority':{'name':'Priority','show': true} - }, - assigned_to_id: 'me' - }; - } + var redirectEndpoint = apiService.getRedmineRedirectEndpoint(); + if (!redirectEndpoint) { + redirectEndpoint = apiService.getRedmineEndpoint(); + } + vm.issueUrl = redirectEndpoint + 'issues/'; - if (issues){ - vm.issues = issues; - if (issues.issues){ - vm.issues = vm.issues.issues; - } - } + vm.order = 'id'; - var redirectEndpoint = redmineService.getRedmineRedirectEndpoint(); - if (!redirectEndpoint) { - redirectEndpoint = redmineService.getRedmineEndpoint(); - } - vm.issueUrl = redirectEndpoint + 'issues/'; + vm.changeOrder = function (order) { + vm.order = order; + vm.reverse = !vm.reverse; + }; - vm.order = 'id'; +} - vm.changeOrder = function(order){ - vm.order = order; - vm.reverse = !vm.reverse; - }; +angular.module('adf.widget.redmine') + .controller('issueController', function (issues, config, redmineService) { + return createIssueController(this, issues, config, redmineService); + }); +angular.module('adf.widget.easyredmine') + .controller('easyIssueController', function (issues, config, easyRedmineService) { + return createIssueController(this, issues, config, easyRedmineService); }); diff --git a/src/main/redmine.js b/src/main/redmine.js index b3aeda7..8c2110f 100644 --- a/src/main/redmine.js +++ b/src/main/redmine.js @@ -1,86 +1,146 @@ 'use strict'; -angular.module('adf.widget.redmine', ['adf.provider', 'chart.js', 'ui.bootstrap.datepicker']) - .constant('redmineEndpoint', 'http://localhost:3000/') - .config(function (dashboardProvider) { - var category = 'Redmine'; - - var editIssues = { - templateUrl: '{widgetsPath}/redmine/src/main/issues/edit/edit.html', - controller: 'editIssuesController', - controllerAs: 'vm', - resolve: { - /** @ngInject **/ - projects: function (redmineService) { +function createCustomQueriesEditController(isEasy) { + return { + templateUrl: isEasy ? '{widgetsPath}/redmine/src/main/issues/edit/easyedit.html' : '{widgetsPath}/redmine/src/main/issues/edit/edit.html', + controller: isEasy ? 'easyEditIssuesController' : 'editIssuesController', + controllerAs: 'vm', + resolve: { + /** @ngInject **/ + projects: function (redmineService, easyRedmineService) { + if (isEasy) { + return easyRedmineService.getProjects(); + } else { return redmineService.getProjects(); } + }, + /** @ngInject **/ + customQueries: function (redmineService, easyRedmineService) { + if (isEasy) { + return easyRedmineService.getCustomQueries().then(function (data){ + return data.easy_queries; + }); + } else { + return redmineService.getCustomQueries().then(function (data){ + return data.queries; + }); + } } - }; + } + }; +} - var editChart = { - templateUrl: '{widgetsPath}/redmine/src/main/chart/edit/edit.html', - controller: 'editChartController', - controllerAs: 'vm', - resolve: { - /** @ngInject **/ - projects: function (redmineService) { +function createChartEditController(isEasy) { + return { + templateUrl: '{widgetsPath}/redmine/src/main/chart/edit/edit.html', + controller: isEasy ? 'easyEditChartController' : 'editChartController', + controllerAs: 'vm', + resolve: { + /** @ngInject **/ + projects: function (redmineService, easyRedmineService) { + if (isEasy) { + return easyRedmineService.getProjects(); + } else { return redmineService.getProjects(); } } - }; + } + }; +} - dashboardProvider - .widget('redmine-custom-queries', { - title: 'Redmine Custom Queries', - description: 'Displays Issues from a Custom Query', - category: category, - templateUrl: '{widgetsPath}/redmine/src/main/issues/view.html', - controller: 'IssueController', - controllerAs: 'vm', - resolve: { - /** @ngInject **/ - issues: function (redmineService, config) { - if(config.customQuery){ +function createCustomQueriesWidget(dashboardProvider, widgetID, title, category, isEasy) { + dashboardProvider + .widget(widgetID, { + title: title, + description: 'Displays issues from a custom query', + category: category, + templateUrl: '{widgetsPath}/redmine/src/main/issues/view.html', + controller: isEasy ? 'easyIssueController' : 'issueController', + controllerAs: 'vm', + resolve: { + /** @ngInject **/ + issues: function (redmineService, easyRedmineService, config) { + if (config.customQuery) { + if (isEasy) { + return easyRedmineService.getIssuesByQueryId(config.customQuery.id, config.project.id); + } else { return redmineService.getIssuesByQueryId(config.customQuery.id, config.customQuery.project_id); } - } - }, - edit: editIssues - }); + } + }, + edit: createCustomQueriesEditController(isEasy) + }); +} - dashboardProvider - .widget('redmine-my-issues', { - title: 'My Redmine Issues', - description: 'Displays all issues assigned to me', - category: category, - templateUrl: '{widgetsPath}/redmine/src/main/issues/view.html', - controller: 'IssueController', - controllerAs: 'vm', - resolve: { - /** @ngInject **/ - issues: function (redmineService) { - return redmineService.getMyIssues(); +function createMyIssuesWidget(dashboardProvider, widgetID, title, category, isEasy) { + dashboardProvider + .widget(widgetID, { + title: title, + description: 'Displays all issues assigned to me', + category: category, + templateUrl: '{widgetsPath}/redmine/src/main/issues/view.html', + controller: isEasy ? 'easyIssueController' : 'issueController', + controllerAs: 'vm', + resolve: { + /** @ngInject **/ + issues: function (redmineService, easyRedmineService) { + if (isEasy) { + return easyRedmineService.getMyIssues(); + } else { + return redmineService.getMyIssues(); } } - }); - // widget is currently broken - dashboardProvider - .widget('redmine-chart', { - title: 'Redmine Chart', - description: 'Displays a burnup or burndown chart', - category: category, - templateUrl: '{widgetsPath}/redmine/src/main/chart/view.html', - controller: 'ChartController', - controllerAs: 'vm', - resolve: { - chartData: function (chartDataService, config) { - if(config.project) { - return chartDataService.getChartData(config); + } + }); +} + +function createChartWidget(dashboardProvider, widgetID, title, category, isEasy) { + dashboardProvider + .widget(widgetID, { + title: title, + description: 'Displays a burnup or burndown chart', + category: category, + templateUrl: '{widgetsPath}/redmine/src/main/chart/view.html', + controller: isEasy ? 'easyChartController' : 'chartController', + controllerAs: 'vm', + resolve: { + /** @ngInject **/ + chartData: function (chartDataService, easyChartDataService, config) { + if (config.project) { + if (isEasy) { + return easyChartDataService.getChartData(config); + } else { + return chartDataService.getChartData(config); } } - }, - edit: editChart - }); + } + }, + edit: createChartEditController(isEasy) + }); + +} + +angular.module('adf.widget.redmine', ['adf.provider', 'chart.js', 'ui.bootstrap.datepicker']) + .constant('redmineEndpoint', 'http://192.168.56.2/redmine/') + .constant('redmineRedirectEndpoint', null) + .config(function (dashboardProvider) { + var category = 'Redmine'; + + // Create widgets + createMyIssuesWidget(dashboardProvider, 'redmine-my-issues', 'My Issues', category, false); + createCustomQueriesWidget(dashboardProvider, 'redmine-custom-queries', 'Custom Queries', category, false); + createChartWidget(dashboardProvider, 'redmine-chart', 'Chart', category, false); + }); + +angular.module('adf.widget.easyredmine', ['adf.provider', 'chart.js', 'ui.bootstrap.datepicker']) + .constant('easyRedmineEndpoint', 'http://192.168.56.2/easyredmine/') + .constant('easyRedmineRedirectEndpoint', null) + .config(function (dashboardProvider) { + var category = 'EasyRedmine'; + // Create widgets + createMyIssuesWidget(dashboardProvider, 'easyredmine-my-issues', 'My Issues', category, true); + createCustomQueriesWidget(dashboardProvider, 'easyredmine-custom-queries', 'Custom Queries', category, true); + createChartWidget(dashboardProvider, 'easyredmine-chart', 'Chart', category, true); }); diff --git a/src/main/service.js b/src/main/service.js index 5d22133..156ab1e 100644 --- a/src/main/service.js +++ b/src/main/service.js @@ -1,175 +1,184 @@ 'use strict'; -angular.module('adf.widget.redmine') - .factory('redmineService', function ($http, redmineEndpoint, redmineRedirectEndpoint, $q) { - - function extractData(response) { - return response.data; - } - - function request(param) { - return $http.get(redmineEndpoint + param).then(extractData); - } - - function getProjects() { - return request('projects.json').then(function (data) { - return data.projects; - }); - } - - function getVersions(project) { - return request('projects/' + project + '/versions.json').then(function (data) { - return data.versions; - }); - } - - function getIssues(config) { - var params = generateGeneralIssuesParameters(config); - var limit = config.limit ? config.limit : Number.MAX_SAFE_INTEGER; - return getIssuesWithParamsAndLimit(params, limit); - } - - function getIssuesForChart(config) { - var allIssues = []; - var limit = config.limit ? config.limit : Number.MAX_SAFE_INTEGER; - var params1 = generateParametersForIssuesOpenOnEnd(config); - var params2 = generateParametersForIssuesClosedBetweenStartAndEnd(config); - var params3 = generateParametersForIssuesOpen(config); - return $q.all([getIssuesWithParamsAndLimit(params1, limit), getIssuesWithParamsAndLimit(params2, limit), - getIssuesWithParamsAndLimit(params3, limit)]).then(function(responses){ - angular.forEach(responses, function (issues) { - angular.forEach(issues, function (issue) { - allIssues.push(issue); - }); - }); - return allIssues; - }); - } - - function getIssuesWithParamsAndLimit(params, limit){ - var allIssues = []; - return collectPageIssues(params, 0).then(function (issues) { - angular.forEach(issues.issues, function (issue) { +function apiService($http, apiEndpoint, apiEndpointRedirect, $q) { + function extractData(response) { + return response.data; + } + + function request(param) { + return $http.get(apiEndpoint + param).then(extractData); + } + + function getProjects() { + return request('projects.json').then(function (data) { + return data.projects; + }); + } + + function getVersions(project) { + return request('projects/' + project + '/versions.json').then(function (data) { + return data.versions; + }); + } + + function getIssues(config) { + var params = generateGeneralIssuesParameters(config); + var limit = config.limit ? config.limit : Number.MAX_SAFE_INTEGER; + return getIssuesWithParamsAndLimit(params, limit); + } + + function getIssuesForChart(config) { + var allIssues = []; + var limit = config.limit ? config.limit : Number.MAX_SAFE_INTEGER; + var params1 = generateParametersForIssuesOpenOnEnd(config); + var params2 = generateParametersForIssuesClosedBetweenStartAndEnd(config); + var params3 = generateParametersForIssuesOpen(config); + return $q.all([getIssuesWithParamsAndLimit(params1, limit), getIssuesWithParamsAndLimit(params2, limit), + getIssuesWithParamsAndLimit(params3, limit)]).then(function (responses) { + angular.forEach(responses, function (issues) { + angular.forEach(issues, function (issue) { allIssues.push(issue); }); - var requests = []; - for (var i = 100; i < issues.total_count && i < limit; i = i + 100) { - requests.push(collectPageIssues(params, i)); - } - if (params.length > 0) { - return $q.all(requests).then(function (responses) { - angular.forEach(responses, function (response) { - angular.forEach(response.issues, function (issue) { - allIssues.push(issue); - }); - }); - return allIssues; - }); - } else { - return allIssues; - } }); - } - - function collectPageIssues(params, offset) { - return request('issues.json' + params + '&offset=' + offset).then(function (issues) { - return issues; + return allIssues; + }); + } + + function getIssuesWithParamsAndLimit(params, limit) { + var allIssues = []; + return collectPageIssues(params, 0).then(function (issues) { + angular.forEach(issues.issues, function (issue) { + allIssues.push(issue); }); - } - - function generateParametersForIssuesOpenOnEnd(data) { - var params = generateGeneralIssuesParameters(data); - params += '&status_id=*'; - var toDate = new Date(data.timespan.toDateTime); - params += '&created_on=<=' + dateToYMD(toDate); - params += '&closed_on=>=' + dateToYMD(toDate); - return params; - } - - function generateParametersForIssuesOpen(data) { - var params = generateGeneralIssuesParameters(data); - params += '&status_id=open'; - var toDate = new Date(data.timespan.toDateTime); - params += '&created_on=<=' + dateToYMD(toDate); - return params; - } - - function generateParametersForIssuesClosedBetweenStartAndEnd(data) { - var params = generateGeneralIssuesParameters(data); - params += '&status_id=*'; - var fromDate = new Date(data.timespan.fromDateTime); - var toDate = new Date(data.timespan.toDateTime); - params += '&closed_on=><' + dateToYMD(fromDate) + '|' + dateToYMD(toDate); - return params; - } - - function generateGeneralIssuesParameters(data) { - var params = '?limit=100&sort=created_on'; - if (data.project && data.project !== "All") { - params += '&project_id=' + angular.fromJson(data.project).id; + var requests = []; + for (var i = 100; i < issues.total_count && i < limit; i = i + 100) { + requests.push(collectPageIssues(params, i)); } - if (data.filterWithAssigned && data.assigned_to_id) { - params += '&assigned_to_id=' + data.assigned_to_id; - } - if (data.showClosed) { - params += '&status_id=*'; - } - if (data.filterWithVersion && data.version) { - params += '&fixed_version_id=' + angular.fromJson(data.version).id; - } - if (data.filterWithTracker && data.tracker) { - params += '&tracker_id='+angular.fromJson(data.tracker).id; + if (params.length > 0) { + return $q.all(requests).then(function (responses) { + angular.forEach(responses, function (response) { + angular.forEach(response.issues, function (issue) { + allIssues.push(issue); + }); + }); + return allIssues; + }); + } else { + return allIssues; } - return params; - } - - function dateToYMD(date) { - var d = date.getDate(); - var m = date.getMonth() + 1; - var y = date.getFullYear(); - return '' + y + '-' + (m <= 9 ? '0' + m : m) + '-' + (d <= 9 ? '0' + d : d); - } - - function getCustomQueries() { - return request('queries.json?limit=100'); - } - - function getIssuesByQueryId(queryId, projectId) { - return request('issues.json?query_id=' + queryId + '&project_id=' + projectId).then(function(data){ - return data.issues; - }); - } - - function getRedmineEndpoint(){ - return redmineEndpoint; + }); + } + + function collectPageIssues(params, offset) { + return request('issues.json' + params + '&offset=' + offset).then(function (issues) { + return issues; + }); + } + + function generateParametersForIssuesOpenOnEnd(data) { + var params = generateGeneralIssuesParameters(data); + params += '&status_id=*'; + var toDate = new Date(data.timespan.toDateTime); + params += '&created_on=<=' + dateToYMD(toDate); + params += '&closed_on=>=' + dateToYMD(toDate); + return params; + } + + function generateParametersForIssuesOpen(data) { + var params = generateGeneralIssuesParameters(data); + params += '&status_id=open'; + var toDate = new Date(data.timespan.toDateTime); + params += '&created_on=<=' + dateToYMD(toDate); + return params; + } + + function generateParametersForIssuesClosedBetweenStartAndEnd(data) { + var params = generateGeneralIssuesParameters(data); + params += '&status_id=*'; + var fromDate = new Date(data.timespan.fromDateTime); + var toDate = new Date(data.timespan.toDateTime); + params += '&closed_on=><' + dateToYMD(fromDate) + '|' + dateToYMD(toDate); + return params; + } + + function generateGeneralIssuesParameters(data) { + var params = '?limit=100&sort=created_on'; + if (data.project && data.project !== "All") { + params += '&project_id=' + angular.fromJson(data.project).id; + } + if (data.filterWithAssigned && data.assigned_to_id) { + params += '&assigned_to_id=' + data.assigned_to_id; + } + if (data.showClosed) { + params += '&status_id=*'; } + if (data.filterWithVersion && data.version) { + params += '&fixed_version_id=' + angular.fromJson(data.version).id; + } + if (data.filterWithTracker && data.tracker) { + params += '&tracker_id=' + angular.fromJson(data.tracker).id; + } + return params; + } + + function dateToYMD(date) { + var d = date.getDate(); + var m = date.getMonth() + 1; + var y = date.getFullYear(); + return '' + y + '-' + (m <= 9 ? '0' + m : m) + '-' + (d <= 9 ? '0' + d : d); + } + + function getCustomQueries() { + return request('queries.json?limit=100'); + } + + function getIssuesByQueryId(queryId, projectId) { + return request('issues.json?query_id=' + queryId + '&project_id=' + projectId).then(function (data) { + return data.issues; + }); + } + + function getRedmineEndpoint() { + return apiEndpoint; + } + + function getRedmineRedirectEndpoint() { + return apiEndpointRedirect; + } + + function getTrackers() { + return request('trackers.json').then(function (data) { + return data.trackers; + }); + } + + function getMyIssues() { + return request('issues.json?assigned_to_id=me').then(function (data) { + return data; + }); + } + + return { + getIssues: getIssues, + getIssuesForChart: getIssuesForChart, + getProjects: getProjects, + getVersions: getVersions, + getCustomQueries: getCustomQueries, + getIssuesByQueryId: getIssuesByQueryId, + getRedmineEndpoint: getRedmineEndpoint, + getRedmineRedirectEndpoint: getRedmineRedirectEndpoint, + getTrackers: getTrackers, + getMyIssues: getMyIssues + }; +} - function getRedmineRedirectEndpoint(){ - return redmineRedirectEndpoint; - } - function getTrackers() { - return request('trackers.json').then(function (data) { - return data.trackers; - }); - } - - function getMyIssues(){ - return request('issues.json?assigned_to_id=me').then(function(data){ - return data; - }); - } +angular.module('adf.widget.redmine') + .factory('redmineService', function ($http, redmineEndpoint, redmineRedirectEndpoint, $q) { + return apiService($http, redmineEndpoint, redmineRedirectEndpoint, $q); + }); - return { - getIssues: getIssues, - getIssuesForChart: getIssuesForChart, - getProjects: getProjects, - getVersions: getVersions, - getCustomQueries: getCustomQueries, - getIssuesByQueryId: getIssuesByQueryId, - getRedmineEndpoint: getRedmineEndpoint, - getRedmineRedirectEndpoint: getRedmineRedirectEndpoint, - getTrackers: getTrackers, - getMyIssues : getMyIssues - }; +angular.module('adf.widget.easyredmine') + .factory('easyRedmineService', function ($http, easyRedmineEndpoint, easyRedmineRedirectEndpoint, $q) { + return apiService($http, easyRedmineEndpoint, easyRedmineRedirectEndpoint, $q); }); From ab2fc979e0dfc0b2931226095193ab4f2f1e749a Mon Sep 17 00:00:00 2001 From: Joshua Sprey Date: Tue, 15 Dec 2020 17:24:31 +0100 Subject: [PATCH 2/2] (#14) Remove chart widget for EasyRedmine --- dist/adf-widget-redmine.js | 4 ++-- dist/adf-widget-redmine.min.js | 2 +- src/main/redmine.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/adf-widget-redmine.js b/dist/adf-widget-redmine.js index 1932d5d..20df9d5 100644 --- a/dist/adf-widget-redmine.js +++ b/dist/adf-widget-redmine.js @@ -143,7 +143,7 @@ angular.module('adf.widget.easyredmine', ['adf.provider', 'chart.js', 'ui.bootst // Create widgets createMyIssuesWidget(dashboardProvider, 'easyredmine-my-issues', 'My Issues', category, true); createCustomQueriesWidget(dashboardProvider, 'easyredmine-custom-queries', 'Custom Queries', category, true); - createChartWidget(dashboardProvider, 'easyredmine-chart', 'Chart', category, true); + //createChartWidget(dashboardProvider, 'easyredmine-chart', 'Chart', category, true); }]); angular.module("adf.widget.easyredmine").run(["$templateCache", function($templateCache) {$templateCache.put("{widgetsPath}/redmine/src/main/chart/view.html","
    Please configure the widget
    "); @@ -711,4 +711,4 @@ angular.module('adf.widget.easyredmine') .factory('easyRedmineService', ["$http", "easyRedmineEndpoint", "easyRedmineRedirectEndpoint", "$q", function ($http, easyRedmineEndpoint, easyRedmineRedirectEndpoint, $q) { return apiService($http, easyRedmineEndpoint, easyRedmineRedirectEndpoint, $q); }]); -})(window); +})(window); \ No newline at end of file diff --git a/dist/adf-widget-redmine.min.js b/dist/adf-widget-redmine.min.js index 8864a30..98b1a87 100644 --- a/dist/adf-widget-redmine.min.js +++ b/dist/adf-widget-redmine.min.js @@ -1 +1 @@ -!function(e,t){"use strict";function n(e){return{templateUrl:"{widgetsPath}/redmine/src/main/issues/edit/edit.html",controller:e?"easyEditIssuesController":"editIssuesController",controllerAs:"vm",resolve:{projects:["redmineService","easyRedmineService",function(t,n){return e?n.getProjects():t.getProjects()}]}}}function i(e){return{templateUrl:"{widgetsPath}/redmine/src/main/chart/edit/edit.html",controller:e?"easyEditChartController":"editChartController",controllerAs:"vm",resolve:{projects:["redmineService","easyRedmineService",function(t,n){return e?n.getProjects():t.getProjects()}]}}}function r(e,t,i,r,s){e.widget(t,{title:i,description:"Displays Issues from a Custom Query",category:r,templateUrl:"{widgetsPath}/redmine/src/main/issues/view.html",controller:s?"easyIssueController":"issueController",controllerAs:"vm",resolve:{issues:["redmineService","easyRedmineService","config",function(e,t,n){if(n.customQuery)return s?t.getIssuesByQueryId(n.customQuery.id,n.customQuery.project_id):e.getIssuesByQueryId(n.customQuery.id,n.customQuery.project_id)}]},edit:n(s)})}function s(e,t,n,i,r){e.widget(t,{title:n,description:"Displays all issues assigned to me",category:i,templateUrl:"{widgetsPath}/redmine/src/main/issues/view.html",controller:r?"easyIssueController":"issueController",controllerAs:"vm",resolve:{issues:["redmineService","easyRedmineService",function(e,t){return r?t.getMyIssues():e.getMyIssues()}]}})}function o(e,t,n,r,s){e.widget(t,{title:n,description:"Displays a burnup or burndown chart",category:r,templateUrl:"{widgetsPath}/redmine/src/main/chart/view.html",controller:s?"easyChartController":"chartController",controllerAs:"vm",resolve:{chartData:["chartDataService","easyChartDataService","config",function(e,t,n){if(n.project)return s?t.getChartData(n):e.getChartData(n)}]},edit:i(s)})}function a(e,t,n,i){e.possibleColumns={id:{name:"ID",show:!0},tracker:{name:"Tracker",show:!0},status:{name:"Status",show:!0},subject:{name:"Subject",show:!0},assignee:{name:"Assignee",show:!0},priority:{name:"Priority",show:!0}},i.getCustomQueries().then(function(t){e.customQueries=null,t&&t.queries?e.customQueries=t.queries:t&&t.easy_queries&&(e.customQueries=t.easy_queries)}),angular.equals({},n)&&(n.columns=e.possibleColumns,n.project="",n.assigned_to_id="me",n.showClosed=!1),e.projects=t}function c(e,t,n,i){n&&(e.config=n),n.columns||(e.config={columns:{id:{name:"ID",show:!0},tracker:{name:"Tracker",show:!0},status:{name:"Status",show:!0},subject:{name:"Subject",show:!0},assignee:{name:"Assignee",show:!1},priority:{name:"Priority",show:!0}},assigned_to_id:"me"}),t&&(e.issues=t,t.issues&&(e.issues=e.issues.issues));var r=i.getRedmineRedirectEndpoint();r||(r=i.getRedmineEndpoint()),e.issueUrl=r+"issues/",e.order="id",e.changeOrder=function(t){e.order=t,e.reverse=!e.reverse}}function l(e,t){function n(e,t,n){for(var i=0;i0?i.all(s).then(function(e){return angular.forEach(e,function(e){angular.forEach(e.issues,function(e){n.push(e)})}),n}):n})}function d(e,t){return s("issues.json"+e+"&offset="+t).then(function(e){return e})}function m(e){var t=f(e);t+="&status_id=*";var n=new Date(e.timespan.toDateTime);return t+="&created_on=<="+v(n),t+="&closed_on=>="+v(n)}function g(e){var t=f(e);t+="&status_id=open";var n=new Date(e.timespan.toDateTime);return t+="&created_on=<="+v(n)}function p(e){var t=f(e);t+="&status_id=*";var n=new Date(e.timespan.fromDateTime),i=new Date(e.timespan.toDateTime);return t+="&closed_on=><"+v(n)+"|"+v(i)}function f(e){var t="?limit=100&sort=created_on";return e.project&&"All"!==e.project&&(t+="&project_id="+angular.fromJson(e.project).id),e.filterWithAssigned&&e.assigned_to_id&&(t+="&assigned_to_id="+e.assigned_to_id),e.showClosed&&(t+="&status_id=*"),e.filterWithVersion&&e.version&&(t+="&fixed_version_id="+angular.fromJson(e.version).id),e.filterWithTracker&&e.tracker&&(t+="&tracker_id="+angular.fromJson(e.tracker).id),t}function v(e){var t=e.getDate(),n=e.getMonth()+1,i=e.getFullYear();return""+i+"-"+(n<=9?"0"+n:n)+"-"+(t<=9?"0"+t:t)}function h(){return s("queries.json?limit=100")}function y(e,t){return s("issues.json?query_id="+e+"&project_id="+t).then(function(e){return e.issues})}function b(){return t}function w(){return n}function k(){return s("trackers.json").then(function(e){return e.trackers})}function j(){return s("issues.json?assigned_to_id=me").then(function(e){return e})}return{getIssues:c,getIssuesForChart:l,getProjects:o,getVersions:a,getCustomQueries:h,getIssuesByQueryId:y,getRedmineEndpoint:b,getRedmineRedirectEndpoint:w,getTrackers:k,getMyIssues:j}}angular.module("adf.widget.redmine",["adf.provider","chart.js","ui.bootstrap.datepicker"]).constant("redmineEndpoint","http://192.168.56.2/redmine/").constant("redmineRedirectEndpoint",null).config(["dashboardProvider",function(e){var t="Redmine";s(e,"redmine-my-issues","My Redmine Issues",t,!1),r(e,"redmine-custom-queries","Redmine Custom Queries",t,!1),o(e,"redmine-chart","Redmine Chart",t,!1)}]),angular.module("adf.widget.easyredmine",["adf.provider","chart.js","ui.bootstrap.datepicker"]).constant("easyRedmineEndpoint","http://192.168.56.2/easyredmine/").constant("easyRedmineRedirectEndpoint",null).config(["dashboardProvider",function(e){var t="EasyRedmine";s(e,"easyredmine-my-issues","My EasyRedmine Issues",t,!0),r(e,"easyredmine-custom-queries","EasyRedmine Custom Queries",t,!0),o(e,"easyredmine-chart","EasyRedmine Chart",t,!0)}]),angular.module("adf.widget.easyredmine").run(["$templateCache",function(e){e.put("{widgetsPath}/redmine/src/main/chart/view.html",'
    Please configure the widget
    '),e.put("{widgetsPath}/redmine/src/main/issues/view.html",'
    Please configure the widget
    No issues found
    ID ↓TrackerStatusPrioritySubjectAssignee
    #{{issue.id}}{{issue.tracker.name}}{{issue.status.name}}{{issue.priority.name}}{{issue.subject}}{{issue.assigned_to.name}}
    '),e.put("{widgetsPath}/redmine/src/main/chart/edit/edit.html",'

    Show ideal line

    '),e.put("{widgetsPath}/redmine/src/main/issues/edit/edit.html",'
    Show closed issues
  • {{entry.name}}
  • ')}]),angular.module("adf.widget.redmine").run(["$templateCache",function(e){e.put("{widgetsPath}/redmine/src/main/chart/view.html",'
    Please configure the widget
    '),e.put("{widgetsPath}/redmine/src/main/issues/view.html",'
    Please configure the widget
    No issues found
    ID ↓TrackerStatusPrioritySubjectAssignee
    #{{issue.id}}{{issue.tracker.name}}{{issue.status.name}}{{issue.priority.name}}{{issue.subject}}{{issue.assigned_to.name}}
    '),e.put("{widgetsPath}/redmine/src/main/chart/edit/edit.html",'

    Show ideal line

    '),e.put("{widgetsPath}/redmine/src/main/issues/edit/edit.html",'
    Show closed issues
  • {{entry.name}}
  • ')}]),angular.module("adf.widget.redmine").controller("editIssuesController",["projects","config","redmineService",function(e,t,n){return a(this,e,t,n)}]),angular.module("adf.widget.easyredmine").controller("easyEditIssuesController",["projects","config","easyRedmineService",function(e,t,n){return a(this,e,t,n)}]),angular.module("adf.widget.redmine").controller("editChartController",["projects","config","chartDataService","redmineService",function(e,t,n,i){function r(e){"version"===e?m.config.filterWithVersion=!0:"assigned"===e?m.config.filterWithAssigned=!0:"tracker"===e&&(m.config.filterWithTracker=!0),m.filterToAdd="none"}function s(){m.config.timespan.fromDateTime&&(m.config.timespan.fromDateTime=new Date(m.config.timespan.fromDateTime),m.config.timespan.toDateTime=new Date(m.config.timespan.toDateTime))}function o(){m.inlineOptions.minDate=m.inlineOptions.minDate?null:new Date,m.dateOptions.minDate=m.inlineOptions.minDate}function a(){if(m.config.project){if("All"===m.config.project)return void(m.versions=[]);i.getVersions(angular.fromJson(m.config.project).identifier).then(function(e){m.versions=e})}}function c(){m.config.filterWithVersion&&m.updateVersions()}function l(){m.config.timespan.toDateTime=new Date(angular.fromJson(m.config.version).due_date);var e=new Date(m.config.timespan.toDateTime);m.config.timespan.fromDateTime=e.setDate(e.getDate()-14)}function u(){i.getTrackers().then(function(e){m.trackers=e})}function d(e){var t=e.date,n=e.mode;if("day"===n)for(var i=new Date(t).setHours(0,0,0,0),r=0;r0?i.all(s).then(function(e){return angular.forEach(e,function(e){angular.forEach(e.issues,function(e){n.push(e)})}),n}):n})}function d(e,t){return s("issues.json"+e+"&offset="+t).then(function(e){return e})}function m(e){var t=f(e);t+="&status_id=*";var n=new Date(e.timespan.toDateTime);return t+="&created_on=<="+h(n),t+="&closed_on=>="+h(n)}function p(e){var t=f(e);t+="&status_id=open";var n=new Date(e.timespan.toDateTime);return t+="&created_on=<="+h(n)}function g(e){var t=f(e);t+="&status_id=*";var n=new Date(e.timespan.fromDateTime),i=new Date(e.timespan.toDateTime);return t+="&closed_on=><"+h(n)+"|"+h(i)}function f(e){var t="?limit=100&sort=created_on";return e.project&&"All"!==e.project&&(t+="&project_id="+angular.fromJson(e.project).id),e.filterWithAssigned&&e.assigned_to_id&&(t+="&assigned_to_id="+e.assigned_to_id),e.showClosed&&(t+="&status_id=*"),e.filterWithVersion&&e.version&&(t+="&fixed_version_id="+angular.fromJson(e.version).id),e.filterWithTracker&&e.tracker&&(t+="&tracker_id="+angular.fromJson(e.tracker).id),t}function h(e){var t=e.getDate(),n=e.getMonth()+1,i=e.getFullYear();return""+i+"-"+(n<=9?"0"+n:n)+"-"+(t<=9?"0"+t:t)}function v(){return s("queries.json?limit=100")}function y(e,t){return s("issues.json?query_id="+e+"&project_id="+t).then(function(e){return e.issues})}function b(){return t}function w(){return n}function k(){return s("trackers.json").then(function(e){return e.trackers})}function j(){return s("issues.json?assigned_to_id=me").then(function(e){return e})}return{getIssues:c,getIssuesForChart:l,getProjects:r,getVersions:a,getCustomQueries:v,getIssuesByQueryId:y,getRedmineEndpoint:b,getRedmineRedirectEndpoint:w,getTrackers:k,getMyIssues:j}}angular.module("adf.widget.redmine",["adf.provider","chart.js","ui.bootstrap.datepicker"]).constant("redmineEndpoint","http://192.168.56.2/redmine/").constant("redmineRedirectEndpoint",null).config(["dashboardProvider",function(e){var t="Redmine";s(e,"redmine-my-issues","My Issues",t,!1),o(e,"redmine-custom-queries","Custom Queries",t,!1),r(e,"redmine-chart","Chart",t,!1)}]),angular.module("adf.widget.easyredmine",["adf.provider","chart.js","ui.bootstrap.datepicker"]).constant("easyRedmineEndpoint","http://192.168.56.2/easyredmine/").constant("easyRedmineRedirectEndpoint",null).config(["dashboardProvider",function(e){var t="EasyRedmine";s(e,"easyredmine-my-issues","My Issues",t,!0),o(e,"easyredmine-custom-queries","Custom Queries",t,!0)}]),angular.module("adf.widget.easyredmine").run(["$templateCache",function(e){e.put("{widgetsPath}/redmine/src/main/chart/view.html",'
    Please configure the widget
    '),e.put("{widgetsPath}/redmine/src/main/issues/view.html",'
    Please configure the widget
    No issues found
    ID ↓TrackerStatusPrioritySubjectAssignee
    #{{issue.id}}{{issue.tracker.name}}{{issue.status.name}}{{issue.priority.name}}{{issue.subject}}{{issue.assigned_to.name}}
    '),e.put("{widgetsPath}/redmine/src/main/chart/edit/edit.html",'

    Show ideal line

    '),e.put("{widgetsPath}/redmine/src/main/issues/edit/easyedit.html",'
    Show closed issues
  • {{entry.name}}
  • '),e.put("{widgetsPath}/redmine/src/main/issues/edit/edit.html",'
    Show closed issues
  • {{entry.name}}
  • ')}]),angular.module("adf.widget.redmine").run(["$templateCache",function(e){e.put("{widgetsPath}/redmine/src/main/chart/view.html",'
    Please configure the widget
    '),e.put("{widgetsPath}/redmine/src/main/issues/view.html",'
    Please configure the widget
    No issues found
    ID ↓TrackerStatusPrioritySubjectAssignee
    #{{issue.id}}{{issue.tracker.name}}{{issue.status.name}}{{issue.priority.name}}{{issue.subject}}{{issue.assigned_to.name}}
    '),e.put("{widgetsPath}/redmine/src/main/chart/edit/edit.html",'

    Show ideal line

    '),e.put("{widgetsPath}/redmine/src/main/issues/edit/easyedit.html",'
    Show closed issues
  • {{entry.name}}
  • '),e.put("{widgetsPath}/redmine/src/main/issues/edit/edit.html",'
    Show closed issues
  • {{entry.name}}
  • ')}]),angular.module("adf.widget.redmine").controller("editIssuesController",["projects","customQueries","config",function(e,t,n){return a(this,e,t,n)}]),angular.module("adf.widget.easyredmine").controller("easyEditIssuesController",["projects","customQueries","config",function(e,t,n){return a(this,e,t,n)}]),angular.module("adf.widget.redmine").controller("editChartController",["projects","config","chartDataService","redmineService",function(e,t,n,i){return c(this,e,t,n,i)}]),angular.module("adf.widget.easyredmine").controller("easyEditChartController",["projects","config","easyChartDataService","easyRedmineService",function(e,t,n,i){return c(this,e,t,n,i)}]),angular.module("adf.widget.redmine").controller("issueController",["issues","config","redmineService",function(e,t,n){return l(this,e,t,n)}]),angular.module("adf.widget.easyredmine").controller("easyIssueController",["issues","config","easyRedmineService",function(e,t,n){return l(this,e,t,n)}]),angular.module("adf.widget.redmine").factory("chartDataService",["$q","redmineService",function(e,t){return u(e,t)}]),angular.module("adf.widget.easyredmine").factory("easyChartDataService",["$q","easyRedmineService",function(e,t){return u(e,t)}]),angular.module("adf.widget.redmine").controller("chartController",["chartData","config",function(e,t){return d(this,e,t)}]),angular.module("adf.widget.easyredmine").controller("easyChartController",["chartData","config",function(e,t){return d(this,e,t)}]),angular.module("adf.widget.redmine").factory("redmineService",["$http","redmineEndpoint","redmineRedirectEndpoint","$q",function(e,t,n,i){return m(e,t,n,i)}]),angular.module("adf.widget.easyredmine").factory("easyRedmineService",["$http","easyRedmineEndpoint","easyRedmineRedirectEndpoint","$q",function(e,t,n,i){return m(e,t,n,i)}])}(window); \ No newline at end of file diff --git a/src/main/redmine.js b/src/main/redmine.js index 8c2110f..732872c 100644 --- a/src/main/redmine.js +++ b/src/main/redmine.js @@ -142,5 +142,5 @@ angular.module('adf.widget.easyredmine', ['adf.provider', 'chart.js', 'ui.bootst // Create widgets createMyIssuesWidget(dashboardProvider, 'easyredmine-my-issues', 'My Issues', category, true); createCustomQueriesWidget(dashboardProvider, 'easyredmine-custom-queries', 'Custom Queries', category, true); - createChartWidget(dashboardProvider, 'easyredmine-chart', 'Chart', category, true); + //createChartWidget(dashboardProvider, 'easyredmine-chart', 'Chart', category, true); });