Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Need to create new native record from widget HTML button

bishalsharm
ServiceNow Employee
ServiceNow Employee

Hi Team,

Here, I am sharing the widget code including HTML,Client and Server script.

I am not able to create a record in a scoped table, when click on submit button.
Please find below the widget configuration and its pictorial repressentation.

 

Body HTML Template:

<div>
    <div ng-if="c.submissionMessage" class="alert alert-info">
        {{c.submissionMessage}}
    </div>
    <br>
    <p>Is this request for you?</p>
    <select ng-model="c.formData.requestForSelf"
            ng-change="c.onRequestForSelfChange()"
            class="form-control"
            name="requestForSelf">
        <option value="None">-- None --</option>
        <option value="Yes">Yes</option>
        <option value="No">No</option>
    </select>
    <br><br>
    <div ng-show="c.formData.requestForSelf === 'No'">
        <p>Who is this request for?</p>
        <select ng-model="c.formData.selectedUser"
                ng-options="user.value as user.label for user in c.data.users"
                ng-change="c.onUserChange()"
                class="form-control"
                name="userSelect">
            <option value="">-- Select a User --</option>
        </select>
        <br><br>
    </div>
    <div>
        <p>Select the access bundles you want to request.</p>
        <widget id="access_bundle_widget"></widget>
        <br>
        <label for="justification">Justification</label>
        <textarea ng-model="c.formData.justification"
                  class="form-control"
                  name="justification"
                  rows="4"
                  placeholder="Enter additional comments"></textarea>
    </div>
    <br>
    <button ng-click="c.submitForm()" class="btn btn-primary">Submit</button>
</div>

 

Server Script: 

(function() {
    // Initialize data object
    data.users = [];
    data.loggedInUserId = gs.getUserID();
    data.submissionMessage = '';
    data.errorMessage = '';
    
    gs.info('Server script started. User ID: ' + data.loggedInUserId);
    
    // Query sys_user table for user dropdown
    var userGr = new GlideRecord('sys_user');
    userGr.addQuery('active', true);
    userGr.orderBy('name');
    userGr.query();
    while (userGr.next()) {
        var userName = userGr.getDisplayValue('name') || userGr.getValue('sys_id');
        if (userName) {
            data.users.push({
                value: userGr.getValue('sys_id'),
                label: userName
            });
        }
    }
    gs.info('Fetched ' + data.users.length + ' users: ' + JSON.stringify(data.users.slice(0, 5), null, 2));
    
    // Log raw input
    gs.info('Raw input: ' + (input ? JSON.stringify(input, null, 2) : 'null'));
    
    // Handle form submission
    if (input) {
        // Ensure action is set
        input.action = input.action || 'submit';
        gs.info('Action set to: ' + input.action);
        
        if (input.action === 'submit') {
            try {
                var requestGr = new GlideRecord('x_paler_acc_cat_ag_access_request');
                if (!requestGr.isValid()) {
                    data.errorMessage = 'Error: Table x_paler_acc_cat_ag_access_request does not exist or is inaccessible.';
                    gs.error('Table validation error: x_paler_acc_cat_ag_access_request');
                    return;
                }
                requestGr.initialize();
                
                // Map requested_for
                var requestedFor = input.requestForSelf === 'Yes' ? data.loggedInUserId : (input.requestForSelf === 'No' ? input.selectedUser : null);
                if (!requestedFor || requestedFor === '' || requestedFor === 'undefined') {
                    data.errorMessage = 'Error: No valid user selected. requestForSelf=' + input.requestForSelf + ', selectedUser=' + input.selectedUser;
                    gs.error(data.errorMessage);
                    return;
                }
                requestGr.setValue('requested_for', requestedFor);
                
                // Map selected checkboxes to opted_access_bundles
                if (input.selectedCheckboxes && input.selectedCheckboxes.length > 0) {
                    requestGr.setValue('opted_access_bundles', input.selectedCheckboxes.join(', '));
                    gs.info('Mapped checkboxes: ' + input.selectedCheckboxes.join(', '));
                } else {
                    requestGr.setValue('opted_access_bundles', '');
                    gs.info('No checkboxes selected');
                }
                
                // Map justification
                requestGr.setValue('justification', input.justification || '');
                
                // Insert record
                var recordId = requestGr.insert();
                if (recordId) {
                    data.submissionMessage = 'Request submitted successfully! ID: ' + recordId;
                    gs.info('Record inserted: ' + recordId);
                } else {
                    data.errorMessage = 'Error: Failed to insert record. Check permissions.';
                    gs.error('Failed to insert record');
                }
            } catch (e) {
                data.errorMessage = 'Error during submission: ' + e.toString();
                gs.error('Submission error: ' + e.toString());
            }
        } else {
            data.errorMessage = 'Error: Invalid action. Expected "submit", got ' + (input.action || 'undefined');
            gs.error('Invalid action: ' + (input.action || 'undefined'));
        }
    } else {
        data.errorMessage = 'Error: No input data received';
        gs.error('No input data received');
    }
    
    // Ensure response is returned
    return { data: data };
})();

 

