Limit short description to max 40 characters for Projects and Demands

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-09-2024 08:17 AM
Hi Community,
I have been asked to configure the fields that represent project and demand names so users would be restricted to setup names longer than 40 characters.
The field is short_description and it's a shared field from the extended tables (task for demand and planned_task for project) which means I cannot update the dictionary record.
I have created a Client Script and a Business Rule to try and drive the behaviour, however I am struggling to enforce it when I create the project from a template (link: To create project from a template click here.)
The Client Script (onChange) is as following (it's similar for Demand and for Project)
function onChange(control, oldValue, newValue, isLoading, isTemplate) {
if (isLoading || newValue === '') {
return;
}
if (newValue.length > 40) {
alert(getMessage('Project name must be 40 characters or less.'));
// Reset the field value to the previous value
g_form.setValue('short_description', oldValue);
}
}
The Business Rule (before insert) is as following (only for Project)
(function executeRule(current, previous /*null when async*/) {
// check if Project name exceeds 40 characters
if (current.short_description.length > 40) {
current.setAbortAction (true);
gs.addErrorMessage('Project name must be 40 characters or less');
}
})(current, previous);
What am I missing and what do I need to do to make this work?
Thank you.
Paula
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-09-2024 08:53 AM - edited 01-09-2024 08:55 AM
Have you added any logs to see if the business rule executes ?
Can I see a screenshot of the business rule, conditions and when to run
Run this BR and see if you see anything in the logs
(function executeRule(current, previous /*null when async*/) {
gs.log('(current.short_description.length=> ' + (current.short_description.length );
// check if Project name exceeds 40 characters
if (current.short_description.length > 40) {
current.setAbortAction (true);
gs.addErrorMessage('Project name must be 40 characters or less');
}
})(current, previous);

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-09-2024 08:56 AM
No, I haven't added logs (not too sure how I would do that). I'm more of a beginner with dev side of things, especially if it involves scripting.
Happy to take on any guidance
Here you are:

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-10-2024 03:47 AM
thanks Anurag, however nothing was picked up in the system logs.
May I check if the script line is correct, as I had an error?
Should it be:
gs.log('current.short_description.length=> ' + current.short_description.length);
or
gs.log('current.short_description.length=> ' + (current.short_description.length));
I've tried various versions but with no success

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-09-2024 09:00 AM - edited 01-09-2024 09:00 AM
I also came across 2 OOTB UI Macros - not sure if maybe these could be configured to incorporate the character limit restriction (or if it's advisable at all)..
I've had a go using Bard and Chatgpt, but with no success 😞
This is the OOTB version
<?xml version="1.0" encoding="utf-8"?>
<j:jelly xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null" trim="false">
<table width="350px">
<j:if test="${sysparm_template_action != 'apply_template'}">
<tr id="project_name">
<td nowrap="true" data-type="label" class="label label_spacing">
<label><span class="mandatory_populated label_description">*</span>${gs.getMessage('Project name')} </label>
</td>
<td nowrap="true" class="input_controls">
<input name="project_name" placeholder="${gs.getMessage('Project name')}" autocomplete="off"/>
</td>
</tr>
</j:if>
<j:if test="${sysparm_has_children != 'true'}">
<tr id="start_date">
<td nowrap="true" data-type="label" class="label label_spacing">
<label><span class="mandatory_populated label_description">*</span>${gs.getMessage('Start Date')} </label>
</td>
<td nowrap="true" class="input_controls test">
<g:ui_date_time name="project_start_date" value="${jvar_start_date}"/>
</td>
</tr>
</j:if>
<tr id="project_template">
<td nowrap="true" data-type="label" class="label label_spacing">
<label><span class="mandatory_populated label_description">*</span>${gs.getMessage('Project template')} </label>
</td>
<td nowrap="true" class="input_controls">
<g:ui_reference name="template_id" table="${sysparm_template_table}" value="${sysparm_template_id}" query="active=true^table=${sysparm_table_name}" displayvalue="${sysparm_template_name}" />
</td>
</tr>
<tr id="dialog_buttons">
<td align="right" colspan="2">
<g:dialog_buttons_ok_cancel ok="return actionOK()" ok_id="ok_button" cancel_type="button"/>
</td>
</tr>
<tr><td colspan="2"><br/></td></tr>
</table>
</j:jelly>