Add editable watchlist to portal tickets

Chuck S2
Giga Contributor

I would like to make the watch list on the tickets on the service portal editable (after submission). I reviewed a thread that was started 4 years ago and tried to follow that thread and populate the various Client and Server script fields accordingly, but nothing is showing on the portal. I am pretty much a newbie at service portal. Any help would be appreciated. Thanks! 

1 ACCEPTED SOLUTION

Hi Chuck, 

The following are the widget modifications that we made, you can place this into the relevant fields on the widget form. 

Body HTML Termplate: 

<div class="panel panel-primary" ng-if="data.canRead">
  <div class="panel-heading">
    <h4 class="panel-title pull-left">
      ${Watch list}
    </h4>
    <div class="clearfix"></div>
  </div>
  <div class="panel-body">
    <form ng-submit="save()">
      <div class="text-center text-italic text-muted">
        <div>
          <sn-record-picker field="watch_list" sn-disabled="!data.canWrite" table="'sys_user'" display-field="'email'" display-fields="'name'" search-fields="'email'" value-field="'sys_id'" default-query="'active=true^web_service_access_only=false^user_nameISNOTEMPTY^emailISNOTEMPTY'" page-size="10" multiple="true"></sn-record-picker>   </div>
        <div style="margin-top:15px; float: right;">
          <button type="submit" class="btn btn-primary post-btn ng-scope">Save</button>
        </div>
      </div>
    </form>
  </div>
</div>

Server Script: 

(function() {
	var gr;
	if(input){
		gr = new GlideRecord(input.table);
		if(gr.get(input.sys_id)){
			if(gr.watch_list.canWrite()){
				gr.watch_list = input.watchList;
				gr.update();
				gs.addInfoMessage('Updated');
			}
			else{
				gs.addErrorMessage("Update failed, you don't have the required access");
			}
		}
	}
	else{
		var sys_id = (input && input.sys_id) || options.sys_id || $sp.getParameter("sys_id");
		var table = (input && input.table) || options.table || $sp.getParameter("table");
		gr = new GlideRecord(table);
		if(gr.get(sys_id)){
			data.table = table;
			data.sys_id = sys_id;
			data.canRead = gr.watch_list.canRead();
			data.canWrite = gr.watch_list.canWrite();
			if(data.canRead){
				var dV = gr.getDisplayValue('watch_list');
				var sV = gr.getValue('watch_list');
				data.displayValue = dV == '' ? [] : dV;
				data.value = sV == null ? [] : sV;
				data.displayValue = dV;
				data.value = sV;
			}
		}
	}
})();

Client Controller: 

function($scope, spUtil, $http) {   
	var c = this;

	$scope.watch_list = {
		displayValue: c.data.displayValue,
		value: c.data.value,
		name: 'watch_list'
	};
	$scope.save = function(){
		c.data.watchList = $scope.watch_list.value;
		c.server.update().then(function() {

			spUtil.recordWatch($scope, c.data.table, "sys_id=" + c.data.sys_id, function(name, data) {
				if(name.name == 'record.updated' && data.operation == 'update'){
					$scope.watch_list.value = data.record.watch_list.value;
					$scope.watch_list.displayValue = data.record.watch_list.display_value;
					$scope.$apply();
				}
			});
		});
	};
	$scope.$on("field.change", function(evt, parms) {
		if (parms.field.name == 'watch_list') {}

	});
};  

 

 

 

This result in a widget that has only valid users in there. If you wish to change which users are filtered, check out the default-query in the HTML Body

default-query="'active=true^web_service_access_only=false^user_nameISNOTEMPTY^emailISNOTEMPTY'"

 

This if done correctly, you'll get a widget like the following: 

find_real_file.pngfind_real_file.png

find_real_file.png

 

 

Hopefully the above is helpful!

Thanks,

Mike

View solution in original post

12 REPLIES 12

User667175
Giga Expert

Hi Chuck, 

 

We added the following widget to our instance and it works great. There will be a bit of configuration that might take a bit to understand. e.g. adding the widget to the form, but the widget works great 

 

https://developer.servicenow.com/connect.do#!/share/contents/3082544_serviceportal_watchlist?t=PRODUCT_DETAILS

 

Thanks,

Mike

Thanks Mike,

I downloaded the update set and see it, but now how do I add it to my ticket widget?

 

Thanks!

Hi Chuck, 

I would suggest watching a few ServiceNow portal configuration videos I think TechNow hosted by Chuck Tomasi has a few on the Basic ServicePortal config. 

 

Find the page that you wish to add the widget to in the page designer. In the below example I've used "Ticket" however use any page that you have cloned. 

From there, you can search Widgets on the left hand side.Find the watch list widget, and you should be able to drag and drop where you want on the form. 

And configure as you wish. 

find_real_file.png

 

Thanks,

Mike

Hi Mike,

 

I added it to the ticket where I wanted it using Designer and it seems to work great but now need to remove the original watchlist (see attached) because when I update the new watchlist it doesn't reflect in the circled watchlist, so could become confusing. Is there an easy way to do this? I don't see it defined in the ticket widget.find_real_file.png