From a025fc9d366d7ccb905a59bfbba11907bf2f82f5 Mon Sep 17 00:00:00 2001 From: Thomas Rupprecht Date: Wed, 22 Sep 2021 20:37:25 +0200 Subject: [PATCH 01/14] add editorconfig --- .editorconfig | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..af777b2 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*.{html,css,js,json}] +indent_style = tab +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true From cfc6e98097ab4a43acbc4d5472c9b35aca4df724 Mon Sep 17 00:00:00 2001 From: Thomas Rupprecht Date: Wed, 22 Sep 2021 21:04:32 +0200 Subject: [PATCH 02/14] reformat code --- background/index.html | 2 +- background/index.js | 106 ++++++++++++++++++------------------- config.js | 60 ++++++++++----------- manifest.json | 66 +++++++++++------------ popup/index.css | 46 ++++++++-------- popup/index.html | 98 +++++++++++++++++------------------ popup/index.js | 118 +++++++++++++++++++++--------------------- 7 files changed, 248 insertions(+), 248 deletions(-) diff --git a/background/index.html b/background/index.html index 0458901..d34a8ea 100644 --- a/background/index.html +++ b/background/index.html @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/background/index.js b/background/index.js index 5e654e9..d2b9138 100644 --- a/background/index.js +++ b/background/index.js @@ -1,85 +1,85 @@ const fetchJson = (url) => { - return fetch(url).then((response) => (response.json())); + return fetch(url).then((response) => (response.json())); }; const fetchCalendar = (days = 28) => { - let url = Config.calenderUrl + '?o=json'; - if (days) { - url += '&r=' + days; - } - return fetchJson(url); + let url = Config.calenderUrl + '?o=json'; + if (days) { + url += '&r=' + days; + } + return fetchJson(url); }; const fetchSpaceApi = () => { - return fetchJson(Config.spaceApiUrl); + return fetchJson(Config.spaceApiUrl); }; const updateBadge = (open) => { - let badgeText, badgeColor; - if (open) { - badgeText = browser.browserAction.setBadgeText({text: 'open'}); - badgeColor = browser.browserAction.setBadgeBackgroundColor({color: Config.openColor}); - } else { - badgeText = browser.browserAction.setBadgeText({text: ''}); - badgeColor = browser.browserAction.setBadgeBackgroundColor({color: null}); - } - Promise.all([badgeText, badgeColor]) - .then() - .catch((error) => { - console.error(error); - }); + let badgeText, badgeColor; + if (open) { + badgeText = browser.browserAction.setBadgeText({text: 'open'}); + badgeColor = browser.browserAction.setBadgeBackgroundColor({color: Config.openColor}); + } else { + badgeText = browser.browserAction.setBadgeText({text: ''}); + badgeColor = browser.browserAction.setBadgeBackgroundColor({color: null}); + } + Promise.all([badgeText, badgeColor]) + .then() + .catch((error) => { + console.error(error); + }); }; const sendNotification = (open) => { - browser.notifications.create('notification-id', { - type: 'basic', - iconUrl: browser.runtime.getURL('icons/logo.svg'), - title: 'Space Status', - message: 'Space ist jetzt ' + (open ? 'offen' : 'geschlossen') + '.' - }); + browser.notifications.create('notification-id', { + type: 'basic', + iconUrl: browser.runtime.getURL('icons/logo.svg'), + title: 'Space Status', + message: 'Space ist jetzt ' + (open ? 'offen' : 'geschlossen') + '.' + }); }; const fetchNewData = () => { - fetchCalendar().then((json) => { - window.calendar = json; - }).catch((error) => { - console.error(error); - }); + fetchCalendar().then((json) => { + window.calendar = json; + }).catch((error) => { + console.error(error); + }); - fetchSpaceApi().then((json) => { - if (window.spaceApi && window.spaceApi.state.open !== json.state.open) { - sendNotification(json.state.open) - } - window.spaceApi = json; - updateBadge(window.spaceApi.state.open); - }).catch((error) => { - console.error(error); - }); + fetchSpaceApi().then((json) => { + if (window.spaceApi && window.spaceApi.state.open !== json.state.open) { + sendNotification(json.state.open) + } + window.spaceApi = json; + updateBadge(window.spaceApi.state.open); + }).catch((error) => { + console.error(error); + }); }; let intervalHandler = null; const stopFetching = () => { - if (intervalHandler !== null) { - clearInterval(intervalHandler); - intervalHandler = null; - } + if (intervalHandler !== null) { + clearInterval(intervalHandler); + intervalHandler = null; + } }; const startFetching = () => { - fetchNewData(); - if (intervalHandler === null) { - intervalHandler = setInterval(() => { - fetchNewData(); - }, Config.refreshTimeout); - } + fetchNewData(); + if (intervalHandler === null) { + intervalHandler = setInterval(() => { + fetchNewData(); + }, Config.refreshTimeout); + } }; window.addEventListener('offline', () => { - stopFetching(); + stopFetching(); }); window.addEventListener('online', () => { - startFetching(); + startFetching(); }); if (window.navigator.onLine) { - startFetching(); + startFetching(); } diff --git a/config.js b/config.js index 4115d60..7aa1187 100644 --- a/config.js +++ b/config.js @@ -1,32 +1,32 @@ window.Config = { - refreshTimeout: 1000 * 60 * 5, // 5min, - spaceApiUrl: 'https://www.usrspace.at/spaceapi.json', - calenderUrl: 'https://www.usrspace.at/calendar.php', - openColor: '#33cc33', - quickLinks: [ - { - url: 'https://www.usrspace.at/', - img: 'icons/font-awesome/home-solid.svg', - alt: 'Home', - text: 'Homepage' - }, - { - url: 'https://wiki.usrspace.at/', - img: 'icons/font-awesome/wikipedia-w-brands.svg', - alt: 'Wiki', - text: 'Wiki' - }, - { - url: 'https://gitea.usrspace.at/', - img: 'icons/gitea-brands.svg', - alt: 'Gitea', - text: 'Gitea' - }, - { - url: 'https://cloud.usrspace.at/', - img: 'icons/font-awesome/cloud-solid.svg', - alt: 'Cloud', - text: 'Nextcloud' - } - ] + refreshTimeout: 1000 * 60 * 5, // 5min, + spaceApiUrl: 'https://www.usrspace.at/spaceapi.json', + calenderUrl: 'https://www.usrspace.at/calendar.php', + openColor: '#33cc33', + quickLinks: [ + { + url: 'https://www.usrspace.at/', + img: 'icons/font-awesome/home-solid.svg', + alt: 'Home', + text: 'Homepage' + }, + { + url: 'https://wiki.usrspace.at/', + img: 'icons/font-awesome/wikipedia-w-brands.svg', + alt: 'Wiki', + text: 'Wiki' + }, + { + url: 'https://gitea.usrspace.at/', + img: 'icons/gitea-brands.svg', + alt: 'Gitea', + text: 'Gitea' + }, + { + url: 'https://cloud.usrspace.at/', + img: 'icons/font-awesome/cloud-solid.svg', + alt: 'Cloud', + text: 'Nextcloud' + } + ] }; diff --git a/manifest.json b/manifest.json index e3af4dd..fa9c32c 100644 --- a/manifest.json +++ b/manifest.json @@ -1,35 +1,35 @@ { - "manifest_version": 2, - "name": "/usr/space", - "version": "0.6", - "description": "An Add-on for the Hacker-/Maker-Space /usr/space.", - "icons": { - "48": "icons/logo.svg", - "96": "icons/logo.svg" - }, - "background": { - "page": "background/index.html" - }, - "browser_action": { - "browser_style": true, - //"chrome_style": true, - "default_title": "/usr/space", - //"default_icon": "icons/logo.svg", - "default_icon": { - "16": "icons/logo.svg", - "32": "icons/logo.svg" - }, - "default_area": "navbar", - "default_popup": "popup/index.html" - }, - "permissions": [ - "https://www.usrspace.at/*", - "webRequest", - "notifications" - ], - "author": "Thomas Rupprecht" - //"developer": { - // "name": "Thomas Rupprecht", - // "url": "https://blog.ximex.at/" - //} + "manifest_version": 2, + "name": "/usr/space", + "version": "0.6", + "description": "An Add-on for the Hacker-/Maker-Space /usr/space.", + "icons": { + "48": "icons/logo.svg", + "96": "icons/logo.svg" + }, + "background": { + "page": "background/index.html" + }, + "browser_action": { + "browser_style": true, + //"chrome_style": true, + "default_title": "/usr/space", + //"default_icon": "icons/logo.svg", + "default_icon": { + "16": "icons/logo.svg", + "32": "icons/logo.svg" + }, + "default_area": "navbar", + "default_popup": "popup/index.html" + }, + "permissions": [ + "https://www.usrspace.at/*", + "webRequest", + "notifications" + ], + "author": "Thomas Rupprecht" + //"developer": { + // "name": "Thomas Rupprecht", + // "url": "https://blog.ximex.at/" + //} } diff --git a/popup/index.css b/popup/index.css index 3581388..ba08a1a 100644 --- a/popup/index.css +++ b/popup/index.css @@ -1,52 +1,52 @@ body { - width: 360px; + width: 360px; } h2 { - margin: 12px 8px 8px; + margin: 12px 8px 8px; } summary { - margin: 12px 8px 8px; + margin: 12px 8px 8px; } summary > h2 { - margin: 0; - display: inline-block; + margin: 0; + display: inline-block; } .panel-list-item > .icon { - text-align: center; - width: 23px; - margin-right: 4px; + text-align: center; + width: 23px; + margin-right: 4px; } .panel-list-item > .icon > img { - vertical-align: text-bottom; + vertical-align: text-bottom; } #state { - margin: 0 8px; + margin: 0 8px; } #state > img { - vertical-align: text-bottom; - margin-right: 4px; + vertical-align: text-bottom; + margin-right: 4px; } #calendar { - margin: 0 8px; + margin: 0 8px; } #calendar > div > img { - vertical-align: text-bottom; - margin-right: 4px; + vertical-align: text-bottom; + margin-right: 4px; } #space-api { - margin: 0; - padding: 0 8px; - height: 240px; - overflow-x: hidden; - overflow-y: scroll; - background-color: #ebebeb; + margin: 0; + padding: 0 8px; + height: 240px; + overflow-x: hidden; + overflow-y: scroll; + background-color: #ebebeb; } #space-api code { - font-family: monospace; - font-size: 10px; + font-family: monospace; + font-size: 10px; } diff --git a/popup/index.html b/popup/index.html index 9e3a94f..2de4255 100644 --- a/popup/index.html +++ b/popup/index.html @@ -1,57 +1,57 @@ - - /usr/space - + + /usr/space + - -
-

Aktueller Status

-
loading...
-
-
-

Links

-
- - - - -
-
-
-

Nächster Termin

-
loading...
-
-
-
-

SpaceApi JSON

-
loading...
-
-
+ +
+

Aktueller Status

+
loading...
+
+
+

Links

+
+ + + + +
+
+
+

Nächster Termin

+
loading...
+
+
+
+

SpaceApi JSON

+
loading...
+
+
- - - + + + diff --git a/popup/index.js b/popup/index.js index 9b97493..e24caa6 100644 --- a/popup/index.js +++ b/popup/index.js @@ -1,77 +1,77 @@ Array.from(document.getElementsByClassName('link')).forEach((element) => { - element.addEventListener('click', (event) => { - const newTab = browser.tabs.create({ - url: event.currentTarget.dataset.url - }); - newTab.then((data) => { - // console.log(data); - }).catch((error) => { - console.error(error); - }); - }); + element.addEventListener('click', (event) => { + const newTab = browser.tabs.create({ + url: event.currentTarget.dataset.url + }); + newTab.then((data) => { + // console.log(data); + }).catch((error) => { + console.error(error); + }); + }); }); browser.runtime.getBackgroundPage().then((page) => { - updateNextEvent(page.calendar); - updateSpaceApiJson(page.spaceApi); - updateState(page.spaceApi); + updateNextEvent(page.calendar); + updateSpaceApiJson(page.spaceApi); + updateState(page.spaceApi); }).catch((error) => { - console.error(error); + console.error(error); }); const updateNextEvent = (nextEvents) => { - const calendarElement = document.getElementById('calendar'); - calendarElement.innerText = ''; + const calendarElement = document.getElementById('calendar'); + calendarElement.innerText = ''; - if (nextEvents.length === 0) { - const hintNode = document.createTextNode('Keine Termine in den nächsten 4 Wochen!'); - const strongElement = document.createElement('strong'); - strongElement.append(hintNode); - calendarElement.append(strongElement); - return; - } + if (nextEvents.length === 0) { + const hintNode = document.createTextNode('Keine Termine in den nächsten 4 Wochen!'); + const strongElement = document.createElement('strong'); + strongElement.append(hintNode); + calendarElement.append(strongElement); + return; + } - const nextEventDate = nextEvents[0].begin.substr(0, 10); - const nextEventDateEvents = nextEvents.filter((nextEvent) => (nextEvent.begin.startsWith(nextEventDate))); + const nextEventDate = nextEvents[0].begin.substr(0, 10); + const nextEventDateEvents = nextEvents.filter((nextEvent) => (nextEvent.begin.startsWith(nextEventDate))); - nextEventDateEvents.forEach((nextEventDateEvent) => { - const divElement = document.createElement('div'); - divElement.innerHTML = 'Clock'; - const beginDate = new Date(nextEventDateEvent.begin); - const strongElement = document.createElement('strong'); - const timeElement = document.createElement('time'); - strongElement.textContent = nextEventDateEvent.name; - timeElement.datetime = beginDate.toISOString(); - const dateNode = document.createTextNode(beginDate.toLocaleString()); - // divElement.innerText = ''; - divElement.append(strongElement); - divElement.append(document.createTextNode(' ')); - divElement.append(timeElement); - timeElement.append(dateNode); - if (nextEventDateEvent.location) { - const locationNode = document.createTextNode(' (' + nextEventDateEvent.location + ')'); - divElement.append(locationNode); - } - calendarElement.append(divElement); - }); + nextEventDateEvents.forEach((nextEventDateEvent) => { + const divElement = document.createElement('div'); + divElement.innerHTML = 'Clock'; + const beginDate = new Date(nextEventDateEvent.begin); + const strongElement = document.createElement('strong'); + const timeElement = document.createElement('time'); + strongElement.textContent = nextEventDateEvent.name; + timeElement.datetime = beginDate.toISOString(); + const dateNode = document.createTextNode(beginDate.toLocaleString()); + // divElement.innerText = ''; + divElement.append(strongElement); + divElement.append(document.createTextNode(' ')); + divElement.append(timeElement); + timeElement.append(dateNode); + if (nextEventDateEvent.location) { + const locationNode = document.createTextNode(' (' + nextEventDateEvent.location + ')'); + divElement.append(locationNode); + } + calendarElement.append(divElement); + }); }; const updateSpaceApiJson = (spaceApi) => { - const spaceApiElement = document.querySelector('#space-api code'); - const json = JSON.stringify(spaceApi, null, 2).replace(/ /g, ' ').replace(/\n/g, '
'); - spaceApiElement.innerHTML = json; - // const jsonNode = document.createTextNode(json); - // spaceApiElement.innerText = ''; - // spaceApiElement.append(jsonNode); + const spaceApiElement = document.querySelector('#space-api code'); + const json = JSON.stringify(spaceApi, null, 2).replace(/ /g, ' ').replace(/\n/g, '
'); + spaceApiElement.innerHTML = json; + // const jsonNode = document.createTextNode(json); + // spaceApiElement.innerText = ''; + // spaceApiElement.append(jsonNode); }; const updateState = (spaceApi) => { - const stateElement = document.getElementById('state'); - const since = new Date(spaceApi.state.lastchange * 1000); - const sinceStr = ' seit '; - if (spaceApi.state.open) { - stateElement.innerHTML = 'OffenOffen' + sinceStr; - } else { - stateElement.innerHTML = 'GeschlossenGeschlossen' + sinceStr; - } + const stateElement = document.getElementById('state'); + const since = new Date(spaceApi.state.lastchange * 1000); + const sinceStr = ' seit '; + if (spaceApi.state.open) { + stateElement.innerHTML = 'OffenOffen' + sinceStr; + } else { + stateElement.innerHTML = 'GeschlossenGeschlossen' + sinceStr; + } }; From dcdd759e9e0517c740f39ea3c014a4ff9ba2f3e4 Mon Sep 17 00:00:00 2001 From: Thomas Rupprecht Date: Wed, 22 Sep 2021 21:17:51 +0200 Subject: [PATCH 03/14] add package.json for typescript type definitions --- package-lock.json | 26 ++++++++++++++++++++++++++ package.json | 5 +++++ 2 files changed, 31 insertions(+) create mode 100644 package-lock.json create mode 100644 package.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f9e8eac --- /dev/null +++ b/package-lock.json @@ -0,0 +1,26 @@ +{ + "name": "usrspace-browser-addon", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "devDependencies": { + "web-ext-types": "^3.2.1" + } + }, + "node_modules/web-ext-types": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-ext-types/-/web-ext-types-3.2.1.tgz", + "integrity": "sha512-oQZYDU3W8X867h8Jmt3129kRVKklz70db40Y6OzoTTuzOJpF/dB2KULJUf0txVPyUUXuyzV8GmT3nVvRHoG+Ew==", + "dev": true + } + }, + "dependencies": { + "web-ext-types": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-ext-types/-/web-ext-types-3.2.1.tgz", + "integrity": "sha512-oQZYDU3W8X867h8Jmt3129kRVKklz70db40Y6OzoTTuzOJpF/dB2KULJUf0txVPyUUXuyzV8GmT3nVvRHoG+Ew==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..b9d9b6a --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "web-ext-types": "^3.2.1" + } +} From 71fbce24e9b92e672aeb4e7cb10994ccfc8d3ac5 Mon Sep 17 00:00:00 2001 From: Thomas Rupprecht Date: Wed, 22 Sep 2021 21:36:54 +0200 Subject: [PATCH 04/14] use template strings --- background/index.js | 6 +++--- popup/index.js | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/background/index.js b/background/index.js index d2b9138..67597f1 100644 --- a/background/index.js +++ b/background/index.js @@ -3,9 +3,9 @@ const fetchJson = (url) => { }; const fetchCalendar = (days = 28) => { - let url = Config.calenderUrl + '?o=json'; + let url = `${Config.calenderUrl}?o=json`; if (days) { - url += '&r=' + days; + url += `&r=${days}`; } return fetchJson(url); }; @@ -35,7 +35,7 @@ const sendNotification = (open) => { type: 'basic', iconUrl: browser.runtime.getURL('icons/logo.svg'), title: 'Space Status', - message: 'Space ist jetzt ' + (open ? 'offen' : 'geschlossen') + '.' + message: `Space ist jetzt ${open ? 'offen' : 'geschlossen'}.` }); }; diff --git a/popup/index.js b/popup/index.js index e24caa6..31f7c60 100644 --- a/popup/index.js +++ b/popup/index.js @@ -49,7 +49,7 @@ const updateNextEvent = (nextEvents) => { divElement.append(timeElement); timeElement.append(dateNode); if (nextEventDateEvent.location) { - const locationNode = document.createTextNode(' (' + nextEventDateEvent.location + ')'); + const locationNode = document.createTextNode(` (${nextEventDateEvent.location})`); divElement.append(locationNode); } calendarElement.append(divElement); @@ -68,10 +68,10 @@ const updateSpaceApiJson = (spaceApi) => { const updateState = (spaceApi) => { const stateElement = document.getElementById('state'); const since = new Date(spaceApi.state.lastchange * 1000); - const sinceStr = ' seit '; + const sinceStr = ` seit `; if (spaceApi.state.open) { - stateElement.innerHTML = 'OffenOffen' + sinceStr; + stateElement.innerHTML = `OffenOffen ${sinceStr}`; } else { - stateElement.innerHTML = 'GeschlossenGeschlossen' + sinceStr; + stateElement.innerHTML = `GeschlossenGeschlossen ${sinceStr}`; } }; From 7aaf0d9840b8fcff840b6cc3d2fe4b317e3d5045 Mon Sep 17 00:00:00 2001 From: Thomas Rupprecht Date: Wed, 22 Sep 2021 21:43:35 +0200 Subject: [PATCH 05/14] format datetime --- popup/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/popup/index.js b/popup/index.js index 31f7c60..d361dad 100644 --- a/popup/index.js +++ b/popup/index.js @@ -42,7 +42,7 @@ const updateNextEvent = (nextEvents) => { const timeElement = document.createElement('time'); strongElement.textContent = nextEventDateEvent.name; timeElement.datetime = beginDate.toISOString(); - const dateNode = document.createTextNode(beginDate.toLocaleString()); + const dateNode = document.createTextNode(beginDate.toLocaleString([], {dateStyle: "short", timeStyle: "short"})); // divElement.innerText = ''; divElement.append(strongElement); divElement.append(document.createTextNode(' ')); @@ -68,7 +68,7 @@ const updateSpaceApiJson = (spaceApi) => { const updateState = (spaceApi) => { const stateElement = document.getElementById('state'); const since = new Date(spaceApi.state.lastchange * 1000); - const sinceStr = ` seit `; + const sinceStr = ` seit `; if (spaceApi.state.open) { stateElement.innerHTML = `OffenOffen ${sinceStr}`; } else { From 05d2d257e24fba7124680ae91216a7dc3b7207c3 Mon Sep 17 00:00:00 2001 From: Thomas Rupprecht Date: Wed, 22 Sep 2021 22:49:30 +0200 Subject: [PATCH 06/14] change to normal function and use async/await --- background/index.js | 56 +++++++++++++++++++++++---------------------- popup/index.js | 55 +++++++++++++++++++++++++------------------- 2 files changed, 60 insertions(+), 51 deletions(-) diff --git a/background/index.js b/background/index.js index 67597f1..24744cd 100644 --- a/background/index.js +++ b/background/index.js @@ -1,20 +1,20 @@ -const fetchJson = (url) => { +function fetchJson(url) { return fetch(url).then((response) => (response.json())); -}; +} -const fetchCalendar = (days = 28) => { +function fetchCalendar(days = 28) { let url = `${Config.calenderUrl}?o=json`; if (days) { url += `&r=${days}`; } return fetchJson(url); -}; +} -const fetchSpaceApi = () => { +function fetchSpaceApi() { return fetchJson(Config.spaceApiUrl); -}; +} -const updateBadge = (open) => { +async function updateBadge(open) { let badgeText, badgeColor; if (open) { badgeText = browser.browserAction.setBadgeText({text: 'open'}); @@ -23,56 +23,58 @@ const updateBadge = (open) => { badgeText = browser.browserAction.setBadgeText({text: ''}); badgeColor = browser.browserAction.setBadgeBackgroundColor({color: null}); } - Promise.all([badgeText, badgeColor]) - .then() - .catch((error) => { - console.error(error); - }); -}; + try { + await Promise.all([badgeText, badgeColor]); + } catch (error) { + console.error(error); + } +} -const sendNotification = (open) => { +function sendNotification(open) { browser.notifications.create('notification-id', { type: 'basic', iconUrl: browser.runtime.getURL('icons/logo.svg'), title: 'Space Status', message: `Space ist jetzt ${open ? 'offen' : 'geschlossen'}.` }); -}; +} -const fetchNewData = () => { - fetchCalendar().then((json) => { +async function fetchNewData() { + try { + const json = await fetchCalendar(); window.calendar = json; - }).catch((error) => { + } catch (error) { console.error(error); - }); + } - fetchSpaceApi().then((json) => { + try { + const json = await fetchSpaceApi(); if (window.spaceApi && window.spaceApi.state.open !== json.state.open) { sendNotification(json.state.open) } window.spaceApi = json; updateBadge(window.spaceApi.state.open); - }).catch((error) => { + } catch (error) { console.error(error); - }); -}; + } +} let intervalHandler = null; -const stopFetching = () => { +function stopFetching() { if (intervalHandler !== null) { clearInterval(intervalHandler); intervalHandler = null; } -}; -const startFetching = () => { +} +function startFetching() { fetchNewData(); if (intervalHandler === null) { intervalHandler = setInterval(() => { fetchNewData(); }, Config.refreshTimeout); } -}; +} window.addEventListener('offline', () => { stopFetching(); diff --git a/popup/index.js b/popup/index.js index d361dad..b237e8b 100644 --- a/popup/index.js +++ b/popup/index.js @@ -1,25 +1,32 @@ -Array.from(document.getElementsByClassName('link')).forEach((element) => { - element.addEventListener('click', (event) => { - const newTab = browser.tabs.create({ - url: event.currentTarget.dataset.url - }); - newTab.then((data) => { - // console.log(data); - }).catch((error) => { - console.error(error); - }); +async function linkElementClickListener(event) { + try { + const tab = await browser.tabs.create({url: event.currentTarget.dataset.url}); + // console.log(tab); + } catch (error) { + console.error(error); + } +} + +async function init() { + const linkElements = Array.from(document.getElementsByClassName('link')); + linkElements.forEach((linkElement) => { + linkElement.addEventListener('click', linkElementClickListener); }); -}); -browser.runtime.getBackgroundPage().then((page) => { - updateNextEvent(page.calendar); - updateSpaceApiJson(page.spaceApi); - updateState(page.spaceApi); -}).catch((error) => { - console.error(error); -}); + try { + const page = await browser.runtime.getBackgroundPage(); + console.log(page); -const updateNextEvent = (nextEvents) => { + updateNextEvent(page.calendar); + updateSpaceApiJson(page.spaceApi); + updateState(page.spaceApi); + } catch (error) { + console.error(error); + } +} +init(); + +function updateNextEvent(nextEvents) { const calendarElement = document.getElementById('calendar'); calendarElement.innerText = ''; @@ -54,18 +61,18 @@ const updateNextEvent = (nextEvents) => { } calendarElement.append(divElement); }); -}; +} -const updateSpaceApiJson = (spaceApi) => { +function updateSpaceApiJson(spaceApi) { const spaceApiElement = document.querySelector('#space-api code'); const json = JSON.stringify(spaceApi, null, 2).replace(/ /g, ' ').replace(/\n/g, '
'); spaceApiElement.innerHTML = json; // const jsonNode = document.createTextNode(json); // spaceApiElement.innerText = ''; // spaceApiElement.append(jsonNode); -}; +} -const updateState = (spaceApi) => { +function updateState(spaceApi) { const stateElement = document.getElementById('state'); const since = new Date(spaceApi.state.lastchange * 1000); const sinceStr = ` seit `; @@ -74,4 +81,4 @@ const updateState = (spaceApi) => { } else { stateElement.innerHTML = `GeschlossenGeschlossen ${sinceStr}`; } -}; +} From 50a55ff68ba5671133eda42e66093f70186f3090 Mon Sep 17 00:00:00 2001 From: Thomas Rupprecht Date: Wed, 22 Sep 2021 22:51:55 +0200 Subject: [PATCH 07/14] use css variables and prepare for dark mode support --- popup/index.css | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/popup/index.css b/popup/index.css index ba08a1a..9ba8399 100644 --- a/popup/index.css +++ b/popup/index.css @@ -1,6 +1,25 @@ +:root { + --light-blue: #2AA1BF; + --dark-blue: #095C81; + --light-color: #333; + --dark-color: #CCC; + --light-background: #FFF; + --dark-background: #111; + --light-code-background: #EBEBEB; + --dark-code-background: #333; +} + body { width: 360px; + color: var(--light-color); + background-color: var(--light-background); } +/* @media (prefers-color-scheme: dark) { + body { + color: var(--dark-color); + background-color: var(--dark-background); + } +} */ h2 { margin: 12px 8px 8px; @@ -44,8 +63,13 @@ summary > h2 { height: 240px; overflow-x: hidden; overflow-y: scroll; - background-color: #ebebeb; + background-color: var(--light-code-background); } +/* @media (prefers-color-scheme: dark) { + #space-api { + background-color: var(--dark-code-background); + } +} */ #space-api code { font-family: monospace; font-size: 10px; From 52e0ea105e24bd5d5f18a2c6277bc64460eb963a Mon Sep 17 00:00:00 2001 From: Thomas Rupprecht Date: Thu, 23 Sep 2021 02:28:20 +0200 Subject: [PATCH 08/14] fix data, remove logging, improve code --- background/index.js | 6 +++--- popup/index.js | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/background/index.js b/background/index.js index 24744cd..b510c61 100644 --- a/background/index.js +++ b/background/index.js @@ -31,11 +31,11 @@ async function updateBadge(open) { } function sendNotification(open) { - browser.notifications.create('notification-id', { + browser.notifications.create('status-change', { type: 'basic', - iconUrl: browser.runtime.getURL('icons/logo.svg'), title: 'Space Status', - message: `Space ist jetzt ${open ? 'offen' : 'geschlossen'}.` + message: `Space ist jetzt ${open ? 'offen' : 'geschlossen'}.`, + iconUrl: browser.runtime.getURL('icons/logo.svg') }); } diff --git a/popup/index.js b/popup/index.js index b237e8b..207e561 100644 --- a/popup/index.js +++ b/popup/index.js @@ -15,7 +15,6 @@ async function init() { try { const page = await browser.runtime.getBackgroundPage(); - console.log(page); updateNextEvent(page.calendar); updateSpaceApiJson(page.spaceApi); @@ -49,7 +48,7 @@ function updateNextEvent(nextEvents) { const timeElement = document.createElement('time'); strongElement.textContent = nextEventDateEvent.name; timeElement.datetime = beginDate.toISOString(); - const dateNode = document.createTextNode(beginDate.toLocaleString([], {dateStyle: "short", timeStyle: "short"})); + const dateNode = document.createTextNode(beginDate.toLocaleString([], {dateStyle: "medium", timeStyle: "short"})); // divElement.innerText = ''; divElement.append(strongElement); divElement.append(document.createTextNode(' ')); @@ -75,7 +74,7 @@ function updateSpaceApiJson(spaceApi) { function updateState(spaceApi) { const stateElement = document.getElementById('state'); const since = new Date(spaceApi.state.lastchange * 1000); - const sinceStr = ` seit `; + const sinceStr = ` seit `; if (spaceApi.state.open) { stateElement.innerHTML = `OffenOffen ${sinceStr}`; } else { From c252a26c18d970100f9b6f6f32f9b4be33457b7b Mon Sep 17 00:00:00 2001 From: Thomas Rupprecht Date: Thu, 23 Sep 2021 02:35:11 +0200 Subject: [PATCH 09/14] add Nunito font --- popup/font/Nunito-Bold.ttf | Bin 0 -> 152748 bytes popup/font/Nunito-Regular.ttf | Bin 0 -> 152932 bytes popup/font/OFL.txt | 93 ++++++++++++++++++++++++++++++++++ popup/index.css | 14 +++++ 4 files changed, 107 insertions(+) create mode 100644 popup/font/Nunito-Bold.ttf create mode 100644 popup/font/Nunito-Regular.ttf create mode 100644 popup/font/OFL.txt diff --git a/popup/font/Nunito-Bold.ttf b/popup/font/Nunito-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..368468ce4b77fd44a05f3d43ab873215cb6ed9b1 GIT binary patch literal 152748 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

Nächster Termin

loading...
-
+

SpaceApi JSON

loading...
diff --git a/popup/index.js b/popup/index.js index 207e561..82de786 100644 --- a/popup/index.js +++ b/popup/index.js @@ -1,3 +1,22 @@ +const calendarSVG = ` + + + + +`; +const doorClosedSVG = ` + + + + +`; +const doorOpenSVG = ` + + + + +`; + async function linkElementClickListener(event) { try { const tab = await browser.tabs.create({url: event.currentTarget.dataset.url}); @@ -42,7 +61,7 @@ function updateNextEvent(nextEvents) { nextEventDateEvents.forEach((nextEventDateEvent) => { const divElement = document.createElement('div'); - divElement.innerHTML = 'Clock'; + divElement.innerHTML = calendarSVG; const beginDate = new Date(nextEventDateEvent.begin); const strongElement = document.createElement('strong'); const timeElement = document.createElement('time'); @@ -50,9 +69,7 @@ function updateNextEvent(nextEvents) { timeElement.datetime = beginDate.toISOString(); const dateNode = document.createTextNode(beginDate.toLocaleString([], {dateStyle: "medium", timeStyle: "short"})); // divElement.innerText = ''; - divElement.append(strongElement); - divElement.append(document.createTextNode(' ')); - divElement.append(timeElement); + divElement.append(strongElement, ' ', timeElement); timeElement.append(dateNode); if (nextEventDateEvent.location) { const locationNode = document.createTextNode(` (${nextEventDateEvent.location})`); @@ -76,8 +93,8 @@ function updateState(spaceApi) { const since = new Date(spaceApi.state.lastchange * 1000); const sinceStr = ` seit `; if (spaceApi.state.open) { - stateElement.innerHTML = `OffenOffen ${sinceStr}`; + stateElement.innerHTML = `${doorOpenSVG}Offen ${sinceStr}`; } else { - stateElement.innerHTML = `GeschlossenGeschlossen ${sinceStr}`; + stateElement.innerHTML = `${doorClosedSVG}Geschlossen ${sinceStr}`; } } From d1803778b7fd0855b4671a1f3326d7c2b9e5cfa9 Mon Sep 17 00:00:00 2001 From: Thomas Rupprecht Date: Sat, 6 Nov 2021 11:01:47 +0100 Subject: [PATCH 11/14] update license --- LICENSE.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 63b4b68..a888f3c 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,6 +1,6 @@ MIT License -Copyright (c) [year] [fullname] +Copyright (c) 2021 /usr/space Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. From ab49fbda15a9b4a9ffc160122c5f5b4c82c698fb Mon Sep 17 00:00:00 2001 From: Thomas Rupprecht Date: Sat, 6 Nov 2021 11:13:36 +0100 Subject: [PATCH 12/14] change icon --- icons/favicon.svg | 23 +++++++++++++++++++++++ manifest.json | 10 +++++----- 2 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 icons/favicon.svg diff --git a/icons/favicon.svg b/icons/favicon.svg new file mode 100644 index 0000000..c312918 --- /dev/null +++ b/icons/favicon.svg @@ -0,0 +1,23 @@ + + /usr/space + Logo /usr/space + + + + + + + + + + + diff --git a/manifest.json b/manifest.json index fa9c32c..ff1e2eb 100644 --- a/manifest.json +++ b/manifest.json @@ -4,8 +4,8 @@ "version": "0.6", "description": "An Add-on for the Hacker-/Maker-Space /usr/space.", "icons": { - "48": "icons/logo.svg", - "96": "icons/logo.svg" + "48": "icons/favicon.svg", + "96": "icons/favicon.svg" }, "background": { "page": "background/index.html" @@ -14,10 +14,10 @@ "browser_style": true, //"chrome_style": true, "default_title": "/usr/space", - //"default_icon": "icons/logo.svg", + //"default_icon": "icons/favicon.svg", "default_icon": { - "16": "icons/logo.svg", - "32": "icons/logo.svg" + "16": "icons/favicon.svg", + "32": "icons/favicon.svg" }, "default_area": "navbar", "default_popup": "popup/index.html" From 7b9517297f5761f5394cae27ef58ca264731d03d Mon Sep 17 00:00:00 2001 From: Thomas Rupprecht Date: Sat, 6 Nov 2021 11:22:07 +0100 Subject: [PATCH 13/14] remove old html code and load right svg --- background/index.js | 2 +- popup/index.html | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/background/index.js b/background/index.js index b510c61..7cd05c2 100644 --- a/background/index.js +++ b/background/index.js @@ -35,7 +35,7 @@ function sendNotification(open) { type: 'basic', title: 'Space Status', message: `Space ist jetzt ${open ? 'offen' : 'geschlossen'}.`, - iconUrl: browser.runtime.getURL('icons/logo.svg') + iconUrl: browser.runtime.getURL('icons/favicon.svg') }); } diff --git a/popup/index.html b/popup/index.html index 2d9dd3b..84e71e4 100644 --- a/popup/index.html +++ b/popup/index.html @@ -6,10 +6,6 @@ -

Aktueller Status

loading...
From e812aa8feb25b3940c2baf22ffde5039b0925f67 Mon Sep 17 00:00:00 2001 From: Thomas Rupprecht Date: Sat, 6 Nov 2021 11:25:11 +0100 Subject: [PATCH 14/14] release v0.7 --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index ff1e2eb..560ab89 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 2, "name": "/usr/space", - "version": "0.6", + "version": "0.7", "description": "An Add-on for the Hacker-/Maker-Space /usr/space.", "icons": { "48": "icons/favicon.svg",