Name

global.ScrumAjaxTaskBoardDetailsProviderLegacy

Description

Legacy version of ScrumAjaxTaskBoardDetailsProvider to support Planning board IE7/8 which doesn t support Heisenberg.

Script

var ScrumAjaxTaskBoardDetailsProviderLegacy = Class.create();
  	ScrumAjaxTaskBoardDetailsProviderLegacy.prototype = Object.extendsObject(AbstractAjaxProcessor, {
  	   belongsToUser: function(user){
  	      return gs.getUser().getID() == user;
  	   },
  	
  	   isActiveTaskState: function(state){
  	      var states = gs.getProperty("com.snc.sdlc.scrum.pp.progress.task.state").split(",");
  	      for (var i = 0; i < states.length; i++)
  	         if (states[i] == state)
  	            return true;
  	      return false;
  	   },
  	
  	   createStoryNode: function(gr, userLanguage, parentOnly){
  	      var id = gr["sys_id"];
  	      var name = gr["short_description"];
  	      var assignedTo = gr["assigned_to"];
  	      var assignedToName = this._getUserName(assignedTo);
  	      var stateName = this._getChoiceName("rm_story", gr["state"], userLanguage, "state");
  	      var points = gr["story_points"];
  	      var displayName = name;
  	      if (displayName.trim().length == 0)
  	         displayName = gs.getMessage("-- Empty --");
  	      var type = gr["type"];
  	      var typeLabel = this._getChoiceName("rm_story", type, userLanguage, "type");
  	      var classification = gr["classification"];
  	      var classificationLabel = this._getChoiceName("rm_story", classification, userLanguage, "classification");
  	      
  	      var item = this.newItem("story");
  	      if (parentOnly){
  	         var tasks = new GlideRecordSecure("rm_scrum_task");
  	         tasks.addQuery("parent", id);
  	         tasks.query();
  	         item.setAttribute('has_tasks', 'false');
  	         while(tasks.next()){
  	            var taskState = tasks["state"];
  	            if (!this.taskStateActiveMap || !this.taskStateActiveMap[taskState]){
  	               if (!this.taskStateActiveMap)
  	                  this.taskStateActiveMap = {};
  	               if (this.isActiveTaskState(taskState))
  	                  this.taskStateActiveMap[taskState] = "true";
  	               else
  	                  this.taskStateActiveMap[taskState] = "false";
  	            }
  	            if (this.taskStateActiveMap[taskState] == "true"){
  	               item.setAttribute('has_tasks', 'true');
  	               break;
  	            }
  	         }   
  	      }
  	
  	      item.setAttribute('belongs_to', this.belongsToUser(gr["assigned_to"]));
  	      item.setAttribute('blocked', gr["blocked"]);
  	      item.setAttribute('blocked_reason', escape(gr["blocked_reason"]));
  	      item.setAttribute('id', gr["sys_id"]);
  	      item.setAttribute('number', gr["number"]);
  	      item.setAttribute('points', points);
  	      item.setAttribute('assigned_to', gr["assigned_to"]);
  	      item.setAttribute('assigned_to_name', assignedToName);
  	      item.setAttribute('short_description', escape(gr["short_description"]));
  	      item.setAttribute('acceptance_criteria', escape(gr["acceptance_criteria"]));
  	      item.setAttribute('state', escape(gr["state"]));
  	      item.setAttribute('type', type);
  	      item.setAttribute("type_label", typeLabel);
  	      item.setAttribute('classification', classification);
  	      item.setAttribute("classification_label", classificationLabel);
  	
  	      item.setAttribute('index', gr["sprint_index"]);
  	      
  	      var adittional = '';
  	      if (!parentOnly) {
  	         adittional += '<tr class="toggleItem">';
  	         adittional +=     '<td style="white-space: nowrap; vertical-align: top;">';
  	         adittional +=         '<span class="itemStateTitleCell">';
  	         adittional +=             gs.getMessage("Story State: ");
  	         adittional +=         '</span>';
  	         adittional +=     '</td>';
  	         adittional +=     '<td style="white-space: nowrap; vertical-align: top;">';
  	         adittional +=         '<span id="stateCell_'+id+'" class="itemStateCell">';
  	         adittional +=             GlideStringUtil.escapeHTML(stateName);
  	         adittional +=         '</span>';
  	         adittional +=     '</td>';
  	         adittional += '</tr>';
  	      }
  	
  	      var markup = '<table class="elemTable">';
  	         markup +=     '<tr>';
  	         markup +=         '<td colspan="2" title="'+gs.getMessage("Short Description")+'" id="short_descriptionCell_'+id+'" class="itemNameCell" style="width: 100%">';
  	         markup +=             GlideStringUtil.escapeHTML(displayName);
  	         markup +=         '</td>';
  	         markup +=     '</tr>';
  	         markup +=     adittional;
  	         markup +=     '<tr class="toggleItem">';
  	         markup +=         '<td style="vertical-align: top; white-space: nowrap;">';
  	         markup +=             '<span class="itemAssignedTitleCell">';
  	         markup +=                 gs.getMessage("Assigned To: ");
  	         markup +=             '</span>';
  	         markup +=         '</td>';
  	         markup +=         '<td style="vertical-align: top; width: 100%;">';
  	         markup +=             '<span id="assigned_to_nameCell_'+id+'" class="itemAssignedCell">';
  	         markup +=                 GlideStringUtil.escapeHTML(assignedToName);
  	         markup +=             '</span>';
  	         markup +=         '</td>';
  	         markup +=     '</tr>';
  	         markup +=     '<tr class="toggleItem">';
  	         markup +=         '<td style="white-space: nowrap; vertical-align: top;">';
  	         markup +=             '<span class="itemTypeCell">';
  	         markup +=                 gs.getMessage("Story Type: ");
  	         markup +=             '</span>';
  	         markup +=         '</td>';
  	         markup +=         '<td style="width: 100%; white-space: nowrap; vertical-align: top;">';
  	         markup +=             '<span class="itemTypeLabelCell" id="type_labelCell_'+id+'">';
  	         markup +=                 GlideStringUtil.escapeHTML(typeLabel);
  	         markup +=             '</span>';
  	         markup +=         '</td>';
  	         markup +=     '</tr>';
  	         markup +=     '<tr class="toggleItem">';
  	         markup +=         '<td style="white-space: nowrap; vertical-align: top;">';
  	         markup +=             '<span class="itemClassificationCell">';
  	         markup +=                 gs.getMessage("Classification: ");
  	         markup +=             '</span>';
  	         markup +=         '</td>';
  	         markup +=         '<td style="width: 100%; white-space: nowrap; vertical-align: top;">';
  	         markup +=             '<span class="itemClassificationLabelCell" id="classification_labelCell_'+id+'">';
  	         markup +=                 GlideStringUtil.escapeHTML(classificationLabel);
  	         markup +=             '</span>';
  	         markup +=         '</td>';
  	         markup +=     '</tr>';
  	         markup += '</table>';
  	
  	      item.setAttribute('markup', escape(markup));
  	
  	      var controlsMarkup = '<table  class="toggleItem" cellpadding="0" style="height: 100%;">';
  	         controlsMarkup +=     '<tr>';
  	         controlsMarkup +=         '<td class="itemBlockedCell">';
  	         controlsMarkup +=         '</td>';
  	         controlsMarkup +=     '</tr>';
  	         controlsMarkup +=     '<tr>';
  	         controlsMarkup +=         '<td class="itemPointsCell" style="white-space: nowrap; padding-top: 5px;">';
  	         controlsMarkup +=             '<span title="'+gs.getMessage("Points")+'" id="pointsCell_'+id+'" class="input_span">';
  	         controlsMarkup +=                 GlideStringUtil.escapeHTML(points);
  	         controlsMarkup +=             '</span>';
  	         controlsMarkup +=         '</td>';
  	         controlsMarkup +=     '</tr>';
  	         controlsMarkup +=     '<tr>';
  	         controlsMarkup +=         '<td class="itemChildCell" style="padding-top: 4px;">';
  	         controlsMarkup +=         '</td>';
  	         controlsMarkup +=     '</tr>';
  	         controlsMarkup +=     '<tr>';
  	         controlsMarkup +=         '<td class="itemCreateChildCell" style="padding-top: 4px;">';
  	         controlsMarkup +=         '</td>';
  	         controlsMarkup +=     '</tr>';
  	         controlsMarkup += '</table>';
  	
  	      item.setAttribute("controls_markup", escape(controlsMarkup));
  	      item.setAttribute('mod_count', escape(gr["sys_mod_count"]));
  	      return item;
  	   },
  	
  	   createTaskNode: function(gr, userLanguage, createTop, showActual){
  	      
  	      var type = gr["type"];
  	      var id = gr["sys_id"];
  	      var name = gr["short_description"];
  	      var displayName = name;
  	      if (displayName.trim().length == 0)
  	         displayName = gs.getMessage("-- Empty --");
  	      var assignedTo = gr["assigned_to"];
  	      var assignedToName = this._getUserName(assignedTo);
  	      var typeLabel = this._getChoiceName("rm_scrum_task", type, userLanguage, "type");
  	      var testResult = gr["test_result"];
  	      var testResultLabel = this._getChoiceName("rm_scrum_task", testResult,userLanguage , "test_result");
  	      var planned = gr["planned_hours"];
  	      var remaining = gr["remaining_hours"];
  	      var hours = gr["hours"];
  	
  	      var item;
  	      if (createTop)
  	         item = this.newItem("task");
  	      else
  	         item = this.getDocument().createElement("task");
  	      item.setAttribute("belongs_to", this.belongsToUser(gr["assigned_to"]));
  	      item.setAttribute("blocked", gr["blocked"]);
  	      item.setAttribute("blocked_reason", escape(gr["blocked_reason"]));
  	      item.setAttribute("id", id);
  	      item.setAttribute("number", gr["number"]);
  	      item.setAttribute("hours", hours);
  	      item.setAttribute("planned_hours", planned);
  	      item.setAttribute("remaining_hours", remaining);
  	      item.setAttribute("assigned_to", assignedTo);
  	      item.setAttribute("assigned_to_name", assignedToName);
  	      item.setAttribute("type_label", typeLabel);
  	      item.setAttribute("short_description", escape(name));
  	      item.setAttribute("test_result_label", testResultLabel);
  	      item.setAttribute("test_result", testResult);
  	      item.setAttribute("type", type);
  	      item.setAttribute("state", gr["state"]);
  	      item.setAttribute('mod_count', escape(gr["sys_mod_count"]));
  	
  	
  	      var resultRowDisplay = "";
  	      if (type != "4")
  	         resultRowDisplay = ' style="display: none;"';
  	      var markup = '<table class="elemTable">';
  		     markup +=     '<tr>';
  		     markup +=         '<td colspan="2" id="short_descriptionCell_'+id+'" class="itemNameCell" style="width: 100%" title="'+gs.getMessage("Short Description")+'">';
  		     markup +=             GlideStringUtil.escapeHTML(displayName);
  		     markup +=         '</td>';
  		     markup +=     '</tr>';
  	         markup +=     '<tr class="toggleItem">';
  		     markup +=         '<td style="white-space: nowrap; vertical-align: top;">';
  		     markup +=             '<span class="itemAssignedTitleCell" >';
  		     markup +=                 gs.getMessage("Assigned To: ");
  		     markup +=             '</span>';
  		     markup +=         '</td>';
  		     markup +=         '<td style="width: 100%; vertical-align: top;">';
  		     markup +=             '<span class="itemAssignedCell" id="assigned_to_nameCell_'+id+'">';
  		     markup +=                 GlideStringUtil.escapeHTML(assignedToName);
  		     markup +=             '</span>';
  		     markup +=         '</td>';
  		     markup +=     '</tr>';
  	         markup +=     '<tr class="toggleItem">';
  		     markup +=         '<td style="white-space: nowrap; vertical-align: top;">';
  		     markup +=             '<span class="itemTypeCell">';
  		     markup +=                 gs.getMessage("Task Type: ");
  		     markup +=             '</span>';
  		     markup +=         '</td>';
  		     markup +=         '<td style="width: 100%; white-space: nowrap; vertical-align: top;">';
  		     markup +=             '<span class="itemTypeLabelCell" id="type_labelCell_'+id+'">';
  		     markup +=                 GlideStringUtil.escapeHTML(typeLabel);
  		     markup +=             '</span>';
  		     markup +=         '</td>';
  		     markup +=     '</tr>';
  	         markup +=     '<tr class="itemTestResultRow" id="test_result_labelRow_'+id+'"'+resultRowDisplay+'>';
  		     markup +=         '<td class="toggleItem" style="white-space: nowrap; vertical-align: top;">';
  		     markup +=             '<span class="itemTestResultCell">';
  		     markup +=                 gs.getMessage("Test Result: ");
  		     markup +=             '</span>';
  		     markup +=         '</td>';
  		     markup +=         '<td  class="toggleItem" style="width: 100%; white-space: nowrap; vertical-align: top;">';
  		     markup +=             '<span class="itemTestResultLabelCell" id="test_result_labelCell_'+id+'">';
  		     markup +=                 GlideStringUtil.escapeHTML(testResultLabel);
  		     markup +=             '</span>';
  		     markup +=         '</td>';
  		     markup +=     '</tr>';
  		     markup += '</table>';
  	
  	      item.setAttribute("markup", escape(markup));
  	
  	      var actualStyle = '';
  	      if (!showActual)
  	         actualStyle = ' style="display: none;"';
  	      var controlsMarkup = '<table class="toggleItem" style="background: none; background-color: none; padding: 0px" cellPadding="0" cellSpacing="0">';
  		     controlsMarkup +=     '<tr>';
  		     controlsMarkup +=         '<td nowrap="nowrap" class="itemBlockedCell">';
  		     controlsMarkup +=         '</td>';
  		     controlsMarkup +=     '</tr>';
  	         controlsMarkup +=     '<tr>';
  		     controlsMarkup +=         '<td nowrap="nowrap" title="'+gs.getMessage("Planned hours")+'" style="white-space: nowrap; padding-top: 5px;" class="itemHoursPlannedCell">';
  		     controlsMarkup +=             '<span style="white-space: nowrap;">P ';
  		     controlsMarkup +=                 '<span title="'+gs.getMessage("Planned hours")+'" id="planned_hoursCell_'+id+'" class="input_span">';
  		     controlsMarkup +=                     GlideStringUtil.escapeHTML(planned);
  		     controlsMarkup +=                 '</span>';
  		     controlsMarkup +=             '</span>';
  		     controlsMarkup +=         '</td>';
  		     controlsMarkup +=     '</tr>';
  	         controlsMarkup +=     '<tr>';
  		     controlsMarkup +=         '<td nowrap="nowrap" title="'+gs.getMessage("Remaining hours")+'" style="white-space: nowrap; padding-top: 5px;" class="itemHoursRemainingCell">';
  		     controlsMarkup +=             '<span style="white-space: nowrap;">R ';
  		     controlsMarkup +=                 '<span title="'+gs.getMessage("Remaining hours")+'" id="remaining_hoursCell_'+id+'" class="input_span">';
  		     controlsMarkup +=                     GlideStringUtil.escapeHTML(remaining);
  		     controlsMarkup +=                 '</span>';
  		     controlsMarkup +=             '</span>';
  		     controlsMarkup +=         '</td>';
  		     controlsMarkup +=     '</tr>';
  	         controlsMarkup +=     '<tr'+actualStyle+'>';
  		     controlsMarkup +=         '<td nowrap="nowrap" title="'+gs.getMessage("Actual hours")+'" style="white-space: nowrap; padding-top: 5px;" class="itemHoursCell">';
  		     controlsMarkup +=             '<span style="white-space: nowrap;">A ';
  		     controlsMarkup +=                 '<span title="'+gs.getMessage("Actual hours")+'" id="hoursCell_'+id+'" class="input_span">';
  		     controlsMarkup +=                     GlideStringUtil.escapeHTML(hours);
  		     controlsMarkup +=                 '</span>';
  		     controlsMarkup +=             '</span>';
  		     controlsMarkup +=         '</td>';
  		     controlsMarkup +=     '</tr>';
  		     controlsMarkup += '</table>';
  	
  	      item.setAttribute("controls_markup", escape(controlsMarkup));
  	
  	      return item;
  	   },
  	
  	   getStringDate: function(str){
  	      return new GlideDateTime(str);
  	   },
  	
  	
  	   getLongDate: function(lng){
  	      return new GlideDateTime(new Packages.java.util.Date(lng));
  	   },
  	
  	   updateTaskBoardData: function() {
  		  var gr;
  		  var gr2;
  	      var rootID = this.getParameter('sysparm_root_id');
  	      var parentOnly = this.getParameter('sysparm_parent_only') == "true";
  	      var userLanguage = this.getParameter('sysparm_user_language');
  	      var lastUpdated  = this.getLongDate(Packages.java.lang.Long.parseLong(this.getParameter('sysparm_last_updated')));
  	      var showActual = gs.getProperty('com.snc.sdlc.scrum.pp.task_uses_actual_hours') == "true";
  	      var timeItem = this.newItem("time");
  	      timeItem.setAttribute("time", new Packages.java.util.Date().getTime());
  	
  	      var idsStr = "";
  	      if (parentOnly){
  	         gr = new GlideRecordSecure("rm_story");
  	         gr.addQuery("sprint", rootID);
  	         gr.orderBy("sprint_index");
  	         gr.orderBy("number");
  	         gr.query();
  	         while(gr.next()) { 
  	            if (this.getStringDate(gr["sys_updated_on"]).compareTo(lastUpdated) > 0)
  	               this.createStoryNode(gr, userLanguage, parentOnly);
  	            else{
  	               gr2 = new GlideRecordSecure("rm_scrum_task");
  	               gr2.addQuery("parent", gr["sys_id"]);
  	               gr2.query();
  	               while(gr2.next())
  	                  if (this.getStringDate(gr2["sys_updated_on"]).compareTo(lastUpdated) > 0){
  	                     this.createStoryNode(gr, userLanguage, parentOnly);
  	                     break;
  	                  }
  	            }
  	            idsStr += "|"+gr["sys_id"];
  	         }
  	      }else{
  	         gr = new GlideRecordSecure("rm_story");
  	         gr.addQuery("sprint", rootID);
  	         gr.orderBy("sprint_index");
  	         gr.orderBy("number");
  	         gr.query();
  	         var item = null;
  	         while(gr.next()) { 
  	            gr2 = new GlideRecordSecure("rm_scrum_task");
  	            gr2.addQuery("parent", gr["sys_id"]);
  	            gr2.query();
  	            while(gr2.next()) {
  	               var childUpdated  = this.getStringDate(gr2["sys_updated_on"]);
  	               if (childUpdated.compareTo(lastUpdated) > 0){
  	                  if (!item || item == null)
  	                     item = this.createStoryNode(gr, userLanguage, parentOnly);
  	                  item.appendChild(this.createTaskNode(gr2, userLanguage, false, showActual));
  	               }
  	               idsStr += "|"+gr2["sys_id"];
  	            }
  	            if (!item || item == null)
  	               if (this.getStringDate(gr["sys_updated_on"]).compareTo(lastUpdated) > 0)
  	                  this.createStoryNode(gr, userLanguage, parentOnly);
  	            idsStr += "|"+gr["sys_id"];
  	         }
  	      }
  	      var idsItem = this.newItem("ids");
  	      idsItem.setAttribute("ids", idsStr);
  	   },
  	
  	   getTaskBoardData: function() {
  	      var rootID = this.getParameter('sysparm_root_id');
  	      var parentOnly = this.getParameter('sysparm_parent_only') == "true";
  	      var userLanguage = this.getParameter('sysparm_user_language');
  	      var showActual = gs.getProperty('com.snc.sdlc.scrum.pp.task_uses_actual_hours') == "true";
  	
  	      //var userMap = {};
  	      //var gr = new GlideRecordSecure("sys_user_has_role");
  	      //gr.addQuery("role.name", "IN", "scrum_user,scrum_admin");
  	      //gr.addJoinQuery("sys_user", "user", "sys_id");
  	      //gr.query();
  	      //while(gr.next())
  	         //if (!userMap[gr.user.sys_id]){
  	            //var item = this.newItem("user");
  	            //item.setAttribute('name', gr.user.name);
  	            //item.setAttribute('id', gr.user.sys_id);
  	            //userMap[gr.user.sys_id] = gr.user.sys_id;
  	         //}
  	      //userMap = null;
  	
  	      var timeItem = this.newItem("time");
  	      timeItem.setAttribute("time", new Packages.java.util.Date().getTime());
  	
  	      var gr = new GlideRecordSecure("rm_story");
  	      gr.addQuery("sprint", rootID);
  	      gr.orderBy("sprint_index");
  	      gr.orderBy("number");
  	      gr.query();
  	      while (gr.next()){
  	         var item = this.createStoryNode(gr, userLanguage, parentOnly);
  	         if (!parentOnly){
  	            var gr2 = new GlideRecordSecure("rm_scrum_task");
  	            gr2.addQuery("parent", gr["sys_id"]);
  	            gr2.query();
  	            while (gr2.next())
  	               item.appendChild(this.createTaskNode(gr2, userLanguage, false, showActual));
  	         }
  	      }
  	   },
  	
  	   getTaskData: function() {
  	      var sysID = this.getParameter('sysparm_sys_id');
  	      var userLanguage = this.getParameter('sysparm_user_language');
  	      var showActual = gs.getProperty('com.snc.sdlc.scrum.pp.task_uses_actual_hours') == "true";
  	      var gr = new GlideRecordSecure("rm_scrum_task");
  	      gr.addQuery("sys_id", sysID);
  	      gr.query();
  	      if (gr.next())
  	         this.createTaskNode(gr, userLanguage, true, showActual);
  	   },
  	
  	   _getUserName: function(userID){
  	
  	      if (userID && userID != ''){
  	         if (this.userNameMap && this.userNameMap[userID]){
  	            return this.userNameMap[userID];
  	         }else{
  	            var gr = new GlideRecordSecure("sys_user");
  	            gr.addQuery("sys_id", userID);
  	            gr.query();
  	            if (gr.next()){
  	               if (!this.userNameMap)
  	                  this.userNameMap = {};
  	               this.userNameMap[userID] = gr.name;
  	               return gr.name;
  	            }
  	         }
  	      }
  	      return "-- None --";
  	   },
  	
  	   _getChoiceName: function(table, typeID, userLanguage, element){
  	      var key = table + "|" + typeID + "|" + userLanguage + "|" + element;
  	      if (this.choiceNameMap && this.choiceNameMap[key]){
  	         return this.choiceNameMap[key];
  	      }else{
  	         if (!this.choiceNameMap)
  	            this.choiceNameMap = {};
  	         if (!typeID || typeID == ''){
  	            this.choiceNameMap[key] = "-- None --";
  	            return "-- None --";
  	         }
  	         var gr = new GlideRecordSecure("sys_choice");
  	         gr.addQuery("name", table);
  	         gr.addQuery("element", element);
  	         gr.addQuery("language", "en");
  	         gr.addQuery("value", typeID);
  	         gr.query();
  	         var label = "-- None --";
  	         if (gr.next()){
  	            label = gr["label"];
  	            if (userLanguage != "en"){
  	               var gr2 = new GlideRecordSecure("sys_choice");
  	               gr2.addQuery("name", table);
  	               gr2.addQuery("element", element);
  	               gr2.addQuery("language", userLanguage);
  	               gr2.addQuery("value", typeID);
  	               gr2.query();
  	               if (gr2.next())
  	                  label = gr2["label"];
  	            }
  	         }
  	         this.choiceNameMap[key] = label;
  	         return label;
  	      }
  	   },
  		
  		/**
  		 * Prevent public access to this processor
  		 */
  		isPublic: function() {
  			return false;
  		}    
  	});

Sys ID

2ede1183872031003706db5eb2e3ecf6

Offical Documentation

Official Docs: