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 @@
{
+ 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
+
+
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"
}
}