summaryrefslogtreecommitdiff
path: root/src/ui/prompt.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/prompt.js')
-rw-r--r--src/ui/prompt.js91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/ui/prompt.js b/src/ui/prompt.js
new file mode 100644
index 0000000..f19aac9
--- /dev/null
+++ b/src/ui/prompt.js
@@ -0,0 +1,91 @@
+(async () => {
+ window.bg = await browser.runtime.getBackgroundPage();
+ ["Prompts"]
+ .forEach(p => window[p] = bg[p]);
+ let data = Prompts.promptData;
+ debug(data);
+ let {title, message, options, checks, buttons} = data.features;
+
+ function labelFor(el, text) {
+ let label = document.createElement("label");
+ label.setAttribute("for", el.id);
+ label.textContent = text;
+ return label;
+ }
+
+ function createInput(container, {label, type, name, checked}, count) {
+ let input = document.createElement("input");
+ input.type = type;
+ input.value = count;
+ input.name = name;
+ input.checked = checked;
+ input.id = `${name}-${count}`;
+ let sub = document.createElement("div");
+ sub.appendChild(input);
+ sub.appendChild(labelFor(input, label));
+ container.appendChild(sub);
+ }
+
+ function createButton(container, label, count) {
+ let button = document.createElement("button");
+ if (count === 0) button.type = "submit";
+ button.id = `${button}-${count}`;
+ button.value = count;
+ button.textContent = label;
+ container.appendChild(button);
+ }
+
+ function renderInputs(container, dataset, type, name) {
+ if (typeof container === "string") {
+ container = document.querySelector(container);
+ }
+ if (typeof dataset === "string") {
+ container.innerHTML = dataset;
+ return;
+ }
+ container.innerHTML = "";
+ let count = 0;
+ if (dataset && dataset[Symbol.iterator]) {
+ let create = type === "button" ? createButton : createInput;
+ for (let data of dataset) {
+ data.type = type;
+ data.name = name;
+ create(container, data, count++);
+ }
+ }
+ }
+ if (title) {
+ document.title = title;
+ document.querySelector("#title").textContent = title;
+ }
+ if (message) {
+ let lines = message.split(/\n/);
+ let container = document.querySelector("#message");
+ container.classList.toggle("multiline", lines.length > 1);
+ message.innerHTML = "";
+ for (let l of lines) {
+ let p = document.createElement("p");
+ p.textContent = l;
+ container.appendChild(p);
+ }
+ }
+ renderInputs("#options", options, "radio", "opt");
+ renderInputs("#checks", checks, "checkbox", "flag");
+ renderInputs("#buttons", buttons, "button", "button");
+ addEventListener("unload", e => {
+ data.done();
+ });
+
+ let buttonClicked = e => {
+ let {result} = data;
+ result.button = parseInt(e.currentTarget.value);
+ let option = document.querySelector('#options [type="radio"]:checked');
+ result.option = option && parseInt(option.value);
+ result.checks = [...document.querySelectorAll('#checks [type="checkbox"]:checked')]
+ .map(c => parseInt(c.value));
+ data.done();
+ };
+ for (let b of document.querySelectorAll("#buttons button")) {
+ b.addEventListener("click", buttonClicked);
+ }
+})();