From 0e1cff999afaae555abf07f0ccd5e72887c3aade Mon Sep 17 00:00:00 2001
From: Mike Frysinger
Date: Sun, 12 Mar 2017 00:51:25 -0800
Subject: [PATCH] add support for saving configs
Change the settings from a single entry to an array of computers.
With a lot of help from Gary Clark!
---
Makefile | 2 +-
js/main.js | 229 ++++++++++++++++++++++++++++++++++++++++++++++++-----
main.html | 69 +++++++++++-----
3 files changed, 262 insertions(+), 38 deletions(-)
diff --git a/Makefile b/Makefile
index 5e88047..7ffc43d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-CLOSURE = closure-compiler --language_in ECMASCRIPT5
+CLOSURE = closure-compiler --language_in ECMASCRIPT6
YUICOMPRESSOR = yuicompressor
all:
diff --git a/js/main.js b/js/main.js
index bfe3530..b74b59d 100644
--- a/js/main.js
+++ b/js/main.js
@@ -5,6 +5,17 @@ function status(msg) {
$$('[name=status]').innerText = msg;
}
+function popup_msg(ele, msg) {
+ var popup = $$('[name=popup_msg]');
+ var pos = ele.getBoundingClientRect();
+ popup.innerText = msg;
+ // Might want to add some generalized "center in element" logic.
+ popup.style.top = 5 + pos.top + 'px';
+ popup.style.left = pos.left + 'px';
+ popup.style.display = '';
+ setTimeout(() => { popup.style.display = 'none'; }, 3000);
+}
+
// Create a packet following the spec:
// https://en.wikipedia.org/wiki/Wake-on-LAN#Magic_packet
function magicpacket(mac, pass) {
@@ -194,59 +205,241 @@ function paste_pass() {
/*
* Storage logic.
*/
+
+var computers = [];
+
var settings_keys = [
+ 'computers',
+ 'last_selected',
+ 'theme',
+];
+var old_settings_keys = [
'host',
'mac',
'pass',
'port',
- 'theme',
];
var default_theme = 'dark';
+var default_name = 'Default';
var default_host = '192.168.0.255';
var default_port = '40000';
var default_mac = '20:00:00:00:00:00';
var default_pass = '00:00:00:00:00:00';
-function load_settings() {
- var storage = chrome.storage.local;
+/*
+ * Set form data based on selected computer settings.
+ * Uses defaults if not available.
+ */
+function load_computer(idx) {
+ var computer = computers[idx] || {};
+ chrome.storage.local.set({'last_selected': idx});
+ var form = $$('form[name=settings]');
+
+ form.computer.value = computer['name'] || default_name;
+ form.host.value = computer['host'] || default_host;
+ form.port.value = computer['port'] || default_port;
+ // We assume we only get called during init.
+ paste_mac();
+ form.mac.value = computer['mac'] || default_mac;
+ paste_mac();
+ paste_pass();
+ form.pass.value = computer['pass'] || default_pass;
+ paste_pass();
+}
+
+function load_settings() {
chrome.storage.local.get(settings_keys, function(settings) {
set_theme(settings['theme'] || default_theme);
- var form = $$('form[name=settings]');
- form.host.value = settings['host'] || default_host;
- form.port.value = settings['port'] || default_port;
- // We assume we only get called during init.
- paste_mac();
- form.mac.value = settings['mac'] || default_mac;
- paste_mac();
- paste_pass();
- form.pass.value = settings['pass'] || default_pass;
- paste_pass();
+ if ('computers' in settings) {
+ computers = settings['computers'] || [];
+ populate_computers();
+ load_computer(settings['last_selected'] || 0);
+ } else {
+ // Migrate old settings.
+ chrome.storage.local.get(old_settings_keys, function(settings) {
+ computers[0] = settings;
+ populate_computers();
+ load_computer(0);
+ store_settings();
+ chrome.storage.local.remove(old_settings_keys);
+ });
+ }
});
}
+/*
+ * Update the currently selected computer then write out the whole thing.
+ */
function store_settings() {
- var form = $$('form[name=settings]');
sync_mac();
sync_pass();
- var settings = {
+
+ var form = $$('form[name=settings]');
+ var select = $$('select[name=computer]');
+ var idx = select.selectedIndex;
+ computers[idx] = {
+ 'name': form.computer.value,
'host': form.host.value,
'mac': form.mac.value,
'pass': form.pass.value,
'port': form.port.value,
- 'theme': curr_theme,
};
- chrome.storage.local.set(settings);
+
+ chrome.storage.local.set({
+ 'computers': computers,
+ });
+}
+
+/*
+ * If they try deleting all entries, make sure we re-add the default.
+ */
+function check_empty_computers(select) {
+ if (select.length == 0) {
+ var option = document.createElement('option');
+ option.text = 'Default';
+ select.add(option, 0);
+ load_computer(0);
+ }
+}
+
+/*
+ * Fill out the computer drop down with existing config options.
+ */
+function populate_computers() {
+ var select = $$('select[name=computer]');
+ select.length = 0;
+
+ for (var i = 0; i < computers.length; i++) {
+ var option = document.createElement('option');
+ var computer = computers[i] || {};
+ option.text = computer['name'] || default_name;
+ select.add(option, i);
+ }
+
+ check_empty_computers(select);
+}
+
+/*
+ * When a computer config is selected, load the corresponding settings.
+ */
+function select_computer() {
+ load_computer($$('select[name=computer]').selectedIndex);
+}
+
+/*
+ * Toggle between the computer drop down & new name input field.
+ */
+function toggle_add_fields(hide_obj, show_obj) {
+ hide_obj.disabled = true;
+ hide_obj.style.display = 'none';
+ show_obj.disabled = false;
+ show_obj.style.display = 'inline';
+ show_obj.focus();
+}
+
+/*
+ * Del curent slected computer
+ */
+function del_computer() {
+ var select = $$('select[name=computer]');
+
+ var idx = select.selectedIndex;
+ // Delete the currently selected index.
+ computers.splice(idx, 1);
+ select.remove(idx);
+
+ // Make sure the list isn't entirely empty now.
+ check_empty_computers(select);
+
+ // Load/select the next entry in the list.
+ if (idx == select.length && idx > 0)
+ --idx;
+ load_computer(idx);
+
+ store_settings();
+}
+
+
+/*
+ * Shows an input box to enter new computer name.
+ */
+function add_computer_start() {
+ var select = $$('select[name=computer]');
+ var text = $$('input[name=computer_name]');
+
+ // If the box isn't visible, show it. Otherwise, they want to
+ // actually add the current settings so create a new entry.
+ if (select.style.display == 'none')
+ add_computer();
+ else
+ toggle_add_fields(select, text);
+}
+
+/*
+ * Wait for the enter key in the add text field.
+ */
+function add_computer_check(e) {
+ if (e.key == 'Enter') {
+ add_computer();
+ e.preventDefault();
+ }
+}
+
+/*
+ * Try to actually create a new computer entry.
+ */
+function add_computer() {
+ var select = $$('select[name=computer]');
+ var form = $$('form[name=settings]');
+ var text = $$('input[name=computer_name]');
+
+ var name = text.value.trim();
+ // Make sure they've added a valid name first.
+ // Options fields don't allow leading/trailing whitespace.
+ if (name == '') {
+ text.value = '';
+ toggle_add_fields(text, select);
+ return;
+ }
+
+ // Make sure they don't try to add a duplicate name.
+ for (var i = 0; i < select.length; ++i) {
+ if (select.options[i].value == name) {
+ popup_msg(text, 'ERROR: computer name already exists!');
+ return;
+ }
+ }
+ text.value = '';
+
+ var option = document.createElement('option');
+ option.text = name;
+ select.add(option, -1);
+
+ // Let the load_computer logic fill out the default values for us.
+ var idx = select.length - 1;
+ computers[idx] = {
+ 'name': name,
+ };
+ load_computer(select.length - 1);
+
+ toggle_add_fields(text, select);
+
+ store_settings();
}
/*
* Startup.
*/
window.onload = function() {
- $$('form[name=settings]').onsubmit = send;
+ $$('input[name=send]').onclick = send;
+ $$('select[name=computer]').onchange = select_computer;
$$('a[name=mac-paste]').onclick = paste_mac;
$$('a[name=pass-paste]').onclick = paste_pass;
+ $$('input[name=del_computer]').onclick = del_computer;
+ $$('input[name=add_computer]').onclick = add_computer_start;
+ $$('input[name=computer_name]').onkeypress = add_computer_check;
$$('input[name=theme]').onclick = toggle_theme;
load_settings();
diff --git a/main.html b/main.html
index 4d35eb2..278be36 100644
--- a/main.html
+++ b/main.html
@@ -20,6 +20,14 @@ input.mac {
text-align: center;
}
+select[name=computer] {
+ width: 275px;
+}
+
+input[name=computer_name] {
+ width: 270px;
+}
+
input[name=port] {
text-align: center;
}
@@ -39,6 +47,14 @@ a {
font-weight: bold;
border: 1px dashed;
}
+
+span[name=popup_msg] {
+ text-align: center;
+ font-weight: bold;
+ position: absolute;
+ background-color: yellow;
+ border: 1px solid;
+}
@@ -51,58 +67,73 @@ a {
+
+