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.

SPModal receive undefined values from child widget

KrystianS480670
Tera Contributor

Hi,

I have a problem getting the value from the child widget to parent and putting it in the comment.

Parent Widget:

Body:

<div>
    <div class="dropdown" id="child-case-tabs" ng-if="data.showActions">
        <button type="button" id="actions-button" class="btn btn-default dropdown-toggle action-btn" data-toggle="dropdown" style="width : 100%" aria-haspopup="true" ng-init="setFocusOnActionButtons()">
            ${Actions}
            <span class="fa fa-caret-down"></span>
        </button>
        <ul class="dropdown-menu pull-right" id="actionList">
            <li ng-if="data.canResolve">
                <a href="javascript&colon;void(0)" ng-click="$event.stopPropagation();resolveIncident()">${Resolve}</a>
            </li>
            <li ng-if="data.canReopen">
                <a href="javascript&colon;void(0)" ng-click="$event.stopPropagation();reopenIncident()">${Reopen}</a>
            </li>
            <li ng-if="data.canEscalate">
				<a href="javascript&colon;void(0)" ng-click="$event.stopPropagation();escalateIncident()">${Escalate}</a>
			</li>
            <li ng-if="data.canClose">
                <a href="javascript&colon;void(0)" ng-click="$event.stopPropagation();closeIncident()">${Close}</a>
            </li>
        </ul>
    </div>
  
</div>

Server:

(function() {
    var incidentGr = new GlideRecord('incident');
	var incidentSysId = options.sys_id;
	
	if (!incidentSysId && $sp.getParameter('table') == 'incident')
		incidentSysId = $sp.getParameter('sys_id');
	
	if (!incidentSysId && $sp.getParameter('table') == 'universal_request') {
		var urGr = new GlideRecord('universal_request');
		urGr.get($sp.getParameter('sys_id'));
		incidentSysId = urGr.primary_task + "";
	}
	
	/* Actions - Start */
    // if (input && input.action == 'resolveIncident' && incidentGr.get(incidentSysId) && hasPermissions(incidentGr, "write")) {
    //     incidentGr.incident_state = global.IncidentState.RESOLVED;
	// 	incidentGr.state = global.IncidentState.RESOLVED;
	// 	incidentGr.resolved_by = gs.getUserID();
	// 	data.isIncidentResolved = incidentGr.update();
    // }
	
	if (input && input.action == 'reopenIncident' && incidentGr.get(incidentSysId) && hasPermissions(incidentGr, "write")) {
        incidentGr.incident_state = global.IncidentState.IN_PROGRESS;
		incidentGr.state = global.IncidentState.IN_PROGRESS;
		data.isIncidentReopened = incidentGr.update();
		gs.addInfoMessage(gs.getMessage("Request reopened"));
    }
	
	if (input && input.action == 'closeIncident' && incidentGr.get(incidentSysId) && hasPermissions(incidentGr, "write")) {
		incidentGr.incident_state = global.IncidentState.CLOSED;
		incidentGr.state = global.IncidentState.CLOSED;
		data.isIncidentClosed = incidentGr.update();
    }
	if (input && input.action === 'escalateIncident') {
    gs.info(JSON.stringify(input))
    var gr = new GlideRecord('incident');
    if (gr.get(incidentSysId)) { // Ensure data.sys_id is set in the widget context
        var comment = 'Selected Option: ' + input.selectedOption + '\nDetails: ' + input.freeText;
        gr.comments = comment;
        gr.update();
    } else {
        gs.log('Incident not found for sys_id: ' + data.sys_id); // Debug
    }
}

   /* Actions - End */
	
	/* Load incident data */
    if (incidentGr.get(incidentSysId) && hasPermissions(incidentGr, "read")) {
		var incidentUtils = new global.IncidentUtils();
		//data.canResolve = incidentUtils.canResolveIncident(incidentGr);
		data.canReopen = incidentUtils.canReopenIncident(incidentGr);
		data.canClose = incidentUtils.canCloseIncident(incidentGr);
		data.canEscalate= incidentGr.getValue('u_escalated')=='0'?true:false;
		data.showActions = /*data.canResolve ||*/ data.canReopen || data.canClose || data.canEscalate;
    }

    function hasPermissions(gr, operation) {
        if (operation == "read" && gr.canRead())
            return true;

        if (operation == "write" && gr.canWrite())
            return true;

        return (gr.getValue("caller_id") == gs.getUserID()) || (gr.getValue("opened_by") == gs.getUserID());
    }
    data.i18n = {};

})();

