diff --git a/README.md b/README.md index 6fa8b4d..b807cae 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,5 @@ -# Electron Todo +# Europa - Feature rich wrapper around Jupyter Lab -A simple todo app made with Electron. - -[See the tutorial here](https://medium.com/@codedraken) - -If something doesn't work in the future check the [Electron Breaking Changes page](https://github.com/electron/electron/blob/master/docs/api/breaking-changes.md). +## Screenshot +![Screenshot of Europa's welcome page](github-assets/img/welcomescreen.png) diff --git a/github-assets/img/welcomescreen.png b/github-assets/img/welcomescreen.png new file mode 100644 index 0000000..b5b6e1a Binary files /dev/null and b/github-assets/img/welcomescreen.png differ diff --git a/renderer/index.js b/renderer/index.js deleted file mode 100644 index 9f39ae8..0000000 --- a/renderer/index.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict' - -const { ipcRenderer } = require('electron') - -// delete todo by its text value ( used below in event listener) -const recentItemClicked = (e) => { - console.log(e.target.textContent); - // ipcRenderer.send('delete-todo', e.target.textContent) - ipcRenderer.send('open-url', e.target.textContent); -} - -document.getElementById('openUrlBtn').addEventListener('click', () => { - ipcRenderer.send('open-url-window') -}) -document.getElementById('newServerBtn').addEventListener('click', () => { - ipcRenderer.send('new-server-window') -}) - -// on receive todos -ipcRenderer.on('todos', (event, todos) => { - // get the todoList ul - const todoList = document.getElementById('todoList') - - // create html string - const todoItems = todos.reduce((html, todo) => { - html += `
  • ${todo}
  • ` - - return html - }, '') - - // set list html to the todo items - todoList.innerHTML = todoItems - - // add click handlers to delete the clicked todo - todoList.querySelectorAll('.recent-item').forEach(item => { - item.addEventListener('click', recentItemClicked) - }) -}) diff --git a/DataStore.js b/src/DataStore.js similarity index 100% rename from DataStore.js rename to src/DataStore.js diff --git a/Window.js b/src/Window.js similarity index 100% rename from Window.js rename to src/Window.js diff --git a/main.js b/src/main.js similarity index 67% rename from main.js rename to src/main.js index b87e868..9f10837 100644 --- a/main.js +++ b/src/main.js @@ -5,8 +5,10 @@ const { app, ipcMain, BrowserWindow } = require('electron') const Window = require('./Window') const DataStore = require('./DataStore') +const electronLocalshortcut = require('electron-localshortcut'); + +require('electron-reload')(process.cwd()) -require('electron-reload')(__dirname) // create a new todo store name "Todos Main" const todosData = new DataStore({ name: 'Todos Main' }) @@ -19,6 +21,8 @@ function main () { // add todo window let addTodoWin + let newJupyterWin + let newServerDialog // TODO: put these events into their own file @@ -77,30 +81,46 @@ function main () { // create add todo window ipcMain.on('open-url', (e, url) => { - console.log(url); - // if addTodoWin does not already exist - if (!newJupyterWin) { - // create a new add todo window - newJupyterWin = new BrowserWindow({ - width: 500, - height: 120, - // close with the main window - parent: mainWindow - }) - newJupyterWin.loadURL(url); - - // Disable menu bar - // newJupyterWin.setMenu(null) - // newJupyterWin.setAutoHideMenuBar(true) - // cleanup - newJupyterWin.on('closed', () => { - newJupyterWin = null - }) - newJupyterWin.once('ready-to-show', () => { - newJupyterWin.show() - }) + // Create a title for the new window + var windowTitle = 'Europa @ '.concat(url.substring(0, 100)); + if (url.length > 100) { + windowTitle.concat('...'); } + + console.log(windowTitle); + newJupyterWin = new BrowserWindow({ + width: 1080, + height: 768, + webPreferences: { + nodeIntegration: false + }, + title: windowTitle + }) + newJupyterWin.loadURL(url); + + // Disable menu bar + newJupyterWin.setMenu(null) + newJupyterWin.setAutoHideMenuBar(true) + + // cleanup + newJupyterWin.on('closed', () => { + newJupyterWin = null + }) + newJupyterWin.once('ready-to-show', () => { + newJupyterWin.show() + }) + + // Prevent the title from being updated + newJupyterWin.on('page-title-updated', (evt) => { + evt.preventDefault(); + }); + + // Register shortcuts + electronLocalshortcut.register(newJupyterWin, 'Ctrl+Shift+W', () => { + newJupyterWin.close(); + console.log('You pressed ctrl+shift+w'); + }); }) // add-todo from add todo window diff --git a/package-lock.json b/src/package-lock.json similarity index 98% rename from package-lock.json rename to src/package-lock.json index 042558f..16dba4f 100644 --- a/package-lock.json +++ b/src/package-lock.json @@ -816,6 +816,32 @@ "sumchecker": "^2.0.2" } }, + "electron-is-accelerator": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz", + "integrity": "sha1-UJ5RDCala1Xhf4Y6SwThEYRqsns=" + }, + "electron-localshortcut": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/electron-localshortcut/-/electron-localshortcut-3.2.1.tgz", + "integrity": "sha512-DWvhKv36GsdXKnaFFhEiK8kZZA+24/yFLgtTwJJHc7AFgDjNRIBJZ/jq62Y/dWv9E4ypYwrVWN2bVrCYw1uv7Q==", + "requires": { + "debug": "^4.0.1", + "electron-is-accelerator": "^0.1.0", + "keyboardevent-from-electron-accelerator": "^2.0.0", + "keyboardevents-areequal": "^0.2.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, "electron-reload": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/electron-reload/-/electron-reload-1.2.5.tgz", @@ -2682,6 +2708,16 @@ "array-includes": "^3.0.3" } }, + "keyboardevent-from-electron-accelerator": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz", + "integrity": "sha512-iQcmNA0M4ETMNi0kG/q0h/43wZk7rMeKYrXP7sqKIJbHkTU8Koowgzv+ieR/vWJbOwxx5nDC3UnudZ0aLSu4VA==" + }, + "keyboardevents-areequal": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz", + "integrity": "sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==" + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", diff --git a/package.json b/src/package.json similarity index 93% rename from package.json rename to src/package.json index b94bae4..4e86868 100644 --- a/package.json +++ b/src/package.json @@ -20,6 +20,7 @@ }, "dependencies": { "electron": "^3.0.4", + "electron-localshortcut": "^3.2.1", "electron-reload": "^1.2.5", "electron-store": "^2.0.0", "spectre.css": "^0.5.3" diff --git a/renderer/add.html b/src/renderer/add.html similarity index 100% rename from renderer/add.html rename to src/renderer/add.html diff --git a/renderer/add.js b/src/renderer/add.js similarity index 100% rename from renderer/add.js rename to src/renderer/add.js diff --git a/renderer/index.html b/src/renderer/index.html similarity index 69% rename from renderer/index.html rename to src/renderer/index.html index 4453d85..901c178 100644 --- a/renderer/index.html +++ b/src/renderer/index.html @@ -4,17 +4,15 @@ Jupytron - -
    -

    Jupytron

    -

    Editing evolved

    +

    Europa

    +

    Jupyter Lab's Moon

    diff --git a/src/renderer/index.js b/src/renderer/index.js new file mode 100644 index 0000000..1a5b960 --- /dev/null +++ b/src/renderer/index.js @@ -0,0 +1,68 @@ +'use strict' + +const { ipcRenderer, shell } = require('electron') + +// delete todo by its text value ( used below in event listener) +const recentItemClicked = (e) => { + console.log(e.target.textContent); + // ipcRenderer.send('delete-todo', e.target.textContent) + ipcRenderer.send('open-url', e.target.textContent); +} +const deleteRecentItemClicked = (e) => { + console.log(e.target.getAttribute('id')); + ipcRenderer.send('delete-todo', e.target.getAttribute('id')) +} + +document.getElementById('openUrlBtn').addEventListener('click', () => { + ipcRenderer.send('open-url-window') +}) +document.getElementById('newServerBtn').addEventListener('click', () => { + ipcRenderer.send('new-server-window') +}) + +// Listeners for help links +document.getElementById('helpReportIssue').addEventListener('click', () => { + shell.openExternal('https://github.com/suyashmahar/jupytron/issues') +}) +document.getElementById('helpGitHubRepo').addEventListener('click', () => { + shell.openExternal('https://github.com/suyashmahar/jupytron') +}) +document.getElementById('helpProductDocumentation').addEventListener('click', () => { + shell.openExternal('https://github.com/suyashmahar/jupytron/wiki') +}) +document.getElementById('helpTipsAndTricks').addEventListener('click', () => { + shell.openExternal('https://github.com/suyashmahar/jupytron/wiki/TipsAndTricks') +}) +document.getElementById('helpKeyboardShortcuts').addEventListener('click', () => { + shell.openExternal('https://github.com/suyashmahar/jupytron/wiki/KeyboardShortcuts') +}) + + +https://github.com/suyashmahar/jupytron/wiki + +// on receive todos +ipcRenderer.on('todos', (event, todos) => { + // get the todoList ul + const todoList = document.getElementById('todoList') + + // create html string + const todoItems = todos.reduce((html, todo) => { + var itemDeleteBtnHtml = `` + html += `
  • ${todo}${itemDeleteBtnHtml}
  • ` + + return html + }, '') + + // set list html to the todo items + todoList.innerHTML = todoItems + + // Add click handlers to the link + todoList.querySelectorAll('.recent-item-link').forEach(item => { + item.addEventListener('click', recentItemClicked) + }) + + // Add click handlers to the delete button + todoList.querySelectorAll('.inline-btn-link-delete').forEach(item => { + item.addEventListener('click', deleteRecentItemClicked) + }) +}) diff --git a/renderer/new_server/newserver.css b/src/renderer/new_server/newserver.css similarity index 100% rename from renderer/new_server/newserver.css rename to src/renderer/new_server/newserver.css diff --git a/renderer/new_server/newserver.html b/src/renderer/new_server/newserver.html similarity index 100% rename from renderer/new_server/newserver.html rename to src/renderer/new_server/newserver.html diff --git a/renderer/new_server/newserver.js b/src/renderer/new_server/newserver.js similarity index 100% rename from renderer/new_server/newserver.js rename to src/renderer/new_server/newserver.js diff --git a/renderer/style.css b/src/renderer/style.css similarity index 72% rename from renderer/style.css rename to src/renderer/style.css index 14a81a2..815d990 100644 --- a/renderer/style.css +++ b/src/renderer/style.css @@ -3,6 +3,25 @@ body { background-color: #fffbf6 !important; } +.recent-item-link {} + +.inline-btn-link-delete { + padding-left: 0.5%; + opacity: 0; + font-size: 80%; + text-decoration: none !important; +} + +.inline-btn-link-delete:hover { + opacity: 1; + color: red; +} + +.recent-item-link:hover + .inline-btn-link-delete { + opacity: 1; + color: red; +} + .vertical-center { background-color: #fffbf6 !important; min-height: 100%; /* Fallback for browsers do NOT support vh unit */