Skip to main content

widget: prod changes


 
HTML
___________________________


<!--span option:-->

<h1>ServiceNow Production Changes</h1>
<h2>Listed in order of most recent</h2>
<h3>{{c.numberOfTickets}} change requests</h3>
<div style="border: 2px solid black">
 

<div ng-repeat="item in c.chgsList" ng-class="'color' + ($index % 2)">
  <span><b><a href="change_request.do?sysparm_query=number={{item.number}}">{{item.number}}</a></b></span><span>{{item.short_description}}</span><span> (deployed on: {{item.start_date}})</span>
   <span class="formattxt">{{item.description}}</span>
  <br/><br/>
</div>

</div>
 
  <!--table option:--><!--
<div class="chgwrap" >

  <h1>ServiceNow Production Changes</h1>
  <h2>Listed in order of most recent</h2>
 
  <table class='chg'>
 
     
  <tr ng-repeat="item in c.chgsList" ng-class="'color' + ($index % 2)">
    <td class='chg'>
     <a href="change_request.do?sysparm_query=number={{item.number}}">{{item.number}}</a>{{item.short_description}}</b>
     </td>
       <td class='chg2'><div style="width: 800px">
      {{item.description}}</div>
     </td>
  </tr>
 
  </table>
 </div> -->

___________________________
CSS
___________________________


//**SPAN OPTION CSS**
div.color0 {
 background-color: #cfe0e8;
 border: solid thin;
}
div.color1 {
 background-color: #daebe8;
 border: solid thin;
}
span.formattxt{
  white-space: pre; /* whitespace style deals with \n and converts to <br>*/
  white-space:pre-wrap;
  white-space:-moz-pre-wrap;
  white-space:-pre-wrap;
  white-space:-o-pre-wrap;
  word-wrap:break-word
}

//**TABLE OPTION CSS**
/*tr.color0 {
 background-color: #cfe0e8;
 border: solid thin;
}
tr.color1 {

 background-color: #daebe8;
 border: solid thin;
}
div.chgwrap {
  width: 80%;
}
table.chg{
 width: 80%;
 border: 2px solid black;
}
td.chg {
 vertical-align:top;
  padding-top: 20px;
 border: solid thin;

}
td.chg2 {
vertical-align:top
border: solid thin;
white-space: pre; // whitespace style deals with \n and converts to <br>
white-space:pre-wrap;
white-space:-moz-pre-wrap;
white-space:-pre-wrap;
white-space:-o-pre-wrap;
word-wrap:break-word
}*/



___________________________
client script
___________________________


function($scope) {
  /* widget controller */
  var c = this;
populateSNChgList(c);
//--credits:
//https://docs.servicenow.com/bundle/london-servicenow-platform/page/build/service-portal/concept/adv-widget-tutorial.html
  //https://stackoverflow.com/questions/12179455/how-to-assign-alternate-class-to-rows-in-angular-js
//https://stackoverflow.com/questions/13964735/angularjs-newline-filter-with-no-other-html
}

populateSNChgList = function(c) {
        //console.log("message", 'run the op');

          c.server.get({
            action: "get_chgs",
            msg : "Checking for ServiceNow changes..."
           
          }).then(function(r){
            c.chgsList=r.data.chgsList;
          });
}

___________________________
server script
___________________________

(function() {
  /* populate the 'data' object */
  /* e.g., data.table = $sp.getValue('table'); */
    data.chgsList=[];
  data.chgsListCount=0;
  //data.chgsList='';
    if (input && input.action === "get_chgs"){
  data.chgsList=getSNChgs();
  data.chgsListCount=data.chgsList.length;
}


function getSNChgs(){
  var lnBrk='\n';
  var results=[];
    var gr= new GlideRecord('change_request');
    gr.addQuery('cmdb_ci=57c1157f4f02d200b98034828110c70d^ORshort_descriptionLIKEServiceNow');//--ServiceNow
gr.addQuery('state','3');
gr.orderByDesc('number');
    gr.query();

    while(gr.next()){
var chgTicket={};
  var stDate=gr.start_date.split(' ');
//chgTicket.title=gr.number + ' - Change Title: ' + gr.short_description + '; deployment date: ' + stDate[0];
  $sp.getRecordDisplayValues(chgTicket, gr, 'number,short_description,sys_id,start_date');
var sDesc=lnBrk+'Change description: ' + lnBrk + gr.description;
chgTicket.description= sDesc;
  results.push(chgTicket);
     }
   return results;
}

})();

Comments

Popular posts from this blog

ServiceNow check for null or nil or empty (or not)

Haven't tested these all recently within global/local scopes, so feel free to have a play! option 1 use an encoded query embedded in the GlideRecord , e.g.  var grProf = new GlideRecord ( 'x_cls_clear_skye_i_profile' ); grProf . addQuery ( 'status=1^ owner=NULL ' ); grProf . query (); even better use the glideRecord  addNotNullQuery or addNullQuery option 2 JSUtil.nil / notNil (this might be the most powerful. See this link ) example: if ( current . operation () == 'insert' && JSUtil . notNil ( current . parent ) && ! current . work_effort . nil ())  option 3 there might be times when you need to get inside the GlideRecord and perform the check there, for example if the code goes down 2 optional routes depending on null / not null can use gs.nil : var grAppr = new GlideRecord ( 'sysapproval_approver' ); var grUser = new GlideRecord ( 'sys_user' ); if ( grUser . get ( 'sys_id' , current . approver )){...

Code a pause/wait - gs.sleep or gs.wait alternative, pause script for specified seconds (timer)

Code a pause/wait - gs.sleep / gs.wait alternative, pause script for specified seconds (timer)  e.g. 10 seconds: do_sleep ( 10000 ); function do_sleep ( milliseconds ) { var start = new Date (). getTime (); for ( var i = 0 ; i < 1e7 ; i ++) { if (( new Date (). getTime () - start ) > milliseconds ){ gs . print ( 'waking up!' ); break ; } } }