The Zurich release has arrived! Interested in new features and functionalities? Click here for more

I want to view "Watch List" tickets in the "My requests" page in employee center portal

Community Alums
Not applicable

Hello Everyone,

 

We have a have requirement to show "Watch List" tickets for the logged in user in "My Requests" page in Employee center portal.

OOTB widget(my request) we have open, closed filter configured so I have added one more filter "Watchlist requests".

 

Pandu6_1-1706775370447.png

 

So when I click on that, it should fetch the tickets for which the user is added in watch list.

If anyone has worked on it please help me with the changes that needs to be done.

 

Thank you!

 

15 REPLIES 15

Community Alums
Not applicable

Hi Ram,

Open the below link, It will take you to the widget(Add your domain to the URL).

URL: https://<Input Your Domain>.service-now.com/now/nav/ui/classic/params/target/sp_widget.do%3Fsys_id%3Df1672671d7301200a9addd173e24d47d%26sysparm_record_target%3Dsp_widget%26sysparm_record_row%3D1%26sysparm_record_rows%3D2%26sysparm_record_list%3DnameSTARTSWITHmy%2Brequests%255EORDERBYDESCsys_updated_on 

 

Hi @Community Alums : I realized that OOB My Request widget has been changed in Washington release and the script has also been changed. Have you tried the same in Washington release?

Can you recreate these steps with the new revision? Some of the scripting has changed.

Maruthi Ram
Tera Contributor

@Community Alums :Currently I'm in Washington DC version

Eheitman
Tera Guru

Here are the updates for clones My Requests Widget in Washington

Client controller

function($scope, spAriaUtil, i18n, spModal) {

    var c = this;

    c.trackPage = function() {
        window.GlideWebAnalytics.trackEvent("Service Catalog", "Catalog My Requests", "My Requests Widget Loaded");
    }

    if (c.data.is_new_order)
        spAriaUtil.sendLiveMessage(c.data.requestSubmitMsg);

    c.viewFilter = 'open';
    c.filterOptions = [{key:'open',value:c.data.messages.openRequests},{key:'close',value:c.data.messages.closedRequests},{key:'watchlist',value:c.data.messages.watchlistRequests}]; //added watchlist

    c.changeView = function() {
        window.GlideWebAnalytics.trackEvent("Service Catalog", "Catalog My Requests", "Open/Close Filter Toggled");
        c.server.get({
            action: "change_view",
            view: c.viewFilter,
            search_text: c.filterText
        }).then(function(response) {
            c.data = response.data;
            var resultMsg = (c.data.request.req_list.length == 1 ? 'result' : 'results') + ' returned';
            spAriaUtil.sendLiveMessage(i18n.getMessage('{0} ' + resultMsg).withValues([c.data.request.req_list.length]));
        });
    }

    c.search = function() {
        c.server.get({
            action: 'search',
            search_text: c.filterText,
            view: c.viewFilter
        }).then(function(response) {
            c.data = response.data;
            var resultMsg = (c.data.request.req_list.length == 1 ? 'result' : 'results') + ' returned';
            spAriaUtil.sendLiveMessage(i18n.getMessage('{0} ' + resultMsg).withValues([c.data.request.req_list.length]));
        });
    }

    c.checkEnter = function(event) {
        if (event.which === 13)
            c.search();
    }


    c.filterDraftItem = function(item) {
        if (!c.data.draftSearchText)
            return true; // If no searchText, return true to show all items

        var searchText = c.data.draftSearchText.toLowerCase();

        // Perform the filtering based on item.name or item.displayName
        return (
            (item.name && item.name.toLowerCase().includes(searchText)) ||
            (item.cart_item_name && item.cart_item_name.toLowerCase().includes(searchText))
        );
    };

    c.updateFilteredDraftItems = function() {
        if (!c.data.draftItems)
            return;

        if (!c.data.draftSearchText)
            c.filteredDraftItems = c.data.draftItems;
        else {
            c.filteredDraftItems = c.data.draftItems.filter(function(item) {
                return c.filterDraftItem(item)
            });
        }
    }

    c.filteredDraftItems = [];
    c.updateFilteredDraftItems();

    c.removeDraftItem = function(cartItem) {
        var options = {
            title: c.data.deleteDraftItemMsg,
            headerStyle: {
                border: 'none',
                'padding-bottom': 0
            },
            footerStyle: {
                border: 'none',
                'padding-top': 0
            },
            messageOnly: true,
            buttons: [{
                label: c.data.dialogCancel,
                primary: false
            }, {
                label: c.data.dialogDelete,
                //class: 'btn-danger',
                primary: true
            }],
        };

        spModal.open(options).then(function(actionButton) {
            if (actionButton) {
                if (!actionButton.primary)
                    return;

                c.fetchingDrafts = true;
                c.server.get({
                    action: "remove_item",
                    removeItemID: cartItem.sys_id,
                    prevLimit : c.data.draftItems && c.data.draftItems.length ? c.data.draftItems.length : 100,
                    attachmentTable: cartItem.attachment_table
                }).then(function(response) {
                    c.data.draftItems = response.data.draftItems;
                    c.data.hasMoreDrafts = response.data.hasMoreDrafts;
                    c.updateFilteredDraftItems();
                    c.fetchingDrafts = false;
                });
            }
        });
    }

    c.loadMore = function() {
        window.GlideWebAnalytics.trackEvent("Service Catalog", "Catalog My Requests", "Show More Clicked");
        var currentRequests = c.data.request.req_list.length;
        spAriaUtil.sendLiveMessage("${Loading more requests}");
        c.fetching = true;
        c.server.get({
            action: 'fetch_more',
            lastLimit: c.data.lastLimit,
            view: c.viewFilter,
            search_text: c.filterText
        }).then(function(response) {
            var addedRequests = response.data.request.req_list.length - currentRequests;
            var resultMsg = (addedRequests == 1 ? 'request' : 'requests') + ' added';
            spAriaUtil.sendLiveMessage(i18n.getMessage('{0} ' + resultMsg).withValues([addedRequests]));
            c.data = response.data;
            c.fetching = false;
        });
    }

    c.loadMoreDrafts = function() {
            c.fetchingDrafts = true;

            c.server.get({
                action : 'fetch_more_draft_items',
                prevLimit: c.data.draftItems && c.data.draftItems.length ? c.data.draftItems.length : 100,
            }).then(function(response){
                c.data.draftItems = response.data.draftItems;
                c.data.hasMoreDrafts = response.data.hasMoreDrafts;
                c.updateFilteredDraftItems();
                c.fetchingDrafts = false;
        });
    }

    c.changeSelectedTab = function(selectedTab) {
        c.data.isRequestsTabActive = selectedTab == "requests";
        c.data.isDraftsTabActive = selectedTab == "drafts";
    }
}

