From 7acd8a20bdff30dd1430d4486fbd280476a3a0fc Mon Sep 17 00:00:00 2001 From: Johannes Millan Date: Thu, 5 Jan 2017 23:45:30 +0100 Subject: [PATCH] make most basic jira api work; make jira settings configurabl;e implement searching real issues; --- app/index.html | 2 + app/scripts/_app.js | 16 +++- .../daily-planner/daily-planner-d.html | 34 +++++-- app/scripts/daily-planner/daily-planner-d.js | 18 +++- app/scripts/main/global-services/jira-s.js | 91 +++++++++++++++++++ .../main/global-services/jira-s.spec.js | 17 ++++ app/scripts/routes/settings/settings-c.html | 33 ++++++- app/scripts/routes/settings/settings-c.js | 11 ++- electron/jira.js | 31 +++++++ electron/main.js | 6 ++ karma.conf.js | 1 + package.json | 1 + 12 files changed, 244 insertions(+), 17 deletions(-) create mode 100644 app/scripts/main/global-services/jira-s.js create mode 100644 app/scripts/main/global-services/jira-s.spec.js create mode 100644 electron/jira.js diff --git a/app/index.html b/app/index.html index a9798aaee9..65961ccdb9 100644 --- a/app/index.html +++ b/app/index.html @@ -80,6 +80,7 @@ TODO configure more restrictive Content-Security-Policy + @@ -115,6 +116,7 @@ TODO configure more restrictive Content-Security-Policy + diff --git a/app/scripts/_app.js b/app/scripts/_app.js index cbf1255466..61ecaf7c92 100644 --- a/app/scripts/_app.js +++ b/app/scripts/_app.js @@ -22,11 +22,21 @@ 'as.sortable', 'angularMoment' ]) + .config(configHttp) .config(configMdTheme) - .run(initGlobalTaskModel) + .run(initGlobalModels) .run(initGlobalShortcuts) .run(showHintsForToday); + function configHttp($httpProvider) { + //delete $httpProvider.defaults.headers.common['X-Requested-With']; + + $httpProvider.defaults.headers.common = {}; + $httpProvider.defaults.headers.post = {}; + $httpProvider.defaults.headers.put = {}; + $httpProvider.defaults.headers.patch = {}; + } + function configMdTheme($mdThemingProvider) { $mdThemingProvider.theme('dark-grey').backgroundPalette('grey').dark(); $mdThemingProvider.theme('dark-orange').backgroundPalette('orange').dark(); @@ -34,12 +44,14 @@ $mdThemingProvider.theme('dark-blue').backgroundPalette('blue').dark(); } - function initGlobalTaskModel(Tasks, $rootScope) { + function initGlobalModels(Tasks, $rootScope, $localStorage) { $rootScope.r = {}; $rootScope.r.tasks = Tasks.getToday(); $rootScope.r.backlogTasks = Tasks.getBacklog(); $rootScope.r.currentTask = Tasks.getCurrent(); $rootScope.r.doneBacklogTasks = Tasks.getDoneBacklog(); + + $rootScope.r.jiraSettings = $localStorage.jiraSettings; } function showHintsForToday($rootScope, $localStorage, ProductivityTips) { diff --git a/app/scripts/daily-planner/daily-planner-d.html b/app/scripts/daily-planner/daily-planner-d.html index 2e603850b5..3161507738 100644 --- a/app/scripts/daily-planner/daily-planner-d.html +++ b/app/scripts/daily-planner/daily-planner-d.html @@ -8,16 +8,34 @@
- - + + - - + + + + + - + + + + + {{task.title}} + + + No states matching "{{vm.searchText}}" were found. + Create a new one! + +
{ + console.log(res); + vm.taskSuggestions = Jira.transformIssues(res); + }); vm.addTask = () => { if (vm.newTask) { - Tasks.addToday({ - title: vm.newTask - }); - vm.newTask = ''; + //Tasks.addToday({ + // title: vm.newTask + //}); + Tasks.addToday( vm.newTask); + + vm.newTask = undefined; } // if we have already defined enough tasks and the diff --git a/app/scripts/main/global-services/jira-s.js b/app/scripts/main/global-services/jira-s.js new file mode 100644 index 0000000000..737c52cdb2 --- /dev/null +++ b/app/scripts/main/global-services/jira-s.js @@ -0,0 +1,91 @@ +/** + * @ngdoc service + * @name superProductivity.Jira + * @description + * # Jira + * Service in the superProductivity. + */ + +(function () { + 'use strict'; + + angular + .module('superProductivity') + .service('Jira', Jira); + + /* @ngInject */ + function Jira($q, $localStorage) { + const IPC_JIRA_CB_EVENT = 'JIRA_RESPONSE'; + const IPC_JIRA_MAKE_REQUEST_EVENT = 'JIRA'; + + this.requestsLog = {}; + + if (angular.isDefined(window.ipcRenderer)) { + window.ipcRenderer.on(IPC_JIRA_CB_EVENT, (ev, res) => { + console.log('RES', res); + + if (res.requestId) { + // resolve saved promise + this.requestsLog[res.requestId].resolve(res); + // delete entry for promise afterwards + delete this.requestsLog[res.requestId]; + } + }); + } + + this.getSuggestions = () => { + let testRequest = { + config: $localStorage.jiraSettings, + apiMethod: 'searchJira', + //arguments: [$localStorage.jiraSettings.userName, true], + //arguments: ['assignee = "'+$localStorage.jiraSettings.userName+'" AND resolution = Unresolved ORDER BY updatedDate DESC',false], + arguments: ['assignee = "joschka.decuveland" AND resolution = Unresolved ORDER BY updatedDate DESC', false], + requestId: Math.random().toString(36).substr(2, 10) + }; + + return this.sendRequest(testRequest); + }; + + this.transformIssues = (response) => { + + let res = response.response; + let tasks = []; + + for (let i = 0; i < res.issues.length; i++) { + let issue = res.issues[i]; + tasks.push({ + title: issue.key + ' ' + issue.fields.summary, + note: issue.fields.description, + originalKey: issue.key, + originalLink: issue.self + }); + } + + return tasks; + }; + + this.sendRequest = (request) => { + if (!$localStorage.jiraSettings) { + console.log('NO SETTINGS DEFINED'); + return; + } + + if (angular.isDefined(window.ipcRenderer)) { + let defer = $q.defer(); + // save to request log + this.requestsLog[request.requestId] = defer; + // send to electron + window.ipcRenderer.send(IPC_JIRA_MAKE_REQUEST_EVENT, request); + + return defer.promise; + } else { + return $q.when(null); + } + }; + + this.auth = () => { + + }; + } + +})(); diff --git a/app/scripts/main/global-services/jira-s.spec.js b/app/scripts/main/global-services/jira-s.spec.js new file mode 100644 index 0000000000..e5be7a9ffd --- /dev/null +++ b/app/scripts/main/global-services/jira-s.spec.js @@ -0,0 +1,17 @@ +'use strict'; + +describe('Service: Jira', function() { + // load the service's module + beforeEach(module('superProductivity')); + + // instantiate service + var Jira; + beforeEach(inject(function (_Jira_) { + Jira = _Jira_; + })); + + it('should be defined', function() { + expect(true).toBe(true); + }); + +}); \ No newline at end of file diff --git a/app/scripts/routes/settings/settings-c.html b/app/scripts/routes/settings/settings-c.html index 661582ccca..4678534945 100644 --- a/app/scripts/routes/settings/settings-c.html +++ b/app/scripts/routes/settings/settings-c.html @@ -1,4 +1,7 @@
+ + +

Make/Restore Backup

@@ -8,7 +11,6 @@ Download your tasks and settings
- @@ -32,4 +34,33 @@ + + +

Jira-Setup for Task Suggestion

+
+ + + + + + + + + + + + + + + Save Config + +
+
diff --git a/app/scripts/routes/settings/settings-c.js b/app/scripts/routes/settings/settings-c.js index 4c54476cf6..bcb60385f3 100644 --- a/app/scripts/routes/settings/settings-c.js +++ b/app/scripts/routes/settings/settings-c.js @@ -15,7 +15,7 @@ /* @ngInject */ function SettingsCtrl($localStorage, $rootScope) { - var vm = this; + let vm = this; vm.importSettings = (uploadSettingsTextarea) => { let settings = JSON.parse(uploadSettingsTextarea); @@ -24,5 +24,14 @@ $rootScope.r.tasks = $localStorage.tasks = settings.tasks; $rootScope.r.backlogTasks = $localStorage.backlogTasks = settings.backlogTasks; }; + + vm.jiraSettings = $rootScope.r.jiraSettings; + console.log(vm.jiraSettings); + + vm.saveJiraSettings = (settings) => { + console.log('I am here!', settings); + + $rootScope.r.jiraSettings = $localStorage.jiraSettings = settings; + }; } })(); diff --git a/electron/jira.js b/electron/jira.js new file mode 100644 index 0000000000..4674d3064f --- /dev/null +++ b/electron/jira.js @@ -0,0 +1,31 @@ +const JiraApi = require('jira').JiraApi; + +//request = { +// config: {}, +// apiMethod: 'findIssue', +// argument: 'BNGP-1283', +// requestId: Math.random().toString(36).substr(2, 10) +//}; + +module.exports = (mainWindow, request) => { + console.log(request); + + let config = request.config; + let apiMethod = request.apiMethod; + let arguments = request.arguments; + let requestId = request.requestId; + + + let jira = new JiraApi('https', config.host, config.port, config.userName, config.password, 'latest'); + + jira[apiMethod](...arguments, (error, res) => { + console.log('JIRA_RESPONSE', error, res); + + mainWindow.webContents.send('JIRA_RESPONSE', { + error: error, + response: res, + requestId: requestId + }); + }); + +}; \ No newline at end of file diff --git a/electron/main.js b/electron/main.js index 22b596c5e5..e6689ff895 100644 --- a/electron/main.js +++ b/electron/main.js @@ -5,6 +5,8 @@ const powerSaveBlocker = require('electron').powerSaveBlocker; const moment = require('moment'); const idle = require('./idle'); const CONFIG = require('./CONFIG'); +const jira = require('./jira'); + powerSaveBlocker.start('prevent-app-suspension'); // Module to control application life. @@ -115,6 +117,10 @@ electron.ipcMain.on('SHUTDOWN', () => { app.quit(); }); +electron.ipcMain.on('JIRA', (ev, request) => { + jira(mainWindow, request); +}); + function trackTimeFn() { //let timeSpend = moment.duration({ milliseconds: CONFIG.PING_INTERVAL }); diff --git a/karma.conf.js b/karma.conf.js index 607952f682..34509a5916 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -29,6 +29,7 @@ module.exports = function(config) { 'app/bower_components/angular-moment/angular-moment.js', 'app/bower_components/ng-sortable/dist/ng-sortable.js', 'app/bower_components/moment-duration-format/lib/moment-duration-format.js', + 'app/bower_components/angular-base64/angular-base64.js', 'app/bower_components/angular-mocks/angular-mocks.js', // endbower diff --git a/package.json b/package.json index 272ae51021..dbeed4fea6 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "dependencies": { "electron": "^1.4.1", "electron-inspector": "^0.1.4", + "jira": "^0.9.2", "moment": "^2.17.1" } }