aboutsummaryrefslogtreecommitdiffstats
path: root/data/lib/bugzillaDOMFunctions.js
diff options
context:
space:
mode:
Diffstat (limited to 'data/lib/bugzillaDOMFunctions.js')
-rw-r--r--data/lib/bugzillaDOMFunctions.js372
1 files changed, 372 insertions, 0 deletions
diff --git a/data/lib/bugzillaDOMFunctions.js b/data/lib/bugzillaDOMFunctions.js
new file mode 100644
index 0000000..30405f0
--- /dev/null
+++ b/data/lib/bugzillaDOMFunctions.js
@@ -0,0 +1,372 @@
+// Released under the MIT/X11 license
+// http://www.opensource.org/licenses/mit-license.php
+"use strict";
+
+/**
+ * Select option with given value on the <SELECT> element with given id.
+ *
+ * Also execute change HTMLEvent, so that the form behaves accordingly.
+ *
+ * @param id
+ * @param label
+ * @return none
+ *
+ */
+function selectOption (id, label, fireEvent) {
+ if (!fireEvent) {
+ fireEvent = true;
+ }
+ var sel = document.getElementById(id);
+ sel.value = label;
+ if (fireEvent) {
+ var intEvent = document.createEvent("HTMLEvents");
+ intEvent.initEvent("change", true, true);
+ sel.dispatchEvent(intEvent);
+ }
+}
+
+function selectOptionByLabel(id, label, fireEvent) {
+ if (!fireEvent) {
+ fireEvent = true;
+ }
+ var sel = document.getElementById(id);
+ var labelRE = new RegExp(label.trim());
+ var ourOption = Array.filter(sel.options, function (op) {
+ return op.textContent.trim() === label;
+ });
+
+ if (ourOption[0]) {
+ sel.value = ourOption[0].value;
+ }
+
+ if (fireEvent) {
+ var intEvent = document.createEvent("HTMLEvents");
+ intEvent.initEvent("change", true, true);
+ sel.dispatchEvent(intEvent);
+ }
+}
+
+/**
+ * Add object to the text box (comment box or status whiteboard)
+ *
+ * @param id String with the id of the element
+ * @param stuff String/Array to be added to the comment box
+ *
+ * @return none
+ */
+function addStuffToTextBox (id, stuff) {
+ var textBox = document.getElementById(id);
+ if (textBox.tagName.toLowerCase() === "textarea") {
+ stuff = textBox.value ? "\n\n" + stuff : stuff;
+ textBox.value += stuff;
+ }
+ else {
+ textBox.value = addCSVValue(textBox.value,stuff);
+ }
+}
+
+/**
+ * Remove a keyword from the element if it is there
+ *
+ * @param id String with the id of the element
+ * @param stuff String/Array with keyword(s) to be removed
+ */
+function removeStuffFromTextBox (id, stuff) {
+ var changedElement = document.getElementById(id);
+ changedElement.value = removeCSVValue(changedElement.value,stuff);
+}
+
+/**
+ * generalized hasKeyword ... search in the value of the box with given id
+ *
+ * @param id String with ID of the element we want to check
+ * @param str String to be searched for
+ * @return Boolean found?
+ */
+function idContainsWord (id, str) {
+ var kwd = "";
+ try {
+ kwd = document.getElementById(id).value;
+ } catch (e) {
+ // For those who don't have particular element at all or if it is empty
+ return false;
+ }
+ return (isInList(str, kwd.trim().split(/[,\s]+/)));
+}
+
+/**
+ * Check for the presence of a keyword
+ *
+ * @param str String with the keyword
+ * @return Boolean
+ */
+function hasKeyword (str) {
+ return (idContainsWord('keywords', str));
+}
+
+/**
+ * Set the bug to NEEDINFO state
+ *
+ * Working function.
+ * @return none
+ * @todo TODO we may extend this to general setNeedinfo function
+ * with parameter [reporter|assignee|general-email-address]
+ */
+function setNeedinfoReporter () {
+ clickMouse("needinfo");
+ selectOption("needinfo_role", "reporter");
+}
+
+/**
+ *
+ */
+function getOwner () {
+ // TODO(maemo) doesn't work on maemo
+ var assigneeAElement = getOptionTableCell("bz_show_bug_column_1","Assigned To");
+ return parseMailto(assigneeAElement);
+}
+
+/**
+ * Return maintainer which is per default by bugzilla
+ * (which is not necessarily the one who is default maintainer per component)
+ *
+ * @return String with the maintainer's email address
+ */
+function getDefaultBugzillaMaintainer (component) {
+ var address = filterByRegexp(constantData.defBugzillaMaintainerArr, component);
+ return address;
+}
+
+/**
+ * Generic function to add new button to the page. Actually copies new button
+ * from the old one (in order to have the same look-and-feel, etc.
+ *
+ * @param location Object around which the new button will be added
+ * @param after Boolean before or after location ?
+ * @param pkg String which package to take the command from
+ * @param id String which command to take
+ * @return none
+ */
+function createNewButton (location, after, cmdObj) {
+ try {
+ var newId = cmdObj.name.toLowerCase().replace(/[^a-z0-9]+/,"","g") + "_btn";
+ } catch (e) {
+ console.error("createNewButton : e = " + e +
+ "\ncreateNewButton : cmdObj.toSource() = " +
+ cmdObj.toSource());
+ }
+
+ // protection against double-firings
+ if (document.getElementById(newId)) {
+ console.log("Element with id " + newId + " already exists!");
+ return ;
+ }
+
+ var newButton = document.createElement("input");
+ newButton.setAttribute("id", newId);
+ newButton.setAttribute("type", "button");
+ newButton.value = cmdObj.name;
+ newButton.addEventListener("click", function(evt) {
+ executeCommand(cmdObj);
+ }, false);
+
+ var originalLocation = document.getElementById(location);
+
+ try {
+ if (after) {
+ originalLocation.parentNode.insertBefore(newButton,
+ originalLocation.nextSibling);
+ originalLocation.parentNode.insertBefore(document
+ .createTextNode("\u00A0"), newButton);
+ }
+ else {
+ originalLocation.parentNode.insertBefore(newButton, originalLocation);
+ originalLocation.parentNode.insertBefore(document
+ .createTextNode("\u00A0"), originalLocation);
+ }
+ } catch (e) {
+ if (e instanceof TypeError) {
+ console.error("cannot find originalLocation element with id " + location);
+ }
+ else {
+ throw e;
+ }
+ }
+}
+
+/**
+ * Get the current title of the bug
+ *
+ * @return string
+ */
+function getSummary() {
+ return document.getElementById("short_desc_nonedit_display").textContent;
+}
+
+/**
+ * Get the current email of the reporter of the bug.
+ *
+ * @return string
+ */
+function getReporter () {
+ var reporterElement = getOptionTableCell("bz_show_bug_column_2", "Reported");
+ // RH Bugzilla after upgrade to 3.6.2 moved the information to other column
+ if (!reporterElement) {
+ reporterElement = getOptionTableCell("bz_show_bug_column_1", "Reported", true);
+ }
+ // Maemo calls the label "Reporter" and it doesn't have ids on table columns ... TODO(maemo)
+ return parseMailto(reporterElement);
+}
+
+function getComponent() {
+ var elem = document.getElementById("component");
+ if (elem) {
+ return elem.value;
+ }
+ return null;
+}
+
+function getProduct() {
+ var elem = document.getElementById("product");
+ if (elem) {
+ return elem.value;
+ }
+ return null;
+}
+
+function commentsWalker (fce) {
+ var comments = document.getElementById("comments").
+ getElementsByClassName("bz_comment");
+ Array.forEach(comments, function(item) {
+ fce(item);
+ });
+}
+
+/**
+ * collect the list of attachments in a structured format
+ *
+ * @return Array of arrays, one for each attachments;
+ * each record has string name of the attachment, integer its id number,
+ * string of MIME type, integer of size in kilobytes, and the whole
+ * element itself
+ */
+function getAttachments () {
+ var outAtts = [];
+ var atts = document.getElementById("attachment_table").
+ getElementsByTagName("tr");
+ for ( var i = 1, ii = atts.length - 1; i < ii; i++) {
+ outAtts.push(parseAttachmentLine(atts[i]));
+ }
+ return outAtts;
+}
+
+/**
+ * Get login of the currently logged-in user.
+ *
+ * @return String with the login name of the currently logged-in user
+ */
+function getLogin () {
+ var lastLIElement = document.querySelector("#header ul.links li:last-of-type");
+ var loginArr = lastLIElement.textContent.split("\n");
+ var loginStr = loginArr[loginArr.length - 1].trim();
+ return loginStr;
+}
+
+/**
+ * adds a person to the CC list, if it isn't already there
+ *
+ * @param who String with email address or "self" if the current user
+ * of the bugzilla should be added
+ */
+function addToCCList (who) {
+ if (!who) {
+ return ;
+ }
+ if (who === "self") {
+ document.getElementById("addselfcc").checked = true;
+ }
+ else {
+ clickMouse("cc_edit_area_showhide");
+ if (!isInList(who, getCCList())) {
+ addStuffToTextBox("newcc",who);
+ }
+ }
+}
+
+/**
+ * a collect a list of emails on CC list
+ *
+ * @return Array with email addresses as Strings.
+ */
+function getCCList () {
+ var CCListSelect = document.getElementById("cc");
+ var outCCList = [];
+ if (CCListSelect) {
+ outCCList = Array.map(CCListSelect.options, function(item) {
+ return item.value;
+ });
+ }
+ return outCCList;
+}
+
+/**
+ * remove elements from the page based on their IDs
+ *
+ * @param doc Document object
+ * @param target String/Array with ID(s)
+ * @param remove Boolean indicating whether the node should be
+ * actually removed or just hidden.
+ * @return none
+ * TODO remove parameter could be replaced by function which would
+ * do actual activity.
+ */
+function killNodes(doc, target, remove) {
+ var targetArr = target instanceof Array ? target : target.trim().split(/[,\s]+/);
+ targetArr.forEach(function(x) {
+ if (remove) {
+ var targetNode = doc.getElementById(x);
+ targetNode.parentNode.removeChild(targetNode);
+ }
+ else {
+ x.style.display = "none";
+ }
+ });
+}
+
+/**
+ * Is this bug a RHEL bug?
+ *
+ * @return Boolean true if it is a RHEL bug
+ */
+function isEnterprise() {
+ var result = ProfessionalProducts.some(function(elem,idx,arr) {
+ return new RegExp(elem).test(getProduct());
+ });
+ return result;
+}
+
+/**
+ * Find out whether the bug is needed an attention of bugZappers
+ *
+ * @return Boolean whether the bug has been triaged or not
+ */
+function isTriaged() {
+ return hasKeyword("Triaged");
+}
+
+/**
+ * Return string with the ID for the external_id SELECT for external bugzilla
+ *
+ * @param URLhostname String hostname of the external bugzilla
+ * @return String with the string for the external_id SELECT
+ */
+function getBugzillaName(URLhostname, bzLabelNames) {
+ var bugzillaID = "";
+ if (bzLabelNames[URLhostname]) {
+ bugzillaID = bzLabelNames[URLhostname];
+ }
+ else {
+ bugzillaID = "";
+ }
+ return bugzillaID;
+}