Cilient Controller:

function incidentTicketActions($scope, $http, spUtil, $timeout, spModal, i18n, $window, $uibModal, spAriaUtil) {
    /* widget controller */
    var c = this;
    c.doneLoading = false;
    //c.resolvedIncidentMsg = "${Resolved Incident}";
    c.closedIncidentMsg = "${Closed Incident}";
    c.reopenedIncidentMsg = "${Reopened Incident}";

    var MOBILE_DEVICE_SCREEN_WIDTH = 767;
    $scope.mobileDevice = c.data.isMobile || ($window.innerWidth < MOBILE_DEVICE_SCREEN_WIDTH);

    // $scope.resolveIncident = function() {
    //     $scope.data.action = 'resolveIncident';
    //     $scope.server.update(init).then(function(response){
    // 				if (response.isIncidentResolved)
    // 					spAriaUtil.sendLiveMessage(c.resolvedIncidentMsg);
    // 			});
    // 	$scope.$emit('focusOnActions', {"isFocusRequired": true});
    // };

    $scope.closeIncident = function() {
        $scope.data.action = 'closeIncident';
        $scope.server.update(init).then(function(response) {
            if (response.isIncidentClosed)
                spAriaUtil.sendLiveMessage(c.closedIncidentMsg);
        });
        var elm = document.getElementById('short-desc')
        elm.focus();
    };

    $scope.reopenIncident = function() {
        $scope.data.action = 'reopenIncident';
        $scope.server.update(init).then(function(response) {
            if (response.isIncidentReopened)
                spAriaUtil.sendLiveMessage(c.reopenedIncidentMsg);
        });
        $scope.$emit('focusOnActions', {
            "isFocusRequired": true
        });
    };

    $scope.escalateIncident = function() {
        $scope.data.action = 'escalateIncident';
        var c = this;

        spModal.open({
            title: 'Add Work Note',
            widget: 'select_box2',
            size: 'md',
            buttons: [{
                    label: 'Cancel',
                    cancel: true
                },
                {
                    label: 'Submit',
                    primary: true
                }
            ]
        }).then(function(response) {
            console.log('Parent: Received shared data:', response);
            if (response) {
                c.server.get({
                    action: 'escalateIncident',
                })
				c.server.update();
            } else {
                console.log('Parent: No valid data received');
            }
        });
    };

    function init() {}

    $(document).on('click', 'div.modal-footer button.btn, ul#child-case-tabs .dropdown-menu', function(e) {
        e.stopPropagation();
    });

    $(document).bind('dragover drop', function(event) {
        event.preventDefault();
        return false;
    });

    $scope.$on('sp_loading_indicator', function(e, value) {
        if (!value && !c.doneLoading) {
            c.doneLoading = true;
        }
    });
}

 

And child Widget where the modal is build:

BODY:

<div class="simple-incident-form-container">
  <div class="panel panel-default">
    <div class="panel-body">
      <form name="incidentForm" novalidate>
        <!-- Select Box (Mandatory) -->
        <div class="form-group">
          <label>Select Option <span class="required"></span></label>
          <select ng-model="c.data.selectedOption" 
                  name="selectOption" 
                  class="form-control" 
                  required
                  ng-options="option.value as option.label for option in c.data.options">
            <option value="" disabled selected>Select an option</option>
          </select>
        </div>

        <!-- Free Text Field -->
        <div class="form-group">
          <label>Additional Details</label>
          <textarea ng-model="c.data.freeText" 
                    name="freeText" 
                    class="form-control" 
                    rows="3"></textarea>
        </div>
      </form>
    </div>
  </div>
</div>

Client Controller:

api.controller = function($scope, spUtil) {
    var c = this;

    // Initialize data
    c.data = {
        options: [
            { value: 'option1', label: 'Option 1' },
            { value: 'option2', label: 'Option 2' },
            { value: 'option3', label: 'Option 3' }
        ],
        selectedOption: '',
        freeText: ''
    };

    // Debug changes
    $scope.$watch('c.data.selectedOption', function(newVal) {
        console.log('Child: Selected Option changed to:', newVal);

		c.data.selectedOption=newVal;
    });
    $scope.$watch('c.data.freeText', function(newVal) {
        console.log('Child: Free Text changed to:', newVal);
			c.data.freeText=newVal;
    });
};

 

The problem is that after entering the value in the widget:

KrystianS480670_0-1740658873239.png

The result in comment are:

KrystianS480670_1-1740658899230.png

Instead values inserted in window.

Can anyone show me where is the problem?

 

0 REPLIES 0