From 05d67b8812dff45ccf34bf7c3433d40aab0fa30f Mon Sep 17 00:00:00 2001 From: Dani3lSun Date: Sun, 17 Jan 2016 18:08:02 +0100 Subject: [PATCH] initial commit --- .gitignore | 1 + README.md | 508 +++++++++++++++++++++++++++++++++++++++++++++++- apexutils.js | 18 ++ electronapex.js | 38 ++++ img/app.icns | Bin 0 -> 102459 bytes index.html | 39 ++++ main.js | 143 ++++++++++++++ package.json | 23 +++ 8 files changed, 768 insertions(+), 2 deletions(-) create mode 100644 apexutils.js create mode 100644 electronapex.js create mode 100644 img/app.icns create mode 100644 index.html create mode 100644 main.js create mode 100644 package.json diff --git a/.gitignore b/.gitignore index 4796eb8..8006b99 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ node_modules # Optional REPL history .node_repl_history + diff --git a/README.md b/README.md index 78323e1..3719e28 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,506 @@ -# apex-app-desktop -APEX App as Desktop Application using Github Electron +**Table of Contents** + +- [CrappyBird](#apex-desktop-application-using-github-electron) + - [Description](#description) + - [Helpful links](#helpful-links) + - [Successful](#successful) + - [Problems](#problems) + - [Changelog](#changelog) + - [Installation](#installation) + - [Preparations](#preparations) + - [Install Node.js](#install-node.js) + - [Electron App](#electron-app) + - [package.json](#package.json) + - [Install Electron into app folder and globally](#install-electron-into-app-folder-and-globally) + - [main.js](#main.js) + - [index.html](#index.html) + - [apexutils.js](#apexutils.js) + - [electronapex.js](#electronapex.js) + - [Starting the App](#starting-the-app) + - [Bundle the app into a real Application](#bundle-the-app-into-a-real-Application) + - [Sample functions](#sample-functions) + - [Desktop notifications](#desktop-notifications) + - [File open](#file-open) + - [APEX Authorization Scheme](#apex-authorization-scheme) + - [License](#license) + - [Preview](#preview) + +#APEX Desktop Application using Github Electron +##Description +This is not a ready to use software, but much more a showcase and tutorial how to build desktop APEX apps using Electron from Github... + +This showcase describes the steps I´ve been done (maybe wrong ones included, too :) ), there I had success and there a had problems with. + +##Helpful Links +- [Electron](http://electron.atom.io) +- [Electron on Github](https://github.com/atom/electron) +- [Node.js](https://nodejs.org) (required on your Machine to install all other things) +- [Electron API docs](https://github.com/atom/electron/tree/master/docs/api) +- [Electron Packager](https://github.com/maxogden/electron-packager) (Packaging Apps into container to rollout) +- [Electron Tutorial](http://ryanfrench.co/2015/05/02/harmonic_tutorial_1.html) (Sample App tutorial) + +##Successful +- Embed APEX App into electron using webview +- Copy&Paste support with App menu (menubar) +- Open links (href / window.open) inside of electron app +- Desktop Notifications +- React on console.log events from APEX app and do things with this (for example opening a local file) +- App style without border and titlebar +- fullscreen mode + +##Problems +- React on electron functions triggered from APEX app (nodeintegration and webview-preload functions in webviews does not work for APEX app (maybe because of the changed URL if page gets rendered)) +- Session state (on a hard refresh, app returns to login page (possible solution: on close get last webview URL and save it)) +- Closing to OS X dock: Reopening the app shows login page, instead of content from before (minimize works well) + +##Changelog + +####0.8 - Beta Testing + + +##Installation +###Preparations +####Install Node.js +It is required to have a up and running Node.js installation on your local development machine. +Either install it using a package manager, or download the latest version from Node.js homepage...for example: +- Ubuntu: +``` +apt-get install nodejs +apt-get install npm +``` + +- Mac OS X (Homebrew): +``` +brew install nodejs +``` + +- Windows: +Download and install it from Nodejs homepage + +npm is the package manager for node applications. Thus electron is based on node, npm is working all the same... + +###Electron App +####package.json +**not required if you decide to download this repository!** +The first step is to generate the package.json file +``` +mkdir apex-app-desktop +cd apex-app-desktop +npm init +``` + +The resulting json file could look like this: +```json +{ + "name": "apex-app-desktop", + "version": "1.0.0", + "description": "APEX Desktop Application using Github Electron", + "main": "main.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Dani3lSun/apex-app-desktop.git" + }, + "author": "Daniel Hochleitner", + "license": "MIT", + "bugs": { + "url": "https://github.com/Dani3lSun/apex-app-desktop/issues" + }, + "homepage": "https://github.com/Dani3lSun/apex-app-desktop#readme", + "devDependencies": { + "electron-prebuilt": "^0.36.4" + } +} +``` + +Now we have to add **"start": "electron .""** to the scripts tag of the json file. +```json +{ + "name": "apex-app-desktop", + "version": "1.0.0", + "description": "APEX Desktop Application using Github Electron", + "main": "main.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "electron ." + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Dani3lSun/apex-app-desktop.git" + }, + "author": "Daniel Hochleitner", + "license": "MIT", + "bugs": { + "url": "https://github.com/Dani3lSun/apex-app-desktop/issues" + }, + "homepage": "https://github.com/Dani3lSun/apex-app-desktop#readme", + "devDependencies": { + "electron-prebuilt": "^0.36.4" + } +} +``` + +####Install Electron into app folder and globally +**not required if you decide to download this repository!** + +``` +npm i electron-prebuilt --save-dev #for local app folder +npm i -g electron-prebuilt #globally for using commandline +``` + +####main.js +**not required if you decide to download this repository!** + +This is the main javascript file for the app (also mentioned in the package.json file). It will initialize the whole application. +Here you can open new windows, react on app events or create menus... + +```javascript +// Libraries used in the app +var app = require('app'); +var BrowserWindow = require('browser-window'); +var appMenu = require("menu"); +app.commandLine.appendSwitch('ignore-certificate-errors', 'true'); +// Crash Reporter (Optional) +require('crash-reporter').start({ + productName: 'APEX Plugins', + companyName: 'Daniel Hochleitner', + submitURL: 'https://github.com/Dani3lSun/apex-app-desktop/issues', + autoSubmit: false +}); +// Init mainWindow +var mainWindow = null; +// Kill the app when all windows are closed +app.on('mainWindow-all-closed', function() { + if (process.platform != 'darwin') { + app.quit(); + } +}); +// App is loaded +app.on('ready', function() { + // Create the main window for the app + mainWindow = new BrowserWindow({ + "width": 1280, // init width + "height": 800, // init height + "min-width": 1024, + "min-height": 800, + "resizable": true, + "use-content-size": true, + "transparent": true, // better look in OSX + "title-bar-style": "hidden-inset" // better look in OSX + }); + // Load in content with webview to APEX app + mainWindow.loadURL('file://' + __dirname + '/index.html'); + // Ensure that garbage collection occurs when the window is closed + mainWindow.on('closed', function(e) { + mainWindow = null; + }); + // Create the Application main menu (required for Copy&Paste Support) + // Application menu + var template = [{ + label: "Application", + submenu: [{ + label: "About Application", + selector: "orderFrontStandardAboutPanel:" + }, { + type: "separator" + }, { + label: "Quit", + accelerator: "Command+Q", + click: function() { + app.quit(); + } + }] + // Edit menu + }, { + label: "Edit", + submenu: [{ + label: "Undo", + accelerator: "CmdOrCtrl+Z", + selector: "undo:" + }, { + label: "Redo", + accelerator: "Shift+CmdOrCtrl+Z", + selector: "redo:" + }, { + type: "separator" + }, { + label: "Cut", + accelerator: "CmdOrCtrl+X", + selector: "cut:" + }, { + label: "Copy", + accelerator: "CmdOrCtrl+C", + selector: "copy:" + }, { + label: "Paste", + accelerator: "CmdOrCtrl+V", + selector: "paste:" + }, { + label: "Select All", + accelerator: "CmdOrCtrl+A", + selector: "selectAll:" + }] + }, { + // View menu + label: 'View', + submenu: [{ + label: 'Reload', + accelerator: 'CmdOrCtrl+R', + click: function(item, focusedWindow) { + if (focusedWindow) + focusedWindow.reload(); + } + }, { + label: 'Toggle Full Screen', + accelerator: (function() { + if (process.platform == 'darwin') + return 'Ctrl+Command+F'; + else + return 'F11'; + })(), + click: function(item, focusedWindow) { + if (focusedWindow) + focusedWindow.setFullScreen(!focusedWindow.isFullScreen()); + } + }, { + label: 'Toggle Developer Tools', + accelerator: (function() { + if (process.platform == 'darwin') + return 'Alt+Command+I'; + else + return 'Ctrl+Shift+I'; + })(), + click: function(item, focusedWindow) { + if (focusedWindow) + focusedWindow.toggleDevTools(); + } + }] + }]; + // set menu with options from above + appMenu.setApplicationMenu(appMenu.buildFromTemplate(template)); +}); +// Create the main window for the app when App is reopened from OSX Dock +app.on('activate', function(e, hasVisibleWindows) { + if (mainWindow === null) { + mainWindow = new BrowserWindow({ + "width": 1280, //init width + "height": 800, // init height + "min-width": 1024, + "min-height": 800, + "resizable": true, + "use-content-size": true, + "transparent": true, // better look in OSX + "title-bar-style": "hidden-inset" // better look in OSX + }); + mainWindow.loadURL('file://' + __dirname + '/index.html'); + mainWindow.on('closed', function() { + mainWindow = null; + }); + } +}); +``` + +####index.html +**not required if you decide to download this repository!** + +This file is opened from main.js. It includes the webview element which has as source the APEX URL. +Also this file has js functions that get triggered from webview events. + +```html + + + + + APEX Plugins + + + + + + + + + + +``` + +####apexutil.js +**not required if you decide to download this repository!** + +This file contains functions for APEX triggered events in electron opponent for electronapex.js functions inside APEX. +Generally spoken: All functions that are required by electron for the APEX js functions. Wrapped into a own file... + +```javascript +// Functions for APEX triggered events in electron +// opponent for electronapex.js functions inside APEX +// + +// electron functions +electron = window.require('electron'); + +var stringDevider = "::"; + +module.exports = { + // opens a local file from consol.log text from APEX + openLocalFile: function(consoleString) { + var position = consoleString.indexOf(stringDevider) + 2; + path = consoleString.substr(position); + var shell = electron.shell; + shell.openItem(path); + } +}; +``` + +####electronapex.js +**not required if you decide to download this repository!** + +This file contains js functions used in the APEX app itself. For example notifications or opening files. +File open uses console.log to trigger the event on electron side (not nice but works...hopefully someone was here more successful than I!). + +**Upload this file to your APEX application or workspace!** + +```javascript +// Functions for electron used in APEX +// functions often uses wrapper around console.log (webview.addEventListener('console-message' gets these events)) +// upload to APEX App! + +var stringDevider = "::"; +// global namespace +var electronapex = { + // open file + openFile: function(path) { + var type = 'open-file'; + console.log(type + stringDevider + path); + }, + // check if notifications are enabled + notifyCheck: function() { + // Let's check if the browser supports notifications + if (!("Notification" in window)) { + alert("This browser does not support system notifications"); + } + // Let's check whether notification permissions have already been granted + else if (Notification.permission === "granted") { + // If it's okay let's create a notification + var notification = new Notification("You already have granted Notification permissions, great!:)"); + } + // Otherwise, we need to ask the user for permission + else if (Notification.permission !== 'denied') { + Notification.requestPermission(function(permission) { + // If the user accepts, let's create a notification + if (permission === "granted") { + var notification = new Notification("Now Notifications should work!"); + } + }); + } + }, + // send a notification + doNotify: function(text) { + var notification = new Notification(text); + } +}; +``` + +####Starting the App +- If you cloned this repository than you have to do this: +``` +npm install #installs all dependencies from package.json +npm start +``` + +- If you did all by yourself: +``` +npm start +``` + +####Bundle the app into a real Application +To create a real application from your development app folder you need the "electron-packager" package installed globally: +``` +npm install electron-packager -g +``` + +Now you can create the application on commandline with: +``` +cd apex-app-desktop +electron-packager . "APEX Plugins" --platform=darwin --arch=x64 --version=0.36.4 --app-version=1.0.0 --icon img/app.icns +``` +This command creates a "APEX Plugins.app" for Mac OS X (darwin) in 64bit, optionally takes the image from img folder as application icon. ""--version" is the version string for electron, can be found in your package.json file! + +##Sample functions +###Desktop notifications +For this functionality I created a dynamic action (on button click) with this code: +```javascript +var text = $v('P15_NOTIFY_TEXT'); //read text from APEX item +electronapex.doNotify(text); //use function from electronapex.js +``` + +###Desktop notifications +For this functionality I created a dynamic action (on button click) with this code: +```javascript +var text = $v('P15_NOTIFY_TEXT'); //read text from APEX item +electronapex.doNotify(text); //use function from electronapex.js +``` + +Uses the Browser Notification API [MDN](https://developer.mozilla.org/de/docs/Web/API/notification) + +###File open +Here I wrapped the file path + type "open-file" into console.log. On electron side I react on this with "webview.addEventListener('console-message')". +I created a dynamic action (on button click) with this code: +```javascript +var path = $v('P15_FILE_PATH'); //read path from APEX item +electronapex.openFile(path); //use function from electronapex.js +``` + +###APEX Authorization Scheme +Thus the webview is created with the option (useragent="APEXDESKTOP" - index.html), +we can use this on APEX side to create a authorization scheme which is true or false based on the user agent of the "browser". + +Name: Is Electron User Agent +Message: This page is only visible inside a electron desktop app + +```language-sql +DECLARE + l_user_agent VARCHAR2(500); +BEGIN + l_user_agent := owa_util.get_cgi_env('HTTP_USER_AGENT'); + IF l_user_agent = 'APEXDESKTOP' THEN + RETURN TRUE; + ELSE + RETURN FALSE; + END IF; +END; +``` + +##License +This software is under **MIT License**. + +[LICENSE](https://github.com/Dani3lSun/apex-app-desktop/blob/master/LICENSE) + +##Preview +![]() +--- diff --git a/apexutils.js b/apexutils.js new file mode 100644 index 0000000..a2f82da --- /dev/null +++ b/apexutils.js @@ -0,0 +1,18 @@ +// Functions for APEX triggered events in electron +// opponent for electronapex.js functions inside APEX +// + +// electron functions +electron = window.require('electron'); + +var stringDevider = "::"; + +module.exports = { + // opens a local file from consol.log text from APEX + openLocalFile: function(consoleString) { + var position = consoleString.indexOf(stringDevider) + 2; + path = consoleString.substr(position); + var shell = electron.shell; + shell.openItem(path); + } +}; diff --git a/electronapex.js b/electronapex.js new file mode 100644 index 0000000..c24a6be --- /dev/null +++ b/electronapex.js @@ -0,0 +1,38 @@ +// Functions for electron used in APEX +// functions often uses wrapper around console.log (webview.addEventListener('console-message' gets these events)) +// upload to APEX App! + +var stringDevider = "::"; +// global namespace +var electronapex = { + // open file + openFile: function(path) { + var type = 'open-file'; + console.log(type + stringDevider + path); + }, + // check if notifications are enabled + notifyCheck: function() { + // Let's check if the browser supports notifications + if (!("Notification" in window)) { + alert("This browser does not support system notifications"); + } + // Let's check whether notification permissions have already been granted + else if (Notification.permission === "granted") { + // If it's okay let's create a notification + var notification = new Notification("You already have granted Notification permissions, great!:)"); + } + // Otherwise, we need to ask the user for permission + else if (Notification.permission !== 'denied') { + Notification.requestPermission(function(permission) { + // If the user accepts, let's create a notification + if (permission === "granted") { + var notification = new Notification("Now Notifications should work!"); + } + }); + } + }, + // send a notification + doNotify: function(text) { + var notification = new Notification(text); + } +}; diff --git a/img/app.icns b/img/app.icns new file mode 100644 index 0000000000000000000000000000000000000000..5278339cb544636cb9a26c531f3c45c6627e4431 GIT binary patch literal 102459 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 + + + + APEX Plugins + + + + + + + + + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..8053593 --- /dev/null +++ b/main.js @@ -0,0 +1,143 @@ +// Libraries used in the app +var app = require('app'); +var BrowserWindow = require('browser-window'); +var appMenu = require("menu"); +app.commandLine.appendSwitch('ignore-certificate-errors', 'true'); +// Crash Reporter (Optional) +require('crash-reporter').start({ + productName: 'APEX Plugins', + companyName: 'Daniel Hochleitner', + submitURL: 'https://github.com/Dani3lSun/apex-app-desktop/issues', + autoSubmit: false +}); +// Init mainWindow +var mainWindow = null; +// Kill the app when all windows are closed +app.on('mainWindow-all-closed', function() { + if (process.platform != 'darwin') { + app.quit(); + } +}); +// App is loaded +app.on('ready', function() { + // Create the main window for the app + mainWindow = new BrowserWindow({ + "width": 1280, // init width + "height": 800, // init height + "min-width": 1024, + "min-height": 800, + "resizable": true, + "use-content-size": true, + "transparent": true, // better look in OSX + "title-bar-style": "hidden-inset" // better look in OSX + }); + // Load in content with webview to APEX app + mainWindow.loadURL('file://' + __dirname + '/index.html'); + // Ensure that garbage collection occurs when the window is closed + mainWindow.on('closed', function(e) { + mainWindow = null; + }); + // Create the Application main menu (required for Copy&Paste Support) + // Application menu + var template = [{ + label: "Application", + submenu: [{ + label: "About Application", + selector: "orderFrontStandardAboutPanel:" + }, { + type: "separator" + }, { + label: "Quit", + accelerator: "Command+Q", + click: function() { + app.quit(); + } + }] + // Edit menu + }, { + label: "Edit", + submenu: [{ + label: "Undo", + accelerator: "CmdOrCtrl+Z", + selector: "undo:" + }, { + label: "Redo", + accelerator: "Shift+CmdOrCtrl+Z", + selector: "redo:" + }, { + type: "separator" + }, { + label: "Cut", + accelerator: "CmdOrCtrl+X", + selector: "cut:" + }, { + label: "Copy", + accelerator: "CmdOrCtrl+C", + selector: "copy:" + }, { + label: "Paste", + accelerator: "CmdOrCtrl+V", + selector: "paste:" + }, { + label: "Select All", + accelerator: "CmdOrCtrl+A", + selector: "selectAll:" + }] + }, { + // View menu + label: 'View', + submenu: [{ + label: 'Reload', + accelerator: 'CmdOrCtrl+R', + click: function(item, focusedWindow) { + if (focusedWindow) + focusedWindow.reload(); + } + }, { + label: 'Toggle Full Screen', + accelerator: (function() { + if (process.platform == 'darwin') + return 'Ctrl+Command+F'; + else + return 'F11'; + })(), + click: function(item, focusedWindow) { + if (focusedWindow) + focusedWindow.setFullScreen(!focusedWindow.isFullScreen()); + } + }, { + label: 'Toggle Developer Tools', + accelerator: (function() { + if (process.platform == 'darwin') + return 'Alt+Command+I'; + else + return 'Ctrl+Shift+I'; + })(), + click: function(item, focusedWindow) { + if (focusedWindow) + focusedWindow.toggleDevTools(); + } + }] + }]; + // set menu with options from above + appMenu.setApplicationMenu(appMenu.buildFromTemplate(template)); +}); +// Create the main window for the app when App is reopened from OSX Dock +app.on('activate', function(e, hasVisibleWindows) { + if (mainWindow === null) { + mainWindow = new BrowserWindow({ + "width": 1280, //init width + "height": 800, // init height + "min-width": 1024, + "min-height": 800, + "resizable": true, + "use-content-size": true, + "transparent": true, // better look in OSX + "title-bar-style": "hidden-inset" // better look in OSX + }); + mainWindow.loadURL('file://' + __dirname + '/index.html'); + mainWindow.on('closed', function() { + mainWindow = null; + }); + } +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..21d5586 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "apex-app-desktop", + "version": "1.0.0", + "description": "APEX Desktop Application using Github Electron", + "main": "main.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "electron ." + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Dani3lSun/apex-app-desktop.git" + }, + "author": "Daniel Hochleitner", + "license": "MIT", + "bugs": { + "url": "https://github.com/Dani3lSun/apex-app-desktop/issues" + }, + "homepage": "https://github.com/Dani3lSun/apex-app-desktop#readme", + "devDependencies": { + "electron-prebuilt": "^0.36.4" + } +}