diff options
Diffstat (limited to 'comm/chat/content/imAccountOptionsHelper.js')
-rw-r--r-- | comm/chat/content/imAccountOptionsHelper.js | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/comm/chat/content/imAccountOptionsHelper.js b/comm/chat/content/imAccountOptionsHelper.js new file mode 100644 index 0000000000..cbe8c486d8 --- /dev/null +++ b/comm/chat/content/imAccountOptionsHelper.js @@ -0,0 +1,121 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +var accountOptionsHelper = { + /** + * Create a new label and a corresponding input. + * + * @param {string} aType - The input type ("number" or "text"). + * @param {string} aValue - The initial value for the input. + * @param {string} aLabel - The text for the label. + * @param {string} aName - The id for the input. + * @param {Element} grid - A container with a two column grid display to + * append the new elements to. + */ + createTextbox(aType, aValue, aLabel, aName, grid) { + let label = document.createXULElement("label"); + label.textContent = aLabel; + label.setAttribute("control", aName); + label.classList.add("label-inline"); + grid.appendChild(label); + + let input = document.createElementNS( + "http://www.w3.org/1999/xhtml", + "input" + ); + if (aType == "number") { + input.classList.add("input-number-inline"); + } else { + input.classList.add("input-inline"); + } + if (aType) { + input.setAttribute("type", aType); + } + input.setAttribute("value", aValue); + input.setAttribute("id", aName); + + grid.appendChild(input); + }, + + /** + * Create a new label and a corresponding menulist. + * + * @param {object[]} aList - The list of items to fill the menulist with. + * @param {string} aList[].label - The label for the menuitem. + * @param {string} aList[].value - The value for the menuitem. + * @param {string} aLabel - The text for the label. + * @param {string} aName - The id for the menulist. + * @param {Element} grid - A container with a two column grid display to + * append the new elements to. + */ + createMenulist(aList, aLabel, aName, grid) { + let label = document.createXULElement("label"); + label.setAttribute("value", aLabel); + label.setAttribute("control", aName); + label.classList.add("label-inline"); + grid.appendChild(label); + + let menulist = document.createXULElement("menulist"); + menulist.setAttribute("id", aName); + menulist.setAttribute("flex", "1"); + menulist.classList.add("input-inline"); + let popup = menulist.appendChild(document.createXULElement("menupopup")); + for (let elt of aList) { + let item = document.createXULElement("menuitem"); + item.setAttribute("label", elt.name); + item.setAttribute("value", elt.value); + popup.appendChild(item); + } + grid.appendChild(menulist); + }, + + // Adds options with specific prefix for ids to UI according to their types + // with optional attributes for each type and returns true if at least one + // option has been added to UI, otherwise returns false. + addOptions(aIdPrefix, aOptions, aAttributes) { + let grid = document.getElementById("protoSpecific"); + while (grid.hasChildNodes()) { + grid.lastChild.remove(); + } + + let haveOptions = false; + for (let opt of aOptions) { + let text = opt.label; + let name = aIdPrefix + opt.name; + switch (opt.type) { + case Ci.prplIPref.typeBool: + let chk = document.createXULElement("checkbox"); + chk.setAttribute("label", text); + chk.setAttribute("id", name); + if (opt.getBool()) { + chk.setAttribute("checked", "true"); + } + // Span two columns. + chk.classList.add("grid-item-span-row"); + grid.appendChild(chk); + break; + case Ci.prplIPref.typeInt: + this.createTextbox("number", opt.getInt(), text, name, grid); + break; + case Ci.prplIPref.typeString: + this.createTextbox("text", opt.getString(), text, name, grid); + break; + case Ci.prplIPref.typeList: + this.createMenulist(opt.getList(), text, name, grid); + document.getElementById(name).value = opt.getListDefault(); + break; + default: + throw new Error("unknown preference type " + opt.type); + } + if (aAttributes && aAttributes[opt.type]) { + let element = document.getElementById(name); + for (let attr of aAttributes[opt.type]) { + element.setAttribute(attr.name, attr.value); + } + } + haveOptions = true; + } + return haveOptions; + }, +}; |