ServiceDesk

 View Only

Workflow/ServiceDesk - How To influence HTML elements in a Process View Page 

Oct 31, 2015 12:36 PM

Some parts of a Process View Page are rendered without an associated configuration interface.
An example of this would be the 'Send Email' Process Action from within a ServiceDesk Ticket View.

For our purpose, let us say that we do not want to use this feature.
We can hide the 'Send Email' Process Action in the Ticket View with the following technique:

1) Modify the Portal Template that is used for the Process View Page (Workflow\ProcessManager\Portal\Template66_33.aspx).
    Insert after the line: <asp:Content...

   This line only for 7.5 environments:

<script type="text/javascript" src="<%= (Request.ApplicationPath + @"/Scripts/jquery-1.7.2.js").Replace(@"//", @"/") %>"></script>


   This line only for 7.6 environments:

<script type="text/javascript" src="<%= (Request.ApplicationPath + @"../Shared/scripts/scripts/jquery.min.js").Replace(@"//", @"/") %>"></script>


   These two lines for either environment:

<script type="text/javascript" src="<%= (Request.ApplicationPath + @"/JScript.js").Replace(@"//", @"/") %>"></script>
<script type="text/javascript">$(document).ready(function() { hideSmartTasks(); });</script>


   NOTE: Once completed, you will have inserted three additional lines of code after the line starting with: <asp:Content

2) Create the file: Workflow\ProcessManager\JScript.js
    Use the following code:

function hideSmartTasks() {
        $("a").filter(function() { return $(this).text() === "Send Email"; }).hide();
}


This example utilizes the jQuery source that ships with the Workflow product, you could use any JavaScript that suits your purpose.


Posted 9-11-2017 - This next example does not use jQuery and operates on the 'User is VIP' boolean.

    Modify the Portal Template that is used for the Process View Page (Workflow\ProcessManager\Portal\Template66_33.aspx).
    Insert after the line: <asp:Content...

<script type="text/javascript" src="<%= (Request.ApplicationPath + @"/JScript.js").Replace(@"//", @"/") %>">setOverviewColors();</script>

    Create the file: Workflow\ProcessManager\JScript.js
    Use the following code:

window.onload = function setOverviewColors() {
    if ( !document.querySelectorAll ) {
        var labels = document.getElementsByTagName("span");
        for (var i = 0; i < labels.length; i++) {
            switch(labels[i].innerHTML) {
                case "User is VIP":
                    var neighbor = labels[i].parentElement;
                    var target = neighbor.nextSibling;
                    if ( target.innerHTML == "False" ) {
                        target.style.color="DarkGreen";
                    } else if ( target.innerHTML == "True" ) {
                            target.style.color="Red";
                            target.style.fontWeight="bold";
                    }
                    break;
            }
        }
    } else {
        var labels = document.querySelectorAll("td.dg_label span");
        for (var i = 0; i < labels.length; i++) {
            switch(labels[i].innerHTML) {
                case "User is VIP":
                    var neighbor = labels[i].parentElement;
                    var target = neighbor.nextElementSibling;
                    if ( target.innerHTML == "False" ) {
                        target.style.color="DarkGreen";
                    } else if ( target.innerHTML == "True" ) {
                        target.style.color="Red";
                        target.style.fontWeight="bold";
                    }
                    break;
            }
        }
    }
}




NOTE: Be sure to mention that you have applied this technique when talking to a Symantec Support Representative.


Posted 2-26-2018 - This example navigates to the 'IT Services' category when entering the 'Submit Request' page.

    Modify the Portal Template that is used for the Process View Page (Workflow\ProcessManager\Portal\Template100.aspx).
    Insert after the line: <asp:Content...

<script type="text/javascript" src="<%= (Request.ApplicationPath + @"/JScript.js").Replace(@"//", @"/") %>"></script>

    Create the file: Workflow\ProcessManager\JScript.js
    Use the following code:

$(document).ready(function() {
  if ( !sessionStorage.justOnce ) {
    sessionStorage.setItem("justOnce", "true");
    $(this).delay(1000).queue(function() {
      $("span.pm-node").each(function() {
        if ( $(this).text() == "IT Services" ) {
          $(this).addClass("pm-selected");
          $(this).trigger('click');
        } else {
          $(this).removeClass("pm-selected");
        }
      });
      $(this).dequeue();
    });
  }
});



Posted 2-28-2018 - This example invokes an automatic page refresh when modifying an Incident in a Process View.

    Modify the Portal Template that is used for the Process View Page (Workflow\ProcessManager\Portal\Template66_33.aspx).
    Insert after the line: <asp:Content...

