Comment
bencollyer
Tera Contributor

@LukeV7571479230 - Your original post was awesome and we have made use of it extensively.  

 

One change I would recommend to anyone using this is to build a generic AJAX script include to handle the execution of your server side script.  This can then be used to call ANY server side function via this methodology.  Our standard implementation:  

var dowProgressWorkerAJAX = Class.create();
dowProgressWorkerAJAX.prototype = Object.extendsObject(AbstractAjaxProcessor, {
	start: function () {
		var workerName = this.getParameter('sysparm_progressWorkerName');

		if (global.JSUtil.nil(workerName)) {
			return false;
		}

		var worker = new GlideScriptedHierarchicalWorker();
		worker.setProgressName(workerName);
		worker.setScriptIncludeName(this.getParameter('sysparm_scriptIncludeName'));
		worker.setScriptIncludeMethod(this.getParameter('sysparm_scriptIncludeMethod'));
		if (global.JSUtil.notNil(this.getParameter('sysparm_scriptIncludeMethodArg1Name'))) {
			worker.putMethodArg(this.getParameter('sysparm_scriptIncludeMethodArg1Name'), this.getParameter('sysparm_scriptIncludeMethodArg1'));
		}
		if (global.JSUtil.notNil(this.getParameter('sysparm_scriptIncludeMethodArg2Name'))) {
			worker.putMethodArg(this.getParameter('sysparm_scriptIncludeMethodArg2Name'), this.getParameter('sysparm_scriptIncludeMethodArg2'));
		}
		if (global.JSUtil.notNil(this.getParameter('sysparm_scriptIncludeMethodArg3Name'))) {
			worker.putMethodArg(this.getParameter('sysparm_scriptIncludeMethodArg3Name'), this.getParameter('sysparm_scriptIncludeMethodArg3'));
		}
		if (global.JSUtil.notNil(this.getParameter('sysparm_scriptIncludeMethodArg4Name'))) {
			worker.putMethodArg(this.getParameter('sysparm_scriptIncludeMethodArg4Name'), this.getParameter('sysparm_scriptIncludeMethodArg4'));
		}
		worker.setBackground(true);
		worker.start();

		return worker.getProgressID();
	},

	cancel: function () {
		var trackerId = this.getParameter("sysparm_tracker_id");
		if (!trackerId)
			return false;

		var execTracker = new SNC.GlideExecutionTracker(trackerId);
		execTracker.cancel(gs.getMessage("Cancelled"));
	},

	type: 'dowProgressWorkerAJAX'
});

 

You can call any script include with up to 4 method arguments passed in like:

var dd = new GlideDialogWindow("hierarchical_progress_viewer", false, "40em", "10.5em");
dd.setTitle("Re-opening Work Order Tasks");
dd.setPreference('sysparm_ajax_processor', 'dowProgressWorkerAJAX');
dd.setPreference('sysparm_progressWorkerName', 'ReopenWorkOrderTasks');
dd.setPreference('sysparm_scriptIncludeName', 'dowWorkOrderTaskUtils');
dd.setPreference('sysparm_scriptIncludeMethod', 'cloneWorkOrderTasks');
dd.setPreference('sysparm_scriptIncludeMethodArg1Name', '_wotEncodedQuery');
dd.setPreference('sysparm_scriptIncludeMethodArg1', wotQuery);
dd.setPreference('sysparm_scriptIncludeMethodArg2Name', '_workNote');
dd.setPreference('sysparm_scriptIncludeMethodArg2', workNote);

// etc, etc for args 3 and 4 if needed.

 

The script include still needs the tracker updates code from Luke's "Processor Script Includes" section, especially the percent complete calculations, but otherwise can be any script include function.

 

Thanks again Luke.