mirror of
https://github.com/owenlejeune/AirHockey.git
synced 2025-12-27 09:51:18 -05:00
Electron desktop client added
This commit is contained in:
38
Electron Client/node_modules/electron-prompt/README.md
generated
vendored
Normal file
38
Electron Client/node_modules/electron-prompt/README.md
generated
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
# electron-prompt
|
||||
|
||||
Electron helper to prompt for a value via input or select
|
||||
|
||||
## Usage
|
||||
|
||||
```
|
||||
npm install electron-prompt --save
|
||||
```
|
||||
|
||||
```js
|
||||
prompt([options, parentBrowserWindow]).then(...).catch(...)
|
||||
```
|
||||
|
||||
## Example
|
||||
|
||||
```js
|
||||
const prompt = require('electron-prompt');
|
||||
|
||||
prompt({
|
||||
title: 'Prompt example',
|
||||
label: 'URL:',
|
||||
value: 'http://example.org',
|
||||
inputAttrs: { // attrs to be set if using 'input'
|
||||
type: 'url'
|
||||
},
|
||||
type: 'select', // 'select' or 'input, defaults to 'input'
|
||||
selectOptions: { // select options if using 'select' type
|
||||
'value 1': 'Display Option 1',
|
||||
'value 2': 'Display Option 2',
|
||||
'value 3': 'Display Option 3'
|
||||
}
|
||||
})
|
||||
.then((r) => {
|
||||
console.log('result', r); // null if window was closed, or user clicked Cancel
|
||||
})
|
||||
.catch(console.error);
|
||||
```
|
||||
88
Electron Client/node_modules/electron-prompt/lib/index.js
generated
vendored
Normal file
88
Electron Client/node_modules/electron-prompt/lib/index.js
generated
vendored
Normal file
@@ -0,0 +1,88 @@
|
||||
const electron = require('electron');
|
||||
const BrowserWindow = electron.BrowserWindow || electron.remote.BrowserWindow;
|
||||
const ipcMain = electron.ipcMain || electron.remote.ipcMain;
|
||||
const url = require('url');
|
||||
const path = require('path');
|
||||
|
||||
function electronPrompt(options, parentWindow) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const id = `${new Date().getTime()}-${Math.random()}`;
|
||||
|
||||
const opts = Object.assign({
|
||||
title: 'Prompt',
|
||||
label: 'Please input a value:',
|
||||
alwaysOnTop: false,
|
||||
value: null,
|
||||
type: 'input',
|
||||
selectOptions: null
|
||||
}, options || {});
|
||||
|
||||
if(opts.type == 'select' && (opts.selectOptions === null || typeof(opts.selectOptions) !== 'object')) {
|
||||
return reject(new Error('"selectOptions" must be an object'));
|
||||
}
|
||||
|
||||
let promptWindow = new BrowserWindow({
|
||||
width: 370, height: 130,
|
||||
resizable: false,
|
||||
parent: parentWindow ? (parentWindow instanceof BrowserWindow) : null,
|
||||
skipTaskbar: true,
|
||||
alwaysOnTop: opts.alwaysOnTop,
|
||||
useContentSize: true,
|
||||
modal: parentWindow ? true : false,
|
||||
title : opts.title
|
||||
});
|
||||
|
||||
promptWindow.setMenu(null);
|
||||
|
||||
const getOptionsListener = (event) => {
|
||||
event.returnValue = JSON.stringify(opts);
|
||||
};
|
||||
|
||||
const postDataListener = (event, value) => {
|
||||
resolve(value);
|
||||
event.returnValue = null;
|
||||
cleanup();
|
||||
};
|
||||
|
||||
const unresponsiveListener = () => {
|
||||
reject(new Error('Window was unresponsive'));
|
||||
cleanup();
|
||||
};
|
||||
|
||||
const errorListener = (event, message) => {
|
||||
reject(new Error(message));
|
||||
event.returnValue = null;
|
||||
cleanup();
|
||||
};
|
||||
|
||||
const cleanup = () => {
|
||||
if (promptWindow) {
|
||||
promptWindow.close();
|
||||
promptWindow = null;
|
||||
}
|
||||
};
|
||||
|
||||
ipcMain.on('prompt-get-options:' + id, getOptionsListener);
|
||||
ipcMain.on('prompt-post-data:' + id, postDataListener);
|
||||
ipcMain.on('prompt-error:' + id, errorListener);
|
||||
promptWindow.on('unresponsive', unresponsiveListener);
|
||||
|
||||
promptWindow.on('closed', () => {
|
||||
ipcMain.removeListener('prompt-get-options:' + id, getOptionsListener);
|
||||
ipcMain.removeListener('prompt-post-data:' + id, postDataListener);
|
||||
ipcMain.removeListener('prompt-error:' + id, postDataListener);
|
||||
resolve(null);
|
||||
});
|
||||
|
||||
const promptUrl = url.format({
|
||||
protocol: 'file',
|
||||
slashes: true,
|
||||
pathname: path.join(__dirname, 'page', 'prompt.html'),
|
||||
hash: id
|
||||
});
|
||||
|
||||
promptWindow.loadURL(promptUrl);
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = electronPrompt;
|
||||
69
Electron Client/node_modules/electron-prompt/lib/page/prompt.css
generated
vendored
Normal file
69
Electron Client/node_modules/electron-prompt/lib/page/prompt.css
generated
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
body {
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
line-height: 1.5em;
|
||||
color: #333;
|
||||
background-color: #fff;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#container {
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
display: flex;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#form {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#label {
|
||||
max-width: 100%;
|
||||
margin-bottom: .8em;
|
||||
padding: 0 .5em;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
#data {
|
||||
border-radius: 2px;
|
||||
background: #fff;
|
||||
width: 90%;
|
||||
padding: .4em .5em;
|
||||
border: 1px solid black;
|
||||
min-height: 2em;
|
||||
margin: 0 0 1.2em;
|
||||
}
|
||||
|
||||
select#data {
|
||||
height: 2em;
|
||||
}
|
||||
|
||||
#data-container {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#buttons {
|
||||
text-align: right;
|
||||
padding: 0 .5em 0 0;
|
||||
}
|
||||
|
||||
#buttons > button {
|
||||
border-radius: 2px;
|
||||
border: 0;
|
||||
margin: 0 0 0 .5em;
|
||||
font-size: .8em;
|
||||
line-height: 1em;
|
||||
padding: .6em 1em
|
||||
}
|
||||
|
||||
#ok {
|
||||
background-color: #3879D9;
|
||||
color: white;
|
||||
}
|
||||
|
||||
#cancel {
|
||||
background-color: #DDD;
|
||||
color: black;
|
||||
}
|
||||
18
Electron Client/node_modules/electron-prompt/lib/page/prompt.html
generated
vendored
Normal file
18
Electron Client/node_modules/electron-prompt/lib/page/prompt.html
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
<html>
|
||||
<head>
|
||||
<link href="prompt.css" rel="stylesheet" />
|
||||
</head>
|
||||
<body>
|
||||
<div id="container">
|
||||
<div id="form">
|
||||
<div id="label">...</div>
|
||||
<div id="data-container"></div>
|
||||
<div id="buttons">
|
||||
<button id="cancel">Cancel</button>
|
||||
<button id="ok">OK</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="prompt.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
99
Electron Client/node_modules/electron-prompt/lib/page/prompt.js
generated
vendored
Normal file
99
Electron Client/node_modules/electron-prompt/lib/page/prompt.js
generated
vendored
Normal file
@@ -0,0 +1,99 @@
|
||||
const { ipcRenderer } = require('electron');
|
||||
const docReady = require('doc-ready');
|
||||
let promptId, promptOptions;
|
||||
|
||||
window.onerror = (error) => {
|
||||
if(promptId) {
|
||||
promptError("An error has occured on the prompt window: \n"+error);
|
||||
}
|
||||
};
|
||||
|
||||
const promptError = (e) => {
|
||||
if(e instanceof Error) {
|
||||
e = e.message;
|
||||
}
|
||||
ipcRenderer.sendSync('prompt-error:'+promptId, e);
|
||||
}
|
||||
|
||||
const promptCancel = () => {
|
||||
ipcRenderer.sendSync('prompt-post-data:'+promptId, null);
|
||||
}
|
||||
|
||||
const promptSubmit = () => {
|
||||
const dataEl = document.getElementById('data');
|
||||
let data = null;
|
||||
|
||||
if(promptOptions.type === 'input') {
|
||||
data = dataEl.value
|
||||
} else if(promptOptions.type === 'select') {
|
||||
if(promptOptions.selectMultiple) {
|
||||
data = dataEl.querySelectorAll('option[selected]').map((o) => o.getAttribute('value'));
|
||||
} else {
|
||||
data = dataEl.value;
|
||||
}
|
||||
}
|
||||
ipcRenderer.sendSync('prompt-post-data:'+promptId, data);
|
||||
}
|
||||
|
||||
docReady(() => {
|
||||
promptId = document.location.hash.replace('#','');
|
||||
|
||||
try {
|
||||
promptOptions = JSON.parse(ipcRenderer.sendSync('prompt-get-options:'+promptId));
|
||||
} catch(e) {
|
||||
return promptError(e);
|
||||
}
|
||||
|
||||
document.getElementById("label").textContent = promptOptions.label;
|
||||
document.getElementById("ok").addEventListener('click', () => promptSubmit());
|
||||
document.getElementById("cancel").addEventListener('click', () => promptCancel());
|
||||
|
||||
const dataContainerEl = document.getElementById('data-container');
|
||||
|
||||
let dataEl;
|
||||
if(promptOptions.type === 'input') {
|
||||
dataEl = document.createElement('input');
|
||||
dataEl.setAttribute('type', 'text');
|
||||
|
||||
if(promptOptions.value) {
|
||||
dataEl.value = promptOptions.value;
|
||||
} else {
|
||||
dataEl.value = '';
|
||||
}
|
||||
|
||||
if(promptOptions.inputAttrs && typeof(promptOptions.inputAttrs) === 'object') {
|
||||
for(let k in promptOptions.inputAttrs) {
|
||||
if(!promptOptions.inputAttrs.hasOwnProperty(k)) continue;
|
||||
|
||||
dataEl.setAttribute(k, promptOptions.inputAttrs[k]);
|
||||
}
|
||||
}
|
||||
|
||||
dataEl.addEventListener('keyup', (e) => {
|
||||
e.which = e.which || e.keyCode;
|
||||
if(e.which == 13) {
|
||||
promptSubmit();
|
||||
}
|
||||
});
|
||||
} else if(promptOptions.type === 'select') {
|
||||
dataEl = document.createElement('select');
|
||||
let optionEl;
|
||||
|
||||
for(let k in promptOptions.selectOptions) {
|
||||
if(!promptOptions.selectOptions.hasOwnProperty(k)) continue;
|
||||
|
||||
optionEl = document.createElement('option');
|
||||
optionEl.setAttribute('value', k);
|
||||
optionEl.textContent = promptOptions.selectOptions[k];
|
||||
if(k === promptOptions.value) {
|
||||
optionEl.setAttribute('selected', 'selected');
|
||||
}
|
||||
dataEl.appendChild(optionEl);
|
||||
}
|
||||
}
|
||||
|
||||
dataContainerEl.appendChild(dataEl);
|
||||
dataEl.setAttribute('id', 'data');
|
||||
|
||||
dataEl.focus();
|
||||
});
|
||||
54
Electron Client/node_modules/electron-prompt/package.json
generated
vendored
Normal file
54
Electron Client/node_modules/electron-prompt/package.json
generated
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"_from": "electron-prompt@*",
|
||||
"_id": "electron-prompt@0.5.0",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-WauibfvMKgzDx1x5rZ8fO6I8x7fpOSWgbydGFtsvzoqmQj1r/KPJU+VzhqAQMXaDGRxqVGiVoJdCskgQIluV+A==",
|
||||
"_location": "/electron-prompt",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "electron-prompt@*",
|
||||
"name": "electron-prompt",
|
||||
"escapedName": "electron-prompt",
|
||||
"rawSpec": "*",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "*"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"#USER",
|
||||
"/"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/electron-prompt/-/electron-prompt-0.5.0.tgz",
|
||||
"_shasum": "e8ab1ec510aceb162e78639008e5e9ebaf02f07e",
|
||||
"_spec": "electron-prompt@*",
|
||||
"_where": "/Volumes/Clear Drive/Code/Javascript/AirHockey Elec",
|
||||
"author": {
|
||||
"name": "sperrichon",
|
||||
"email": "sperrichon@users.noreply.github.com",
|
||||
"url": "https://github.com/sperrichon"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/sperrichon/electron-prompt/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"dependencies": {
|
||||
"doc-ready": "^1.0.4"
|
||||
},
|
||||
"deprecated": false,
|
||||
"description": "Electron helper to prompt for a value via input or select",
|
||||
"homepage": "https://github.com/sperrichon/electron-prompt#readme",
|
||||
"keywords": [
|
||||
"electron",
|
||||
"prompt",
|
||||
"string"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "lib/index.js",
|
||||
"name": "electron-prompt",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/sperrichon/electron-prompt.git"
|
||||
},
|
||||
"version": "0.5.0"
|
||||
}
|
||||
Reference in New Issue
Block a user