Skip to main content

widget with table summary (count)

looks like this



HTML

<form>

  <!-- Step 2. Display initial data from the server -->

  <div class="panel panel-default">
    <!-- Default panel contents -->
    <div class="panel-heading">Table Summary: Registrations</div>


    <!-- List group -->
    <ul class="list-group">
      <li class="list-group-item"
          ng-repeat="s in c.data.summary"
          ng-click="c.selectAg(s)">{{ s.agName }}
        <span class="badge">{{ s.agCount }}</span>
      </li>
    </ul>
  </div>

  <!-- Step 5. Display customized content based on user input -->

 <pre>{{c.data.records | json}}</pre>

</form>


<!-- copied from: https://getbootstrap.com/docs/3.3/components/#panels-list-group -->

CSS

.badge{background:red;}

CLIENT


  function() { /* widget controller */ var c = this; /* Step 3. Accept user input */ c.selectAg = function(record) { //Set a property on the data object to identify the selected object c.data.selectedAg = record.agValue; //Send the data object to the server script c.server.update(); } }


SERVER


  /* populate the 'data' object */
  /* e.g., data.table = $sp.getValue('table'); */
(function() {

/* Step 1. Load initial data from the server */
/* populate the 'data' object */
/* e.g., data.table = $sp.getValue('table'); */

if(!input) {
data.summary = [];
data.table = 'x_snc_cloudevents_registrations';
data.groupBy = 'event';
  data.fields = 'last_name,first_name,company,email,event,start_date,state';


var ga = new GlideAggregate(data.table);
ga.setGroup(true);
ga.groupBy(data.groupBy);
ga.addAggregate('COUNT');
ga.query();

while(ga.next()) {
data.summary.push({
agName:ga[data.groupBy].getDisplayValue() || 'None',
agValue:ga[data.groupBy].toString(),
agCount:ga.getAggregate('COUNT')
});
}
}



/* Step 4. Process user input */

if(input) {
//console.log("Selected ag (from server): " + input.selectedAg); data.records=[]; var gr = new GlideRecord(input.table); gr.addQuery(input.groupBy, input.selectedAg); gr.query(); //use an array to order columns data.labels = []; var labels = $sp.getFieldsObject(gr, input.fields); for (var label in labels) { data.labels.push({"key":label, "type": labels[label].type, "value":labels[label].label}); } while(gr.next()){ var o = {}; //use $sp utility methods rather than manually creating record objects $sp.getRecordDisplayValues(o,gr,input.fields); $sp.getRecordValues(o,gr,'sys_id'); data.records.push(o); } }
}

})();

Comments

Popular posts from this blog

Get URL Parameter - server side script (portal or classic UI)

Classic UI : var sURL_editparam = gs . action . getGlideURI (). getMap (). get ( ' sysparm_aparameter ' ); if ( sURL_editparam == 'true' ) { gs . addInfoMessage ( 'parameter passed ); } Portal : var sURL_editparam = $sp . getParameter ( " sysparm_aparameter " ); if ( sURL_editparam == 'true' ) { gs . addInfoMessage ( 'parameter passed ); }

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 )){