aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bugzillaBugTriage.js372
1 files changed, 220 insertions, 152 deletions
diff --git a/bugzillaBugTriage.js b/bugzillaBugTriage.js
index 8a4f5f0..35d4132 100644
--- a/bugzillaBugTriage.js
+++ b/bugzillaBugTriage.js
@@ -265,19 +265,6 @@ XMLRPCMessage.prototype.getParamXML = function(type, data) {
return xml;
};
-///*
-// * Create and return an object that has p as its prototype
-// *
-// * @param p parent Object
-// * @return child Object
-// */
-//heir = function (o) {
-// function F() {};
-// F.prototype = o;
-// delete F.prototype.create;
-// return new F();
-//};
-
// ==============================================================
var hlpr = function () {
};
@@ -292,15 +279,30 @@ hlpr.valToArray = function valToArray(val) {
return arr;
};
+/**
+ * Merges two comma separated string as a list and returns new string
+ *
+ * @param str String with one values
+ * @param value String with other values
+ * @return String with merged lists
+ */
hlpr.addCSVValue = function addCSVValue(str, value) {
let parts = (str.trim().length > 0 ? str.split(",") : []);
+ // FIXME isn't this wrong? In if conditions it treats value as a
+ // string, but then uses hlpr.valToArray on it ???
if (parts.indexOf(value) < 0) {
parts.concat(hlpr.valToArray(value));
}
return parts.join(",");
};
-// FIXME rewrite so that it doesn't break Eclipse
+/**
+ * Treats comma separated string as a list and removes one item from it
+ *
+ * @param str String treated as a list
+ * @param value String with the value to be removed from str
+ * @return String with the resulting list comma separated
+ */
hlpr.removeCSVValue = function removeCSVValue(str, value) {
str = str.trim(); // we want it trimmed without any questions anyway
let parts = str ? str.split(",") : [];
@@ -312,10 +314,8 @@ hlpr.removeCSVValue = function removeCSVValue(str, value) {
* Check whether an item is member of the list. Idea is just to make long if
* commands slightly more readable.
*
- * @param mbr
- * string to be searched in the list
- * @param list
- * list
+ * @param mbr string to be searched in the list
+ * @param list list
* @return position of the string in the list, or -1 if none found.
*/
hlpr.isInList = function(mbr, list) {
@@ -463,12 +463,9 @@ Color.prototype.toString = function() {
* http://en.wikipedia.org/wiki/HSL_color_space. Assumes r, g, and b are
* contained in the set [0, 255] and returns h, s, and l in the set [0, 1].4343
*
- * @param Number
- * r The red color value
- * @param Number
- * g The green color value
- * @param Number
- * b The blue color value
+ * @param Number r The red color value
+ * @param Number g The green color value
+ * @param Number b The blue color value
* @return Array The HSL representation
*/
Color.prototype.hsl = function() {
@@ -505,12 +502,9 @@ Color.prototype.hsl = function() {
* http://en.wikipedia.org/wiki/HSL_color_space. Assumes h, s, and l are
* contained in the set [0, 1] and returns r, g, and b in the set [0, 255].
*
- * @param Number
- * h The hue
- * @param Number
- * s The saturation
- * @param Number
- * l The lightness
+ * @param Number h The hue
+ * @param Number s The saturation
+ * @param Number l The lightness
* @return Array The RGB representation
*/
Color.prototype.hslToRgb = function(h, s, l) {
@@ -553,12 +547,9 @@ Color.prototype.hslToRgb = function(h, s, l) {
* http://en.wikipedia.org/wiki/HSV_color_space. Assumes r, g, and b are
* contained in the set [0, 255] and returns h, s, and v in the set [0, 1].
*
- * @param Number
- * r The red color value
- * @param Number
- * g The green color value
- * @param Number
- * b The blue color value
+ * @param Number r The red color value
+ * @param Number g The green color value
+ * @param Number b The blue color value
* @return Array The HSV representation
*/
Color.prototype.hsv = function() {
@@ -596,12 +587,9 @@ Color.prototype.hsv = function() {
* http://en.wikipedia.org/wiki/HSV_color_space. Assumes h, s, and v are
* contained in the set [0, 1] and returns r, g, and b in the set [0, 255].
*
- * @param Number
- * h The hue
- * @param Number
- * s The saturation
- * @param Number
- * v The value
+ * @param Number h The hue
+ * @param Number s The saturation
+ * @param Number v The value
* @return Array The RGB representation
*/
Color.prototype.hsvToRgb = function(h, s, v) {
@@ -665,10 +653,140 @@ Color.prototype.lightColor = function() {
// BZPage's methods
function BZPage(doc) {
-
+// this.initCommentsDropdown();
}
/**
+ *
+ */
+BZPage.prototype.getInstalledPackages = function() {
+ let installedPackages = {};
+ if (gJSONData && ("commentPackages" in gJSONData)) {
+ let enabledPackages = jetpack.storage.settings.enabledPacks.split(/[, ]/);
+ for each (let pkg in enabledPackages) {
+ if (pkg in gJSONData.commentPackages) {
+ installedPackages[pkg] = gJSONData.commentPackages[pkg];
+ }
+ }
+ }
+ return installedPackages;
+};
+
+/**
+ *
+ */
+BZPage.prototype.initCommentsDropdown = function() {
+ let that = this;
+ this.doc.getElementById("comments").innerHTML +=
+ "<div id='make_bugzilla_comment_action'>" +
+ " <label for='comment_action'>Add Comment: </label>" +
+ " <select id='comment_action'>" +
+ " <option value=''>-- Select Comment from List --</option>" +
+ "</div>";
+ let select = this.doc.getElementById("comment_action");
+ let packages = this.getInstalledPackages();
+
+ packages.forEach(function (pkg, idx, arr) {
+ pkg.forEach(function (comment, iidx, aarr) {
+ // FIXME idx and iidx shouldn’t be numbers but names of properties
+ let value = idx + "//" + iidx;
+ let opt = that.doc.createElement("option");
+ opt.setAttribute(value,value);
+ opt.textContent = comment.name;
+ select.appendChild(opt);
+ })
+ });
+
+ select.addEventListener("change", that.onCommentsDropdownChange, false);
+};
+
+BZPage.prototype.onCommentsDropdownChange = function() {
+ // $("select#comment_action", this.doc).attr("value");
+ let valueElement = this.doc.getElementById("comment_action");
+ if (valueElement) {
+ let value = valueElement.getAttribute("value");
+ } else {
+ return;
+ }
+ let [pkg, id] = value.split("//");
+ let commentObj = this.installedPackages[pkg][id];
+
+ let commentField = this.doc.getElementById("comment");
+ let keywordsInput = this.doc.getElementById("keywords");
+ let whiteboardsInput = this.doc.getElementById("status_whiteboard");
+ let dependson = this.doc.getElementById("dependson");
+ let blocks = this.doc.getElementById("blocked");
+
+
+ // TODO make these getters/setters on the bz object instead
+ console.log("0" + this.doc.getElementById("bug_status"));
+ if ("status" in commentObj) this.selectOption("bug_status", commentObj.status);
+ console.log("1");
+ if ("resolution" in commentObj) this.selectOption("resolution", commentObj.resolution);
+ console.log("2");
+
+ if ("addKeyword" in commentObj) keywordsInput.val(this.addKeyword(keywordsInput.val(), commentObj.addKeyword));
+ if ("removeKeyword" in commentObj) keywordsInput.val(this.removeKeyword(keywordsInput.val(), commentObj.removeKeyword));
+ if ("addWhiteboard" in commentObj) whiteboardsInput.val(this.addWhiteboard(whiteboardsInput.val(), commentObj.addWhiteboard));
+ if ("removeWhiteboard" in commentObj) whiteboardsInput.val(this.removeWhiteboard(whiteboardsInput.val(), commentObj.removeWhiteboard));
+ if ("product" in commentObj) this.selectOption("product", commentObj.product);
+ if ("component" in commentObj) this.selectOption("component", commentObj.component);
+ if ("version" in commentObj) this.selectOption("version", commentObj.version);
+ if ("platform" in commentObj) this.selectOption("rep_platform", commentObj.platform);
+ if ("os" in commentObj) this.selectOption("op_sys", commentObj.os);
+
+ if ("priority" in commentObj) this.selectOption("priority", commentObj.priority);
+ if ("severity" in commentObj) this.selectOption("bug_severity", commentObj.severity);
+ if ("target" in commentObj) this.selectOption("target_milestone", commentObj.target);
+
+ if ("assignee" in commentObj) {
+ this.clickMouse("bz_assignee_edit_action");
+ this.doc.getElementById("assigned_to").value = commentObj.assignee;
+ }
+
+ if ("qacontact" in commentObj) {
+ this.clickMouse("bz_qa_contact_edit_action");
+ this.doc.getElementById("qa_contact").value = commentObj.qacontact;
+ }
+
+ if ("url" in commentObj) {
+ this.clickMouse("bz_url_edit_action");
+ this.doc.getElementById("bug_file_loc").value = commentObj.url;
+ }
+
+ // TODO dependson/blocked doesn't work. Find out why.
+ if ("addDependsOn" in commentObj) {
+ this.clickMouse("dependson_edit_action");
+ dependson.value = hlpr.addCSVValue(dependson.value, commentObj.addDependsOn);
+ }
+ if ("removeDependsOn" in commentObj) {
+ this.clickMouse("dependson_edit_action");
+ dependson.value = hlpr.addCSVValue(dependson.value, commentObj.removeDependsOn);
+ }
+
+ if ("addBlocks" in commentObj) {
+ this.clickMouse("blocked_edit_action");
+ blocks.value = hlpr.addCSVValue(blocks.value, commentObj.addBlocks);
+ }
+ if ("removeBlocks" in commentObj) {
+ this.clickMouse("blocked_edit_action");
+ blocks.value = hlpr.removeCSVValue(blocks.value, commentObj.removeBlocks);
+ }
+
+ if ("comment" in commentObj) {
+ commentField.value += commentObj.comment;
+ }
+
+
+ // TODO cclist, flags, see also
+
+ if (("commit" in commentObj) && commentObj.commit) {
+ // Directly commit the form
+ this.clickMouse("commit");
+ }
+};
+
+/**
* Select option with given label on the <SELECT> element with given id.
*
* Also execute change HTMLEvent, so that the form behaves accordingly.
@@ -699,21 +817,14 @@ BZPage.prototype.selectOption = function(id, label) {
/**
* Send mouse click to the specified element
*
- * @param element
- * where to send mouseclick to
+ * @param String ID of the element to send mouseclick to
* @return None
- *
- * FIXME depreceated version from bugzilla-comments
- hlpr.clickElement = function clickElement(element) {
- let doc = element[0].ownerDocument;
- ...
- element[0].dispatchEvent(e);
*/
-BZPage.prototype.clickMouse = function(target) {
+BZPage.prototype.clickMouse = function(targetID) {
var localEvent = this.doc.createEvent("MouseEvents");
localEvent.initMouseEvent("click", true, true, this.doc.defaultView, 0, 0,
0, 0, 0, false, false, false, false, 0, null);
- target.dispatchEvent(localEvent);
+ this.doc.getElementById(targetID).dispatchEvent(localEvent);
};
/**
@@ -735,11 +846,9 @@ BZPage.prototype.getISODate = function (dateStr) {
* select element of the array where regexp in the first element matches second
* parameter of this function
*
- * @param list
- * array with regexps and return values
- * @param chosingMark
- * string by which the element of array is to be matched
- * @return string chosen element
+ * @param list Array with regexps and return values
+ * @param chosingMark String by which the element of array is to be matched
+ * @return String chosen element
*/
BZPage.prototype.filterByRegexp = function(list, chosingMark) {
var chosenPair = [];
@@ -758,10 +867,8 @@ BZPage.prototype.filterByRegexp = function(list, chosingMark) {
/**
* Add text to the text box (comment box or status whiteboard)
*
- * @param id
- * string with the id of the element
- * @param string2BAdded
- * string to be added to the comment box
+ * @param id String with the id of the element
+ * @param string2BAdded String to be added to the comment box
*
* @return none
*/
@@ -788,8 +895,7 @@ BZPage.prototype.addTextToTextBox = function(id, string2BAdded) {
/**
* Add new keyword among the keywords.
*
- * @param str
- * string with the new keyword
+ * @param str String with the new keyword
* @return none
*
* Checks for the existing keywords.
@@ -801,10 +907,8 @@ BZPage.prototype.addKeyword = function(str) {
/**
* 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
+ * @param id String with ID of the element we want to check
+ * @param str String to be searched for
* @return Boolean found?
*/
BZPage.prototype.idContainsWord = function(id, str) {
@@ -821,8 +925,7 @@ BZPage.prototype.idContainsWord = function(id, str) {
/**
* Check for the presence of a keyword
*
- * @param str
- * string with the keyword
+ * @param str String with the keyword
* @return Boolean
*/
BZPage.prototype.hasKeyword = function(str) {
@@ -832,8 +935,7 @@ BZPage.prototype.hasKeyword = function(str) {
/**
* Set additional keyword if it isn't there
*
- * @param str
- * string with the keyword
+ * @param str String with the keyword
* @return none
*/
BZPage.prototype.setKeyword = function(str) {
@@ -854,24 +956,16 @@ BZPage.prototype.getOptionValue = function(id) {
* 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 originalLocation
- * object after which the new button will be added
- * @param newId
- * string with the id of the new button; has to be unique in whole
+ * @param originalLocation Object after which the new button will be added
+ * @param newId String with the id of the new button; has to be unique in whole
* page
- * @param newLabel
- * string with the label which will be shown to user
- * @param commentString
- * string with comment to be added to the comment box
- * @param nState
- * string with the new state bug should switch to (see
+ * @param newLabel String with the label which will be shown to user
+ * @param commentString String with comment to be added to the comment box
+ * @param nState String with the new state bug should switch to (see
* generalPurposeCureForAllDisease function for details)
- * @param secPar
- * string with second parameter for generalPurposeForAllDisease
- * @param doSubmit
- * bool optional whether the button should submit whole page (default
- * true)
- *
+ * @param secPar String with second parameter for generalPurposeForAllDisease
+ * @param doSubmit Boolean optional whether the button should submit whole
+ * page (default true)
* @return none
*/
BZPage.prototype.addNewButton = function(originalLocation, newId, newLabel,
@@ -1538,10 +1632,8 @@ RHBugzillaPage.prototype.setBranding = function() {
* Given line to be parsed, find out which chipset it is and fill in the
* whiteboard
*
- * @param iLine
- * string with the whole unparsed "interesting line"
- * @param driverStr
- * string with the driver name
+ * @param iLine String with the whole unparsed "interesting line"
+ * @param driverStr String with the driver name
* @return None
*/
RHBugzillaPage.prototype.fillInWhiteBoard = function(iLine, driverStr) {
@@ -1559,12 +1651,9 @@ RHBugzillaPage.prototype.fillInWhiteBoard = function(iLine, driverStr) {
/**
* Given PCI IDs for manufacturer and card ID return chipset string
*
- * @param manufacturerNo
- * string with manufacturer PCI ID
- * @param cardNo
- * string with card PCI ID
- *
- * @return array with chip string and optinoal variants
+ * @param manufacturerNo String with manufacturer PCI ID
+ * @param cardNo String with card PCI ID
+ * @return Array with chip string and optinoal variants
*/
function checkChipStringFromID(manufacturerNo, cardNo) {
var soughtID = (manufacturerNo + "," + cardNo).toUpperCase();
@@ -1684,12 +1773,9 @@ RHBugzillaPage.prototype.fillInChipMagic = function () {
/**
* Opens a new tab with a query for the given text in the selected component
*
- * @param text
- * to be searched for
- * @param component
- * string with the component name (maybe latter regexp?)
- * @param product
- * (optional) string with the product name
+ * @param text to be searched for
+ * @param component String with the component name (maybe latter regexp?)
+ * @param product (optional) string with the product name
* @return None
*
*/
@@ -1821,8 +1907,7 @@ RHBugzillaPage.prototype.parseAttachmentLine = function(inElem) {
/**
* Check for the presence of a keyword
*
- * @param str
- * string with the keyword
+ * @param str String with the keyword
* @return Boolean
*
*/
@@ -1834,14 +1919,10 @@ RHBugzillaPage.prototype.hasKeyword = function(str) {
/**
* Add accesskey to the particular element
*
- * @param rootElement
- * element to which the new text object will be attached
- * @param beforeText
- * text before the accesskey character
- * @param accKey
- * what will be the accesskey itself
- * @param afterText
- * text after the accesskey character
+ * @param rootElement Element to which the new text object will be attached
+ * @param beforeText Text before the accesskey character
+ * @param accKey what will be the accesskey itself
+ * @param afterText text after the accesskey character
* @return modified element with the fixed accesskey FIXME isn't this closure
* and possible memleak?
*/
@@ -1854,8 +1935,7 @@ RHBugzillaPage.prototype.fixElement = function(elem, beforeText, accKey, afterTe
/**
* Add XGL to the CC list
*
- * @param evt
- * event which made this function active
+ * @param evt Event which made this function active
* @return none
*/
RHBugzillaPage.prototype.changeOwner = function(newAssignee) {
@@ -1868,7 +1948,7 @@ RHBugzillaPage.prototype.changeOwner = function(newAssignee) {
this.doc.getElementById("newcc").textContent = newAssignee;
}
if (newAssignee) {
- this.clickMouse(this.doc.getElementById("bz_assignee_edit_action"));
+ this.clickMouse("bz_assignee_edit_action");
this.doc.getElementById("assigned_to").value = newAssignee;
this.doc.getElementById("set_default_assignee").checked = false;
if (defAssigneeButton = this.doc
@@ -1882,20 +1962,18 @@ RHBugzillaPage.prototype.changeOwner = function(newAssignee) {
* Set the bug to NEEDINFO state
*
* Working function.
- *
* @return none
*/
RHBugzillaPage.prototype.setNeedinfoReporter = function() {
- this.clickMouse(this.doc.getElementById("needinfo"));
+ this.clickMouse("needinfo");
this.selectOption("needinfo_role", "reporter");
};
/**
* 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
+ * @param URLhostname String hostname of the external bugzilla
+ * @return String with the string for the external_id SELECT
*/
RHBugzillaPage.prototype.getBugzillaName = function(URLhostname) {
var bugzillaID = "";
@@ -1910,10 +1988,9 @@ RHBugzillaPage.prototype.getBugzillaName = function(URLhostname) {
/**
* Generate URL of the bug on remote bugzilla
*
- * @param selectValue
- * Number which is index of the bugzilla in hashBugzillaWholeURL
- * @param bugID
- * Number which is bug ID
+ * @param selectValue Number which is index of the bugzilla
+ * in hashBugzillaWholeURL
+ * @param bugID Number which is bug ID
* @return string with the URL
*/
RHBugzillaPage.prototype.getWholeURL = function(selectValue, bugID) {
@@ -1929,9 +2006,11 @@ RHBugzillaPage.prototype.getWholeURL = function(selectValue, bugID) {
/**
* Callback function for the XMLRPC request
*
- * @param ret
- * object with xmlhttprequest response with attributes: + status --
- * int return code + statusText + responseHeaders + responseText
+ * @param ret Object with xmlhttprequest response with attributes:
+ * + status -- int return code
+ * + statusText
+ * + responseHeaders
+ * + responseText
*/
RHBugzillaPage.prototype.callBack = function(data, textStatus) {
if (--this.reqCounter <= 0) {
@@ -1943,12 +2022,9 @@ RHBugzillaPage.prototype.callBack = function(data, textStatus) {
* The worker function -- call XMLRPC to fix MIME type of the particular
* attachment
*
- * @param id
- * integer with the attachment id to be fixed
- * @param type
- * string with the new MIME type, optional defaults to "text/plain"
- * @param email
- * Boolean whether email should be sent to appropriate person;
+ * @param id Integer with the attachment id to be fixed
+ * @param type String with the new MIME type, optional defaults to "text/plain"
+ * @param email Boolean whether email should be sent to appropriate person;
* option, defaults to false
*
* updateAttachMimeType($data_ref, $username, $password)
@@ -2015,8 +2091,7 @@ RHBugzillaPage.prototype.fixAllAttachments = function(list) {
/**
* Create a button for fixing all bad attachments.
*
- * @param list
- * Array of all bad attachmentss
+ * @param list Array of all bad attachmentss
* @return button fixing all bad Attachments
*/
RHBugzillaPage.prototype.createFixAllButton = function(list) {
@@ -2054,9 +2129,7 @@ RHBugzillaPage.prototype.addTextLink = function(row) {
/**
* Add information about the upstream bug upstream, and closing it.
*
- * @param evt
- * event which called this handler
- *
+ * @param evt Event which called this handler
* @return none
*/
RHBugzillaPage.prototype.addClosingUpstream = function() {
@@ -2113,10 +2186,8 @@ RHBugzillaPage.prototype.addClosingUpstream = function() {
/**
* Insert a row of buttons before the marked element
*
- * @param anchor
- * element before which the row of buttons will be inserted
- * @param array
- * array of data for buttons to be generated
+ * @param anchor Element before which the row of buttons will be inserted
+ * @param array Array of data for buttons to be generated
* @return none
*/
RHBugzillaPage.prototype.generateToolBar = function(anchor, array) {
@@ -2130,13 +2201,11 @@ RHBugzillaPage.prototype.generateToolBar = function(anchor, array) {
/**
* Generalized function for all actions
*
- * @param addString
- * string to be added as new comment
- * @param nextState
- * string signifying next state of the bug (whatever is in Bugzilla +
+ * @param addString String to be added as new comment
+ * @param nextState String signifying next state of the bug (whatever is in Bugzilla +
* "NEEDINFO" meaning NEEDINFO(Reporter))
- * @param secondParameter
- * string with label on the subbutton for reason of closing the bug
+ * @param secondParameter String with label on the subbutton for reason of
+ * closing the bug
* @return none
*/
RHBugzillaPage.prototype.generalPurposeCureForAllDisease = function(addString,
@@ -2270,8 +2339,7 @@ RHBugzillaPage.prototype.parseBacktrace = function(ret) {
* separated into function, so that it could be called from onload method of the
* XMLHttpRequest.
*
- * @param jsonList
- * Array created from JSON
+ * @param jsonList Array created from JSON
* @return none
*/
RHBugzillaPage.prototype.buildButtons = function(above, below) {