2017-11-13 15:36:31 +00:00
import $ from 'jquery' ;
2018-01-08 15:28:03 +00:00
const ownLoader = require ( './loader/loader-import' ) ;
2018-04-08 17:55:29 +00:00
2017-11-13 15:36:31 +00:00
var app = require ( 'ui/modules' ) . get ( 'apps/webinar_app' , [ ] )
. directive ( 'kbnVis' , [ function ( ) {
return {
restrict : 'E' ,
scope : {
visID : '=visId' ,
2017-12-26 17:22:00 +00:00
specificTimeRange : '=specificTimeRange'
2017-11-13 15:36:31 +00:00
} ,
2018-04-18 11:36:10 +00:00
controller : function VisController ( $scope , $rootScope , $location , wzsavedVisualizations , genericReq , errorHandler , Private ) {
2018-01-08 15:28:03 +00:00
if ( ! $rootScope . ownHandlers ) $rootScope . ownHandlers = [ ] ;
2018-03-02 18:55:27 +00:00
let originalImplicitFilter = '' ;
let implicitFilter = '' ;
let visTitle = '' ;
let fullFilter = '' ;
let rendered = false ;
let visualization = null ;
let visHandler = null ;
let renderInProgress = false ;
2018-04-18 11:36:10 +00:00
const myRender = raw => {
if ( raw && ( ( $rootScope . discoverPendingUpdates && $rootScope . discoverPendingUpdates . length != 0 ) || $scope . visID . includes ( 'Ruleset' ) ) ) { // There are pending updates from the discover (which is the one who owns the true app state)
2018-04-09 16:33:23 +00:00
2018-04-08 17:55:29 +00:00
if ( ! visualization && ! rendered && ! renderInProgress ) { // There's no visualization object -> create it with proper filters
renderInProgress = true ;
2018-01-16 23:17:48 +00:00
2018-04-08 17:55:29 +00:00
if ( $rootScope . visTimestamp ) {
2018-04-18 11:36:10 +00:00
const rawVis = raw . filter ( item => item . id === $scope . visID + "-" + $rootScope . visTimestamp ) ;
wzsavedVisualizations . get ( $scope . visID + "-" + $rootScope . visTimestamp , rawVis [ 0 ] ) . then ( savedObj => {
2018-04-04 10:04:59 +00:00
originalImplicitFilter = savedObj . searchSource . get ( 'query' ) [ 'query' ] ;
visTitle = savedObj . vis . title ;
visualization = savedObj ;
// There's an original filter
if ( originalImplicitFilter . length > 0 ) {
// And also a pending one -> concatenate them
if ( $rootScope . discoverPendingUpdates && typeof $rootScope . discoverPendingUpdates [ 0 ] . query === 'string' && $rootScope . discoverPendingUpdates [ 0 ] . query . length > 0 ) {
implicitFilter = originalImplicitFilter + ' AND ' + $rootScope . discoverPendingUpdates [ 0 ] . query ;
} else {
// Only the original filter
implicitFilter = originalImplicitFilter ;
}
} else {
// Other case, use the pending one, if it is empty, it won't matter
implicitFilter = $rootScope . discoverPendingUpdates ? $rootScope . discoverPendingUpdates [ 0 ] . query : '' ;
}
if ( visTitle !== 'Wazuh App Overview General Agents status' ) { // We don't want to filter that visualization as it uses another index-pattern
visualization . searchSource
. query ( { language : 'lucene' , query : implicitFilter } )
. set ( 'filter' , $rootScope . discoverPendingUpdates ? $rootScope . discoverPendingUpdates [ 1 ] : { } ) ;
}
let params = { } ;
if ( $scope . specificTimeRange ) {
const timeRange = {
from : 'now-1d/d' ,
to : 'now'
} ;
params = { timeRange : timeRange }
}
$ ( ` [vis-id="' ${ $scope . visID } '"] ` ) . on ( 'renderStart' , ( ) => {
//$("#"+$scope.visID).on('renderStart', () => {
// TBD: Use renderStart to couple it with renderComplete?
} ) ;
visHandler = loader . embedVisualizationWithSavedObject ( $ ( ` [vis-id="' ${ $scope . visID } '"] ` ) , visualization , params ) ;
$rootScope . ownHandlers . push ( visHandler ) ;
visHandler . addRenderCompleteListener ( renderComplete ) ;
2018-04-13 12:15:29 +00:00
} ) . catch ( error => {
if ( error && error . message && error . message . includes ( 'not locate that index-pattern-field' ) ) {
errorHandler . handle ( ` ${ error . message } , please restart Kibana and refresh this page once done ` , 'Visualize' )
} else {
errorHandler . handle ( error , 'Visualize' )
}
2018-04-04 10:04:59 +00:00
} ) ;
2018-04-08 17:55:29 +00:00
}
} else if ( rendered ) { // There's a visualization object -> just update its filters
2018-04-04 10:04:59 +00:00
2018-04-08 17:55:29 +00:00
// There's an original filter
if ( originalImplicitFilter . length > 0 ) {
// And also a pending one -> concatenate them
if ( $rootScope . discoverPendingUpdates && typeof $rootScope . discoverPendingUpdates [ 0 ] . query === 'string' && $rootScope . discoverPendingUpdates [ 0 ] . query . length > 0 ) {
implicitFilter = originalImplicitFilter + ' AND ' + $rootScope . discoverPendingUpdates [ 0 ] . query ;
2018-03-02 18:55:27 +00:00
} else {
2018-04-08 17:55:29 +00:00
// Only the original filter
implicitFilter = originalImplicitFilter ;
2017-11-28 16:37:31 +00:00
}
2018-04-08 17:55:29 +00:00
} else {
// Other case, use the pending one, if it is empty, it won't matter
implicitFilter = $rootScope . discoverPendingUpdates ? $rootScope . discoverPendingUpdates [ 0 ] . query : '' ;
}
if ( visTitle !== 'Wazuh App Overview General Agents status' ) { // We don't want to filter that visualization as it uses another index-pattern
visualization . searchSource
. query ( { language : 'lucene' , query : implicitFilter } )
. set ( 'filter' , $rootScope . discoverPendingUpdates ? $rootScope . discoverPendingUpdates [ 1 ] : { } ) ;
2018-01-17 15:13:14 +00:00
}
}
2018-01-16 23:17:48 +00:00
}
2018-02-09 19:35:28 +00:00
} ;
// Listen for changes
2018-04-09 16:33:23 +00:00
$rootScope . $on ( 'updateVis' , function ( event , query , filters ) {
2018-04-18 11:36:10 +00:00
if ( ! $rootScope . $$phase ) $rootScope . $digest ( ) ;
myRender ( $rootScope . rawVisualizations ) ;
2018-02-09 19:35:28 +00:00
} ) ;
2018-04-08 17:55:29 +00:00
var renderComplete = function ( ) {
2018-02-09 19:35:28 +00:00
rendered = true ;
2018-03-14 15:43:23 +00:00
2018-01-29 11:38:16 +00:00
if ( typeof $rootScope . loadedVisualizations === 'undefined' ) $rootScope . loadedVisualizations = [ ] ;
2018-01-10 14:39:15 +00:00
$rootScope . loadedVisualizations . push ( true ) ;
2018-02-07 10:54:18 +00:00
let currentCompleted = Math . round ( ( $rootScope . loadedVisualizations . length / $rootScope . tabVisualizations [ $location . search ( ) . tab ] ) * 100 ) ;
2018-02-01 15:34:00 +00:00
$rootScope . loadingStatus = ` Rendering visualizations... ${ currentCompleted > 100 ? 100 : currentCompleted } % ` ;
2018-04-08 17:55:29 +00:00
if ( currentCompleted >= 100 ) {
2018-04-09 17:12:44 +00:00
if ( $rootScope . visTimestamp ) {
genericReq . request ( 'GET' , ` /api/wazuh-elastic/delete-vis/ ${ $rootScope . visTimestamp } ` ) . catch ( console . error )
$rootScope . visTimestamp = null ;
2018-04-05 13:15:44 +00:00
}
2018-04-08 17:55:29 +00:00
if ( ! visTitle !== 'Wazuh App Overview General Agents status' ) $rootScope . rendered = true ;
// Forcing a digest cycle
2018-04-05 13:15:44 +00:00
if ( ! $rootScope . $$phase ) $rootScope . $digest ( ) ;
2018-01-10 14:39:15 +00:00
}
2018-04-08 17:55:29 +00:00
else if ( ! visTitle !== 'Wazuh App Overview General Agents status' ) $rootScope . rendered = false ;
2018-01-09 18:53:42 +00:00
} ;
2018-01-08 15:28:03 +00:00
// Initializing the visualization
const loader = ownLoader . getVisualizeLoader ( ) ;
2017-10-09 15:49:10 +00:00
}
2017-11-13 15:36:31 +00:00
}
2018-01-08 15:28:03 +00:00
} ] ) ;