logo

NJP

Code search

Import · Aug 13, 2020 · article

Hello everybody,

I want to share a quick way to search for a string in the instance code,

using a slightly modified version of UI Page "CodeSearchExampleUse".

Create a new UI Page

HTML

<?xml version="1.0" encoding="utf-8" ?>
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">

    <g:requires name="styles/heisenberg/heisenberg_all.css" includes="true" />
    <g:requires name="scripts/lib/jquery_includes.js" />
    <g:requires name="scripts/heisenberg/heisenberg_all.js" />

    <g:sn_codesearch_CodeSearchExample />
</j:jelly>

Client script

// Default search in all applications
document.getElementById("sn_codesearch_search_all_scopes").checked = true;

function sn_codesearch_getResults() {
    $j("#sn_codesearch_results").html('');

    var userToken = "$[gs.getSessionToken()]";

    var endpoint = '/api/sn_codesearch/code_search/search',
    limit = $[gs.getProperty('sn_codesearch.search.results.max', 500)],
    req = {
        data : {
            limit : limit,
            current_app : "sn_codesearch",
            table : $j("#sn_codesearch_table").val(),
            term : $j("#sn_codesearch_term").val(),
            search_all_scopes : $j("#sn_codesearch_search_all_scopes").is(":checked")
        },

        dataType : 'json',
        headers : {"X-UserToken" : userToken}
    };

    if(!req.data.term) {
        alert("No search term provided.");
        return false;
    }

    var jqxhr = $j.ajax(endpoint, req)
        .done(function(data, textStatus, jqXHR) {
            var result = data.result;
            //are we dealing with just one table's results
            if (req.data.table)
                writeOutputForTable(result);
            else
                for (var i=0; i<result.length; i++)
                    writeOutputForTable(result[i]);
        })
        .fail(function(jqXHR, textStatus, errorThrown) {
            console.log("Error - unable to complete search. Message is " + errorThrown);
        });

    return false;
}

function sn_codesearch_clearSelections() {
    $j("#sn_codesearch_table").val('');
    $j("#sn_codesearch_term").val('');
    if ($j("#sn_codesearch_search_all_scopes").is(":checked"))
        $j('label[for="sn_codesearch_search_all_scopes"]').click();

    return false;
}

function writeOutputForTable(data) {
    if(!data)
        return;

    if(!data.hits)
        return;

    var header = $j("<div><h1>" + data.tableLabel + "</h1></div>");
    var result_body = "<div><p> Found <strong>" + data.hits.length + "</strong> records matching query.</p></div>";
    result_body += "<div>";

    $j.each(data.hits, function(idx, hit) {
        // Link to the record
        var result_desc = "<p>Record <a href='/" + hit.className + ".do?sys_id=" + hit.sysId + "' target='_blank' >" + hit.name + "</a> has <strong>" + hit.matches.length + "</strong> matching fields.</p>";
        var text = "<ul>";

        $j.each(hit.matches, function(indx, match) {
            text += "<li><p>" + match.fieldLabel + "</p>";
            text += "<pre>";
            $j.each(match.lineMatches, function(ix, fieldMatch) {
                text += "Line: " + fieldMatch.line + " " + fieldMatch.escaped + "\n";
            });
            text += "</pre></li>";
        });
        text += "</ul>";

        result_body += result_desc + text;
    });

    result_body += "</div>";
    $j(result_body).appendTo(header);
    $j(header).appendTo($j("#sn_codesearch_results"));

}

At this point just create a Module that will open the UI Page

image

The final result is

image

Compared to the original page, it has the "Search All Applications" checked by default, and the link to the record in which the string was found.

I hope it's useful!

Corrections and comments are welcome image

Daniele

Labels:

image

View original source

https://www.servicenow.com/community/developer-articles/code-search/ta-p/2321709