Watch List items menu in header

Moedeb
Tera Guru

I would like to add a menu item into the header for our employee center - very much in the same way the open tickets menu works.

This is so anyone that is on a watch list for an open incident or request item can easily find the tickets and can view them if wanted.

I have copied the 'Tickets' menu item with the following Server Script:

// maximum number of entries in this Menu
var max = 30;

var t = data;  // shortcut
t.items = [];

var u = gs.getUser().getID();

// use record watchers to tell header when to update dropdown counts
t.record_watchers = [];
t.record_watchers.push({'table':'incident','filter':'active=true^caller_id=' + u});
t.record_watchers.push({'table':'sc_request','filter':'active=true^requested_for=' + u});

var st = new GlideRecord('service_task');
if (st.isValid()) {
  t.record_watchers.push({'table':'service_task','filter':'active=true^opened_by=' + u});
  st.addActiveQuery();
  st.addQuery('opened_by', gs.getUserID());
  st.orderByDesc('sys_updated_on');
  st.setLimit(max);
  st.query();
  while (st.next()) {
    if (!st.canRead())
      continue;
    
    var a = {};
    $sp.getRecordValues(a, st, 'short_description,sys_id,number,sys_updated_on');
    if (st.short_description.nil())
      a.short_description = "(No description)";
    a.__table = st.getTableName();
    a.type = 'record';
    a.sortOrder = st.sys_updated_on.getGlideObject().getNumericValue();
    t.items.push(a);
  }
}

var z = new GlideRecord('incident');
z.addActiveQuery();
z.addQuery('caller_id', gs.getUserID());
z.orderByDesc('sys_updated_on');
z.setLimit(max);
z.query();
while (z.next()) {
  if (!z.canRead())
    continue;
  
  var a = {};
  $sp.getRecordValues(a, z, 'short_description,sys_id,number,sys_updated_on');
  if (z.short_description.nil())
    a.short_description = "(No description)";
  a.__table = z.getTableName();
  a.type = 'record';
  a.sortOrder = z.sys_updated_on.getGlideObject().getNumericValue();
  t.items.push(a);
}

var z = new GlideRecord('sc_request');
z.addActiveQuery();
z.addQuery('requested_for', gs.getUserID());
z.orderByDesc('sys_updated_on');
z.setLimit(max);
z.query();
while (z.next()) {
  if (!z.canRead())
    continue;
  
  var ritm = new GlideRecord('sc_req_item');
  ritm.addQuery('request', z.getUniqueValue());
  ritm.query();
  if (!ritm.next())
    continue;

  var a = {};
  $sp.getRecordValues(a, z, 'sys_id,number,sys_updated_on');
  if (ritm.hasNext()) // there are multiple items for this request
    a.short_description = ritm.getRowCount() + ' requested items';
  else if (!ritm.canRead()) // only one item, but user cannot see it
  	continue;
  else // one item, and user can see it
    a.short_description = ritm.cat_item.getDisplayValue() || ritm.getDisplayValue("short_description");
  a.__table = z.getTableName();
  a.type = 'request';
  a.sortOrder = z.sys_updated_on.getGlideObject().getNumericValue();
  t.items.push(a);
}

t.items.sort(function(a, b) {
  return b.sortOrder - a.sortOrder;
});
t.items = t.items.slice(0, max); // only want first 30
t.count = t.items.length;

var link = {title: gs.getMessage('View all requests'), type: 'link', href: '?id=requests', items: []};
t.items.unshift(link); // put 'View all requests' first

 

I have then simply made a copy of the Tickets menu item, renamed it to Watch List Tickets and updated the Server Script to:

// maximum number of entries in this Menu
var max = 30;

var t = data;  // shortcut
t.items = [];

var u = gs.getUser().getID();

// use record watchers to tell header when to update dropdown counts
t.record_watchers = [];
t.record_watchers.push({'table':'incident','filter':'active=true^watch_list=' + u});
t.record_watchers.push({'table':'sc_request','filter':'active=true^watch_list=' + u});

var st = new GlideRecord('service_task');
if (st.isValid()) {
  t.record_watchers.push({'table':'service_task','filter':'active=true^watch_list=' + u});
  st.addActiveQuery();
  st.addQuery('watch_list', gs.getUserID());
  st.orderByDesc('sys_updated_on');
  st.setLimit(max);
  st.query();
  while (st.next()) {
    if (!st.canRead())
      continue;
    
    var a = {};
    $sp.getRecordValues(a, st, 'short_description,sys_id,number,sys_updated_on');
    if (st.short_description.nil())
      a.short_description = "(No description)";
    a.__table = st.getTableName();
    a.type = 'record';
    a.sortOrder = st.sys_updated_on.getGlideObject().getNumericValue();
    t.items.push(a);
  }
}

var z = new GlideRecord('incident');
z.addActiveQuery();
z.addQuery('watch_list', gs.getUserID());
z.orderByDesc('sys_updated_on');
z.setLimit(max);
z.query();
while (z.next()) {
  if (!z.canRead())
    continue;
  
  var a = {};
  $sp.getRecordValues(a, z, 'short_description,sys_id,number,sys_updated_on');
  if (z.short_description.nil())
    a.short_description = "(No description)";
  a.__table = z.getTableName();
  a.type = 'record';
  a.sortOrder = z.sys_updated_on.getGlideObject().getNumericValue();
  t.items.push(a);
}

var z = new GlideRecord('sc_request');
z.addActiveQuery();
z.addQuery('watch_list', gs.getUserID());
z.orderByDesc('sys_updated_on');
z.setLimit(max);
z.query();
while (z.next()) {
  if (!z.canRead())
    continue;
  
  var ritm = new GlideRecord('sc_request');
  ritm.addQuery('request', z.getUniqueValue());
  ritm.query();
  if (!ritm.next())
    continue;

  var a = {};
  $sp.getRecordValues(a, z, 'sys_id,number,sys_updated_on');
  if (ritm.hasNext()) // there are multiple items for this request
    a.short_description = ritm.getRowCount() + ' requested items';
  else if (!ritm.canRead()) // only one item, but user cannot see it
  	continue;
  else // one item, and user can see it
    a.short_description = ritm.cat_item.getDisplayValue() || ritm.getDisplayValue("short_description");
  a.__table = z.getTableName();
  a.type = 'request';
  a.sortOrder = z.sys_updated_on.getGlideObject().getNumericValue();
  t.items.push(a);
}

t.items.sort(function(a, b) {
  return b.sortOrder - a.sortOrder;
});
t.items = t.items.slice(0, max); // only want first 30
t.count = t.items.length;

var link = {title: gs.getMessage('View all tickets'), type: 'link', href: '?id=requests', items: []};
t.items.unshift(link); // put 'View all tickets' first

 

This sort of works, but it's not quite there - it only shows incidents, no requests/request items and if I select "View all Tickets" it takes me to the open tickets list, not the watch list list.

Moedeb_0-1693537814702.png

Would really appreciate some help to make it work please?

0 REPLIES 0