<script type="text/javascript" src="<%= (Request.ApplicationPath + @"/JScript.js").Replace(@"//", @"/") %>"></script>

    Create the file: Workflow\ProcessManager\JScript.js
    Use the following code:

$(document).ready(function() {
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
  if (!Array.from) {
    Array.from = (function () {
      var toStr = Object.prototype.toString;
      var isCallable = function (fn) {
        return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
      };
      var toInteger = function (value) {
        var number = Number(value);
        if (isNaN(number)) { return 0; }
        if (number === 0 || !isFinite(number)) { return number; }
        return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
      };
      var maxSafeInteger = Math.pow(2, 53) - 1;
      var toLength = function (value) {
        var len = toInteger(value);
        return Math.min(Math.max(len, 0), maxSafeInteger);
      };

      // The length property of the from method is 1.
      return function from(arrayLike/*, mapFn, thisArg */) {
        // 1. Let C be the this value.
        var C = this;

        // 2. Let items be ToObject(arrayLike).
        var items = Object(arrayLike);

        // 3. ReturnIfAbrupt(items).
        if (arrayLike == null) {
          throw new TypeError("Array.from requires an array-like object - not null or undefined");
        }

        // 4. If mapfn is undefined, then let mapping be false.
        var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
        var T;
        if (typeof mapFn !== 'undefined') {
          // 5. else
          // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
          if (!isCallable(mapFn)) {
            throw new TypeError('Array.from: when provided, the second argument must be a function');
          }

          // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.
          if (arguments.length > 2) {
            T = arguments[2];
          }
        }

        // 10. Let lenValue be Get(items, "length").
        // 11. Let len be ToLength(lenValue).
        var len = toLength(items.length);

        // 13. If IsConstructor(C) is true, then
        // 13. a. Let A be the result of calling the [[Construct]] internal method of C with an argument list containing the single item len.
        // 14. a. Else, Let A be ArrayCreate(len).
        var A = isCallable(C) ? Object(new C(len)) : new Array(len);

        // 16. Let k be 0.
        var k = 0;
        // 17. Repeat, while k < len… (also steps a - h)
        var kValue;
        while (k < len) {
          kValue = items[k];
          if (mapFn) {
            A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);
          } else {
            A[k] = kValue;
          }
          k += 1;
        }
        // 18. Let putStatus be Put(A, "length", len, true).
        A.length = len;
        // 20. Return A.
        return A;
      };
    }());
  }
  // https://tc39.github.io/ecma262/#sec-array.prototype.find
  if (!Array.prototype.find) {
    Object.defineProperty(Array.prototype, 'find', {
      value: function(predicate) {
       // 1. Let O be ? ToObject(this value).
        if (this == null) {
          throw new TypeError('"this" is null or not defined');
        }

        var o = Object(this);

        // 2. Let len be ? ToLength(? Get(O, "length")).
        var len = o.length >>> 0;

        // 3. If IsCallable(predicate) is false, throw a TypeError exception.
        if (typeof predicate !== 'function') {
          throw new TypeError('predicate must be a function');
        }

        // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
        var thisArg = arguments[1];

        // 5. Let k be 0.
        var k = 0;

        // 6. Repeat, while k < len
        while (k < len) {
          // a. Let Pk be ! ToString(k).
          // b. Let kValue be ? Get(O, Pk).
          // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
          // d. If testResult is true, return kValue.
          var kValue = o[k];
          if (predicate.call(thisArg, kValue, k, o)) {
            return kValue;
          }
          // e. Increase k by 1.
          k++;
        }

        // 7. Return undefined.
        return undefined;
      }
    });
  }
  checkNode = function(Mutato) {
    // non-jQuery method that uses the above Polyfills.
    // var popUp = Array.from(Mutato.removedNodes).find(function(e) {
    //
    var popUp = jQuery.makeArray(Mutato.removedNodes).find(function(e) {
      if ( e.innerHTML == "" ) {
        $("a.ActionLink").each(function() {
          if ( $(this).text() == "Refresh" ) {
            setTimeout(function() {
              window.location = window.location;
            }, 200);
          }
        });
      }
    });
  };
  var targetNode = document.getElementById('pageBody');
  var config = { attributes: true,
                  childList: true,
              characterData: true
  };
  var callback = function(mutationsList) {
    for ( var i = 0; i < mutationsList.length; i++ ) {
      var mutation = mutationsList[i];
      if ( mutation.type === 'childList' ) {
        checkNode(mutation);
      }
    }
  };
  var observer = new MutationObserver(callback);
  observer.observe(targetNode, config);
});

 

Statistics
0 Favorited
1 Views
0 Files
0 Shares
0 Downloads

Tags and Keywords

Related Entries and Links

No Related Resource entered.