Splunk Enterprise

Custom javascript doesn't work

catta99
Explorer

Hi,

i am trying to use custom javascript file to customize some button actions in my dashboard, but it doesn't work and i don't know why. I'm using the last version of Splunk enterprise

My custom script is in the folder  $SPLUNK_HOME/etc/apps/app_name/appserver/static/.

I have  tried to restart Splunk web, use the bumps button but nothing works.

Can anyone help me? 

Simple xml dashboard code

<form version="1.1" theme="dark" script="button.js">
  <search>
    <query>
      
      | makeresults | eval field1="test", field2="test1", field3="lll", field4="sgsgsg"
    </query>
    <earliest></earliest>
    <latest>now</latest>
    <done>
      <set token="field1">$result.field1$</set>
      <set token="field2">$result.field2$</set>
      <set token="field3">$result.field3$</set>
      <set token="field4">$result.field4$</set>
    </done>
  </search>
  <label>stacked_inputs</label>
  <fieldset submitButton="false" autoRun="true"></fieldset>
  <row>
    <panel>
      <title>title</title>
      <input id="test_input1" type="text" token="field1">
        <label>field1</label>
        <default>$field1$</default>
        <initialValue>$field1$</initialValue>
      </input>
      <input id="test_input2" type="text" token="field2">
        <label>field2</label>
        <default>$field2$</default>
        <initialValue>$field2$</initialValue>
      </input>
      <html>
            
            <style>
              #test_input2 {
                  padding-left: 30px !important; 
                  
                  }
              
              
            </style>
            
          </html>
    </panel>
  </row>
  <row>
    <panel>
      <input id="test_input3" type="text" token="field3">
        <label>field3</label>
        <default>$field3$</default>
        <initialValue>$field3$</initialValue>
      </input>
      <input id="test_input4" type="text" token="field4">
        <label>field4</label>
        <default>$field4$</default>
        <initialValue>$field4$</initialValue>
      </input>
    </panel>
  </row>
  <row>
    <panel>
      <html>
        <form>
         <div>
           <div>
            <label>Password</label>
            <input type="text" value="$field4$"/>
            <br/>
            <input type="password" id="exampleInputPassword1" placeholder="Password"/>
          </div>
           </div>
           <button type="submit" class="btn btn-primary">Submit</button>
           </form>
           <button onclick="test()">Back</button>
           <button onclick="test1()">Back1</button>
           <button id="back" data-param="test">Back2</button>
      </html>
    </panel>
  </row>
</form>

Javascript code

catta99_0-1729346067923.png

As you can see i have tried different methods

Thanks for your help.

 

Labels (1)
0 Karma
1 Solution

tscroggins
Influencer

Hi @catta99,

You probably want to start with buttons disabled and then enabled them when the dashboard's async searches are done. You can use SplunkJS to attach search:done event handlers to your searches (see below).

A complex dashboard (multiple searches, multiple buttons, etc.) may require a more complex solution. You can find more information in the SplunkJS documentation or more generally, in your favorite web development resources (or AI stack, if you use one).

<!-- button_test.xml -->
<dashboard version="1.1" theme="light" script="button_test.js">
  <label>button_test</label>
  <search id="search1">
    <query>| stats count</query>
    <earliest>-24h</earliest>
    <latest>now</latest>
  </search>
  <row>
    <panel>
      <html>
        <!-- assign a value to the disabled attribute to pass SplunkWeb's Simple XML validation -->
        <button id="button1" disabled="disabled">Button 1</button>
      </html>
    </panel>
  </row>
</dashboard>
// button_test.js
require([
    "jquery",
    "splunkjs/mvc",
    "splunkjs/mvc/simplexml/ready!"
], function($, mvc) {
    search1 = splunkjs.mvc.Components.get("search1");

    search1.on("search:done", function(properties) {
      $("#button1").prop("disabled", false);
    });

    $("#button1").on("click", function() {
        alert("Button 1 clicked.");
    });
});

 

View solution in original post

kamlesh_vaghela
SplunkTrust
SplunkTrust

@catta99 

Please check below code

function test() {
    console.log("in test");
}

require([
    "jquery",
    "splunkjs/mvc",
    "splunkjs/mvc/simplexml/ready!"
], function($, mvc) {


    console.log("hello 2");
    function test1() {
        console.log("in test1");
    }
    
    $(document).ready(function () {
        $("#back").click(function(){
            alert("button");
            var param = $(this).data("param");
            console.log(param); 
            console.log("click"); 
            history.back();
        });
        $("#backtest").click(function(){
            test();
            alert("Back");
        });
        $("#back1test").click(function(){
            test1();
            alert("Back1");
        });
    })
});

 

Splunk Web Framework works little different from regular or Native Jquery/Javascript behaviour specially on HTML element. So when you write

<button onclick="test()">Back</button>
<button onclick="test1()">Back1</button>

It may not work bcoz when you run the dashboard, the Dashboard XML is rendering into complied version of JS, CSS and HTML. After all this process it will allow developer to add custom JS, CSS and even custom components through custom JS like button_test.js. So all customisation and the element event handleling will be define in this JS only.

Suggestion: Using below code is not best practive. Just code what you want instead of

this.history.back();

I hope this will help you.

Let me know if you need further help on this.

Thanks
KV
An upvote would be appreciated if any of my replies help you solve the problem or gain knowledge.

 

Tags (1)
0 Karma

tscroggins
Influencer

Hi @catta99,

