aboutsummaryrefslogblamecommitdiffstats
path: root/data/lib/bugzillaDOMFunctions.js
blob: f58f0d94741bf566782aa00925981bcf08fb02f9 (plain) (tree)
1
2
3
4
5
6
7
8
9





                                                                        
   
                                                                       
   


               
   




































                                                                





                                                       














                                                     




                                                      







                                                                          




                                                          














                                                                           


                                   







                                           
   
                    
   
               

                                                                               






                                            
   







                                                                                  


                                                                               


                                                     
                                                                          




                                                                             








                                                            


















































                                                                                
   






                                                                           
                                   
   






                                                       
                                                    
   







                                                                                   

                                                                              




























                                                         



                                                                              












                                                         
   










                                                                                 



                                                                          

















                                                        
   














                                                                









                                                                               















                                                                                   
   










                                                                 
   







                                                                             


                                                    











                                                            
// 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) {
  return filterByRegexp(constantData.defBugzillaMaintainerArr, component);
}

/**
 * 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 title of the bug
 * 
 * @return string
 */
function getSeverity() {
  return document.getElementById("bug_severity").value;
}

/**
 * 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;
}