]> git.wh0rd.org - chrome-ext/web-power-switch.git/blobdiff - popup.js
fix dark theme
[chrome-ext/web-power-switch.git] / popup.js
index 189bbb74d071ab6d74bdb4f2d7b37bd58df6867e..2f4bea59a758ca2896c0548277bc86404647103a 100644 (file)
--- a/popup.js
+++ b/popup.js
@@ -1,4 +1,4 @@
-// Written by Mike Frysinger <vapier@gmail.com>.  Released into the public domain.  Suck it.
+// Written by Mike Frysinger <vapier@gmail.com>.  Released into the public domain.
 
 var url_base, user, pass;
 
@@ -14,8 +14,11 @@ function fetchpage(url, callback) {
                                        callback(xhr, state);
                                } else {
                                        xhr.setstatus = true;
-                                       setstatus('Could not connect;<br>check your ' +
-                                                 '<a href="' + chrome.extension.getURL('options.html') + '" target=_blank>settings</a>');
+                                       setstatus(
+                                               'Could not connect;<br>check your ' +
+                                               '<a id="open-settings" href="">settings</a>'
+                                       );
+                                       document.getElementById('open-settings').onclick = open_settings_page;
                                        console.log('connect error', state);
                                }
                        }
@@ -39,20 +42,38 @@ function fetchpage(url, callback) {
        }
 }
 
+function get_css_var(key) { return getComputedStyle(document.documentElement).getPropertyValue(`--${key}`); }
+
 function onoff(o) {
-       return o.toUpperCase() === 'ON' ? 'OFF' : 'ON';
+       const data = o.toUpperCase();
+       switch (data) {
+       case 'OFF':
+               return 'ON';
+       case 'ON':
+               return 'OFF';
+       default:
+               // For example, cycle uses CCL.
+               return data;
+       }
 }
 
 function toggleit(button) {
-       var outlet_num = button.id;
+       const outlet_num = button.id.split(':')[0];
        var old_status = button.data;
        var new_status = onoff(button.data);
        var url = 'outlet?' + outlet_num + '=' + new_status;
 
+       if (!button.id.endsWith('cycle')) {
+               const cycler = document.getElementById(`${button.id}:cycle`);
+               cycler.style.display = new_status === 'ON' ? 'block' : 'none';
+       }
+
        fetchpage(url, function(xhr, state) {
                console.log('switch ' + outlet_num + ': ' + old_status + ' -> ' + new_status);
-               button.value = 'Switch ' + old_status;
-               button.data = new_status;
+               if (!button.id.endsWith('cycle')) {
+                       button.value = 'Switch ' + old_status;
+                       button.data = new_status;
+               }
        });
 }
 function toggle() {
@@ -76,8 +97,13 @@ function toggle_confirm() {
        }, 5000);
 }
 