In your JavaScript source, you can use jQuery selectors to attach a click event handler to an object.

In this example, I define a button with id="button1" in button_test.xml and attach a click event handler in button_test.js:

<!-- button_test.xml -->
<dashboard version="1.1" theme="light" script="button_test.js">
  <label>button_test</label>
  <row>
    <panel>
      <html>
        <button id="button1">Button 1</button>
      </html>
    </panel>
  </row>
</dashboard>
// button_test.js
require([
    "jquery",
    "splunkjs/mvc",
    "splunkjs/mvc/simplexml/ready!"
], function($, mvc) {
    $("#button1").on("click", function() {
        alert("Button 1 clicked.");
    });
});

When button1 is clicked, the browser displays a dialog box with the message "Button 1 clicked."

SplunkJS is documented at https://dev.splunk.com/enterprise/docs/developapps/visualizedata/usewebframework/, where you can find example JavaScript templates.

RequireJS is documented at https://requirejs.org/docs/api.html#jsfiles, but its use is limited to the require([...], function(...) {}); shown above.

jQuery selectors are documented at https://api.jquery.com/category/selectors/.

The jQuery click event is documented at https://api.jquery.com/click/.

 

0 Karma

catta99
Explorer

Thanks @tscroggins , for your answer.

But i still have some big problem with javascript, because sometimes Splunk web did not load the code, sometimes  the code didn't work and some times works without changing it.

I have red the documentation, i use the refresh button (http://<ip:port>/debug/refresh), i'm using my browser in incognito mode but nothing, i restar splunk web when i add a new js file. I even tried to fully restart splunk

 

 

 

Thank for your help

0 Karma

tscroggins
Influencer

Hi @catta99,

To clear the server-side cache, restart splunkweb as you have done:

$SPLUNK_HOME/splunk/bin/splunk restart splunkweb

To clear the client-side cache, use your browser's cache functions or temporarily disable caching in your browser's dev tools.

To prevent splunkweb from caching source files during development, you can disable caching in web.conf and restart Splunk: 

# $SPLUNK_HOME/etc/system/local/web.conf
[settings]
cacheBytesLimit = 0

The example I provided can be expanded as needed. If you're still having issues after clearing all caches, reply with a reduced SimpleXML and JavaScript example, and we'll take another look.

0 Karma

catta99
Explorer

Hi @tscroggins, thanks for your answer,

in the documentation i have found this configuration:

minify_js = False

js_no_cache = True

cacheEntriesLimit = 0

cacheBytesLimit = 0

enableWebDebug = True

and it works.

Sometimes not but i go to /debug/refresh and click the refresh button and splunk loads the new version of the js file.

But if you have a dashboard like that

 

<dashboard script="MyScript.js">
<search id="MySearch">
<query>
query that take some time
</query>
</search>
<row>
<panel>
<hmtl> <button id="btn">Button </button>
</html>
</panel>
</row>

 

 

 

//MyScript


require(["jquery", "splunkjs/mvc", "splunkjs/mvc/simplexml/ready!"], function($, mvc) {

$("#btn").on("click", function() {

// js code
});
});​

 

Splunk will not load the Jquery part, but if you go on "edit"->"source"->"cancel" without modifiyng anything in the dashboard source code the javascript code works.

So the problem maybe is caused because the search (id="MySearch") in the dashboard is executed in an async way?

I have read some posts on this topic but i didn't find any solution

I have tried 

require(["jquery", "splunkjs/mvc", "splunkjs/mvc/simplexml/ready!"], function($, mvc) {
$("#MySearch").on("search:done", function(){
$("#btn").on("click", function() {

// js code
});
});​
});

but nothing 

0 Karma

tscroggins
Influencer

Hi @catta99,

You probably want to start with buttons disabled and then enabled them when the dashboard's async searches are done. You can use SplunkJS to attach search:done event handlers to your searches (see below).

A complex dashboard (multiple searches, multiple buttons, etc.) may require a more complex solution. You can find more information in the SplunkJS documentation or more generally, in your favorite web development resources (or AI stack, if you use one).

<!-- button_test.xml -->
<dashboard version="1.1" theme="light" script="button_test.js">
  <label>button_test</label>
  <search id="search1">
    <query>| stats count</query>
    <earliest>-24h</earliest>
    <latest>now</latest>
  </search>
  <row>
    <panel>
      <html>
        <!-- assign a value to the disabled attribute to pass SplunkWeb's Simple XML validation -->
        <button id="button1" disabled="disabled">Button 1</button>
      </html>
    </panel>
  </row>
</dashboard>
// button_test.js
require([
    "jquery",
    "splunkjs/mvc",
    "splunkjs/mvc/simplexml/ready!"
], function($, mvc) {
    search1 = splunkjs.mvc.Components.get("search1");

    search1.on("search:done", function(properties) {
      $("#button1").prop("disabled", false);
    });

    $("#button1").on("click", function() {
        alert("Button 1 clicked.");
    });
});

 

Get Updates on the Splunk Community!

Enterprise Security Content Update (ESCU) | New Releases

In December, the Splunk Threat Research Team had 1 release of new security content via the Enterprise Security ...

Why am I not seeing the finding in Splunk Enterprise Security Analyst Queue?

(This is the first of a series of 2 blogs). Splunk Enterprise Security is a fantastic tool that offers robust ...

Index This | What are the 12 Days of Splunk-mas?

December 2024 Edition Hayyy Splunk Education Enthusiasts and the Eternally Curious!  We’re back with another ...