GlideAjax Utility with Multiple Functions
A comprehensive Script Include demonstrating multiple client-callable functions in a single utility class.
#glideajax #ajax #client-callable #utilities #validation #search #multi-function
Script Code
JavaScript
1var AjaxUtils = Class.create();
2AjaxUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {
3
4 /**
5 * Validate if a value exists in a table field
6 * Useful for duplicate checking before submission
7 */
8 checkDuplicate: function() {
9 var table = this.getParameter('sysparm_table');
10 var field = this.getParameter('sysparm_field');
11 var value = this.getParameter('sysparm_value');
12 var excludeId = this.getParameter('sysparm_exclude_id'); // For updates
13
14 if (!table || !field || !value) {
15 return JSON.stringify({error: 'Missing required parameters'});
16 }
17
18 var gr = new GlideRecord(table);
19 gr.addQuery(field, value);
20
21 // Exclude current record when checking for update
22 if (excludeId) {
23 gr.addQuery('sys_id', '!=', excludeId);
24 }
25
26 gr.query();
27
28 var result = {
29 isDuplicate: gr.hasNext(),
30 count: gr.getRowCount()
31 };
32
33 return JSON.stringify(result);
34 },
35
36 /**
37 * Get formatted user information
38 */
39 getUserInfo: function() {
40 var userId = this.getParameter('sysparm_user_id') || gs.getUserID();
41
42 var grUser = new GlideRecord('sys_user');
43 if (!grUser.get(userId)) {
44 return JSON.stringify({error: 'User not found'});
45 }
46
47 var userInfo = {
48 sys_id: grUser.sys_id.toString(),
49 name: grUser.name.toString(),
50 email: grUser.email.toString(),
51 phone: grUser.phone.toString(),
52 title: grUser.title.toString(),
53 department: grUser.department.getDisplayValue(),
54 location: grUser.location.getDisplayValue(),
55 manager: grUser.manager.getDisplayValue(),
56 manager_email: grUser.manager.email.toString(),
57 vip: grUser.vip.toString() === 'true',
58 active: grUser.active.toString() === 'true'
59 };
60
61 return JSON.stringify(userInfo);
62 },
63
64 /**
65 * Get available assignment groups for a category
66 */
67 getAssignmentGroups: function() {
68 var category = this.getParameter('sysparm_category');
69 var activeOnly = this.getParameter('sysparm_active_only') === 'true';
70
71 var groups = [];
72 var grGroup = new GlideRecord('sys_user_group');
73
74 if (category) {
75 grGroup.addQuery('u_category', category);
76 }
77
78 if (activeOnly) {
79 grGroup.addQuery('active', 'true');
80 }
81
82 grGroup.orderBy('name');
83 grGroup.query();
84
85 while (grGroup.next()) {
86 groups.push({
87 sys_id: grGroup.sys_id.toString(),
88 name: grGroup.name.toString(),
89 description: grGroup.description.toString(),
90 manager: grGroup.manager.getDisplayValue(),
91 email: grGroup.email.toString()
92 });
93 }
94
95 return JSON.stringify({groups: groups, count: groups.length});
96 },
97
98 /**
99 * Calculate business days between two dates
100 */
101 calculateBusinessDays: function() {
102 var startDate = this.getParameter('sysparm_start_date');
103 var endDate = this.getParameter('sysparm_end_date');
104 var scheduleId = this.getParameter('sysparm_schedule') || '8-5 weekdays excluding holidays';
105
106 if (!startDate || !endDate) {
107 return JSON.stringify({error: 'Start and end dates required'});
108 }
109
110 var schedule = new GlideSchedule(scheduleId);
111 var start = new GlideDateTime(startDate);
112 var end = new GlideDateTime(endDate);
113
114 var duration = schedule.duration(start, end);
115 var businessDays = duration.getByFormat('dd');
116 var businessHours = duration.getByFormat('HH');
117
118 return JSON.stringify({
119 businessDays: businessDays,
120 businessHours: businessHours,
121 totalSeconds: duration.getNumericValue()
122 });
123 },
124
125 /**
126 * Validate field value against business rules
127 */
128 validateField: function() {
129 var table = this.getParameter('sysparm_table');
130 var field = this.getParameter('sysparm_field');
131 var value = this.getParameter('sysparm_value');
132
133 var result = {
134 valid: true,
135 message: '',
136 suggestions: []
137 };
138
139 // Example validations
140 if (field === 'email') {
141 var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
142 if (!emailRegex.test(value)) {
143 result.valid = false;
144 result.message = 'Invalid email format';
145 }
146 }
147
148 if (field === 'phone') {
149 // Remove non-numeric characters
150 var digitsOnly = value.replace(/\D/g, '');
151 if (digitsOnly.length < 10) {
152 result.valid = false;
153 result.message = 'Phone number must have at least 10 digits';
154 }
155 }
156
157 if (field === 'short_description') {
158 if (value.length < 10) {
159 result.valid = false;
160 result.message = 'Description too short (minimum 10 characters)';
161 }
162
163 // Check for common words to suggest better descriptions
164 var vagueWords = ['issue', 'problem', 'error', 'help'];
165 var hasVagueWords = vagueWords.some(function(word) {
166 return value.toLowerCase().indexOf(word) !== -1;
167 });
168
169 if (hasVagueWords) {
170 result.suggestions.push('Be more specific about the issue');
171 }
172 }
173
174 return JSON.stringify(result);
175 },
176
177 /**
178 * Search records with fuzzy matching
179 */
180 searchRecords: function() {
181 var table = this.getParameter('sysparm_table');
182 var searchTerm = this.getParameter('sysparm_search_term');
183 var searchFields = this.getParameter('sysparm_fields'); // Comma-separated
184 var maxResults = parseInt(this.getParameter('sysparm_max_results') || '10');
185
186 if (!table || !searchTerm) {
187 return JSON.stringify({error: 'Table and search term required'});
188 }
189
190 var fields = searchFields ? searchFields.split(',') : ['name', 'number'];
191 var results = [];
192
193 var gr = new GlideRecord(table);
194
195 // Build OR query for multiple fields
196 var qc = gr.addQuery(fields[0], 'CONTAINS', searchTerm);
197 for (var i = 1; i < fields.length; i++) {
198 qc.addOrCondition(fields[i], 'CONTAINS', searchTerm);
199 }
200
201 gr.setLimit(maxResults);
202 gr.query();
203
204 while (gr.next()) {
205 var record = {
206 sys_id: gr.sys_id.toString(),
207 display_value: gr.getDisplayValue()
208 };
209
210 // Add requested fields
211 fields.forEach(function(field) {
212 if (gr.isValidField(field)) {
213 record[field] = gr.getValue(field);
214 }
215 });
216
217 results.push(record);
218 }
219
220 return JSON.stringify({
221 results: results,
222 count: results.length,
223 searchTerm: searchTerm
224 });
225 },
226
227 type: 'AjaxUtils'
228});
How to Use
1. Create a new Script Include named 'AjaxUtils'
2. Check 'Client callable' checkbox
3. Set 'Extends' to 'AbstractAjaxProcessor'
4. Copy the code above
5. Call from Client Scripts using GlideAjax:
var ga = new GlideAjax('AjaxUtils');
ga.addParam('sysparm_name', 'checkDuplicate');
ga.addParam('sysparm_table', 'incident');
ga.addParam('sysparm_field', 'number');
ga.addParam('sysparm_value', 'INC0001');
ga.getXMLAnswer(callback);