From 54fa3d013b714967e2043369d1c00d8e0c806618 Mon Sep 17 00:00:00 2001
From: oxixes <38050447+oxixes@users.noreply.github.com>
Date: Wed, 29 Nov 2023 16:50:07 +0100
Subject: [PATCH 1/7] Make widget work with the v2 API
---
src/config.xml | 8 +-
src/index.html | 16 ++--
src/js/main.js | 179 ++++++++++++++++++------------------
tests/js/PanelWidgetSpec.js | 143 +++++++++++++++-------------
4 files changed, 180 insertions(+), 166 deletions(-)
diff --git a/src/config.xml b/src/config.xml
index 8c6aece..53a61f0 100644
--- a/src/config.xml
+++ b/src/config.xml
@@ -1,5 +1,7 @@
-
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/js/main.js b/src/js/main.js
index 74e59ac..3daeb19 100644
--- a/src/js/main.js
+++ b/src/js/main.js
@@ -21,111 +21,112 @@
"use strict";
- const repaint = function repaint() {
- var height, width, message, next, min;
-
- height = MashupPlatform.widget.context.get('heightInPixels');
- width = MashupPlatform.widget.context.get('widthInPixels');
- message = document.getElementById('message');
-
- document.body.style.fontSize = (height * 0.7) + 'px';
- document.body.style.lineHeight = height + 'px';
-
- message.style.height = height + 'px';
- next = Number(MashupPlatform.prefs.get('max-height')) / 100;
- min = Number(MashupPlatform.prefs.get('min-height')) / 100;
- while ((message.offsetWidth > width || message.offsetHeight > height) && next >= min) {
- document.body.style.fontSize = Math.floor(height * next) + 'px';
- next -= 0.05;
+ class Widget {
+ constructor(MashupPlatform, shadowDOM, _) {
+ this.MashupPlatform = MashupPlatform;
+ this.shadowDOM = shadowDOM;
+
+ this.body = this.shadowDOM.querySelector('body');
+
+ this.init();
+ this.repaint();
}
- if ((message.offsetWidth > width || message.offsetHeight > height)) {
- document.body.style.fontSize = Math.floor(height * min) + 'px';
+
+ repaint() {
+ var height, width, message, next, min;
+
+ height = this.MashupPlatform.widget.context.get('heightInPixels');
+ width = this.MashupPlatform.widget.context.get('widthInPixels');
+ message = this.shadowDOM.getElementById('message');
+
+ this.body.style.fontSize = (height * 0.7) + 'px';
+ this.body.style.lineHeight = height + 'px';
+
+ message.style.height = height + 'px';
+ next = Number(MashupPlatform.prefs.get('max-height')) / 100;
+ min = Number(MashupPlatform.prefs.get('min-height')) / 100;
+ while ((message.offsetWidth > width || message.offsetHeight > height) && next >= min) {
+ this.body.style.fontSize = Math.floor(height * next) + 'px';
+ next -= 0.05;
+ }
+ if ((message.offsetWidth > width || message.offsetHeight > height)) {
+ this.body.style.fontSize = Math.floor(height * min) + 'px';
+ }
}
- };
-
- const parseInputEndpointData = function parseInputEndpointData(data) {
- if (typeof data === "string") {
- try {
- data = JSON.parse(data);
- } catch (e) {
- return data;
+
+ parseInputEndpointData(data) {
+ if (typeof data === "string") {
+ try {
+ data = JSON.parse(data);
+ } catch (e) {
+ return data;
+ }
}
+
+ return data;
}
- return data;
- };
+ processIncomingData(data) {
+ var message, unit, decimals, default_unit, pow;
- const processIncomingData = function processIncomingData(data) {
- var message, unit, decimals, default_unit, pow;
+ data = this.parseInputEndpointData(data);
+ if (data == null || ["number", "string", "boolean"].indexOf(typeof data) !== -1) {
+ data = {
+ value: data
+ };
+ }
+ decimals = parseInt(this.MashupPlatform.prefs.get('decimals'), 10);
+ if (isNaN(decimals) || decimals < 0) {
+ decimals = 0;
+ }
- data = parseInputEndpointData(data);
- if (data == null || ["number", "string", "boolean"].indexOf(typeof data) !== -1) {
- data = {
- value: data
- };
- }
- decimals = parseInt(MashupPlatform.prefs.get('decimals'), 10);
- if (isNaN(decimals) || decimals < 0) {
- decimals = 0;
- }
+ message = this.shadowDOM.getElementById('message');
+ if (data.value == null) {
+ message.textContent = this.MashupPlatform.prefs.get('default-value');
+ } else if (typeof data.value === 'number') {
+ pow = Math.pow(10, decimals);
+ data.value = Math.round((pow * data.value).toFixed(decimals)) / pow;
+ message.textContent = data.value;
+ } else {
+ message.textContent = data.value;
+ }
- message = document.getElementById('message');
- if (data.value == null) {
- message.textContent = MashupPlatform.prefs.get('default-value');
- } else if (typeof data.value === 'number') {
- pow = Math.pow(10, decimals);
- data.value = Math.round((pow * data.value).toFixed(decimals)) / pow;
- message.textContent = data.value;
- } else {
- message.textContent = data.value;
- }
+ unit = document.createElement('span');
+ default_unit = this.MashupPlatform.prefs.get('default-unit');
+ if (data.unit != null) {
+ unit.textContent = data.unit;
+ message.appendChild(unit);
+ } else if (!("unit" in data) && default_unit.trim() != "") {
+ unit.textContent = default_unit;
+ message.appendChild(unit);
+ }
- unit = document.createElement('span');
- default_unit = MashupPlatform.prefs.get('default-unit');
- if (data.unit != null) {
- unit.textContent = data.unit;
- message.appendChild(unit);
- } else if (!("unit" in data) && default_unit.trim() != "") {
- unit.textContent = default_unit;
- message.appendChild(unit);
+ this.repaint();
}
- repaint();
- };
- const init = function init() {
- MashupPlatform.wiring.registerCallback('textinput', processIncomingData);
+ init() {
+ this.MashupPlatform.wiring.registerCallback('textinput', this.processIncomingData);
- MashupPlatform.widget.context.registerCallback(function (newValues) {
- if ("heightInPixels" in newValues || "widthInPixels" in newValues) {
- repaint();
- }
- }.bind(this));
+ this.MashupPlatform.widget.context.registerCallback(function (newValues) {
+ if ("heightInPixels" in newValues || "widthInPixels" in newValues) {
+ this.repaint();
+ }
+ }.bind(this));
- /* Initial content */
+ /* Initial content */
- var message = document.getElementById('message');
- message.textContent = MashupPlatform.prefs.get('default-value');
+ var message = this.shadowDOM.getElementById('message');
+ message.textContent = this.MashupPlatform.prefs.get('default-value');
- var default_unit = MashupPlatform.prefs.get('default-unit');
- if (default_unit.trim() != "") {
- var unit = document.createElement('span');
- unit.textContent = default_unit;
- message.appendChild(unit);
+ var default_unit = MashupPlatform.prefs.get('default-unit');
+ if (default_unit.trim() != "") {
+ var unit = document.createElement('span');
+ unit.textContent = default_unit;
+ message.appendChild(unit);
+ }
}
- };
-
- /* test-code */
- window.init = init;
- window.processIncomingData = processIncomingData;
- window.repaint = repaint;
- /* end-test-code */
-
- /* TODO
- * this if is required for testing, but we have to search a cleaner way
- */
- if (window.MashupPlatform != null) {
- init();
- repaint();
}
+ window.CoNWet_Panel = Widget;
+
})();
diff --git a/tests/js/PanelWidgetSpec.js b/tests/js/PanelWidgetSpec.js
index a1e2e57..70fed13 100644
--- a/tests/js/PanelWidgetSpec.js
+++ b/tests/js/PanelWidgetSpec.js
@@ -23,7 +23,7 @@
const HTML_FIXTURE_CODE = '
';
const clearDocument = function clearDocument() {
- var elements = document.querySelectorAll('body > *:not(.jasmine_html-reporter)');
+ var elements = shadowDOM.querySelector("body").children;
for (var i = 0; i < elements.length; i++) {
elements[i].parentElement.removeChild(elements[i]);
@@ -44,11 +44,22 @@
},
inputs: ['textinput']
});
+
+ let div = document.createElement('div');
+ div.id = 'widget';
+ document.body.appendChild(div);
+ div.attachShadow({mode: 'open'});
+ let shadowBody = document.createElement('body');
+ div.shadowRoot.appendChild(shadowBody);
+ window.shadowDOM = div.shadowRoot;
+ shadowDOM.querySelector("body").innerHTML += HTML_FIXTURE_CODE
+
+ window.widget = new window.CoNWet_Panel(MashupPlatform, shadowDOM, undefined);
});
beforeEach(() => {
clearDocument();
- document.body.innerHTML += HTML_FIXTURE_CODE;
+ shadowDOM.querySelector("body").innerHTML += HTML_FIXTURE_CODE;
MashupPlatform.reset();
});
@@ -57,20 +68,20 @@
describe("default-value", () => {
it("should work with the default value", () => {
- spyOn(window, "repaint");
- init();
+ spyOn(widget, "repaint");
+ widget.init();
- expect(repaint).not.toHaveBeenCalled();
- expect(document.getElementById('message').textContent).toBe("--");
+ expect(widget.repaint).not.toHaveBeenCalled();
+ expect(shadowDOM.getElementById('message').textContent).toBe("--");
});
it("should work with other values", () => {
MashupPlatform.prefs.set("default-value", "n/a");
- spyOn(window, "repaint");
- init();
+ spyOn(widget, "repaint");
+ widget.init();
- expect(repaint).not.toHaveBeenCalled();
- expect(document.getElementById('message').textContent).toBe("n/a");
+ expect(widget.repaint).not.toHaveBeenCalled();
+ expect(shadowDOM.getElementById('message').textContent).toBe("n/a");
});
});
@@ -78,20 +89,20 @@
describe("default-unit", () => {
it("should work with the default value", () => {
- spyOn(window, "repaint");
- init();
+ spyOn(widget, "repaint");
+ widget.init();
- expect(repaint).not.toHaveBeenCalled();
- expect(document.getElementById('message').textContent).toBe("--");
+ expect(widget.repaint).not.toHaveBeenCalled();
+ expect(shadowDOM.getElementById('message').textContent).toBe("--");
});
it("should work with other values", () => {
MashupPlatform.prefs.set("default-unit", "ºC");
- spyOn(window, "repaint");
- init();
+ spyOn(widget, "repaint");
+ widget.init();
- expect(repaint).not.toHaveBeenCalled();
- expect(document.getElementById('message').textContent).toBe("--ºC");
+ expect(widget.repaint).not.toHaveBeenCalled();
+ expect(shadowDOM.getElementById('message').textContent).toBe("--ºC");
});
});
@@ -99,32 +110,32 @@
describe("decimals", () => {
it("should work with the default value", () => {
- spyOn(window, "repaint");
- init();
+ spyOn(widget, "repaint");
+ widget.init();
- processIncomingData(5.12);
+ widget.processIncomingData(5.12);
- expect(document.getElementById('message').textContent).toBe("5.1");
+ expect(shadowDOM.getElementById('message').textContent).toBe("5.1");
});
it("should work with other values", () => {
MashupPlatform.prefs.set("decimals", "2");
- spyOn(window, "repaint");
- init();
+ spyOn(widget, "repaint");
+ widget.init();
- processIncomingData(5.12);
+ widget.processIncomingData(5.12);
- expect(document.getElementById('message').textContent).toBe("5.12");
+ expect(shadowDOM.getElementById('message').textContent).toBe("5.12");
});
it("should handle invalid decimal values", () => {
MashupPlatform.prefs.set("decimals", "-1");
- spyOn(window, "repaint");
- init();
+ spyOn(widget, "repaint");
+ widget.init();
- processIncomingData(5.12);
+ widget.processIncomingData(5.12);
- expect(document.getElementById('message').textContent).toBe("5");
+ expect(shadowDOM.getElementById('message').textContent).toBe("5");
});
});
@@ -136,31 +147,31 @@
describe("basic values (plain)", () => {
it("number", () => {
- init();
- processIncomingData(5);
+ widget.init();
+ widget.processIncomingData(5);
- expect(document.getElementById('message').textContent).toBe("5");
+ expect(shadowDOM.getElementById('message').textContent).toBe("5");
});
it("string", () => {
- init();
- processIncomingData("new content");
+ widget.init();
+ widget.processIncomingData("new content");
- expect(document.getElementById('message').textContent).toBe("new content");
+ expect(shadowDOM.getElementById('message').textContent).toBe("new content");
});
it("boolean", () => {
- init();
- processIncomingData(true);
+ widget.init();
+ widget.processIncomingData(true);
- expect(document.getElementById('message').textContent).toBe("true");
+ expect(shadowDOM.getElementById('message').textContent).toBe("true");
});
it("null", () => {
- init();
- processIncomingData(null);
+ widget.init();
+ widget.processIncomingData(null);
- expect(document.getElementById('message').textContent).toBe("--");
+ expect(shadowDOM.getElementById('message').textContent).toBe("--");
});
});
@@ -168,32 +179,32 @@
describe("basic values", () => {
it("number", () => {
- init();
- processIncomingData({value: 5});
+ widget.init();
+ widget.processIncomingData({value: 5});
- expect(document.getElementById('message').textContent).toBe("5");
+ expect(shadowDOM.getElementById('message').textContent).toBe("5");
});
it("string", () => {
- init();
- processIncomingData({value: "new content"});
+ widget.init();
+ widget.processIncomingData({value: "new content"});
- expect(document.getElementById('message').textContent).toBe("new content");
+ expect(shadowDOM.getElementById('message').textContent).toBe("new content");
});
it("boolean", () => {
- init();
- processIncomingData({value: true});
+ widget.init();
+ widget.processIncomingData({value: true});
- expect(document.getElementById('message').textContent).toBe("true");
+ expect(shadowDOM.getElementById('message').textContent).toBe("true");
});
it("null", () => {
MashupPlatform.prefs.set("default-unit", "ºC");
- init();
- processIncomingData({value: null});
+ widget.init();
+ widget.processIncomingData({value: null});
- expect(document.getElementById('message').textContent).toBe("--ºC");
+ expect(shadowDOM.getElementById('message').textContent).toBe("--ºC");
});
});
@@ -201,33 +212,33 @@
describe("unit override", () => {
it("number", () => {
- init();
- processIncomingData({value: 5, unit: "km/h"});
+ widget.init();
+ widget.processIncomingData({value: 5, unit: "km/h"});
- expect(document.getElementById('message').textContent).toBe("5km/h");
+ expect(shadowDOM.getElementById('message').textContent).toBe("5km/h");
});
it("string", () => {
MashupPlatform.prefs.set("default-unit", "ºC");
- init();
- processIncomingData({value: "new content", unit: ""});
+ widget.init();
+ widget.processIncomingData({value: "new content", unit: ""});
- expect(document.getElementById('message').textContent).toBe("new content");
+ expect(shadowDOM.getElementById('message').textContent).toBe("new content");
});
it("boolean", () => {
MashupPlatform.prefs.set("default-unit", "ºC");
- init();
- processIncomingData({value: true, unit: null});
+ widget.init();
+ widget.processIncomingData({value: true, unit: null});
- expect(document.getElementById('message').textContent).toBe("true");
+ expect(shadowDOM.getElementById('message').textContent).toBe("true");
});
it("null", () => {
- init();
- processIncomingData({value: null, unit: "km/h"});
+ widget.init();
+ widget.processIncomingData({value: null, unit: "km/h"});
- expect(document.getElementById('message').textContent).toBe("--km/h");
+ expect(shadowDOM.getElementById('message').textContent).toBe("--km/h");
});
});
From 9a180ffe26cfa99d3ce8ff976040d4ee2ec2d8cc Mon Sep 17 00:00:00 2001
From: oxixes <38050447+oxixes@users.noreply.github.com>
Date: Wed, 29 Nov 2023 18:22:52 +0100
Subject: [PATCH 2/7] Add background and text color options
---
src/config.xml | 4 +++-
src/index.html | 1 -
src/js/main.js | 40 +++++++++++++++++++++++++++++++------
tests/js/PanelWidgetSpec.js | 8 +++++---
4 files changed, 42 insertions(+), 11 deletions(-)
diff --git a/src/config.xml b/src/config.xml
index 53a61f0..30ccaab 100644
--- a/src/config.xml
+++ b/src/config.xml
@@ -27,6 +27,8 @@