diff --git a/dist/adf-widget-redmine.js b/dist/adf-widget-redmine.js index 0e14cf3..20df9d5 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 diff --git a/dist/adf-widget-redmine.min.js b/dist/adf-widget-redmine.min.js index 0b44c66..98b1a87 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:e?"{widgetsPath}/redmine/src/main/issues/edit/easyedit.html":"{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()}],customQueries:["redmineService","easyRedmineService",function(t,n){return e?n.getCustomQueries().then(function(e){return e.easy_queries}):t.getCustomQueries().then(function(e){return e.queries})}]}}}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 o(e,t,i,o,s){e.widget(t,{title:i,description:"Displays issues from a custom query",category:o,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.project.id):e.getIssuesByQueryId(n.customQuery.id,n.customQuery.project_id)}]},edit:n(s)})}function s(e,t,n,i,o){e.widget(t,{title:n,description:"Displays all issues assigned to me",category:i,templateUrl:"{widgetsPath}/redmine/src/main/issues/view.html",controller:o?"easyIssueController":"issueController",controllerAs:"vm",resolve:{issues:["redmineService","easyRedmineService",function(e,t){return o?t.getMyIssues():e.getMyIssues()}]}})}function r(e,t,n,o,s){e.widget(t,{title:n,description:"Displays a burnup or burndown chart",category:o,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}},angular.equals({},i)&&(i.columns=e.possibleColumns,i.customQuery="",i.project="",i.assigned_to_id="me",i.showClosed=!1),e.projects=t,e.customQueries=n}function c(e,t,n,i,o){function s(t){"version"===t?e.config.filterWithVersion=!0:"assigned"===t?e.config.filterWithAssigned=!0:"tracker"===t&&(e.config.filterWithTracker=!0),e.filterToAdd="none"}function r(){e.config.timespan.fromDateTime&&(e.config.timespan.fromDateTime=new Date(e.config.timespan.fromDateTime),e.config.timespan.toDateTime=new Date(e.config.timespan.toDateTime))}function a(){e.inlineOptions.minDate=e.inlineOptions.minDate?null:new Date,e.dateOptions.minDate=e.inlineOptions.minDate}function c(){if(e.config.project){if("All"===e.config.project)return void(e.versions=[]);o.getVersions(angular.fromJson(e.config.project).identifier).then(function(t){e.versions=t})}}function l(){e.config.filterWithVersion&&e.updateVersions()}function u(){e.config.timespan.toDateTime=new Date(angular.fromJson(e.config.version).due_date);var t=new Date(e.config.timespan.toDateTime);e.config.timespan.fromDateTime=t.setDate(t.getDate()-14)}function d(){o.getTrackers().then(function(t){e.trackers=t})}function m(t){var n=t.date,i=t.mode;if("day"===i)for(var o=new Date(n).setHours(0,0,0,0),s=0;s0?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/gulpfile.js b/gulpfile.js index 359a7c6..ab0ef6b 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -3,6 +3,7 @@ var connect = require('gulp-connect'); var wiredep = require('wiredep').stream; var $ = require('gulp-load-plugins')(); var del = require('del'); +var addsrc = require('gulp-add-src'); var jsReporter = require('jshint-stylish'); var annotateAdfPlugin = require('ng-annotate-adf-plugin'); var pkg = require('./package.json'); @@ -13,10 +14,14 @@ var annotateOptions = { ] }; -var templateOptions = { +var redmineTemplate = { root: '{widgetsPath}/redmine/src/main', module: 'adf.widget.redmine' }; +var easyRedmineTemplate = { + root: '{widgetsPath}/redmine/src/main', + module: 'adf.widget.easyredmine' +}; /** lint **/ @@ -36,13 +41,19 @@ gulp.task('lint', ['csslint', 'jslint']); /** serve **/ -gulp.task('templates', function(){ - return gulp.src('src/**/*.html') - .pipe($.angularTemplatecache('templates.tpl.js', templateOptions)) - .pipe(gulp.dest('.tmp/dist')); +gulp.task('redmineTemplate', function(){ + return gulp.src('src/main/**/*.html') + .pipe($.angularTemplatecache('redmineTemplates.tpl.js', redmineTemplate)) + .pipe(gulp.dest('.tmp/dist')); }); -gulp.task('sample', ['templates'], function(){ +gulp.task('easyRedmineTemplate', function(){ + return gulp.src('src/main/**/*.html') + .pipe($.angularTemplatecache('easyRedmineTemplates.tpl.js', easyRedmineTemplate)) + .pipe(gulp.dest('.tmp/dist')); +}); + +gulp.task('sample', ['redmineTemplate', 'easyRedmineTemplate'], function(){ var files = gulp.src(['src/main/**/*.js', 'src/main/**/*.css', 'src/main/**/*.less', '.tmp/dist/*.js']) .pipe($.if('*.js', $.angularFilesort())); @@ -85,7 +96,10 @@ gulp.task('css', function(){ gulp.task('js', function() { gulp.src(['src/main/**/*.js', 'src/main/**/*.html']) .pipe($.if('*.html', $.minifyHtml())) - .pipe($.if('*.html', $.angularTemplatecache(pkg.name + '.tpl.js', templateOptions))) + .pipe($.if('*.html', $.angularTemplatecache(pkg.name + '.js', redmineTemplate))) + .pipe(addsrc('src/main/**/*.html')) //Add again for easyredmine as angularTemplatecache purges all html files from the pipe + .pipe($.if('*.html', $.minifyHtml())) + .pipe($.if('*.html', $.angularTemplatecache('adf-widget-redmine.js', easyRedmineTemplate))) .pipe($.angularFilesort()) .pipe($.if('*.js', $.replace(/'use strict';/g, ''))) .pipe($.concat(pkg.name + '.js')) diff --git a/package-lock.json b/package-lock.json index 1c65e0b..ce1b7df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -161,6 +161,15 @@ "micromatch": "^2.1.5" } }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } + }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -488,6 +497,12 @@ "integrity": "sha1-vj5TgvwCttYySVasGvmKqYsIU0w=", "dev": true }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true + }, "bufferstreams": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-1.0.1.tgz", @@ -529,6 +544,16 @@ "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", "dev": true }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -1136,6 +1161,23 @@ "clone": "^1.0.2" } }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + }, + "dependencies": { + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, "del": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/del/-/del-1.2.1.tgz", @@ -2236,6 +2278,48 @@ } } }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -2311,6 +2395,16 @@ "rimraf": "^2.2.8" } }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2327,6 +2421,12 @@ "nan": "^2.12.1" } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "gaze": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", @@ -2349,6 +2449,17 @@ "is-property": "^1.0.0" } }, + "get-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", @@ -2646,6 +2757,318 @@ } } }, + "gulp-add-src": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulp-add-src/-/gulp-add-src-1.0.0.tgz", + "integrity": "sha512-wmqf71/V/W4Ffi9lduaWAgNFcJW60TRqgc2lRv94d6I7j4rjHtVMHjnbwDH8RF0czGfJqYbs+ruecZXmwJopCQ==", + "dev": true, + "requires": { + "event-stream": "~3.1.5", + "streamqueue": "^0.1.1", + "through2": "~0.4.1", + "vinyl-fs": "~3.0.2" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "event-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.1.7.tgz", + "integrity": "sha1-tMVAAS0P4UmEIPPYlGAI22OTw3o=", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.2", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + }, + "split": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/split/-/split-0.2.10.tgz", + "integrity": "sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc=", + "dev": true, + "requires": { + "through": "2" + } + }, + "through2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", + "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", + "dev": true, + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~2.1.1" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, "gulp-angular-filesort": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/gulp-angular-filesort/-/gulp-angular-filesort-1.1.1.tgz", @@ -3778,6 +4201,15 @@ "pinkie-promise": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -3824,6 +4256,12 @@ "sparkles": "^1.0.0" } }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, "hasha": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", @@ -4127,6 +4565,12 @@ "xtend": "^4.0.0" } }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -4237,6 +4681,12 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, "is-windows": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", @@ -4469,6 +4919,12 @@ "jsonify": "~0.0.0" } }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -4834,6 +5290,24 @@ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", "dev": true }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "requires": { + "flush-write-stream": "^1.0.2" + } + }, "less": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/less/-/less-2.7.2.tgz", @@ -5869,6 +6343,15 @@ "remove-trailing-separator": "^1.0.1" } }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, "null-check": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", @@ -5904,6 +6387,26 @@ "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", "dev": true }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "dependencies": { + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, "object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", @@ -6146,6 +6649,12 @@ "integrity": "sha1-Llfc5u/dN8NRhwEDCUTCK/OIt7Q=", "dev": true }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", @@ -6316,6 +6825,61 @@ "dev": true, "optional": true }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + }, + "dependencies": { + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + } + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + } + } + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -6502,6 +7066,27 @@ "is-primitive": "^2.0.0" } }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + } + }, "remove-trailing-separator": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", @@ -6630,6 +7215,15 @@ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", "dev": true }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, "response-time": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/response-time/-/response-time-1.0.0.tgz", @@ -7087,6 +7681,36 @@ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, + "streamqueue": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/streamqueue/-/streamqueue-0.1.3.tgz", + "integrity": "sha1-sQ1lFYr1ec46X0jJJ20B2yPU+LU=", + "dev": true, + "requires": { + "isstream": "~0.1.1", + "readable-stream": "~1.0.33" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, "string-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", @@ -7287,6 +7911,16 @@ } } }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, "tildify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", @@ -7355,12 +7989,67 @@ "os-tmpdir": "~1.0.1" } }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "dependencies": { + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + } + } + }, "to-array": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", "dev": true }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "requires": { + "through2": "^2.0.3" + } + }, "toposort": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/toposort/-/toposort-0.2.12.tgz", @@ -7542,6 +8231,12 @@ "spdx-expression-parse": "~1.0.0" } }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true + }, "verror": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", @@ -7657,6 +8352,55 @@ } } }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + }, + "vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, "vinyl-sourcemaps-apply": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", diff --git a/package.json b/package.json index 3e2010f..7447eb1 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "eslint-plugin-angular": "^2.4.0", "eslint-plugin-jasmine": "^2.2.0", "gulp": "^3.8.11", + "gulp-add-src": "^1.0.0", "gulp-angular-filesort": "^1.1.1", "gulp-angular-templatecache": "^1.6.0", "gulp-concat": "^2.5.2", diff --git a/sample/index.html b/sample/index.html index 0bef789..b2c2fbc 100644 --- a/sample/index.html +++ b/sample/index.html @@ -50,10 +50,10 @@ 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..732872c 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); });