Server Script

(function() {

    var localInput = input; //to safeguard pullution of "input" via BR or other scripts
    var itemsObj;
    if (localInput && localInput.action === "remove_item") {
        var cartRecord = new sn_sc.CartJS('draft_items');
        cartRecord.remove(localInput.removeItemID);
        itemsObj = getDraftItems(localInput.prevLimit);
        data.draftItems = itemsObj.items;
        data.hasMoreDrafts = itemsObj.hasMore;
        if (!gs.nil(localInput.attachmentTable))
          new global.GlobalServiceCatalogUtil().deleteAttachments(localInput.attachmentTable, localInput.removeItemID);

        return;
    }

    if (localInput && localInput.action == "fetch_more_draft_items") {
        itemsObj = getDraftItems(localInput.prevLimit + 100);
        data.draftItems = itemsObj.items;
        data.hasMoreDrafts = itemsObj.hasMore;
        return;
    }

    var alsoRequest = false;

    var msg = data.messages = {};
    msg.myRequestsTitle = options.title ? gs.getMessage(options.title) : gs.getMessage('My Requests');
    msg.openRequests = gs.getMessage('Open requests');
    msg.closedRequests = gs.getMessage('Closed requests');
	msg.watchlistRequests = gs.getMessage('Watchlist requests'); //add watchlist view option
    msg.showMoreRequests = gs.getMessage('Show More Requests');
    data.filterMsg = gs.getMessage("Search open requests");
    data.draftFilterMsg = gs.getMessage("Search draft items");
    data.draftItemsMsg = gs.getMessage("Draft Items");
    data.deleteDraftItemMsg = gs.getMessage("Are you sure you want to delete the draft item?");
    data.dialogCancel = gs.getMessage('Cancel');
    data.dialogDelete = gs.getMessage('Delete draft');
    data.draftSearchText = $sp.getParameter("draftSearchText");
    var selectDraftTab = $sp.getParameter('selectDraftTab');
    //localInput will be undefined only on the first load.
    if (gs.nil(localInput)) {
        data.isRequestsTabActive = !data.draftSearchText && !selectDraftTab;
        data.isDraftsTabActive = !!data.draftSearchText || selectDraftTab;
    } else {
        data.isRequestsTabActive = true;
        data.isDraftsTabActive = false;
    }
    if (gs.nil(data.draftSearchText))
        data.draftSearchText = "";
    else
        data.draftSearchText = decodeURIComponent(data.draftSearchText);

    data.hide_draft_tab = (gs.getProperty('glide.sc.disable.save_as_draft') == 'true') || (gs.getProperty('glide.sc.enable.save_as_draft.portal.' + $sp.getPortalRecord().getValue("url_suffix")) != 'true');

    var recordTable = options.record_table || $sp.getParameter("table");
    var recordId = options.record_id || $sp.getParameter("sys_id");

    data.is_associated_ticket_tab = options.is_associated_ticket_tab;

    if (localInput && localInput.view === 'open')
        data.filterMsg = gs.getMessage("Search open requests");
    else if (localInput && localInput.view === 'close')
        data.filterMsg = gs.getMessage("Search closed requests");
	else if (localInput && localInput.view === 'watchlist') //added for search
        data.filterMsg = gs.getMessage("Search watchlist requests");

    data.is_new_order = (($sp.getParameter("is_new_order") + '') === "true");
    data.requestSubmitMsg = gs.getMessage('Thank You. Your request has been submitted');
    var draftItemsObj = getDraftItems(100);
    data.draftItems = draftItemsObj.items;
    data.hasMoreDrafts = draftItemsObj.hasMore;

    function getDraftItems(limit) {
        var userID = gs.getUser().getID();
        var cart = new SPCart("draft_items", userID);

        if (!gs.nil(cart) && typeof cart.getItemsWithPagination === "function")
            itemsObj = cart.getItemsWithPagination('sys_updated_on', limit);
        else {
            gs.info("Drafts tab is hidden as we are either unable to fetch the draft cart or the SPCart script include is customized.");
            data.hide_draft_tab = true;
            itemsObj = {};
        }

        return itemsObj;
    }

    function getField(gr, name) {
        var f = {};
        var id = gr.getUniqueValue();
        gr = new GlideRecord(gr.getRecordClassName());
        gr.get(id);
        f.display_value = gr.getDisplayValue(name);
        f.value = gr.getValue(name);
        var ge = gr.getElement(name);
        if (ge) {
            var ed = ge.getED();
            if (ed)
                f.type = ed.getInternalType();
            f.label = ge.getLabel();
        }
        return f;
    }

    function getMyRequestSysIds() {
        var ids = {};
        var rq_filter = new GlideRecord('request_filter');
        rq_filter.addActiveQuery();
        if (rq_filter.isValidField('applies_to'))
            rq_filter.addQuery('applies_to', 1).addOrCondition('applies_to', 10);
        rq_filter.query();
        while (rq_filter.next()) {
            var tableName = rq_filter.table_name;
            if (rq_filter.isValidField('table'))
                tableName = rq_filter.table;
            var gr = new GlideRecord(tableName);
            if (!gr.isValid())
                continue;

            gr.addQuery(rq_filter.filter);
            gr.query();
            if (tableName == 'sc_request')
                alsoRequest = true;
            while (gr.next()) {
                var portalSettings = {};
                portalSettings.page = rq_filter.portal_page.nil() ? '' : rq_filter.portal_page.getDisplayValue() + '';
                portalSettings.primary_display = rq_filter.primary_display.nil() ? '' : rq_filter.primary_display + '';
                portalSettings.secondary_displays = rq_filter.secondary_display.nil() ? '' : rq_filter.secondary_display + '';
                ids[gr.sys_id + ''] = portalSettings;
            }
        }
        return ids;
    }

    // retrieve the request's
    var myRequestMap = getMyRequestSysIds();
    var taskIDs = Object.keys(myRequestMap);

    var gr = new GlideRecordSecure('task');

    if (!data.is_associated_ticket_tab) {
        if (localInput && localInput.view === 'open')
            gr.addActiveQuery();
        else if (localInput && localInput.view === 'close')
            gr.addQuery('active', 0);
		else if (localInput && localInput.view === 'watchlist') //query for watchlist
            gr.addQuery('watch_list', 'CONTAINS',gs.getUserID());
        else
            gr.addActiveQuery();
    } else {
        if (recordTable != 'universal_request') {
            //Check if universal_request field is present and it is a universal request
            var taskRecord = new GlideRecordSecure('task');
            taskRecord.get(recordId);
            if (taskRecord.isValid() && !taskRecord.universal_request.nil()) {
                var qc = gr.addQuery('parent', taskRecord.universal_request);
                qc.addOrCondition('parent', 'IN', new sn_uni_req.UniversalRequestUtilsSNC().getChildRequests(taskRecord.universal_request));
            } else
                gr.addQuery('parent', recordId);
        } else {
            var qc = gr.addQuery('parent', recordId);
            qc.addOrCondition('parent', 'IN', new sn_uni_req.UniversalRequestUtilsSNC().getChildRequests(recordId));
        }
    }

    gr.orderByDesc('sys_updated_on');
    if (localInput && localInput.search_text) {
        var req = [];
        var task = new GlideRecordSecure('task');
        task.addQuery('123TEXTQUERY321', localInput.search_text);
        if (localInput && localInput.view === 'open')
            task.addQuery('active', 1);
        else if (localInput && localInput.view === 'close')
            task.addQuery('active', 0);
        else
            task.addQuery('active', 1);
        task.addQuery('sys_id', taskIDs);
        task.query();

        while (task.next())
            req.push(task.getUniqueValue());

        var ritmGR = new GlideRecord('sc_req_item');
        if (alsoRequest && ritmGR.isValid()) {
            if (localInput && localInput.view === 'open')
                ritmGR.addQuery('request.active', 1);
            else if (localInput && localInput.view === 'close')
                ritmGR.addQuery('request.active', 0);
            else
                ritmGR.addQuery('request.active', 1);
            ritmGR.addQuery('123TEXTQUERY321', localInput.search_text);
            ritmGR.addQuery('request.sys_id', taskIDs);
            ritmGR.query();
            while (ritmGR.next())
                req.push(ritmGR.getValue('request'));
        }
        gr.addQuery('sys_id', req);
    } else
        gr.addQuery('sys_id', taskIDs);
    gr.query();

    data.request = {};

    data.request.req_list = [];
    var recordIdx = 0;
    var limit = options.items_per_page ? options.items_per_page : 15;
    if (localInput && localInput.action == 'fetch_more')
        data.lastLimit = localInput.lastLimit + limit;
    else
        data.lastLimit = limit;

    data.hasMore = false;
    while (recordIdx != data.lastLimit && gr.next()) {
        var portalSettings = myRequestMap[gr.getUniqueValue()];
        if (typeof portalSettings == 'undefined')
            portalSettings = {};

        var record = {};
        record.sys_id = gr.getValue('sys_id');

        if (gr.getRecordClassName() == 'sc_request') {
            var ritm = new GlideRecord("sc_req_item");
            if (!ritm.isValid())
                continue;

            ritm.addQuery("request", gr.getUniqueValue());
            ritm.query();
            if (ritm.getRowCount() == 0)
                continue;
            if (ritm.getRowCount() > 1)
                record.display_field = gs.getMessage("{0} requested items", ritm.getRowCount());
            else {
                ritm.next();
                record.display_field = ritm.cat_item.getDisplayValue() || ritm.getDisplayValue("short_description");
            }
            record.url = {
                id: portalSettings.page ? portalSettings.page : 'sc_request',
                table: 'sc_request',
                sys_id: record.sys_id
            };
        } else {
            record.display_field = portalSettings.primary_display ? getField(gr, portalSettings.primary_display).display_value : getField(gr, 'number').display_value;
            record.url = {
                id: portalSettings.page ? portalSettings.page : 'ticket',
                table: gr.getRecordClassName(),
                sys_id: record.sys_id
            };
        }
        record.display_number = getField(gr, 'number').display_value || '';
        if (portalSettings.secondary_displays) {
            record.secondary_displays = [];
            portalSettings.secondary_displays.split(",").forEach(function(sDisplay) {
                record.secondary_displays.push(getField(gr, sDisplay));
            });
        } else
            record.secondary_displays = getField(gr, 'short_description');

        record.updated_on = gr.getValue('sys_updated_on');
        record.state = gr.getDisplayValue('state');
        if ((recordIdx !== 0) && (data.lastLimit - limit === recordIdx))
            record.highlight = true;

        data.request.req_list.push(record);
        recordIdx++;
    }

    if (gr.next())
        data.hasMore = true;

})();