-function trim(str) {
-       return str.replace(/^\s+|\s+$/, '');
+/* Toggle the selected theme. */
+function toggle_theme() {
+       const theme = get_css_var('theme') == 'light' ? 'dark' : 'light';
+       const css = $('link#theme-override');
+       css.href = `css/${theme}.css`;
+       storage.set({theme});
+       return false;
 }
 
 function initpopup(xhr, state) {
@@ -101,42 +127,44 @@ function initpopup(xhr, state) {
                if (th.bgColor != '#DDDDFF')
                        continue;
 
-               var controller_name = trim(th.innerText);
+               var controller_name = th.innerText.trim();
                if (controller_name.slice(0, 12) != 'Controller: ')
                        continue;
 
                row = tbl.insertRow(-1);
                cell = row.insertCell(-1);
-               cell.colSpan = 2;
+               cell.colSpan = 10;
                cell.align = 'center';
-               cell.innerText = controller_name.slice(12);
-               cell.innerHTML = '<a href="' + url_base + '" target="_blank">' + cell.innerHTML + '</a>'
-       }
 
-       /*
-               <tr bgcolor="#F4F4F4"><td align=center>1</td>
-               <td>Outlet 1</td><td>
-               <b><font color=red>OFF</font></b></td><td>
-               <a  href=outlet?1=ON>Switch ON</a>
-               </td><td>
-               <!-- <a  href=outlet?1=CCL>Cycle</a> -->
-               </td></tr>
-       */
+               const a = document.createElement('a');
+               a.href = url_base;
+               a.target = '_blank';
+               a.text = controller_name.slice(12).trim();
+               cell.appendChild(a);
+
+               const button = document.createElement('button');
+               button.name = 'theme';
+               button.onclick = toggle_theme;
+               cell.appendChild(button);
+       }
 
        var tr, trs = state.currentTarget.responseXML.querySelectorAll('tr');
        for (var i = 0; tr = trs[i]; ++i) {
                if (tr.bgColor != '#F4F4F4')
                        continue;
 
-               var outlet_num     = trim(tr.children[0].innerText);
-               var outlet_name    = trim(tr.children[1].innerText);
-               var current_status = trim(tr.children[2].innerText);
-               var new_status     = trim(tr.children[3].innerText);
+               var outlet_num     = tr.children[0].innerText.trim();
+               var outlet_name    = tr.children[1].innerText.trim();
+               var current_status = tr.children[2].innerText.trim();
+               var new_status     = tr.children[3].innerText.trim();
                var confirmable    = tr.children[3].children[0].hasAttribute('onclick');
 
                row = tbl.insertRow(-1);
                cell = row.insertCell(-1);
-               cell.innerText = outlet_name + ':';
+               if (outlet_name === '')
+                       cell.innerHTML = '<i>unnamed</i>';
+               else
+                       cell.innerText = outlet_name + ':';
                cell = row.insertCell(-1);
                button = document.createElement('input');
                button.type = 'button';
@@ -145,6 +173,21 @@ function initpopup(xhr, state) {
                button.data = current_status;
                button.onclick = confirmable ? toggle_confirm : toggle;
                cell.appendChild(button);
+
+               // The switch only allows cycling when it's on.
+               cell = row.insertCell(-1);
+               button = document.createElement('input');
+               button.type = 'button';
+               button.id = `${outlet_num}:cycle`;
+               button.value = '🗘';
+               button.data = 'CCL';
+               button.title = 'Power cycle';
+               button.onclick = confirmable ? toggle_confirm : toggle;
+               if (current_status.toUpperCase() === 'OFF') {
+                       button.style.display = 'none';
+               }
+               button.style.fontSize = 'smaller';
+               cell.appendChild(button);
        }
 
        setstatus();
@@ -158,11 +201,35 @@ function setstatus(msg) {
        status.style.position   = msg ? '' : 'absolute';
 }
 
+function open_settings_page() {
+       chrome.runtime.openOptionsPage();
+}
+
 document.addEventListener('DOMContentLoaded', function() {
-       storage.get(settings_keys, function(settings) {
-               url_base = settings['url'] || settings_defaults['url'];
-               user = settings['user'] || settings_defaults['user'];
-               pass = settings['pass'] || settings_defaults['pass'];
-               fetchpage('index.htm', initpopup);
+       storage.get(settings_keys, function(settings_storage) {
+               const settings = Object.assign({}, settings_defaults, settings_storage);
+               url_base = settings['url'];
+               user = settings['user'];
+               pass = settings['pass'];
+               chrome.permissions.contains({
+                       origins: [url_base + '/*']
+               }, function(granted) {
+                       if (granted) {
+                               fetchpage('index.htm', initpopup);
+                       } else {
+                               setstatus(
+                                       'Missing permissions;<br>please visit the ' +
+                                       '<a id="open-settings" href="">settings page</a>' +
+                                       '<br>to grant access.<br>' +
+                                       '<center><input id=retry type=submit value=Retry></center>'
+                               );
+                               document.getElementById('open-settings').onclick = open_settings_page;
+                               // Work around http://crbug.com/125706.
+                               document.getElementById('retry').onclick = function() {
+                                       chrome.permissions.request({origins: [url_base + '/*']});
+                                       fetchpage('index.htm', initpopup);
+                               };
+                       }
+               });
        });
 });