Skip to content
Snippets Groups Projects
Commit 4298d16f authored by Václav Bartoš's avatar Václav Bartoš
Browse files

Added dialog to set case title and description

(more parameters and better styling will be done later)
parent 19b7e88c
No related branches found
No related tags found
No related merge requests found
{ {
"name": "thehive_button", "name": "thehive_button",
"version": "0.1.1", "version": "0.2.0",
"description": "Visualisation plugin which creates a simple button to create a new case in The Hive.", "description": "Visualisation plugin which creates a simple button to create a new case in The Hive.",
"main": "index.js", "main": "index.js",
"kibana": { "kibana": {
...@@ -12,7 +12,8 @@ ...@@ -12,7 +12,8 @@
"build": "plugin-helpers build" "build": "plugin-helpers build"
}, },
"dependencies": { "dependencies": {
"request": "^2.88.0" "request": "^2.88.0",
"jquery-ui": "1"
}, },
"devDependencies": { "devDependencies": {
"@elastic/eslint-config-kibana": "link:../../packages/eslint-config-kibana", "@elastic/eslint-config-kibana": "link:../../packages/eslint-config-kibana",
......
<form>
<label for="case-title">Title:</label><br>
<input type="text" name="case-title" style="width: 100%" value="" required="true"><br>
<br>
<label for="case-title">Description:</label><br>
<textarea name="case-descr" rows="10" style="width: 100%">
--
Created from Kibana
</textarea>
</form>
\ No newline at end of file
import { Status } from 'ui/vis/update_status'; import { Status } from 'ui/vis/update_status';
import chrome from 'ui/chrome'; import chrome from 'ui/chrome';
import { toastNotifications } from 'ui/notify'; import { toastNotifications } from 'ui/notify';
//import vis_template from './vis_template.html'; import case_form from './case_form.html';
import React from 'react'; import React from 'react';
import $ from 'jquery';
import 'jquery-ui/themes/base/core.css';
import 'jquery-ui/themes/base/theme.css';
import 'jquery-ui/themes/base/resizable.css';
import 'jquery-ui/themes/base/dialog.css';
import 'jquery-ui/ui/core';
import 'jquery-ui/ui/widgets/resizable';
import 'jquery-ui/ui/widgets/dialog';
import { import {
EuiButton, EuiButton,
// EuiPanel, // EuiPanel,
...@@ -11,6 +21,7 @@ import { ...@@ -11,6 +21,7 @@ import {
function createTheHiveButton(vis) { function createTheHiveButton(vis) {
// Create the button
var button = document.createElement('button'); var button = document.createElement('button');
button.className = 'euiButton euiButton--danger euiButton--fill'; button.className = 'euiButton euiButton--danger euiButton--fill';
button.innerHTML = '<span class="euiButton__content"><span class="euiButton__text" title="Create new Case in The Hive">Create new Case</span></span>'; button.innerHTML = '<span class="euiButton__content"><span class="euiButton__text" title="Create new Case in The Hive">Create new Case</span></span>';
...@@ -18,22 +29,54 @@ function createTheHiveButton(vis) { ...@@ -18,22 +29,54 @@ function createTheHiveButton(vis) {
button._vis = vis; // store reference to 'vis' to the element button._vis = vis; // store reference to 'vis' to the element
// var button2 = <EuiButton fill iconType="alert" color="danger" onClick={(evt) => hiveButtonOnClick(evt, vis.params)}>Create new Case</EuiButton>; // var button2 = <EuiButton fill iconType="alert" color="danger" onClick={(evt) => hiveButtonOnClick(evt, vis.params)}>Create new Case</EuiButton>;
// button2.setState({vis: vis}); // button2.setState({vis: vis});
// Create the dialog to specify Case parameters
var dialog = document.createElement("div");
dialog.innerHTML = case_form; // content imported from ext. file
$(dialog).dialog({
autoOpen: false,
title: "Create a new Case ...",
width: 600,
resizable: true,
buttons: [
{
text: "Cancel",
click: function() {
$( this ).dialog( "close" );
}
},
{
text: "Submit",
click: function(evt) {
hiveButtonSubmit(dialog, evt.currentTarget);
}
}
]
});
// add reference to visualisation parameters to the dialog element
dialog._params = button._vis.params;
// add reference to newly created dialog to the button element
button._dialog_elem = dialog;
return button; return button;
} }
function hiveButtonOnClick(evt) { function hiveButtonOnClick(evt) {
// Button click -> just open the dialog
var button = evt.currentTarget; var button = evt.currentTarget;
var params = button._vis.params; $(button._dialog_elem).dialog("open");
//console.log("OnCLick", params); return false;
}
function hiveButtonSubmit(dialog, submit_button) {
var params = dialog._params;
console.log("Submit", submit_button, params);
// Add "loading" icon and disable the button // load data from the <form>
var loading_span = document.createElement('span'); var form = $("form", dialog);
loading_span.className = "euiLoadingSpinner euiLoadingSpinner--medium euiButton__spinner"; console.log(form);
button.firstChild.insertBefore(loading_span, button.firstChild.childNodes[0]); var title = $('input[name="case-title"]', form).val();
button.setAttribute("disabled", true); var descr = $('textarea[name="case-descr"]', form).val();
var title = "TODO: SET THE TITLE";
var descr = "(Created from Kibana)\n\n...";
var severity = 2; var severity = 2;
var start_date = null; var start_date = null;
var owner = params.owner; var owner = params.owner;
...@@ -41,6 +84,17 @@ function hiveButtonOnClick(evt) { ...@@ -41,6 +84,17 @@ function hiveButtonOnClick(evt) {
var tlp = 2; var tlp = 2;
var tags = []; var tags = [];
// check validity
if (title == "") {
toastNotifications.addDanger("ERROR: Title cannot be empty");
return false;
}
// disable the button to prevent multiple submits
submit_button.innerHTML = "(working...)";
submit_button.setAttribute("disabled", true);
createHiveCase(params.url, params.apikey, title, descr, severity, start_date, owner, flag, tlp, tags) createHiveCase(params.url, params.apikey, title, descr, severity, start_date, owner, flag, tlp, tags)
.then(function(value) { .then(function(value) {
if ('error' in value) { if ('error' in value) {
...@@ -64,9 +118,13 @@ function hiveButtonOnClick(evt) { ...@@ -64,9 +118,13 @@ function hiveButtonOnClick(evt) {
}); });
window.open(case_url, '_blank'); window.open(case_url, '_blank');
} }
// remove "loading" icon and re-enable the button
button.firstChild.removeChild(loading_span); // re-enable the button
button.removeAttribute("disabled"); submit_button.innerHTML = "Submit";
submit_button.removeAttribute("disabled");
// close the dialog
$(dialog).dialog( "close" );
}); });
return false; return false;
} }
...@@ -147,12 +205,6 @@ class VisController { ...@@ -147,12 +205,6 @@ class VisController {
} }
async render(visData, status) { async render(visData, status) {
//console.log('in promise!', this.vis)
//console.log(vis_template);
//var vis = this.vis;
//this.container.innerHTML = `${vis_template}`;
//this.container.innerHTML += '<p>Hello World from Promise! ' + JSON.stringify(status) + '</p>';
//console.log('Render: ' + JSON.stringify(status));
return 'done rendering'; return 'done rendering';
} }
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment