├── .editorconfig ├── .gitignore ├── .jshintrc ├── .travis.yml ├── LICENSE ├── README.md ├── app ├── app.html ├── fonts │ ├── 1YwB1sO8YE1Lyjf12WNiUA.woff2 │ └── UyBMtLsHKBKXelqf4x7VRQ.woff2 ├── helpers │ ├── context_menu.js │ └── external_links.js ├── images │ ├── 512x512.png │ ├── add.svg │ ├── applogo.svg │ ├── clearcache.svg │ ├── close.svg │ ├── cog.svg │ ├── cross.png │ ├── edit.svg │ ├── envelope.svg │ ├── facebook.svg │ ├── heart.svg │ ├── loading.gif │ ├── logo.png │ ├── manageyum.png │ ├── notification_off.svg │ ├── notification_on.svg │ ├── right-chevron.svg │ ├── rolling.gif │ ├── services │ │ ├── asana.png │ │ ├── asana.svg │ │ ├── basecamp.png │ │ ├── bitbucket.svg │ │ ├── chatwork.png │ │ ├── chatwork.svg │ │ ├── ciscospark.png │ │ ├── ciscospark.svg │ │ ├── closedotio.svg │ │ ├── confluence.png │ │ ├── coupleme.png │ │ ├── coupleme.svg │ │ ├── custom_app.svg │ │ ├── defaultIntegration.png │ │ ├── defaultIntegration.svg │ │ ├── dingtalk.png │ │ ├── dingtalk.svg │ │ ├── discord.png │ │ ├── discord.svg │ │ ├── evernote.png │ │ ├── facebookpages.png │ │ ├── facebookpages.svg │ │ ├── flowdock.png │ │ ├── flowdock.svg │ │ ├── freshdesk.png │ │ ├── github.png │ │ ├── gitter.png │ │ ├── gitter.svg │ │ ├── gmail.svg │ │ ├── google_calendar.png │ │ ├── google_drive.png │ │ ├── googlegmail.png │ │ ├── googleinbox.png │ │ ├── grape.png │ │ ├── grape.svg │ │ ├── groupme.png │ │ ├── groupme.svg │ │ ├── hangouts.png │ │ ├── hangouts.svg │ │ ├── helpscout.svg │ │ ├── hibox.png │ │ ├── hibox.svg │ │ ├── hipchat.png │ │ ├── hipchat.svg │ │ ├── hubspot.svg │ │ ├── icq.png │ │ ├── icq.svg │ │ ├── inbox.svg │ │ ├── intercom.png │ │ ├── intercom.svg │ │ ├── irccloud.png │ │ ├── irccloud.svg │ │ ├── jira.png │ │ ├── linkedin.png │ │ ├── linkedin.svg │ │ ├── mattermost.png │ │ ├── mattermost.svg │ │ ├── messenger.png │ │ ├── messenger.svg │ │ ├── mysms.png │ │ ├── mysms.svg │ │ ├── olark.svg │ │ ├── outlook.png │ │ ├── outlook.svg │ │ ├── producthunt.png │ │ ├── pura.png │ │ ├── rocketchat.png │ │ ├── rocketchat.svg │ │ ├── salesforce.png │ │ ├── salesforce.svg │ │ ├── skype.png │ │ ├── skype.svg │ │ ├── slack.png │ │ ├── slack.svg │ │ ├── steamchat.png │ │ ├── steamchat.svg │ │ ├── teamwork.png │ │ ├── teamwork.svg │ │ ├── telegram.png │ │ ├── telegram.svg │ │ ├── todoist.png │ │ ├── trello.svg │ │ ├── tweetdeck.png │ │ ├── tweetdeck.svg │ │ ├── twitter.svg │ │ ├── vk.png │ │ ├── vk.svg │ │ ├── wechat.png │ │ ├── wechat.svg │ │ ├── whatsapp.png │ │ ├── whatsapp.svg │ │ ├── wire.png │ │ ├── wire.svg │ │ ├── wunderlist.png │ │ ├── yahoomessenger.png │ │ ├── yahoomessenger.svg │ │ ├── zendesk.png │ │ └── zendesk.svg │ ├── twitter.svg │ └── windock │ │ ├── win-dock-alert-1.png │ │ ├── win-dock-alert-10.png │ │ ├── win-dock-alert-2.png │ │ ├── win-dock-alert-3.png │ │ ├── win-dock-alert-4.png │ │ ├── win-dock-alert-5.png │ │ ├── win-dock-alert-6.png │ │ ├── win-dock-alert-7.png │ │ ├── win-dock-alert-8.png │ │ ├── win-dock-alert-9.png │ │ └── win-dock-alert.png ├── package.json ├── src │ ├── app.js │ ├── auth │ │ ├── auth.html │ │ ├── forgotpassword.controller.js │ │ ├── forgotpassword.html │ │ ├── login.controller.js │ │ ├── login.html │ │ ├── loginform.html │ │ ├── register.controller.js │ │ └── register.html │ ├── components │ │ └── APIInterceptor.service.js │ ├── enabledServices │ │ ├── enabledServices.controller.js │ │ └── enabledServices.html │ ├── home │ │ ├── home.controller.js │ │ └── home.html │ ├── index │ │ └── index.html │ ├── notificationcenter │ │ ├── notificationCenter.controller.js │ │ └── notificationCenter.html │ ├── services │ │ ├── addNewService.html │ │ ├── deleteProfile.html │ │ ├── dynamicModal.html │ │ ├── editService.html │ │ ├── myModalContent.html │ │ ├── preloaders │ │ │ ├── asana.js │ │ │ ├── basecamp.js │ │ │ ├── bitbucket.js │ │ │ ├── closedotio.js │ │ │ ├── confluence.js │ │ │ ├── css │ │ │ │ └── slack.css │ │ │ ├── custom_app.js │ │ │ ├── evernote.js │ │ │ ├── freshdesk.js │ │ │ ├── github.js │ │ │ ├── gitter.js │ │ │ ├── gmail.js │ │ │ ├── google_calendar.js │ │ │ ├── google_drive.js │ │ │ ├── hangouts.js │ │ │ ├── helpscout.js │ │ │ ├── hipchat.js │ │ │ ├── inbox.js │ │ │ ├── intercom.js │ │ │ ├── jira.js │ │ │ ├── linkedin.js │ │ │ ├── messenger.js │ │ │ ├── olark.js │ │ │ ├── outlook.js │ │ │ ├── producthunt.js │ │ │ ├── pura.js │ │ │ ├── salesforce.js │ │ │ ├── skype.js │ │ │ ├── slack.js │ │ │ ├── teamwork.js │ │ │ ├── telegram.js │ │ │ ├── todoist.js │ │ │ ├── trello.js │ │ │ ├── tweetdeck.js │ │ │ ├── twitter.js │ │ │ ├── utils │ │ │ │ ├── spellcheck.js │ │ │ │ └── zoom.js │ │ │ ├── whatsapp.js │ │ │ ├── wunderlist.js │ │ │ └── zendesk.js │ │ ├── referModal.html │ │ ├── registerModal.html │ │ ├── services.controller.js │ │ ├── services.factory.js │ │ ├── services.html │ │ ├── shareModal.html │ │ ├── subscription.html │ │ ├── testPreload.js │ │ ├── upgradeModal.html │ │ └── user.factory.js │ └── servicesList │ │ ├── servicesList.controller.js │ │ └── servicesList.html └── styles │ └── main.css ├── appveyor.yml ├── build └── config.gypi ├── config ├── env_development.json ├── env_production.json └── env_test.json ├── e2e ├── hello_world.e2e.js └── utils.js ├── gulpfile.js ├── package.json ├── resources ├── icons │ └── 512x512.png ├── osx │ ├── 256x256.png │ ├── _DS_Store │ ├── dmg-background.png │ ├── dmg-background@2x.png │ ├── dmg-background@2x.png.png │ ├── dmg-icon.icns │ └── icon.icns └── windows │ ├── _DS_Store │ ├── icon.ico │ └── setup-icon.ico ├── scripts ├── istanbul-reporter.js └── travis-build.sh ├── src ├── app.js ├── background.js ├── env.js ├── hello_world │ ├── hello_world.js │ └── hello_world.spec.js ├── helpers │ └── window.js ├── menu │ ├── dev_menu_template.js │ ├── edit_menu_template.js │ ├── file_menu_template.js │ ├── help_menu_template.js │ ├── view_menu_template.js │ └── window_menu_template.js ├── src │ ├── services │ │ └── services.controller.js │ └── servicesList │ │ ├── servicesList.controller.js │ │ └── servicesList.html └── stylesheets │ └── main.less └── tasks ├── build_app.js ├── build_tests.js ├── bundle.js ├── start.js └── utils.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 4 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.json] 13 | indent_size = 2 14 | 15 | [*.md] 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | Thumbs.db 4 | *.log 5 | *.autogenerated 6 | 7 | # ignore everything in 'app' folder what had been generated from 'src' folder 8 | /app/stylesheets 9 | /app/app.js 10 | /app/background.js 11 | /app/env.json 12 | /app/**/*.map 13 | 14 | /dist 15 | 16 | /coverage 17 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "esversion": 6 3 | } 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | os: 2 | - linux 3 | - osx 4 | 5 | branches: 6 | only: 7 | - master 8 | 9 | env: 10 | - NODE_VERSION="6.3.0" 11 | 12 | script: ./scripts/travis-build.sh 13 | 14 | cache: 15 | directories: 16 | - node_modules 17 | 18 | notifications: 19 | email: 20 | on_success: never 21 | on_failure: change 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-2016 Jakub Szwacz 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Manageyum 2 | ============== 3 | 4 | 5 | # Quick start 6 | The only development dependency of this project is [Node.js](https://nodejs.org). So just make sure you have it installed. 7 | Then type few commands known to every Node developer... 8 | ``` 9 | git clone https://github.com/sivaramsi/manageyum.git 10 | cd manageyum 11 | npm install 12 | npm start 13 | ``` 14 | ... and boom! You have a running desktop application on your screen. 15 | 16 | 17 | ## Folders for application code 18 | 19 | The application is split between two main folders... 20 | 21 | `src` - this folder is intended for files which need to be transpiled or compiled (files which can't be used directly by electron). 22 | 23 | `app` - contains all static assets (put here images, css, html etc.) which don't need any pre-processing. 24 | 25 | The build process compiles all stuff from the `src` folder and puts it into the `app` folder, so after the build has finished, your `app` folder contains the full, runnable application. 26 | 27 | Treat `src` and `app` folders like two halves of one bigger thing. 28 | 29 | The drawback of this design is that `app` folder contains some files which should be git-ignored and some which shouldn't (see `.gitignore` file). But thanks to this two-folders split development builds are much (much!) faster. 30 | 31 | # Development 32 | 33 | ### Installation 34 | 35 | ``` 36 | npm install 37 | ``` 38 | It will also download Electron runtime and install dependencies for the second `package.json` file inside the `app` folder. 39 | 40 | ### Starting the app 41 | 42 | ``` 43 | npm start 44 | ``` 45 | 46 | ### Adding npm modules to your app 47 | 48 | Remember to add your dependencies to `app/package.json` file: 49 | ``` 50 | cd app 51 | npm install name_of_npm_module --save 52 | ``` 53 | 54 | # License 55 | 56 | Released under the MIT license. 57 | -------------------------------------------------------------------------------- /app/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Manageyum 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /app/fonts/1YwB1sO8YE1Lyjf12WNiUA.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/fonts/1YwB1sO8YE1Lyjf12WNiUA.woff2 -------------------------------------------------------------------------------- /app/fonts/UyBMtLsHKBKXelqf4x7VRQ.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/fonts/UyBMtLsHKBKXelqf4x7VRQ.woff2 -------------------------------------------------------------------------------- /app/helpers/context_menu.js: -------------------------------------------------------------------------------- 1 | // This gives you default context menu (cut, copy, paste) 2 | // in all input fields and textareas across your app. 3 | 4 | (function () { 5 | 'use strict'; 6 | 7 | var remote = require('electron').remote; 8 | var Menu = remote.Menu; 9 | var MenuItem = remote.MenuItem; 10 | 11 | var isAnyTextSelected = function () { 12 | return window.getSelection().toString() !== ''; 13 | }; 14 | 15 | var cut = new MenuItem({ 16 | label: "Cut", 17 | click: function () { 18 | document.execCommand("cut"); 19 | } 20 | }); 21 | 22 | var copy = new MenuItem({ 23 | label: "Copy", 24 | click: function () { 25 | document.execCommand("copy"); 26 | } 27 | }); 28 | 29 | var paste = new MenuItem({ 30 | label: "Paste", 31 | click: function () { 32 | document.execCommand("paste"); 33 | } 34 | }); 35 | 36 | var normalMenu = new Menu(); 37 | normalMenu.append(copy); 38 | 39 | var textEditingMenu = new Menu(); 40 | textEditingMenu.append(cut); 41 | textEditingMenu.append(copy); 42 | textEditingMenu.append(paste); 43 | 44 | document.addEventListener('contextmenu', function (e) { 45 | switch (e.target.nodeName) { 46 | case 'TEXTAREA': 47 | case 'INPUT': 48 | e.preventDefault(); 49 | textEditingMenu.popup(remote.getCurrentWindow()); 50 | break; 51 | default: 52 | if (isAnyTextSelected()) { 53 | e.preventDefault(); 54 | normalMenu.popup(remote.getCurrentWindow()); 55 | } 56 | } 57 | }, false); 58 | 59 | }()); 60 | -------------------------------------------------------------------------------- /app/helpers/external_links.js: -------------------------------------------------------------------------------- 1 | // Convenient way for opening links in external browser, not in the app. 2 | // Useful especially if you have a lot of links to deal with. 3 | // 4 | // Usage: 5 | // 6 | // Every link with class ".js-external-link" will be opened in external browser. 7 | // google 8 | // 9 | // The same behaviour for many links can be achieved by adding 10 | // this class to any parent tag of an anchor tag. 11 | // 15 | 16 | (function () { 17 | 'use strict'; 18 | 19 | var shell = require('electron').shell; 20 | 21 | var supportExternalLinks = function (e) { 22 | var href; 23 | var isExternal = false; 24 | 25 | var checkDomElement = function (element) { 26 | if (element.nodeName === 'A') { 27 | href = element.getAttribute('href'); 28 | } 29 | if (element.classList.contains('js-external-link')) { 30 | isExternal = true; 31 | } 32 | if (href && isExternal) { 33 | shell.openExternal(href); 34 | e.preventDefault(); 35 | } else if (element.parentElement) { 36 | checkDomElement(element.parentElement); 37 | } 38 | }; 39 | 40 | checkDomElement(e.target); 41 | }; 42 | 43 | document.addEventListener('click', supportExternalLinks, false); 44 | }()); 45 | -------------------------------------------------------------------------------- /app/images/512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/512x512.png -------------------------------------------------------------------------------- /app/images/add.svg: -------------------------------------------------------------------------------- 1 | add service icon -------------------------------------------------------------------------------- /app/images/applogo.svg: -------------------------------------------------------------------------------- 1 | manageyum logo -------------------------------------------------------------------------------- /app/images/clearcache.svg: -------------------------------------------------------------------------------- 1 | clear catch icon -------------------------------------------------------------------------------- /app/images/close.svg: -------------------------------------------------------------------------------- 1 | close icon -------------------------------------------------------------------------------- /app/images/cog.svg: -------------------------------------------------------------------------------- 1 | setting icon -------------------------------------------------------------------------------- /app/images/cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/cross.png -------------------------------------------------------------------------------- /app/images/edit.svg: -------------------------------------------------------------------------------- 1 | edit icon -------------------------------------------------------------------------------- /app/images/envelope.svg: -------------------------------------------------------------------------------- 1 | Asset 26 -------------------------------------------------------------------------------- /app/images/facebook.svg: -------------------------------------------------------------------------------- 1 | Asset 25 -------------------------------------------------------------------------------- /app/images/heart.svg: -------------------------------------------------------------------------------- 1 | Asset 28 -------------------------------------------------------------------------------- /app/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/loading.gif -------------------------------------------------------------------------------- /app/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/logo.png -------------------------------------------------------------------------------- /app/images/manageyum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/manageyum.png -------------------------------------------------------------------------------- /app/images/notification_off.svg: -------------------------------------------------------------------------------- 1 | notification off -------------------------------------------------------------------------------- /app/images/notification_on.svg: -------------------------------------------------------------------------------- 1 | notification on -------------------------------------------------------------------------------- /app/images/right-chevron.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/images/rolling.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/rolling.gif -------------------------------------------------------------------------------- /app/images/services/asana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/asana.png -------------------------------------------------------------------------------- /app/images/services/asana.svg: -------------------------------------------------------------------------------- 1 | Asana -------------------------------------------------------------------------------- /app/images/services/basecamp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/basecamp.png -------------------------------------------------------------------------------- /app/images/services/bitbucket.svg: -------------------------------------------------------------------------------- 1 | Bitbucket -------------------------------------------------------------------------------- /app/images/services/chatwork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/chatwork.png -------------------------------------------------------------------------------- /app/images/services/ciscospark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/ciscospark.png -------------------------------------------------------------------------------- /app/images/services/confluence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/confluence.png -------------------------------------------------------------------------------- /app/images/services/coupleme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/coupleme.png -------------------------------------------------------------------------------- /app/images/services/coupleme.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | coupleme 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/images/services/custom_app.svg: -------------------------------------------------------------------------------- 1 | cube icon -------------------------------------------------------------------------------- /app/images/services/defaultIntegration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/defaultIntegration.png -------------------------------------------------------------------------------- /app/images/services/dingtalk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/dingtalk.png -------------------------------------------------------------------------------- /app/images/services/discord.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/discord.png -------------------------------------------------------------------------------- /app/images/services/discord.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | discord 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/images/services/evernote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/evernote.png -------------------------------------------------------------------------------- /app/images/services/facebookpages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/facebookpages.png -------------------------------------------------------------------------------- /app/images/services/flowdock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/flowdock.png -------------------------------------------------------------------------------- /app/images/services/flowdock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | flowdock 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/images/services/freshdesk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/freshdesk.png -------------------------------------------------------------------------------- /app/images/services/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/github.png -------------------------------------------------------------------------------- /app/images/services/gitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/gitter.png -------------------------------------------------------------------------------- /app/images/services/gitter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | gitter 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/images/services/google_calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/google_calendar.png -------------------------------------------------------------------------------- /app/images/services/google_drive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/google_drive.png -------------------------------------------------------------------------------- /app/images/services/googlegmail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/googlegmail.png -------------------------------------------------------------------------------- /app/images/services/googleinbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/googleinbox.png -------------------------------------------------------------------------------- /app/images/services/grape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/grape.png -------------------------------------------------------------------------------- /app/images/services/groupme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/groupme.png -------------------------------------------------------------------------------- /app/images/services/groupme.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | groupme 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/images/services/hangouts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/hangouts.png -------------------------------------------------------------------------------- /app/images/services/helpscout.svg: -------------------------------------------------------------------------------- 1 | Helpscout -------------------------------------------------------------------------------- /app/images/services/hibox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/hibox.png -------------------------------------------------------------------------------- /app/images/services/hipchat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/hipchat.png -------------------------------------------------------------------------------- /app/images/services/hipchat.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | hipchat 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/images/services/icq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/icq.png -------------------------------------------------------------------------------- /app/images/services/intercom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/intercom.png -------------------------------------------------------------------------------- /app/images/services/intercom.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | intercom 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/images/services/irccloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/irccloud.png -------------------------------------------------------------------------------- /app/images/services/jira.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/jira.png -------------------------------------------------------------------------------- /app/images/services/linkedin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/linkedin.png -------------------------------------------------------------------------------- /app/images/services/linkedin.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | linkedin 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/images/services/mattermost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/mattermost.png -------------------------------------------------------------------------------- /app/images/services/mattermost.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | mattermost 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/images/services/messenger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/messenger.png -------------------------------------------------------------------------------- /app/images/services/messenger.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | messenger 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/images/services/mysms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/mysms.png -------------------------------------------------------------------------------- /app/images/services/outlook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/outlook.png -------------------------------------------------------------------------------- /app/images/services/outlook.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Layer 1 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/images/services/producthunt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/producthunt.png -------------------------------------------------------------------------------- /app/images/services/pura.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/pura.png -------------------------------------------------------------------------------- /app/images/services/rocketchat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/rocketchat.png -------------------------------------------------------------------------------- /app/images/services/salesforce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/salesforce.png -------------------------------------------------------------------------------- /app/images/services/skype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/skype.png -------------------------------------------------------------------------------- /app/images/services/slack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/slack.png -------------------------------------------------------------------------------- /app/images/services/steamchat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/steamchat.png -------------------------------------------------------------------------------- /app/images/services/teamwork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/teamwork.png -------------------------------------------------------------------------------- /app/images/services/telegram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/telegram.png -------------------------------------------------------------------------------- /app/images/services/telegram.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | telegram 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/images/services/todoist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/todoist.png -------------------------------------------------------------------------------- /app/images/services/trello.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | trello-mark-blue 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/images/services/tweetdeck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/tweetdeck.png -------------------------------------------------------------------------------- /app/images/services/tweetdeck.svg: -------------------------------------------------------------------------------- 1 | Tweetdeck -------------------------------------------------------------------------------- /app/images/services/twitter.svg: -------------------------------------------------------------------------------- 1 | Twitter -------------------------------------------------------------------------------- /app/images/services/vk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/vk.png -------------------------------------------------------------------------------- /app/images/services/vk.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | vk 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/images/services/wechat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/wechat.png -------------------------------------------------------------------------------- /app/images/services/wechat.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | wechat 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/images/services/whatsapp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/whatsapp.png -------------------------------------------------------------------------------- /app/images/services/whatsapp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | whatsapp 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/images/services/wire.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/wire.png -------------------------------------------------------------------------------- /app/images/services/wire.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Wire symbol 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/images/services/wunderlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/wunderlist.png -------------------------------------------------------------------------------- /app/images/services/yahoomessenger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/yahoomessenger.png -------------------------------------------------------------------------------- /app/images/services/zendesk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/services/zendesk.png -------------------------------------------------------------------------------- /app/images/services/zendesk.svg: -------------------------------------------------------------------------------- 1 | Zendesk -------------------------------------------------------------------------------- /app/images/twitter.svg: -------------------------------------------------------------------------------- 1 | Asset 27 -------------------------------------------------------------------------------- /app/images/windock/win-dock-alert-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/windock/win-dock-alert-1.png -------------------------------------------------------------------------------- /app/images/windock/win-dock-alert-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/windock/win-dock-alert-10.png -------------------------------------------------------------------------------- /app/images/windock/win-dock-alert-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/windock/win-dock-alert-2.png -------------------------------------------------------------------------------- /app/images/windock/win-dock-alert-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/windock/win-dock-alert-3.png -------------------------------------------------------------------------------- /app/images/windock/win-dock-alert-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/windock/win-dock-alert-4.png -------------------------------------------------------------------------------- /app/images/windock/win-dock-alert-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/windock/win-dock-alert-5.png -------------------------------------------------------------------------------- /app/images/windock/win-dock-alert-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/windock/win-dock-alert-6.png -------------------------------------------------------------------------------- /app/images/windock/win-dock-alert-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/windock/win-dock-alert-7.png -------------------------------------------------------------------------------- /app/images/windock/win-dock-alert-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/windock/win-dock-alert-8.png -------------------------------------------------------------------------------- /app/images/windock/win-dock-alert-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/windock/win-dock-alert-9.png -------------------------------------------------------------------------------- /app/images/windock/win-dock-alert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sivaramsi/manageyum/835afb0d5d77e7584c3f3da313e3f6307cc35770/app/images/windock/win-dock-alert.png -------------------------------------------------------------------------------- /app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Manageyum", 3 | "productName": "Manageyum", 4 | "description": "All apps in one place", 5 | "version": "2.0.1", 6 | "author": "Vinoth David ", 7 | "copyright": "© 2016, Revmakx inc.", 8 | "homepage": "http://manageyum.com", 9 | "license": "MIT", 10 | "main": "background.js", 11 | "dependencies": { 12 | "angular": "^1.5.8", 13 | "angular-electron": "^0.2.1", 14 | "angular-hotkeys": "^1.7.0", 15 | "angular-ladda": "^0.4.3", 16 | "angular-local-storage": "^0.5.0", 17 | "angular-md5": "^0.1.10", 18 | "angular-sanitize": "^1.5.8", 19 | "angular-stripe-checkout": "^5.1.0", 20 | "angular-ui-bootstrap": "^2.2.0", 21 | "angular-ui-router": "^1.0.0-beta.1", 22 | "angularfire": "^2.1.0", 23 | "angulartics": "^1.3.0", 24 | "angulartics-mixpanel": "^0.1.3", 25 | "auto-launch": "^5.0.1", 26 | "bootstrap": "^3.3.7", 27 | "checklist-model": "^0.10.0", 28 | "chrome-tabs": "0.0.1", 29 | "electron-context-menu": "^0.8.0", 30 | "electron-editor-context-menu": "^1.1.1", 31 | "electron-machine-id": "^1.0.9", 32 | "electron-search-text": "^0.3.0", 33 | "electron-spell-check-provider": "^1.0.0", 34 | "electron-spellchecker": "^1.0.6", 35 | "firebase": "^3.6.1", 36 | "fs-jetpack": "^0.9.0", 37 | "jquery": "^3.1.1", 38 | "lodash": "^4.17.2", 39 | "node-notifier": "^4.6.1", 40 | "semver": "^5.3.0" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * @ngdoc overview 5 | * @name puraApp 6 | * @description 7 | * # puraApp 8 | * 9 | * Main module of the application. 10 | */ 11 | 12 | 13 | 14 | 15 | 16 | 17 | //require('electron-context-menu')(); 18 | 19 | 20 | var SRC_DIR = './src/'; 21 | angular 22 | .module('puraApp', [ 23 | 'ui.router', 24 | 'ui.bootstrap', 25 | 'ngSanitize', 26 | 'LocalStorageModule', 27 | 'angular-electron', 28 | 'ui.router.state.events', 29 | 'angular-ladda', 30 | 'angulartics', 31 | 'stripe.checkout', 32 | 'angulartics.mixpanel', 33 | 'cfp.hotkeys', 34 | 'checklist-model', 35 | 'angular-md5' 36 | ]) 37 | .config(function($stateProvider, $urlRouterProvider, $httpProvider, $analyticsProvider) { 38 | 39 | $stateProvider 40 | .state('index', { 41 | url: '/', 42 | templateUrl: SRC_DIR + 'index/index.html' 43 | }) 44 | 45 | $urlRouterProvider.otherwise('/'); 46 | $analyticsProvider.virtualPageviews(false); 47 | }) 48 | 49 | -------------------------------------------------------------------------------- /app/src/auth/auth.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/auth/forgotpassword.controller.js: -------------------------------------------------------------------------------- 1 | angular.module('puraApp').component('forgotpassword', { 2 | templateUrl: './src/auth/forgotpassword.html', 3 | controller: forgotpasswordController, 4 | bindings: {} 5 | }); 6 | 7 | 8 | function forgotpasswordController($state, $scope, firebase) { 9 | var self = this; 10 | 11 | 12 | this.forgotpassword = function() { 13 | 14 | firebase 15 | .auth() 16 | .sendPasswordResetEmail(self.email) 17 | .then(function(data) { 18 | console.log("passwrod reset mail sent"); 19 | self.sucessMessage = "password reset mail sent, please check your mailbox."; 20 | $scope.$apply(); 21 | }) 22 | .catch(function(error) { 23 | console.log("passwrod reset mail error" + error); 24 | self.errorMessage = error.message; 25 | $scope.$apply(); 26 | }); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /app/src/auth/forgotpassword.html: -------------------------------------------------------------------------------- 1 |
2 | 39 |
40 | -------------------------------------------------------------------------------- /app/src/auth/login.controller.js: -------------------------------------------------------------------------------- 1 | angular.module('puraApp').component('login', { 2 | templateUrl: './src/auth/loginform.html', 3 | controller: loginController, 4 | bindings: {} 5 | }); 6 | 7 | 8 | function loginController($state, $scope) { 9 | var self = this; 10 | 11 | 12 | this.login = function() { 13 | self.loading = true; 14 | firebase.auth() 15 | .signInWithEmailAndPassword(self.email, self.password) 16 | .then(function(authData) { 17 | console.log("authData" + authData); 18 | self.loading = false; 19 | $state.go('index'); 20 | }) 21 | .catch(function(error) { 22 | self.loading = false; 23 | var errorCode = error.code; 24 | var errorMessage = error.message; 25 | self.errorMessage = errorMessage; 26 | $scope.$apply(); 27 | console.log("error" + error); 28 | }); 29 | 30 | 31 | 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /app/src/auth/login.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/auth/loginform.html: -------------------------------------------------------------------------------- 1 |
2 | 35 |
36 | -------------------------------------------------------------------------------- /app/src/auth/register.controller.js: -------------------------------------------------------------------------------- 1 | angular.module('puraApp').component('register', { 2 | templateUrl: './src/auth/register.html', 3 | controller: registerController, 4 | bindings: {} 5 | }); 6 | 7 | 8 | function registerController($state, $scope) { 9 | var self = this; 10 | 11 | 12 | 13 | this.register = function() { 14 | firebase.auth() 15 | .createUserWithEmailAndPassword(self.email, self.password) 16 | .then(function(authData) { 17 | console.log("authData" + authData); 18 | $state.go('index'); 19 | }) 20 | .catch(function(error) { 21 | var errorCode = error.code; 22 | var errorMessage = error.message; 23 | self.errorMessage = errorMessage; 24 | $scope.$apply(); 25 | console.log("error" + error); 26 | }); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /app/src/auth/register.html: -------------------------------------------------------------------------------- 1 |
2 | 36 |
37 | -------------------------------------------------------------------------------- /app/src/components/APIInterceptor.service.js: -------------------------------------------------------------------------------- 1 | angular.module('puraApp') 2 | .service('APIInterceptor', function($rootScope, $injector) { 3 | var service = this; 4 | 5 | service.request = function(config) { 6 | var Auth =$injector.get('Auth'); 7 | var authData = Auth.$getAuth(); 8 | 9 | var access_token = authData ? authData.token : null; 10 | 11 | if (access_token) { 12 | config.headers.authorization = access_token; 13 | } 14 | return config; 15 | }; 16 | 17 | service.responseError = function(response) { 18 | if (response.status === 401) { 19 | //$rootScope.$broadcast('unauthorized'); 20 | } 21 | return response; 22 | }; 23 | }) 24 | -------------------------------------------------------------------------------- /app/src/enabledServices/enabledServices.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | Your trial expires in {{$ctrl.getExpiredDate($ctrl.currentPlan.expiration)}} days. Upgrade / Refer friends to enjoy Manageyum to the fullest. 4 |
5 |
8 |

Settings for {{$ctrl.mainLabel}} 9 |

10 | 11 |
12 |
13 |
14 |
15 | 18 |
19 |
20 |
Get Help
21 |
Buy Now
22 |
Subscribe
23 |
Refer Friends
24 |
Register your license
25 |
26 |
27 | 49 |
50 |
51 |
52 | 53 | -------------------------------------------------------------------------------- /app/src/home/home.controller.js: -------------------------------------------------------------------------------- 1 | angular 2 | .module('puraApp') 3 | .component('home', { 4 | templateUrl: './src/home/home.html', 5 | controller: homeController, 6 | bindings: { navindex: "=" } 7 | }); 8 | 9 | 10 | function homeController($sce, $uibModal, User, $log, $rootScope) { 11 | 12 | 13 | this.userServices = User.getServices(); 14 | 15 | this.activePill = 1; 16 | 17 | this.refreshNotificationCenter = function() { 18 | $rootScope.$broadcast('refreshNotificationCenter', { test: 'test' }); 19 | } 20 | 21 | $rootScope.$on('homeNavIndexChanged', (event, data) => { 22 | console.log("home navindex changed" + data.index); 23 | this.activePill = data.index; 24 | // need to add webview listener 25 | }); 26 | } 27 | -------------------------------------------------------------------------------- /app/src/home/home.html: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/index/index.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | -------------------------------------------------------------------------------- /app/src/notificationcenter/notificationCenter.controller.js: -------------------------------------------------------------------------------- 1 | angular.module('puraApp').component('notificationcenter', { 2 | templateUrl: './src/notificationcenter/notificationCenter.html', 3 | controller: notificationCenterCtrl, 4 | bindings: {} 5 | }); 6 | 7 | 8 | function notificationCenterCtrl($sce, $uibModal, User, $log, Services, $rootScope) { 9 | var self = this; 10 | this.notifications = User.getNotifications(); 11 | 12 | $rootScope.$on('refreshNotificationCenter', (event, args) => { 13 | this.notifications = User.getNotifications(); 14 | }); 15 | 16 | function getNotificationsForServices(services) { 17 | let notifications = User.getNotifications(); 18 | let tempNotifications = []; 19 | angular.forEach(notifications, (notification) => { 20 | let service = _.find(services, { uuid: notification.uuid }); 21 | if (service) { 22 | tempNotifications.push(notification); 23 | } 24 | }); 25 | return tempNotifications; 26 | } 27 | 28 | this.refreshNotifications = function() { 29 | let activeProfile = User.getLastSelectedProfile(); 30 | if (activeProfile) { 31 | let services = activeProfile.services; 32 | this.notifications = getNotificationsForServices(services); 33 | return; 34 | } 35 | this.notifications = User.getNotifications(); 36 | } 37 | 38 | $rootScope.$on('profileChanged', (event, newService) => { 39 | this.refreshNotifications(); 40 | }); 41 | 42 | 43 | this.onNotificationClick = function(service, notification) { 44 | $rootScope.$broadcast('notificationClicked', { service: service, notification: notification }); 45 | } 46 | 47 | this.closeNotification = function(service) { 48 | let index = self.notifications.indexOf(service); 49 | if (index > -1) { 50 | self.notifications.splice(index, 1); 51 | } 52 | $rootScope.$broadcast('refreshNotificationCenter', { service: service }); 53 | } 54 | 55 | this.openShareModal = function() { 56 | $rootScope.$broadcast('openShareModal', {}); 57 | 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /app/src/notificationcenter/notificationCenter.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Overview

5 |
6 |
    7 |
    8 |
    9 |
    10 | 11 |
    12 |
    13 | {{service.label}} 14 |
    15 |
    16 | 17 |
    18 |
    19 |
    20 |
    21 |
    22 | 23 |
    24 |
    25 |
    {{notification.title}}
    26 |
    {{notification.options.body}}
    27 |
    {{notification.timestamp | date:"hh:mm a" }}
    28 |
    29 |
    30 |
    31 |
    32 |
    33 | No New Notifications 34 |
    35 |
36 |
37 | 40 |
41 | -------------------------------------------------------------------------------- /app/src/services/deleteProfile.html: -------------------------------------------------------------------------------- 1 | 4 |
5 | 10 | 14 |
15 | -------------------------------------------------------------------------------- /app/src/services/dynamicModal.html: -------------------------------------------------------------------------------- 1 | 4 |
5 | 7 | 9 |
10 | -------------------------------------------------------------------------------- /app/src/services/myModalContent.html: -------------------------------------------------------------------------------- 1 | 4 |
5 | 26 | 30 |
31 | -------------------------------------------------------------------------------- /app/src/services/preloaders/asana.js: -------------------------------------------------------------------------------- 1 | require('./utils/spellcheck.js'); 2 | require('./utils/zoom.js'); 3 | 4 | 5 | const { ipcRenderer } = require('electron'); 6 | 7 | var notificationMap = {}; 8 | 9 | var service = null; 10 | 11 | 12 | 13 | function replacePopupWithRedirect() { 14 | var google_auth_button = $('google_auth_button'); 15 | if (google_auth_button) { 16 | var str = google_auth_button.getAttribute('onclick'); 17 | str = str.replace('false', 'true'); 18 | google_auth_button.setAttribute('onclick', str); 19 | } 20 | } 21 | 22 | function getMessages() { 23 | var title = document.title; 24 | var count_indirect = 0; 25 | if (service.custom_badges_conf && service.custom_badges_conf.length > 0) { 26 | if (title.startsWith('●')) { 27 | count_indirect = 1; 28 | } 29 | } 30 | ipcRenderer['sendToHost']('notification-count', { 31 | count: 0, 32 | count_indirect: count_indirect 33 | }) 34 | } 35 | 36 | 37 | function initIpcListener() { 38 | ipcRenderer.on('open-notification', function(event, args) { 39 | console.log('am called'); 40 | 41 | var notification = args; 42 | var onClickFn = notificationMap[notification.title] 43 | 44 | if (onClickFn) { 45 | console.log('inside notificationHandler') 46 | onClickFn(); 47 | } 48 | }); 49 | 50 | ipcRenderer.on('serviceUpdate', function(event, args) { 51 | service = args; 52 | }); 53 | } 54 | 55 | 56 | asana = { 57 | init: function(serviceConfig) { 58 | service = JSON.parse(serviceConfig); 59 | setInterval(getMessages, 1000); 60 | replacePopupWithRedirect(); 61 | initIpcListener(); 62 | console.log("asana preloader initialized"); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /app/src/services/preloaders/closedotio.js: -------------------------------------------------------------------------------- 1 | require('./utils/spellcheck.js'); 2 | require('./utils/zoom.js'); 3 | const { ipcRenderer } = require('electron'); 4 | 5 | 6 | var notificationMap = {}; 7 | 8 | var service = null; 9 | var close = {}; 10 | var globalNotification = true; 11 | 12 | function getMessages() { 13 | 14 | var count = 0; 15 | var unreadBadge = $('.inbox-count.badge')[0]; 16 | 17 | if (unreadBadge) { 18 | count = parseInt(unreadBadge.innerHTML); 19 | } 20 | 21 | ipcRenderer['sendToHost']('notification-count', { 22 | count: count 23 | }); 24 | } 25 | 26 | 27 | function initNotificationProxy() { 28 | 29 | var OldNotification = Notification; 30 | 31 | OldNotification.onclick = Notification.onclick; 32 | 33 | var settings = { 34 | forceSilent: false, 35 | bodyOverride: undefined 36 | }; 37 | 38 | Notification = function(title, options) { 39 | 40 | if ((service === null || service.showNotifications) && globalNotification) { 41 | 42 | ipcRenderer.sendToHost('notification-message', { 43 | title: title, 44 | options: options 45 | }); 46 | 47 | 48 | var notification; 49 | setTimeout(() => { 50 | 51 | var onclickOld = notification.onclick; 52 | notificationMap[title] = onclickOld; 53 | notification.onclick = function() { 54 | ipcRenderer.sendToHost('notification-click', {}); 55 | console.log('notificationclicked') 56 | if (onclickOld) onclickOld(); 57 | }; 58 | }, 1); 59 | 60 | // Apply overrides // Apply overrides 61 | options = Object.assign({}, options); 62 | options = Object.assign({}, options); 63 | if (settings.forceSilent) options.silent = true; 64 | if (settings.forceSilent) options.silent = true; 65 | if (settings.bodyOverride) options.body = settings.bodyOverride; 66 | if (settings.bodyOverride) options.body = settings.bodyOverride; 67 | 68 | return notification = new OldNotification(title, options); 69 | } 70 | }; 71 | 72 | 73 | Notification.prototype = OldNotification.prototype; 74 | Notification.permission = OldNotification.permission; 75 | Notification.requestPermission = OldNotification.requestPermission; 76 | 77 | } 78 | 79 | function initIpcListener() { 80 | ipcRenderer.on('open-notification', function(event, args) { 81 | console.log('am called') 82 | var notification = args; 83 | var onClickFn = notificationMap[notification.title] 84 | if (onClickFn) { 85 | console.log('inside notificationHandler') 86 | onClickFn(); 87 | //notificationHandler(); 88 | } 89 | }); 90 | 91 | ipcRenderer.on('serviceUpdate', function(event, args) { 92 | service = args; 93 | }); 94 | ipcRenderer.on('global-notification', function(event, args) { 95 | console.log("global-notification changed"); 96 | globalNotification = args; 97 | }); 98 | } 99 | 100 | 101 | 102 | 103 | 104 | closedotio = { 105 | init: function(serviceConfig) { 106 | service = JSON.parse(serviceConfig); 107 | setInterval(getMessages, 1000); 108 | initNotificationProxy(); 109 | initIpcListener(); 110 | console.log("whatsapp preloader initialized"); 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /app/src/services/preloaders/confluence.js: -------------------------------------------------------------------------------- 1 | 2 | require('./utils/spellcheck.js'); 3 | require('./utils/zoom.js'); 4 | const { ipcRenderer } = require('electron'); 5 | 6 | 7 | var notificationMap = {}; 8 | 9 | var service = null; 10 | 11 | var globalNotification = true; 12 | 13 | function getMessages() { 14 | 15 | var badges = $('.aui-badge'); 16 | var count = 0; 17 | 18 | if (badges) { 19 | for (var i = 0; i < badges.length; i++) { 20 | if (!isNaN(badges[i].innerHTML)) { 21 | count = count + parseInt(badges[i].innerHTML); 22 | } 23 | } 24 | } 25 | 26 | ipcRenderer['sendToHost']('notification-count', { 27 | count: count 28 | }); 29 | 30 | } 31 | 32 | 33 | function initNotificationProxy() { 34 | 35 | var OldNotification = Notification; 36 | 37 | OldNotification.onclick = Notification.onclick; 38 | 39 | var settings = { 40 | forceSilent: false, 41 | bodyOverride: undefined 42 | }; 43 | 44 | Notification = function(title, options) { 45 | 46 | if ((service === null || service.showNotifications) && globalNotification) { 47 | 48 | ipcRenderer.sendToHost('notification-message', { 49 | title: title, 50 | options: options 51 | }); 52 | 53 | 54 | var notification; 55 | setTimeout(() => { 56 | 57 | var onclickOld = notification.onclick; 58 | notificationMap[title] = onclickOld; 59 | notification.onclick = function() { 60 | ipcRenderer.sendToHost('notification-click', {}); 61 | console.log('notificationclicked') 62 | if (onclickOld) onclickOld(); 63 | }; 64 | }, 1); 65 | 66 | // Apply overrides // Apply overrides 67 | options = Object.assign({}, options); 68 | options = Object.assign({}, options); 69 | if (settings.forceSilent) options.silent = true; 70 | if (settings.forceSilent) options.silent = true; 71 | if (settings.bodyOverride) options.body = settings.bodyOverride; 72 | if (settings.bodyOverride) options.body = settings.bodyOverride; 73 | 74 | return notification = new OldNotification(title, options); 75 | } 76 | }; 77 | 78 | 79 | Notification.prototype = OldNotification.prototype; 80 | Notification.permission = OldNotification.permission; 81 | Notification.requestPermission = OldNotification.requestPermission; 82 | 83 | } 84 | 85 | function initIpcListener() { 86 | ipcRenderer.on('open-notification', function(event, args) { 87 | console.log('am called') 88 | var notification = args; 89 | var onClickFn = notificationMap[notification.title] 90 | if (onClickFn) { 91 | console.log('inside notificationHandler') 92 | onClickFn(); 93 | //notificationHandler(); 94 | } 95 | }); 96 | 97 | ipcRenderer.on('serviceUpdate', function(event, args) { 98 | service = args; 99 | }); 100 | 101 | ipcRenderer.on('global-notification', function(event, args) { 102 | console.log("global-notification changed"); 103 | globalNotification = args; 104 | }); 105 | } 106 | 107 | 108 | 109 | 110 | 111 | 112 | confluence = { 113 | init: function(serviceConfig) { 114 | service = JSON.parse(serviceConfig); 115 | initNotificationProxy(); 116 | initIpcListener(); 117 | console.log("confluence preloader initialized"); 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /app/src/services/preloaders/css/slack.css: -------------------------------------------------------------------------------- 1 | #banner { 2 | display: none !important; 3 | } -------------------------------------------------------------------------------- /app/src/services/preloaders/custom_app.js: -------------------------------------------------------------------------------- 1 | require('./utils/spellcheck.js'); 2 | require('./utils/zoom.js'); 3 | const { ipcRenderer } = require('electron'); 4 | 5 | 6 | var notificationMap = {}; 7 | 8 | var service = null; 9 | var globalNotification = true; 10 | 11 | 12 | 13 | 14 | function initNotificationProxy() { 15 | 16 | var OldNotification = Notification; 17 | 18 | OldNotification.onclick = Notification.onclick; 19 | 20 | var settings = { 21 | forceSilent: false, 22 | bodyOverride: undefined 23 | }; 24 | 25 | Notification = function(title, options) { 26 | 27 | if ((service === null || service.showNotifications) && globalNotification) { 28 | 29 | ipcRenderer.sendToHost('notification-message', { 30 | title: title, 31 | options: options 32 | }); 33 | 34 | 35 | var notification; 36 | setTimeout(() => { 37 | 38 | var onclickOld = notification.onclick; 39 | notificationMap[title] = onclickOld; 40 | notification.onclick = function() { 41 | ipcRenderer.sendToHost('notification-click', {}); 42 | console.log('notificationclicked') 43 | if (onclickOld) onclickOld(); 44 | }; 45 | }, 1); 46 | 47 | // Apply overrides // Apply overrides 48 | options = Object.assign({}, options); 49 | options = Object.assign({}, options); 50 | if (settings.forceSilent) options.silent = true; 51 | if (settings.forceSilent) options.silent = true; 52 | if (settings.bodyOverride) options.body = settings.bodyOverride; 53 | if (settings.bodyOverride) options.body = settings.bodyOverride; 54 | 55 | return notification = new OldNotification(title, options); 56 | } 57 | }; 58 | 59 | 60 | Notification.prototype = OldNotification.prototype; 61 | Notification.permission = OldNotification.permission; 62 | Notification.requestPermission = OldNotification.requestPermission; 63 | 64 | } 65 | 66 | function initIpcListener() { 67 | ipcRenderer.on('open-notification', function(event, args) { 68 | console.log('am called') 69 | var notification = args; 70 | var onClickFn = notificationMap[notification.title] 71 | if (onClickFn) { 72 | console.log('inside notificationHandler') 73 | onClickFn(); 74 | //notificationHandler(); 75 | } 76 | }); 77 | 78 | ipcRenderer.on('serviceUpdate', function(event, args) { 79 | service = args; 80 | }); 81 | ipcRenderer.on('global-notification', function(event, args) { 82 | console.log("global-notification changed"); 83 | globalNotification = args; 84 | }); 85 | } 86 | 87 | 88 | 89 | 90 | 91 | custom_app = { 92 | init: function(serviceConfig) { 93 | service = JSON.parse(serviceConfig); 94 | initNotificationProxy(); 95 | initIpcListener(); 96 | console.log("custom preloader initialized"); 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /app/src/services/preloaders/evernote.js: -------------------------------------------------------------------------------- 1 | require('./utils/spellcheck.js'); 2 | require('./utils/zoom.js'); 3 | const { ipcRenderer } = require('electron'); 4 | 5 | 6 | var notificationMap = {}; 7 | 8 | var service = null; 9 | var globalNotification = true; 10 | 11 | function getMessages() { 12 | var count = 0; 13 | var element = $('.gwt-Label.GIKW210KR.GIKW210DE').not('.GIKW210KE'); 14 | if (element && element.length > 0) { 15 | element = element[0]; 16 | count = parseInt(element.innerHTML); 17 | } 18 | ipcRenderer['sendToHost']('notification-count', { 19 | count: count 20 | }) 21 | } 22 | 23 | 24 | function initNotificationProxy() { 25 | 26 | var OldNotification = Notification; 27 | 28 | OldNotification.onclick = Notification.onclick; 29 | 30 | var settings = { 31 | forceSilent: false, 32 | bodyOverride: undefined 33 | }; 34 | 35 | Notification = function(title, options) { 36 | 37 | if ((service === null || service.showNotifications) && globalNotification) { 38 | 39 | ipcRenderer.sendToHost('notification-message', { 40 | title: title, 41 | options: options 42 | }); 43 | 44 | 45 | var notification; 46 | setTimeout(() => { 47 | 48 | var onclickOld = notification.onclick; 49 | notificationMap[title] = onclickOld; 50 | notification.onclick = function() { 51 | ipcRenderer.sendToHost('notification-click', {}); 52 | console.log('notificationclicked') 53 | if (onclickOld) onclickOld(); 54 | }; 55 | }, 1); 56 | 57 | // Apply overrides // Apply overrides 58 | options = Object.assign({}, options); 59 | options = Object.assign({}, options); 60 | if (settings.forceSilent) options.silent = true; 61 | if (settings.forceSilent) options.silent = true; 62 | if (settings.bodyOverride) options.body = settings.bodyOverride; 63 | if (settings.bodyOverride) options.body = settings.bodyOverride; 64 | 65 | return notification = new OldNotification(title, options); 66 | } 67 | }; 68 | 69 | 70 | Notification.prototype = OldNotification.prototype; 71 | Notification.permission = OldNotification.permission; 72 | Notification.requestPermission = OldNotification.requestPermission; 73 | 74 | } 75 | 76 | function initIpcListener() { 77 | ipcRenderer.on('open-notification', function(event, args) { 78 | console.log('am called') 79 | var notification = args; 80 | var onClickFn = notificationMap[notification.title] 81 | if (onClickFn) { 82 | console.log('inside notificationHandler') 83 | onClickFn(); 84 | //notificationHandler(); 85 | } 86 | }); 87 | 88 | ipcRenderer.on('serviceUpdate', function(event, args) { 89 | service = args; 90 | }); 91 | ipcRenderer.on('global-notification', function(event, args) { 92 | console.log("global-notification changed"); 93 | globalNotification = args; 94 | }); 95 | } 96 | 97 | 98 | 99 | 100 | 101 | evernote = { 102 | init: function(serviceConfig) { 103 | service = JSON.parse(serviceConfig); 104 | setInterval(getMessages, 1000); 105 | initNotificationProxy(); 106 | initIpcListener(); 107 | console.log("evernote preloader initialized"); 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /app/src/services/preloaders/freshdesk.js: -------------------------------------------------------------------------------- 1 | require('./utils/spellcheck.js'); 2 | require('./utils/zoom.js'); 3 | const { ipcRenderer } = require('electron'); 4 | 5 | 6 | var notificationMap = {}; 7 | 8 | var service = null; 9 | var globalNotification = true; 10 | 11 | function getMessages() { 12 | // for (var e = document['getElementsByClassName']('unread'), t = 0, n = 0; n < e['length']; n++) { 13 | // 0 == e[n]['querySelectorAll']('.icon-muted')['length'] && t++ 14 | // }; 15 | // ipcRenderer['sendToHost']('notification-count', { 16 | // count: t 17 | // }) 18 | } 19 | 20 | 21 | function initNotificationProxy() { 22 | 23 | var OldNotification = Notification; 24 | 25 | OldNotification.onclick = Notification.onclick; 26 | 27 | var settings = { 28 | forceSilent: false, 29 | bodyOverride: undefined 30 | }; 31 | 32 | Notification = function(title, options) { 33 | 34 | if ((service === null || service.showNotifications) && globalNotification) { 35 | 36 | ipcRenderer.sendToHost('notification-message', { 37 | title: title, 38 | options: options 39 | }); 40 | 41 | 42 | var notification; 43 | setTimeout(() => { 44 | 45 | var onclickOld = notification.onclick; 46 | notificationMap[title] = onclickOld; 47 | notification.onclick = function() { 48 | ipcRenderer.sendToHost('notification-click', {}); 49 | console.log('notificationclicked') 50 | if (onclickOld) onclickOld(); 51 | }; 52 | }, 1); 53 | 54 | // Apply overrides // Apply overrides 55 | options = Object.assign({}, options); 56 | options = Object.assign({}, options); 57 | if (settings.forceSilent) options.silent = true; 58 | if (settings.forceSilent) options.silent = true; 59 | if (settings.bodyOverride) options.body = settings.bodyOverride; 60 | if (settings.bodyOverride) options.body = settings.bodyOverride; 61 | 62 | return notification = new OldNotification(title, options); 63 | } 64 | }; 65 | 66 | 67 | Notification.prototype = OldNotification.prototype; 68 | Notification.permission = OldNotification.permission; 69 | Notification.requestPermission = OldNotification.requestPermission; 70 | 71 | } 72 | 73 | function initIpcListener() { 74 | ipcRenderer.on('open-notification', function(event, args) { 75 | console.log('am called') 76 | var notification = args; 77 | var onClickFn = notificationMap[notification.title] 78 | if (onClickFn) { 79 | console.log('inside notificationHandler') 80 | onClickFn(); 81 | //notificationHandler(); 82 | } 83 | }); 84 | 85 | ipcRenderer.on('serviceUpdate', function(event, args) { 86 | service = args; 87 | }); 88 | ipcRenderer.on('global-notification', function(event, args) { 89 | console.log("global-notification changed"); 90 | globalNotification = args; 91 | }); 92 | } 93 | 94 | 95 | 96 | 97 | 98 | freshdesk = { 99 | init: function(serviceConfig) { 100 | service = JSON.parse(serviceConfig); 101 | setInterval(getMessages, 1000); 102 | initNotificationProxy(); 103 | initIpcListener(); 104 | console.log("freshdesk preloader initialized"); 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /app/src/services/preloaders/gitter.js: -------------------------------------------------------------------------------- 1 | require('./utils/spellcheck.js'); 2 | require('./utils/zoom.js'); 3 | const { ipcRenderer } = require('electron'); 4 | 5 | 6 | var notificationMap = {}; 7 | 8 | var service = null; 9 | var globalNotification = true; 10 | 11 | function getMessages() { 12 | for (var e = document['getElementsByClassName']('room-list-item__unread-badge'), t = 0, r = 0; r < e['length']; r++) { 13 | var n = parseInt(e[r]['innerText']['replace'](/[^0-9.]/g, '')); 14 | n > 0 && t++ 15 | }; 16 | ipcRenderer['sendToHost']('notification-count', { 17 | count: t 18 | }); 19 | } 20 | 21 | 22 | function initNotificationProxy() { 23 | 24 | var OldNotification = Notification; 25 | 26 | OldNotification.onclick = Notification.onclick; 27 | 28 | var settings = { 29 | forceSilent: false, 30 | bodyOverride: undefined 31 | }; 32 | 33 | Notification = function(title, options) { 34 | 35 | if ((service === null || service.showNotifications) && globalNotification) { 36 | 37 | ipcRenderer.sendToHost('notification-message', { 38 | title: title, 39 | options: options 40 | }); 41 | 42 | 43 | var notification; 44 | setTimeout(() => { 45 | 46 | var onclickOld = notification.onclick; 47 | notificationMap[title] = onclickOld; 48 | notification.onclick = function() { 49 | ipcRenderer.sendToHost('notification-click', {}); 50 | console.log('notificationclicked') 51 | if (onclickOld) onclickOld(); 52 | }; 53 | }, 1); 54 | 55 | // Apply overrides // Apply overrides 56 | options = Object.assign({}, options); 57 | options = Object.assign({}, options); 58 | if (settings.forceSilent) options.silent = true; 59 | if (settings.forceSilent) options.silent = true; 60 | if (settings.bodyOverride) options.body = settings.bodyOverride; 61 | if (settings.bodyOverride) options.body = settings.bodyOverride; 62 | 63 | return notification = new OldNotification(title, options); 64 | } 65 | }; 66 | 67 | 68 | Notification.prototype = OldNotification.prototype; 69 | Notification.permission = OldNotification.permission; 70 | Notification.requestPermission = OldNotification.requestPermission; 71 | 72 | } 73 | 74 | function initIpcListener() { 75 | ipcRenderer.on('open-notification', function(event, args) { 76 | console.log('am called') 77 | var notification = args; 78 | var onClickFn = notificationMap[notification.title] 79 | if (onClickFn) { 80 | console.log('inside notificationHandler') 81 | onClickFn(); 82 | //notificationHandler(); 83 | } 84 | }); 85 | ipcRenderer.on('serviceUpdate', function(event, args) { 86 | service = args; 87 | }); 88 | 89 | 90 | ipcRenderer.on('global-notification', function(event, args) { 91 | console.log("global-notification changed"); 92 | globalNotification = args; 93 | }); 94 | } 95 | 96 | 97 | 98 | 99 | 100 | gitter = { 101 | init: function(serviceConfig) { 102 | service = JSON.parse(serviceConfig); 103 | setInterval(getMessages, 1000); 104 | initNotificationProxy(); 105 | initIpcListener(); 106 | console.log("gitter preloader initialized"); 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /app/src/services/preloaders/google_calendar.js: -------------------------------------------------------------------------------- 1 | 2 | require('./utils/spellcheck.js'); 3 | require('./utils/zoom.js'); 4 | const { ipcRenderer } = require('electron'); 5 | 6 | var notificationMap = {}; 7 | var service = null; 8 | 9 | var globalNotification = true; 10 | 11 | 12 | 13 | 14 | 15 | function initNotificationProxy() { 16 | 17 | var OldNotification = Notification; 18 | 19 | OldNotification.onclick = Notification.onclick; 20 | 21 | var settings = { 22 | forceSilent: false, 23 | bodyOverride: undefined 24 | }; 25 | 26 | Notification = function(title, options) { 27 | 28 | if ((service === null || service.showNotifications) && globalNotification) { 29 | 30 | ipcRenderer.sendToHost('notification-message', { 31 | title: title, 32 | options: options 33 | }); 34 | 35 | 36 | var notification; 37 | setTimeout(() => { 38 | 39 | var onclickOld = notification.onclick; 40 | notificationMap[title] = onclickOld; 41 | notification.onclick = function() { 42 | ipcRenderer.sendToHost('notification-click', {}); 43 | console.log('notificationclicked') 44 | if (onclickOld) onclickOld(); 45 | }; 46 | }, 1); 47 | 48 | // Apply overrides // Apply overrides 49 | options = Object.assign({}, options); 50 | options = Object.assign({}, options); 51 | if (settings.forceSilent) options.silent = true; 52 | if (settings.forceSilent) options.silent = true; 53 | if (settings.bodyOverride) options.body = settings.bodyOverride; 54 | if (settings.bodyOverride) options.body = settings.bodyOverride; 55 | 56 | return notification = new OldNotification(title, options); 57 | } 58 | }; 59 | 60 | 61 | Notification.prototype = OldNotification.prototype; 62 | Notification.permission = OldNotification.permission; 63 | Notification.requestPermission = OldNotification.requestPermission; 64 | 65 | } 66 | 67 | 68 | function initIpcListener() { 69 | ipcRenderer.on('open-notification', function(event, args) { 70 | console.log('am called') 71 | var notification = args; 72 | var onClickFn = notificationMap[notification.title] 73 | if (onClickFn) { 74 | console.log('inside notificationHandler') 75 | onClickFn(); 76 | //notificationHandler(); 77 | } 78 | }); 79 | ipcRenderer.on('serviceUpdate', function(event, args) { 80 | service = args; 81 | }); 82 | ipcRenderer.on('global-notification', function(event, args) { 83 | console.log("global-notification changed"); 84 | globalNotification = args; 85 | }); 86 | } 87 | 88 | 89 | 90 | google_calendar = { 91 | init: function(serviceConfig) { 92 | service = JSON.parse(serviceConfig); 93 | console.log("google_calendar preloader initialized"); 94 | initNotificationProxy(); 95 | initIpcListener(); 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /app/src/services/preloaders/google_drive.js: -------------------------------------------------------------------------------- 1 | 2 | require('./utils/spellcheck.js'); 3 | require('./utils/zoom.js'); 4 | const { ipcRenderer } = require('electron'); 5 | 6 | 7 | var notificationMap = {}; 8 | 9 | var service = null; 10 | var globalNotification = true; 11 | 12 | function getMessages() { 13 | var count = 0; 14 | var actionItems = document.getElementsByClassName('ocLVN-Y-Sn-og-yc'); 15 | if (actionItems && actionItems.length > 0) { 16 | for (var i = 0; i < actionItems.length; i++) { 17 | count = count + parseInt(actionItems[i].innerHTML); 18 | } 19 | } 20 | 21 | ipcRenderer['sendToHost']('notification-count', { 22 | count: count 23 | }); 24 | } 25 | 26 | 27 | function initNotificationProxy() { 28 | 29 | var OldNotification = Notification; 30 | 31 | OldNotification.onclick = Notification.onclick; 32 | 33 | var settings = { 34 | forceSilent: false, 35 | bodyOverride: undefined 36 | }; 37 | 38 | Notification = function(title, options) { 39 | 40 | if ((service === null || service.showNotifications) && globalNotification) { 41 | 42 | ipcRenderer.sendToHost('notification-message', { 43 | title: title, 44 | options: options 45 | }); 46 | 47 | 48 | var notification; 49 | setTimeout(() => { 50 | 51 | var onclickOld = notification.onclick; 52 | notificationMap[title] = onclickOld; 53 | notification.onclick = function() { 54 | ipcRenderer.sendToHost('notification-click', {}); 55 | console.log('notificationclicked') 56 | if (onclickOld) onclickOld(); 57 | }; 58 | }, 1); 59 | 60 | // Apply overrides // Apply overrides 61 | options = Object.assign({}, options); 62 | options = Object.assign({}, options); 63 | if (settings.forceSilent) options.silent = true; 64 | if (settings.forceSilent) options.silent = true; 65 | if (settings.bodyOverride) options.body = settings.bodyOverride; 66 | if (settings.bodyOverride) options.body = settings.bodyOverride; 67 | 68 | return notification = new OldNotification(title, options); 69 | } 70 | }; 71 | 72 | 73 | Notification.prototype = OldNotification.prototype; 74 | Notification.permission = OldNotification.permission; 75 | Notification.requestPermission = OldNotification.requestPermission; 76 | 77 | } 78 | 79 | function initIpcListener() { 80 | ipcRenderer.on('open-notification', function(event, args) { 81 | console.log('am called') 82 | var notification = args; 83 | var onClickFn = notificationMap[notification.title] 84 | if (onClickFn) { 85 | console.log('inside notificationHandler') 86 | onClickFn(); 87 | //notificationHandler(); 88 | } 89 | }); 90 | 91 | ipcRenderer.on('serviceUpdate', function(event, args) { 92 | service = args; 93 | }); 94 | ipcRenderer.on('global-notification', function(event, args) { 95 | console.log("global-notification changed"); 96 | globalNotification = args; 97 | }); 98 | } 99 | 100 | 101 | 102 | 103 | 104 | google_drive = { 105 | init: function(serviceConfig) { 106 | service = JSON.parse(serviceConfig); 107 | //setInterval(getMessages, 1000); 108 | initNotificationProxy(); 109 | initIpcListener(); 110 | console.log("google_drive preloader initialized"); 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /app/src/services/preloaders/hangouts.js: -------------------------------------------------------------------------------- 1 | require('./utils/spellcheck.js'); 2 | require('./utils/zoom.js'); 3 | const { ipcRenderer } = require('electron'); 4 | 5 | 6 | var notificationMap = {}; 7 | 8 | var service = null; 9 | var globalNotification = true; 10 | 11 | function getMessages() { 12 | var count = 0; 13 | var tempCount = document.getElementById("hangout-landing-chat").lastChild.contentWindow.document.body.getElementsByClassName("ee ").length; 14 | if(tempCount){ 15 | count = tempCount; 16 | } 17 | ipcRenderer['sendToHost']('notification-count', { 18 | count: count 19 | }); 20 | } 21 | 22 | 23 | function initNotificationProxy() { 24 | 25 | var OldNotification = Notification; 26 | 27 | OldNotification.onclick = Notification.onclick; 28 | 29 | var settings = { 30 | forceSilent: false, 31 | bodyOverride: undefined 32 | }; 33 | 34 | Notification = function(title, options) { 35 | 36 | if ((service === null || service.showNotifications) && globalNotification) { 37 | 38 | ipcRenderer.sendToHost('notification-message', { 39 | title: title, 40 | options: options 41 | }); 42 | 43 | 44 | var notification; 45 | setTimeout(() => { 46 | 47 | var onclickOld = notification.onclick; 48 | notificationMap[title] = onclickOld; 49 | notification.onclick = function() { 50 | ipcRenderer.sendToHost('notification-click', {}); 51 | console.log('notificationclicked') 52 | if (onclickOld) onclickOld(); 53 | }; 54 | }, 1); 55 | 56 | // Apply overrides // Apply overrides 57 | options = Object.assign({}, options); 58 | options = Object.assign({}, options); 59 | if (settings.forceSilent) options.silent = true; 60 | if (settings.forceSilent) options.silent = true; 61 | if (settings.bodyOverride) options.body = settings.bodyOverride; 62 | if (settings.bodyOverride) options.body = settings.bodyOverride; 63 | 64 | return notification = new OldNotification(title, options); 65 | } 66 | }; 67 | 68 | 69 | Notification.prototype = OldNotification.prototype; 70 | Notification.permission = OldNotification.permission; 71 | Notification.requestPermission = OldNotification.requestPermission; 72 | 73 | } 74 | 75 | function initIpcListener() { 76 | ipcRenderer.on('open-notification', function(event, args) { 77 | console.log('am called') 78 | var notification = args; 79 | var onClickFn = notificationMap[notification.title] 80 | if (onClickFn) { 81 | console.log('inside notificationHandler') 82 | onClickFn(); 83 | //notificationHandler(); 84 | } 85 | }); 86 | 87 | ipcRenderer.on('serviceUpdate', function(event, args) { 88 | service = args; 89 | }); 90 | ipcRenderer.on('global-notification', function(event, args) { 91 | console.log("global-notification changed"); 92 | globalNotification = args; 93 | }); 94 | } 95 | 96 | 97 | 98 | 99 | 100 | hangouts = { 101 | init: function(serviceConfig) { 102 | service = JSON.parse(serviceConfig); 103 | setInterval(getMessages, 1000); 104 | initNotificationProxy(); 105 | initIpcListener(); 106 | console.log("hangouts preloader initialized"); 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /app/src/services/preloaders/hipchat.js: -------------------------------------------------------------------------------- 1 | require('./utils/spellcheck.js'); 2 | require('./utils/zoom.js'); 3 | const { ipcRenderer } = require('electron'); 4 | 5 | 6 | var notificationMap = {}; 7 | 8 | var service = null; 9 | 10 | var globalNotification = true; 11 | 12 | function getMessages() { 13 | var e = $('.hc-mention')['length'], 14 | t = $('.aui-badge')['not']('.hc-mention')['length'] - e; 15 | ipcRenderer['sendToHost']('notification-count', { 16 | count: e, 17 | count_indirect: t 18 | }) 19 | } 20 | 21 | 22 | function initNotificationProxy() { 23 | 24 | var OldNotification = Notification; 25 | 26 | OldNotification.onclick = Notification.onclick; 27 | 28 | var settings = { 29 | forceSilent: false, 30 | bodyOverride: undefined 31 | }; 32 | 33 | Notification = function(title, options) { 34 | 35 | if ((service === null || service.showNotifications) && globalNotification) { 36 | 37 | ipcRenderer.sendToHost('notification-message', { 38 | title: title, 39 | options: options 40 | }); 41 | 42 | 43 | var notification; 44 | setTimeout(() => { 45 | 46 | var onclickOld = notification.onclick; 47 | notificationMap[title] = onclickOld; 48 | notification.onclick = function() { 49 | ipcRenderer.sendToHost('notification-click', {}); 50 | console.log('notificationclicked') 51 | if (onclickOld) onclickOld(); 52 | }; 53 | }, 1); 54 | 55 | // Apply overrides // Apply overrides 56 | options = Object.assign({}, options); 57 | options = Object.assign({}, options); 58 | if (settings.forceSilent) options.silent = true; 59 | if (settings.forceSilent) options.silent = true; 60 | if (settings.bodyOverride) options.body = settings.bodyOverride; 61 | if (settings.bodyOverride) options.body = settings.bodyOverride; 62 | 63 | return notification = new OldNotification(title, options); 64 | } 65 | }; 66 | 67 | 68 | Notification.prototype = OldNotification.prototype; 69 | Notification.permission = OldNotification.permission; 70 | Notification.requestPermission = OldNotification.requestPermission; 71 | 72 | } 73 | 74 | function initIpcListener() { 75 | ipcRenderer.on('open-notification', function(event, args) { 76 | console.log('am called') 77 | var notification = args; 78 | var onClickFn = notificationMap[notification.title] 79 | if (onClickFn) { 80 | console.log('inside notificationHandler') 81 | onClickFn(); 82 | //notificationHandler(); 83 | } 84 | }); 85 | ipcRenderer.on('serviceUpdate', function(event, args) { 86 | service = args; 87 | }); 88 | ipcRenderer.on('global-notification', function(event, args) { 89 | console.log("global-notification changed"); 90 | globalNotification = args; 91 | }); 92 | } 93 | 94 | 95 | 96 | 97 | 98 | hipchat = { 99 | init: function(serviceConfig) { 100 | service = JSON.parse(serviceConfig); 101 | setInterval(getMessages, 1000); 102 | initNotificationProxy(); 103 | initIpcListener(); 104 | console.log("hipchat preloader initialized"); 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /app/src/services/preloaders/jira.js: -------------------------------------------------------------------------------- 1 | require('./utils/spellcheck.js'); 2 | require('./utils/zoom.js'); 3 | const { ipcRenderer } = require('electron'); 4 | 5 | 6 | var notificationMap = {}; 7 | 8 | var service = null; 9 | 10 | var globalNotification = true; 11 | 12 | function initNotificationProxy() { 13 | 14 | var OldNotification = Notification; 15 | 16 | OldNotification.onclick = Notification.onclick; 17 | 18 | var settings = { 19 | forceSilent: false, 20 | bodyOverride: undefined 21 | }; 22 | 23 | Notification = function(title, options) { 24 | 25 | if ((service === null || service.showNotifications) && globalNotification) { 26 | 27 | ipcRenderer.sendToHost('notification-message', { 28 | title: title, 29 | options: options 30 | }); 31 | 32 | 33 | var notification; 34 | setTimeout(() => { 35 | 36 | var onclickOld = notification.onclick; 37 | notificationMap[title] = onclickOld; 38 | notification.onclick = function() { 39 | ipcRenderer.sendToHost('notification-click', {}); 40 | console.log('notificationclicked') 41 | if (onclickOld) onclickOld(); 42 | }; 43 | }, 1); 44 | 45 | // Apply overrides // Apply overrides 46 | options = Object.assign({}, options); 47 | options = Object.assign({}, options); 48 | if (settings.forceSilent) options.silent = true; 49 | if (settings.forceSilent) options.silent = true; 50 | if (settings.bodyOverride) options.body = settings.bodyOverride; 51 | if (settings.bodyOverride) options.body = settings.bodyOverride; 52 | 53 | return notification = new OldNotification(title, options); 54 | } 55 | }; 56 | 57 | 58 | Notification.prototype = OldNotification.prototype; 59 | Notification.permission = OldNotification.permission; 60 | Notification.requestPermission = OldNotification.requestPermission; 61 | 62 | } 63 | 64 | function initIpcListener() { 65 | ipcRenderer.on('open-notification', function(event, args) { 66 | console.log('am called') 67 | var notification = args; 68 | var onClickFn = notificationMap[notification.title] 69 | if (onClickFn) { 70 | console.log('inside notificationHandler') 71 | onClickFn(); 72 | //notificationHandler(); 73 | } 74 | }); 75 | 76 | ipcRenderer.on('serviceUpdate', function(event, args) { 77 | service = args; 78 | }); 79 | 80 | ipcRenderer.on('global-notification', function(event, args) { 81 | console.log("global-notification changed"); 82 | globalNotification = args; 83 | }); 84 | } 85 | 86 | 87 | 88 | 89 | 90 | 91 | jira = { 92 | init: function(serviceConfig) { 93 | service = JSON.parse(serviceConfig); 94 | 95 | initNotificationProxy(); 96 | initIpcListener(); 97 | console.log("jira preloader initialized"); 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /app/src/services/preloaders/pura.js: -------------------------------------------------------------------------------- 1 | require('./utils/spellcheck.js'); 2 | require('./utils/zoom.js'); 3 | const { ipcRenderer } = require('electron'); 4 | 5 | 6 | var notificationMap = {}; 7 | 8 | var service = null; 9 | 10 | var globalNotification = true; 11 | 12 | function getMessages() { 13 | var unreadBadges = $('.ur-badge'); 14 | var count = 0; 15 | 16 | for (var i = 0; i < unreadBadges.length; i++) { 17 | if (unreadBadges[i].innerHTML.length > 0) { 18 | count = count + 1; 19 | } 20 | } 21 | 22 | 23 | 24 | ipcRenderer['sendToHost']('notification-count', { 25 | count: count 26 | }) 27 | } 28 | 29 | 30 | function initNotificationProxy() { 31 | 32 | var OldNotification = Notification; 33 | 34 | OldNotification.onclick = Notification.onclick; 35 | 36 | var settings = { 37 | forceSilent: false, 38 | bodyOverride: undefined 39 | }; 40 | 41 | Notification = function(title, options) { 42 | 43 | if ((service === null || service.showNotifications) && globalNotification) { 44 | 45 | ipcRenderer.sendToHost('notification-message', { 46 | title: title, 47 | options: options 48 | }); 49 | 50 | 51 | var notification; 52 | setTimeout(() => { 53 | 54 | var onclickOld = notification.onclick; 55 | notificationMap[title] = onclickOld; 56 | notification.onclick = function() { 57 | ipcRenderer.sendToHost('notification-click', {}); 58 | console.log('notificationclicked') 59 | if (onclickOld) onclickOld(); 60 | }; 61 | }, 1); 62 | 63 | // Apply overrides // Apply overrides 64 | options = Object.assign({}, options); 65 | options = Object.assign({}, options); 66 | if (settings.forceSilent) options.silent = true; 67 | if (settings.forceSilent) options.silent = true; 68 | if (settings.bodyOverride) options.body = settings.bodyOverride; 69 | if (settings.bodyOverride) options.body = settings.bodyOverride; 70 | 71 | return notification = new OldNotification(title, options); 72 | } 73 | }; 74 | 75 | 76 | Notification.prototype = OldNotification.prototype; 77 | Notification.permission = OldNotification.permission; 78 | Notification.requestPermission = OldNotification.requestPermission; 79 | 80 | } 81 | 82 | function initIpcListener() { 83 | ipcRenderer.on('open-notification', function(event, args) { 84 | console.log('am called') 85 | var notification = args; 86 | var onClickFn = notificationMap[notification.title] 87 | if (onClickFn) { 88 | console.log('inside notificationHandler') 89 | onClickFn(); 90 | //notificationHandler(); 91 | } 92 | }); 93 | ipcRenderer.on('serviceUpdate', function(event, args) { 94 | service = args; 95 | }); 96 | ipcRenderer.on('global-notification', function(event, args) { 97 | console.log("global-notification changed"); 98 | globalNotification = args; 99 | }); 100 | } 101 | 102 | 103 | 104 | 105 | 106 | pura = { 107 | init: function(serviceConfig) { 108 | service = JSON.parse(serviceConfig); 109 | setInterval(getMessages, 1000); 110 | initNotificationProxy(); 111 | initIpcListener(); 112 | console.log("pura preloader initialized"); 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /app/src/services/preloaders/salesforce.js: -------------------------------------------------------------------------------- 1 | require('./utils/spellcheck.js'); 2 | require('./utils/zoom.js'); 3 | const { ipcRenderer } = require('electron'); 4 | 5 | 6 | var notificationMap = {}; 7 | 8 | var service = null; 9 | var globalNotification = true; 10 | 11 | function getMessages() { 12 | 13 | var unreadBadge = document.getElementsByClassName('counterLabel'); 14 | var count = 0; 15 | 16 | if (unreadBadge && unreadBadge.length > 0) { 17 | count = parseInt(unreadBadge[0].innerHTML); 18 | } 19 | 20 | ipcRenderer['sendToHost']('notification-count', { 21 | count: count 22 | }) 23 | } 24 | 25 | 26 | function initNotificationProxy() { 27 | 28 | var OldNotification = Notification; 29 | 30 | OldNotification.onclick = Notification.onclick; 31 | 32 | var settings = { 33 | forceSilent: false, 34 | bodyOverride: undefined 35 | }; 36 | 37 | Notification = function(title, options) { 38 | 39 | if ((service === null || service.showNotifications) && globalNotification) { 40 | 41 | ipcRenderer.sendToHost('notification-message', { 42 | title: title, 43 | options: options 44 | }); 45 | 46 | 47 | var notification; 48 | setTimeout(() => { 49 | 50 | var onclickOld = notification.onclick; 51 | notificationMap[title] = onclickOld; 52 | notification.onclick = function() { 53 | ipcRenderer.sendToHost('notification-click', {}); 54 | console.log('notificationclicked') 55 | if (onclickOld) onclickOld(); 56 | }; 57 | }, 1); 58 | 59 | // Apply overrides // Apply overrides 60 | options = Object.assign({}, options); 61 | options = Object.assign({}, options); 62 | if (settings.forceSilent) options.silent = true; 63 | if (settings.forceSilent) options.silent = true; 64 | if (settings.bodyOverride) options.body = settings.bodyOverride; 65 | if (settings.bodyOverride) options.body = settings.bodyOverride; 66 | 67 | return notification = new OldNotification(title, options); 68 | } 69 | }; 70 | 71 | 72 | Notification.prototype = OldNotification.prototype; 73 | Notification.permission = OldNotification.permission; 74 | Notification.requestPermission = OldNotification.requestPermission; 75 | 76 | } 77 | 78 | function initIpcListener() { 79 | ipcRenderer.on('open-notification', function(event, args) { 80 | console.log('am called') 81 | var notification = args; 82 | var onClickFn = notificationMap[notification.title] 83 | if (onClickFn) { 84 | console.log('inside notificationHandler') 85 | onClickFn(); 86 | //notificationHandler(); 87 | } 88 | }); 89 | ipcRenderer.on('serviceUpdate', function(event, args) { 90 | service = args; 91 | }); 92 | ipcRenderer.on('global-notification', function(event, args) { 93 | console.log("global-notification changed"); 94 | globalNotification = args; 95 | }); 96 | } 97 | 98 | 99 | 100 | 101 | 102 | salesforce = { 103 | init: function(serviceConfig) { 104 | service = JSON.parse(serviceConfig); 105 | setInterval(getMessages, 1000); 106 | initNotificationProxy(); 107 | initIpcListener(); 108 | console.log("salesforce preloader initialized"); 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /app/src/services/preloaders/utils/spellcheck.js: -------------------------------------------------------------------------------- 1 | setTimeout(()=>{ 2 | // import {SpellCheckHandler, ContextMenuListener, ContextMenuBuilder} from 'electron-spellchecker'; 3 | const SpellCheckHandler = require('electron-spellchecker').SpellCheckHandler; 4 | const ContextMenuListener = require('electron-spellchecker').ContextMenuListener; 5 | const ContextMenuBuilder = require('electron-spellchecker').ContextMenuBuilder; 6 | window.spellCheckHandler = new SpellCheckHandler(); 7 | window.spellCheckHandler.attachToInput(); 8 | 9 | // Start off as US English, America #1 (lol) 10 | window.spellCheckHandler.switchLanguage('en-US'); 11 | 12 | let contextMenuBuilder = new ContextMenuBuilder(window.spellCheckHandler); 13 | let contextMenuListener = new ContextMenuListener((info) => { 14 | contextMenuBuilder.showPopupMenu(info); 15 | }); 16 | 17 | 18 | },1000); 19 | -------------------------------------------------------------------------------- /app/src/services/preloaders/utils/zoom.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var electron = require('electron'), 3 | ipcRenderer = electron['ipcRenderer'], 4 | webFrame = electron['webFrame'], 5 | _browser_zoomLevel = 0, 6 | _browser_maxZoom = 9, 7 | _browser_minZoom = -8; 8 | ipcRenderer['on']('zoomIn', function() { 9 | _browser_maxZoom > _browser_zoomLevel && (_browser_zoomLevel += 1), webFrame['setZoomLevel'](_browser_zoomLevel), ipcRenderer['sendToHost']('zoom-level', { 10 | zoom: _browser_zoomLevel 11 | }) 12 | }), ipcRenderer['on']('zoomOut', function() { 13 | _browser_zoomLevel > _browser_minZoom && (_browser_zoomLevel -= 1), webFrame['setZoomLevel'](_browser_zoomLevel), ipcRenderer['sendToHost']('zoom-level', { 14 | zoom: _browser_zoomLevel 15 | }) 16 | }), ipcRenderer['on']('zoomReset', function() { 17 | _browser_zoomLevel = 0, webFrame['setZoomLevel'](_browser_zoomLevel), ipcRenderer['sendToHost']('zoom-level', { 18 | zoom: _browser_zoomLevel 19 | }) 20 | }), ipcRenderer['on']('setZoom', function(e, o) { 21 | _browser_zoomLevel = o, webFrame['setZoomLevel'](_browser_zoomLevel) 22 | }) 23 | -------------------------------------------------------------------------------- /app/src/services/preloaders/whatsapp.js: -------------------------------------------------------------------------------- 1 | require('./utils/spellcheck.js'); 2 | require('./utils/zoom.js'); 3 | const { ipcRenderer } = require('electron'); 4 | 5 | 6 | var notificationMap = {}; 7 | 8 | var service = null; 9 | var globalNotification = true; 10 | 11 | function getMessages() { 12 | for (var e = document['getElementsByClassName']('unread'), t = 0, n = 0; n < e['length']; n++) { 13 | 0 == e[n]['querySelectorAll']('.icon-muted')['length'] && t++ 14 | }; 15 | ipcRenderer['sendToHost']('notification-count', { 16 | count: t 17 | }) 18 | } 19 | 20 | 21 | function initNotificationProxy() { 22 | 23 | var OldNotification = Notification; 24 | 25 | OldNotification.onclick = Notification.onclick; 26 | 27 | var settings = { 28 | forceSilent: false, 29 | bodyOverride: undefined 30 | }; 31 | 32 | 33 | 34 | Notification = function(title, options) { 35 | 36 | if ((service === null || service.showNotifications) && globalNotification) { 37 | 38 | 39 | ipcRenderer.sendToHost('notification-message', { 40 | title: title, 41 | options: options 42 | }); 43 | 44 | 45 | var notification; 46 | setTimeout(() => { 47 | 48 | var onclickOld = notification.onclick; 49 | notificationMap[title] = onclickOld; 50 | notification.onclick = function() { 51 | ipcRenderer.sendToHost('notification-click', {}); 52 | console.log('notificationclicked') 53 | if (onclickOld) onclickOld(); 54 | }; 55 | }, 1); 56 | 57 | // Apply overrides // Apply overrides 58 | options = Object.assign({}, options); 59 | options = Object.assign({}, options); 60 | if (settings.forceSilent) options.silent = true; 61 | if (settings.forceSilent) options.silent = true; 62 | if (settings.bodyOverride) options.body = settings.bodyOverride; 63 | if (settings.bodyOverride) options.body = settings.bodyOverride; 64 | 65 | return notification = new OldNotification(title, options); 66 | } 67 | }; 68 | 69 | 70 | Notification.prototype = OldNotification.prototype; 71 | Notification.permission = OldNotification.permission; 72 | Notification.requestPermission = OldNotification.requestPermission; 73 | 74 | } 75 | 76 | function initIpcListener() { 77 | ipcRenderer.on('open-notification', function(event, args) { 78 | console.log('am called') 79 | var notification = args; 80 | var onClickFn = notificationMap[notification.title] 81 | if (onClickFn) { 82 | console.log('inside notificationHandler') 83 | onClickFn(); 84 | //notificationHandler(); 85 | } 86 | }); 87 | 88 | ipcRenderer.on('serviceUpdate', function(event, args) { 89 | service = args; 90 | }); 91 | ipcRenderer.on('global-notification', function(event, args) { 92 | console.log("global-notification changed"); 93 | globalNotification = args; 94 | }); 95 | } 96 | 97 | 98 | 99 | 100 | 101 | whatsapp = { 102 | init: function(serviceConfig) { 103 | service = JSON.parse(serviceConfig); 104 | setInterval(getMessages, 1000); 105 | initNotificationProxy(); 106 | initIpcListener(); 107 | console.log("whatsapp preloader initialized"); 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /app/src/services/preloaders/zendesk.js: -------------------------------------------------------------------------------- 1 | require('./utils/spellcheck.js'); 2 | require('./utils/zoom.js'); 3 | 4 | const { ipcRenderer } = require('electron'); 5 | function getMessages() { 6 | var e = 0, 7 | r = document['querySelector']('.dashboard-top-panel .indicators .stats-group .cell-value'); 8 | r && (e = r['innerHTML']), ipcRenderer['sendToHost']('message-zendesk', { 9 | count: e 10 | }) 11 | } 12 | 13 | zendesk = { 14 | init: function() { 15 | setInterval(getMessages, 1000); 16 | console.log("zendesk preloader initialized"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/services/referModal.html: -------------------------------------------------------------------------------- 1 | 8 |
9 |