Client Controller:

api.controller = function($scope, $timeout) {
    var c = this;
    
    // Initialize variables
    c.formData = {
        requestForSelf: 'None',
        selectedUser: '',
        justification: '',
        selectedCheckboxes: []
    };
    c.submissionMessage = '';
    
    console.log('Client script initialized at ' + new Date().toISOString());
    console.log('Users from server:', JSON.stringify(c.data.users || [], null, 2));
    
    // Reference embedded widget
    try {
        c.checkboxesWidget = $scope.getWidget('0be97d1d9338221076cd764efaba107a');
        console.log('Checkbox widget loaded:', !!c.checkboxesWidget);
    } catch (e) {
        console.error('Failed to load access_bundle_widget:', e.message);
    }
    
    // Watch selectedItems
    $scope.$watch('c.checkboxesWidget.selectedItems', function(newVal) {
        c.formData.selectedCheckboxes = newVal || [];
        console.log('Updated checkboxes:', c.formData.selectedCheckboxes);
    }, true);
    
    c.onRequestForSelfChange = function() {
        if (c.formData.requestForSelf !== 'No') {
            c.formData.selectedUser = '';
        }
        console.log('onRequestForSelfChange - requestForSelf:', c.formData.requestForSelf, 'selectedUser:', c.formData.selectedUser);
    };
    
    c.onUserChange = function() {
        console.log('onUserChange - selectedUser:', c.formData.selectedUser);
    };
    
    c.submitForm = function() {
        c.submissionMessage = '';
        var payload = {
            action: 'submit',
            requestForSelf: c.formData.requestForSelf,
            selectedUser: c.formData.requestForSelf === 'No' ? c.formData.selectedUser : '',
            justification: c.formData.justification || '',
            selectedCheckboxes: c.formData.selectedCheckboxes
        };
        console.log('Submitting form:', JSON.stringify(payload));
        
        if (!payload.requestForSelf || payload.requestForSelf === 'None') {
            c.submissionMessage = 'Please select whether the request is for you.';
            console.error('Submit failed: Invalid requestForSelf:', payload.requestForSelf);
            return;
        }
        if (payload.requestForSelf === 'No' && (!payload.selectedUser || payload.selectedUser === '')) {
            c.submissionMessage = 'Please select a user.';
            console.error('Submit failed: No user selected for requestForSelf=No');
            return;
        }
        
        c.server.update(payload).then(function(response) {
            console.log('Raw response:', JSON.stringify(response, null, 2));
            $timeout(function() {
                var responseData = response.data || response.result || response;
                if (responseData) {
                    c.submissionMessage = responseData.submissionMessage || responseData.errorMessage || 'Unknown error occurred.';
                    if (responseData.submissionMessage) {
                        c.formData.requestForSelf = 'None';
                        c.formData.selectedUser = '';
                        c.formData.justification = '';
                        c.formData.selectedCheckboxes = [];
                    }
                } else {
                    c.submissionMessage = 'Error: No response data received.';
                    console.error('No response data:', response);
                }
            });
        }, function(error) {
            $timeout(function() {
                c.submissionMessage = 'Client-side error: ' + error.toString();
                console.error('Submission error:', error);
            });
        });
    };
};

 

I have attached the picture of the widget. Please suggest me what need to be done here.

 

Best Regards,

Bishal Sharma

3 REPLIES 3

palanikumar
Giga Sage
Giga Sage

HI,

Is the Widget created in the scope of the table or in a different scope

Thank you,
Palani

@palanikumar 

this widget is created in scope

@palanikumar 

 

this widget is created in the scope of the table.