Example #1
0
define(function (require) {

  var chrome = require('ui/chrome');
  var routes = require('ui/routes');

  routes.when('/default', {
    resolve: {
      defaultPath: function ($location, $window, Private) {
        var urlHelper = Private(require('ui/kibi/helpers/url_helper'));
        var app = chrome.getApp();
        var tabs = chrome.getTabs();

        urlHelper.getInitialPath(app, tabs).then(function (path) {
          if (path.indexOf('http') === 0) {
            $window.location.href = path;
          } else {
            $location.path(path);
          }
        }).catch(function (err) {
          // fallback to what kibana would do by default
          $location.path(`/${chrome.getInjected('kbnDefaultAppId', 'discover')}`);
        });
      }
    }
  });
});
} from '../../common/constants/search';
import { annotationsRefresh$ } from '../services/annotations_service';
import { interval$ } from '../components/controls/select_interval/select_interval';
import { severity$ } from '../components/controls/select_severity/select_severity';
import { setGlobalState, getSelectedJobIds } from '../components/job_selector/job_select_service_utils';


import chrome from 'ui/chrome';
let mlAnnotationsEnabled = chrome.getInjected('mlAnnotationsEnabled', false);

uiRoutes
  .when('/timeseriesexplorer/?', {
    template,
    k7Breadcrumbs: getSingleMetricViewerBreadcrumbs,
    resolve: {
      CheckLicense: checkFullLicense,
      privileges: checkGetJobsPrivilege,
      indexPatterns: loadIndexPatterns,
      mlNodeCount: getMlNodeCount,
      jobs: mlJobService.loadJobsWrapper
    }
  });

import { uiModules } from 'ui/modules';
const module = uiModules.get('apps/ml');

module.controller('MlTimeSeriesExplorerController', function (
  $injector,
  $scope,
  $timeout,
  Private,
  AppState,
Example #3
0
routes.when(`${BASE_PATH}:view?/:action?/:id?`, {
  template: template,
  k7Breadcrumbs: () => [
    MANAGEMENT_BREADCRUMB,
    {
      text: i18n.translate('xpack.idxMgmt.breadcrumb', {
        defaultMessage: 'Index management'
      }),
    }
  ],
  controllerAs: 'indexManagement',
  controller: class IndexManagementController {
    constructor($scope, $route, $http, kbnUrl, $rootScope) {
      // clean up previously rendered React app if one exists
      // this happens because of React Router redirects
      elem && unmountComponentAtNode(elem);
      // NOTE: We depend upon Angular's $http service because it's decorated with interceptors,
      // e.g. to check license status per request.
      setHttpClient($http);
      setUrlService({
        change(url) {
          kbnUrl.change(url);
          $rootScope.$digest();
        }
      });
      $scope.$$postDigest(() => {
        elem = document.getElementById('indexManagementReactRoot');
        renderReact(elem);
        manageAngularLifecycle($scope, $route, elem);
      });
    }
  }
});
Example #4
0
import _ from 'lodash';
import angular from 'angular';
import rison from 'rison-node';
import { savedObjectManagementRegistry } from 'plugins/kibana/management/saved_object_registry';
import objectViewHTML from 'plugins/kibana/management/sections/objects/_view.html';
import { IndexPatternsCastMappingTypeProvider } from 'ui/index_patterns/_cast_mapping_type';
import uiRoutes from 'ui/routes';
import { uiModules } from 'ui/modules';

uiRoutes
.when('/management/kibana/objects/:service/:id', {
  template: objectViewHTML
});

uiModules.get('apps/management')
.directive('kbnManagementObjectsView', function (kbnIndex, Notifier, confirmModal) {
  return {
    restrict: 'E',
    controller: function ($scope, $injector, $routeParams, $location, $window, $rootScope, esAdmin, Private) {
      const notify = new Notifier({ location: 'SavedObject view' });
      const castMappingType = Private(IndexPatternsCastMappingTypeProvider);
      const serviceObj = savedObjectManagementRegistry.get($routeParams.service);
      const service = $injector.get(serviceObj.service);

      /**
       * Creates a field definition and pushes it to the memo stack. This function
       * is designed to be used in conjunction with _.reduce(). If the
       * values is plain object it will recurse through all the keys till it hits
       * a string, number or an array.
       *
       * @param {array} memo The stack of fields
Example #5
0
import { SavedObjectSaveModal } from 'ui/saved_objects/components/saved_object_save_modal';
import { getEditBreadcrumbs, getCreateBreadcrumbs } from '../breadcrumbs';

uiRoutes
  .when(VisualizeConstants.CREATE_PATH, {
    template: editorTemplate,
    k7Breadcrumbs: getCreateBreadcrumbs,
    resolve: {
      savedVis: function (savedVisualizations, redirectWhenMissing, $route, Private, i18n) {
        const visTypes = Private(VisTypesRegistryProvider);
        const visType = _.find(visTypes, { name: $route.current.params.type });
        const shouldHaveIndex = visType.requiresSearch && visType.options.showIndexSelection;
        const hasIndex = $route.current.params.indexPattern || $route.current.params.savedSearchId;
        if (shouldHaveIndex && !hasIndex) {
          throw new Error(
            i18n('kbn.visualize.createVisualization.noIndexPatternOrSavedSearchIdErrorMessage', {
              defaultMessage: 'You must provide either an indexPattern or a savedSearchId',
            })
          );
        }

        return savedVisualizations.get($route.current.params)
          .catch(redirectWhenMissing({
            '*': '/visualize'
          }));
      }
    }
  })
  .when(`${VisualizeConstants.EDIT_PATH}/:id`, {
    template: editorTemplate,
    k7Breadcrumbs: getEditBreadcrumbs,
Example #6
0
import { VisualizeConstants } from '../visualize_constants';
import routes from 'ui/routes';
import { VisTypesRegistryProvider } from 'ui/registry/vis_types';
import { uiModules } from 'ui/modules';
import visualizeWizardStep1Template from './step_1.html';
import visualizeWizardStep2Template from './step_2.html';

const module = uiModules.get('app/visualize', ['kibana/courier']);

/********
/** Wizard Step 1
/********/

// Redirect old route to new route.
routes.when('/visualize/step/1', {
  redirectTo: VisualizeConstants.WIZARD_STEP_1_PAGE_PATH,
});

routes.when(VisualizeConstants.WIZARD_STEP_1_PAGE_PATH, {
  template: visualizeWizardStep1Template,
  controller: 'VisualizeWizardStep1',
});

module.controller('VisualizeWizardStep1', function ($scope, $route, kbnUrl, timefilter, Private) {
  timefilter.enabled = false;

  const VisType = Private(VisVisTypeProvider);

  const visTypeCategoryToHumanReadableMap = {
    [VisType.CATEGORY.BASIC]: 'Basic Charts',
    [VisType.CATEGORY.DATA]: 'Data',
import { SingleMetricJobServiceProvider } from './create_job_service';
import { FullTimeRangeSelectorServiceProvider } from 'plugins/ml/components/full_time_range_selector/full_time_range_selector_service';
import { mlMessageBarService } from 'plugins/ml/components/messagebar/messagebar_service';
import { initPromise } from 'plugins/ml/util/promise';

import template from './create_job.html';

import { timefilter } from 'ui/timefilter';

uiRoutes
  .when('/jobs/new_job/simple/single_metric', {
    template,
    resolve: {
      CheckLicense: checkLicenseExpired,
      privileges: checkCreateJobsPrivilege,
      indexPattern: loadCurrentIndexPattern,
      savedSearch: loadCurrentSavedSearch,
      checkMlNodesAvailable,
      loadNewJobDefaults,
      initPromise: initPromise(true)
    }
  });

import { uiModules } from 'ui/modules';
const module = uiModules.get('apps/ml');

module
  .controller('MlCreateSingleMetricJob', function (
    $scope,
    $route,
    $filter,
Example #8
0
import 'plugins/kibana/management/sections/indices/_scripted_fields';
import 'plugins/kibana/management/sections/indices/source_filters/source_filters';
import 'plugins/kibana/management/sections/indices/_index_header';
import RefreshKibanaIndex from 'plugins/kibana/management/sections/indices/_refresh_kibana_index';
import UrlProvider from 'ui/url';
import IndicesEditSectionsProvider from 'plugins/kibana/management/sections/indices/_edit_sections';
import uiRoutes from 'ui/routes';
import uiModules from 'ui/modules';
import editTemplate from 'plugins/kibana/management/sections/indices/_edit.html';

uiRoutes
.when('/management/kibana/indices/:indexPatternId', {
  template: editTemplate,
  resolve: {
    indexPattern: function ($route, courier) {
      return courier.indexPatterns
        .get($route.current.params.indexPatternId)
        .catch(courier.redirectWhenMissing('/management/kibana/index'));
    }
  }
});

uiRoutes
.when('/management/kibana/indices', {
  resolve: {
    redirect: function ($location, config) {
      const defaultIndex = config.get('defaultIndex');
      let path = '/management/kibana/index';

      if (defaultIndex) {
        path = `/management/kibana/indices/${defaultIndex}`;
Example #9
0
import { getMlNodeCount } from 'plugins/ml/ml_nodes_check/check_ml_nodes';
import { FilterLists } from './filter_lists';

import uiRoutes from 'ui/routes';

const template = `
  <div class="euiSpacer euiSpacer--s" />
  <ml-nav-menu name="settings" />
  <ml-filter-lists />
`;

uiRoutes
  .when('/settings/filter_lists', {
    template,
    k7Breadcrumbs: getFilterListsBreadcrumbs,
    resolve: {
      CheckLicense: checkFullLicense,
      privileges: checkGetJobsPrivilege,
      mlNodeCount: getMlNodeCount,
    }
  });

module.directive('mlFilterLists', function () {
  return {
    restrict: 'E',
    replace: false,
    scope: {},
    link: function (element) {
      const props = {
        canCreateFilter: checkPermission('canCreateFilter'),
        canDeleteFilter: checkPermission('canDeleteFilter'),
      };
Example #10
0
import { saveAs } from '@spalger/filesaver';
import { find, flattenDeep, pluck, sortBy } from 'lodash';
import angular from 'angular';
import { savedObjectManagementRegistry } from 'plugins/kibana/management/saved_object_registry';
import objectIndexHTML from 'plugins/kibana/management/sections/objects/_objects.html';
import 'ui/directives/file_upload';
import uiRoutes from 'ui/routes';
import { SavedObjectsClientProvider } from 'ui/saved_objects';
import { uiModules } from 'ui/modules';

uiRoutes
.when('/management/kibana/objects', {
  template: objectIndexHTML
});

uiRoutes
.when('/management/kibana/objects/:service', {
  redirectTo: '/management/kibana/objects'
});

uiModules.get('apps/management')
.directive('kbnManagementObjects', function (kbnIndex, Notifier, Private, kbnUrl, Promise, confirmModal) {
  const savedObjectsClient = Private(SavedObjectsClientProvider);

  return {
    restrict: 'E',
    controllerAs: 'managementObjectsController',
    controller: function ($scope, $injector, $q, AppState) {
      const notify = new Notifier({ location: 'Saved Objects' });

      // TODO: Migrate all scope variables to the controller.
Example #11
0
import 'ui/autoload/styles';
import chrome from 'ui/chrome';
import { hashUrl } from 'ui/state_management/state_hashing';
import uiRoutes from 'ui/routes';

uiRoutes.enable();
uiRoutes
  .when('/', {
    resolve: {
      url: function (AppState, globalState, $window) {
        const redirectUrl = chrome.getInjected('redirectUrl');

        const hashedUrl = hashUrl([new AppState(), globalState], redirectUrl);
        const url = chrome.addBasePath(hashedUrl);

        $window.location = url;
      }
    }
  });
Example #12
0
 * you may not use this file except in compliance with the Elastic License.
 */
import React from 'react';
import { render, unmountComponentAtNode } from 'react-dom';
import routes from 'ui/routes';
import template from 'plugins/security/views/management/roles_grid/roles.html';
import { ROLES_PATH } from '../management_urls';
import { getRolesBreadcrumbs } from '../breadcrumbs';
import { I18nContext } from 'ui/i18n';
import { RolesGridPage } from './components';

routes.when(ROLES_PATH, {
  template,
  k7Breadcrumbs: getRolesBreadcrumbs,
  controller($scope) {
    $scope.$$postDigest(() => {
      const domNode = document.getElementById('rolesGridReactRoot');

      render(
        <I18nContext>
          <RolesGridPage />
        </I18nContext>, domNode);

      // unmount react on controller destroy
      $scope.$on('$destroy', () => {
        unmountComponentAtNode(domNode);
      });
    });
  },
});
Example #13
0
app.directive('homeApp', function (reactDirective) {
  return reactDirective(HomeApp);
});

function getRoute() {
  return {
    template,
    controller($scope, config, indexPatterns, Private) {
      $scope.addBasePath = chrome.addBasePath;
      $scope.directories = Private(FeatureCatalogueRegistryProvider).inTitleOrder;
      $scope.recentlyAccessed = recentlyAccessed.get().map(item => {
        item.link = chrome.addBasePath(item.link);
        return item;
      });
      $scope.getConfig = (...args) => config.get(...args);
      $scope.setConfig = (...args) => config.set(...args);
      $scope.clearIndexPatternsCache = () => {
        const getter = indexPatterns.getIds;
        getter.clearCache();
      };
    }
  };
}

// All routing will be handled inside HomeApp via react, we just need to make sure angular doesn't
// redirect us to the default page by encountering a url it isn't marked as being able to handle.
routes.when('/home', getRoute());
routes.when('/home/feature_directory', getRoute());
routes.when('/home/tutorial_directory/:tab?', getRoute());
routes.when('/home/tutorial/:id', getRoute());
Example #14
0
uiRoutes.when('/apm/instances', {
  template,
  resolve: {
    clusters: function (Private) {
      const routeInit = Private(routeInitProvider);
      return routeInit();
    },
  },
  controller: class extends MonitoringViewBaseEuiTableController {
    constructor($injector, $scope, i18n) {
      const $route = $injector.get('$route');
      const globalState = $injector.get('globalState');
      $scope.cluster = find($route.current.locals.clusters, {
        cluster_uuid: globalState.cluster_uuid
      });

      super({
        title: i18n('xpack.monitoring.apm.instances.routeTitle', {
          defaultMessage: '{apm} - Instances',
          values: {
            apm: 'APM'
          }
        }),
        storageKey: 'apm.instances',
        api: `../api/monitoring/v1/clusters/${globalState.cluster_uuid}/apm/instances`,
        defaultData: {},
        reactNodeId: 'apmInstancesReact',
        $scope,
        $injector
      });

      $scope.$watch(() => this.data, data => {
        this.renderReact(data);
      });
    }

    renderReact(data) {
      const {
        pagination,
        sorting,
        onTableChange,
      } = this;

      const component = (
        <I18nContext>
          <ApmServerInstances
            apms={{
              pagination,
              sorting,
              onTableChange,
              data,
            }}
          />
        </I18nContext>
      );
      super.renderReact(component);
    }
  }
});
Example #15
0
uiRoutes.when('/kibana', {
  template,
  resolve: {
    clusters: function (Private) {
      const routeInit = Private(routeInitProvider);
      return routeInit();
    },
    pageData: getPageData
  },
  controller($injector, $scope) {
    timefilter.enableTimeRangeSelector();
    timefilter.enableAutoRefreshSelector();

    const $route = $injector.get('$route');
    const globalState = $injector.get('globalState');
    $scope.cluster = find($route.current.locals.clusters, { cluster_uuid: globalState.cluster_uuid });
    $scope.pageData = $route.current.locals.pageData;

    const title = $injector.get('title');
    title($scope.cluster, 'Kibana');

    const $executor = $injector.get('$executor');
    $executor.register({
      execute: () => getPageData($injector),
      handleResponse: (response) => $scope.pageData = response
    });

    $executor.start($scope);

    $scope.$on('$destroy', $executor.destroy);
  }
});
Example #16
0
uiRoutes.when('/elasticsearch/ml_jobs', {
  template,
  resolve: {
    clusters: function (Private) {
      const routeInit = Private(routeInitProvider);
      return routeInit();
    },
    pageData: getPageData
  },
  controllerAs: 'mlJobs',
  controller: class MlJobsList extends MonitoringViewBaseEuiTableController {

    constructor($injector, $scope, i18n) {
      super({
        title: i18n('xpack.monitoring.elasticsearch.mlJobs.routeTitle', {
          defaultMessage: 'Elasticsearch - Machine Learning Jobs'
        }),
        storageKey: 'elasticsearch.mlJobs',
        getPageData,
        $scope,
        $injector
      });

      const $route = $injector.get('$route');
      this.data = $route.current.locals.pageData;
      const globalState = $injector.get('globalState');
      $scope.cluster = find($route.current.locals.clusters, { cluster_uuid: globalState.cluster_uuid });
    }
  }
});
Example #17
0
  uiRoutes.enable();
}

uiRoutes
  .when('/home', {
    template: appTemplate,
    k7Breadcrumbs: getHomeBreadcrumbs,
    resolve: {
      //Copied from example found in wizard.js ( Kibana TODO - can't
      // IndexPatternsProvider abstract these implementation details better?)
      indexPatterns: function (Private) {
        const savedObjectsClient = Private(SavedObjectsClientProvider);

        return savedObjectsClient.find({
          type: 'index-pattern',
          fields: ['title', 'type'],
          perPage: 10000
        }).then(response => response.savedObjects);
      },
      GetIndexPatternProvider: function (Private) {
        return Private(IndexPatternsProvider);
      },
      SavedWorkspacesProvider: function (Private) {
        return Private(SavedWorkspacesProvider);
      },
      CheckLicense: checkLicense
    }
  })
  .when('/workspace/:id', {
    template: appTemplate,
    k7Breadcrumbs: getWorkspaceBreadcrumbs,
Example #18
0
File: app.js Project: Jaaess/kibana
import 'ace';
import 'angular-ui-ace';
import 'plugins/searchprofiler/directives';
import { Range } from './range';
import { nsToPretty } from 'plugins/searchprofiler/filters/ns_to_pretty';
import { msToPretty } from 'plugins/searchprofiler/filters/ms_to_pretty';
import { checkForParseErrors } from 'plugins/searchprofiler/app_util.js';

// Styles and templates
import 'ui/autoload/all';
import './less/main.less';
import template from './templates/index.html';
import { defaultQuery } from './templates/default_query';

uiRoutes.when('/dev_tools/searchprofiler', {
  template: template
});

uiModules
  .get('app/searchprofiler', ['ui.bootstrap.buttons', 'ui.ace'])
  .controller('profileViz', profileVizController)
  .filter('nsToPretty', () => nsToPretty)
  .filter('msToPretty', () => msToPretty)
  .factory('HighlightService', () => {
    const service = {
      details: null
    };
    return service;
  });

function profileVizController($scope, $route, $interval, $http, HighlightService, Private) {
Example #19
0
import 'ui/field_editor';
import 'plugins/kibana/settings/sections/indices/_index_header';
import IndexPatternsFieldProvider from 'ui/index_patterns/_field';
import UrlProvider from 'ui/url';
import uiRoutes from 'ui/routes';
import fieldEditorTemplate from 'plugins/kibana/settings/sections/indices/_field_editor.html';

uiRoutes
.when('/settings/indices/:indexPatternId/field/:fieldName', { mode: 'edit' })
.when('/settings/indices/:indexPatternId/create-field/', { mode: 'create' })
.defaults(/settings\/indices\/[^\/]+\/(field|create-field)(\/|$)/, {
  template: fieldEditorTemplate,
  resolve: {
    indexPattern: function ($route, courier) {
      return courier.indexPatterns.get($route.current.params.indexPatternId)
      .catch(courier.redirectWhenMissing('/settings/indices'));
    }
  },
  controllerAs: 'fieldSettings',
  controller: function FieldEditorPageController($route, Private, Notifier, docTitle) {
    const Field = Private(IndexPatternsFieldProvider);
    const notify = new Notifier({ location: 'Field Editor' });
    const kbnUrl = Private(UrlProvider);


    this.mode = $route.current.mode;
    this.indexPattern = $route.current.locals.indexPattern;


    if (this.mode === 'edit') {
      const fieldName = $route.current.params.fieldName;
Example #20
0
    elem
  );
};

routes.when(`${EDIT_USERS_PATH}/:username?`, {
  template,
  k7Breadcrumbs: ($injector, $route) => $injector.invoke(
    $route.current.params.username
      ? getEditUserBreadcrumbs
      : getCreateUserBreadcrumbs
  ),
  controllerAs: 'editUser',
  controller($scope, $route, kbnUrl, $http) {
    $scope.$on('$destroy', () => {
      const elem = document.getElementById('editUserReactRoot');
      if (elem) {
        unmountComponentAtNode(elem);
      }
    });
    $scope.$$postDigest(() => {
      const elem = document.getElementById('editUserReactRoot');
      const username = $route.current.params.username;
      const changeUrl = (url) => {
        kbnUrl.change(url);
        $scope.$apply();
      };
      renderReact(elem, $http, changeUrl, username);
    });
  },
});
Example #21
0
/*
 * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
 * or more contributor license agreements. Licensed under the Elastic License;
 * you may not use this file except in compliance with the Elastic License.
 */

import uiRoutes from 'ui/routes';
import { routeInitProvider } from 'plugins/monitoring/lib/route_init';
import template from './index.html';
import { ElasticsearchOverviewController } from './controller';

uiRoutes.when('/elasticsearch', {
  template,
  resolve: {
    clusters(Private) {
      const routeInit = Private(routeInitProvider);
      return routeInit();
    }
  },
  controllerAs: 'elasticsearchOverview',
  controller: ElasticsearchOverviewController
});
Example #22
0
import 'plugins/kibana/visualize/styles/main.less';
import 'plugins/kibana/visualize/editor/editor';
import 'plugins/kibana/visualize/wizard/wizard';
import 'plugins/kibana/visualize/editor/add_bucket_agg';
import 'plugins/kibana/visualize/editor/agg';
import 'plugins/kibana/visualize/editor/agg_add';
import 'plugins/kibana/visualize/editor/agg_filter';
import 'plugins/kibana/visualize/editor/agg_group';
import 'plugins/kibana/visualize/editor/agg_param';
import 'plugins/kibana/visualize/editor/agg_params';
import 'plugins/kibana/visualize/editor/nesting_indicator';
import 'plugins/kibana/visualize/editor/sidebar';
import 'plugins/kibana/visualize/editor/vis_options';
import 'plugins/kibana/visualize/saved_visualizations/_saved_vis';
import 'plugins/kibana/visualize/saved_visualizations/saved_visualizations';
import uiRoutes from 'ui/routes';


uiRoutes
.when('/visualize', {
  redirectTo: '/visualize/step/1'
});

// preloading

require('ui/saved_objects/saved_object_registry')
.register(require('plugins/kibana/visualize/saved_visualizations/saved_visualization_register'));

Example #23
0
uiRoutes.when('/management/kibana/index', {
  template: angularTemplate,
  controller: function ($scope, $injector) {
    // Wait for the directives to execute
    const kbnUrl = $injector.get('kbnUrl');
    $scope.$$postDigest(() => {
      const $routeParams = $injector.get('$routeParams');
      const services = {
        config: $injector.get('config'),
        es: $injector.get('es'),
        indexPatterns: $injector.get('indexPatterns'),
        savedObjectsClient: $injector.get('Private')(SavedObjectsClientProvider),
        changeUrl: url => {
          $scope.$evalAsync(() => kbnUrl.changePath(url));
        },
      };

      const initialQuery = $routeParams.id ? decodeURIComponent($routeParams.id) : undefined;

      renderCreateIndexPatternWizard(
        documentationLinks.indexPatterns.loadingData,
        initialQuery,
        services
      );
    });

    $scope.$on('$destroy', destroyCreateIndexPatternWizard);
  }
});
Example #24
0
/*
 * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
 * or more contributor license agreements. Licensed under the Elastic License;
 * you may not use this file except in compliance with the Elastic License.
 */

import uiRoutes from 'ui/routes';
import template from './index.html';
import { NoDataController } from './controller';
uiRoutes
  .when('/no-data', {
    template,
    resolve: {
      clusters: $injector => {
        const monitoringClusters = $injector.get('monitoringClusters');
        const kbnUrl = $injector.get('kbnUrl');

        return monitoringClusters().then(clusters => {
          if (clusters && clusters.length) {
            kbnUrl.changePath('/home');
            return Promise.reject();
          }
          return Promise.resolve();
        });
      }
    },
    controller: NoDataController
  })
  .otherwise({ redirectTo: '/home' });
Example #25
0
routes.when(`${EDIT_ROLES_PATH}/:name?`, {
  template,
  k7Breadcrumbs: ($injector, $route) => $injector.invoke(
    $route.current.params.name
      ? getEditRoleBreadcrumbs
      : getCreateRoleBreadcrumbs
  ),
  resolve: {
    role($route, ShieldRole, kbnUrl, Promise, Notifier) {
      const name = $route.current.params.name;

      let role;

      if (name != null) {
        role = ShieldRole.get({ name }).$promise
          .catch((response) => {

            if (response.status !== 404) {
              return fatalError(response);
            }

            const notifier = new Notifier();
            notifier.error(`No "${name}" role found.`);
            kbnUrl.redirect(ROLES_PATH);
            return Promise.halt();
          });

      } else {
        role = Promise.resolve(new ShieldRole({
          elasticsearch: {
            cluster: [],
            indices: [],
            run_as: [],
          },
          kibana: {
            global: [],
            space: {},
          },
          _unrecognized_applications: [],
        }));
      }

      return role.then(res => res.toJSON());
    },
    users(ShieldUser, kbnUrl, Promise, Private) {
      // $promise is used here because the result is an ngResource, not a promise itself
      return ShieldUser.query().$promise
        .then(users => _.map(users, 'username'))
        .catch(checkLicenseError(kbnUrl, Promise, Private));
    },
    indexPatterns(Private) {
      const indexPatterns = Private(IndexPatternsProvider);
      return indexPatterns.getTitles();
    },
    spaces($http, chrome, spacesEnabled) {
      if (spacesEnabled) {
        return new SpacesManager($http, chrome).getSpaces();
      }
      return [];
    }
  },
  controllerAs: 'editRole',
  controller($injector, $scope, $http, enableSpaceAwarePrivileges) {
    const $route = $injector.get('$route');
    const Private = $injector.get('Private');

    const role = $route.current.locals.role;

    const xpackInfo = Private(XPackInfoProvider);
    const userProfile = Private(UserProfileProvider);
    const allowDocumentLevelSecurity = xpackInfo.get('features.security.allowRoleDocumentLevelSecurity');
    const allowFieldLevelSecurity = xpackInfo.get('features.security.allowRoleFieldLevelSecurity');
    const rbacApplication = chrome.getInjected('rbacApplication');

    if (role.elasticsearch.indices.length === 0) {
      const emptyOption = {
        names: [],
        privileges: []
      };

      if (allowFieldLevelSecurity) {
        emptyOption.field_security = {
          grant: ['*']
        };
      }

      if (allowDocumentLevelSecurity) {
        emptyOption.query = '';
      }

      role.elasticsearch.indices.push(emptyOption);
    }

    const {
      users,
      indexPatterns,
      spaces,
    } = $route.current.locals;

    $scope.$$postDigest(() => {
      const domNode = document.getElementById('editRoleReactRoot');

      render(
        <I18nContext>
          <EditRolePage
            runAsUsers={users}
            role={role}
            kibanaAppPrivileges={KibanaAppPrivileges}
            indexPatterns={indexPatterns}
            rbacEnabled={true}
            rbacApplication={rbacApplication}
            httpClient={$http}
            allowDocumentLevelSecurity={allowDocumentLevelSecurity}
            allowFieldLevelSecurity={allowFieldLevelSecurity}
            spaces={spaces}
            spacesEnabled={enableSpaceAwarePrivileges}
            userProfile={userProfile}
          />
        </I18nContext>, domNode);

      // unmount react on controller destroy
      $scope.$on('$destroy', () => {
        unmountComponentAtNode(domNode);
      });
    });
  }
});
Example #26
0
uiRoutes.when('/kibana/instances', {
  template,
  resolve: {
    clusters(Private) {
      const routeInit = Private(routeInitProvider);
      return routeInit();
    },
    pageData: getPageData,
  },
  controllerAs: 'kibanas',
  controller: class KibanaInstancesList extends MonitoringViewBaseEuiTableController {

    constructor($injector, $scope) {
      super({
        title: 'Kibana Instances',
        storageKey: 'kibana.instances',
        getPageData,
        reactNodeId: 'monitoringKibanaInstancesApp',
        $scope,
        $injector
      });

      const kbnUrl = $injector.get('kbnUrl');

      $scope.$watch(() => this.data, data => {
        if (!data || !data.kibanas) {
          return;
        }

        const dataFlattened = data.kibanas.map(item => ({
          ...item,
          name: item.kibana.name,
          status: item.kibana.status,
        }));

        this.renderReact(
          <I18nContext>
            <EuiPage>
              <EuiPageBody>
                <EuiPanel>
                  <ClusterStatus stats={$scope.pageData.clusterStatus} />
                </EuiPanel>
                <EuiSpacer size="m" />
                <EuiPageContent>
                  <EuiMonitoringTable
                    className="kibanaInstancesTable"
                    rows={dataFlattened}
                    columns={getColumns(kbnUrl, $scope)}
                    sorting={this.sorting}
                    pagination={this.pagination}
                    search={{
                      box: {
                        incremental: true,
                        placeholder: i18n.translate('xpack.monitoring.kibana.listing.filterInstancesPlaceholder', {
                          defaultMessage: 'Filter Instances…'
                        })
                      },
                    }}
                    onTableChange={this.onTableChange}
                    executeQueryOptions={{
                      defaultFields: ['name']
                    }}
                  />

                </EuiPageContent>
              </EuiPageBody>
            </EuiPage>
          </I18nContext>
        );
      });
    }
  }
});
Example #27
0
      fields: ['title', 'type'],
      perPage: 10000
    }).then(response => response.savedObjects);
  }
};

// add a dependency to all of the subsection routes
uiRoutes
  .defaults(/management\/kibana\/(index_patterns|index_pattern)/, {
    resolve: indexPatternsResolutions,
    requireUICapability: 'management.kibana.index_patterns',
  });

uiRoutes
  .when('/management/kibana/index_patterns', {
    template: indexPatternListTemplate,
    k7Breadcrumbs: getListBreadcrumbs
  });

// wrapper directive, which sets some global stuff up like the left nav
uiModules.get('apps/management')
  .directive('kbnManagementIndexPatterns', function ($route, config, kbnUrl, Private) {
    return {
      restrict: 'E',
      transclude: true,
      template: indexTemplate,
      link: async function ($scope) {
        const indexPatternListProvider = Private(IndexPatternListFactory)();
        const indexPatternCreationProvider = Private(IndexPatternCreationFactory)();
        const indexPatternCreationOptions = await indexPatternCreationProvider.getIndexPatternCreationOptions((url) => {
          $scope.$evalAsync(() => kbnUrl.change(url));
import template from './timeseriesexplorer.html';
import { getMlNodeCount } from 'plugins/ml/ml_nodes_check/check_ml_nodes';
import { ml } from 'plugins/ml/services/ml_api_service';
import { mlJobService } from 'plugins/ml/services/job_service';
import { mlFieldFormatService } from 'plugins/ml/services/field_format_service';
import { JobSelectServiceProvider } from 'plugins/ml/components/job_select_list/job_select_service';
import { mlForecastService } from 'plugins/ml/services/forecast_service';
import { mlTimeSeriesSearchService } from 'plugins/ml/timeseriesexplorer/timeseries_search_service';
import { initPromise } from 'plugins/ml/util/promise';

uiRoutes
  .when('/timeseriesexplorer/?', {
    template,
    resolve: {
      CheckLicense: checkLicense,
      privileges: checkGetJobsPrivilege,
      indexPatterns: loadIndexPatterns,
      mlNodeCount: getMlNodeCount,
      initPromise: initPromise(true)
    }
  });

import { uiModules } from 'ui/modules';
const module = uiModules.get('apps/ml');

module.controller('MlTimeSeriesExplorerController', function (
  $scope,
  $route,
  $timeout,
  Private,
  AppState,
 * Controller for the first step in the Create Job wizard, allowing the user to
 * select the Kibana index pattern or saved search to use for creating a job.
 */

import uiRoutes from 'ui/routes';
import { checkLicenseExpired } from 'plugins/ml/license/check_license';
import { preConfiguredJobRedirect } from 'plugins/ml/jobs/new_job/wizard/preconfigured_job_redirect';
import { checkCreateJobsPrivilege } from 'plugins/ml/privilege/check_privilege';
import { loadIndexPatterns, getIndexPatterns } from 'plugins/ml/util/index_utils';
import { checkMlNodesAvailable } from 'plugins/ml/ml_nodes_check/check_ml_nodes';
import { initPromise } from 'plugins/ml/util/promise';
import template from './index_or_search.html';
import { timefilter } from 'ui/timefilter';

uiRoutes
  .when('/jobs/new_job', {
    redirectTo: '/jobs/new_job/step/index_or_search'
  });

uiRoutes
  .when('/jobs/new_job/step/index_or_search', {
    template,
    resolve: {
      CheckLicense: checkLicenseExpired,
      privileges: checkCreateJobsPrivilege,
      indexPatterns: loadIndexPatterns,
      preConfiguredJobRedirect,
      checkMlNodesAvailable,
      initPromise: initPromise(true)
    }
  });
Example #30
0
  routes.when(`${BASE_PATH}/:section?/:view?/:id?`, {
    template: template,
    controllerAs: 'ccr',
    controller: class CrossClusterReplicationController {
      constructor($scope, $route, $http) {
        /**
         * React-router's <Redirect> does not play well with the angular router. It will cause this controller
         * to re-execute without the $destroy handler being called. This means that the app will be mounted twice
         * creating a memory leak when leaving (only 1 app will be unmounted).
         * To avoid this, we unmount the React app each time we enter the controller.
         */
        unmountReactApp();

        // NOTE: We depend upon Angular's $http service because it's decorated with interceptors,
        // e.g. to check license status per request.
        setHttpClient($http);

        $scope.$$postDigest(() => {
          elem = document.getElementById(CCR_REACT_ROOT);
          renderReact(elem);

          // Angular Lifecycle
          const appRoute = $route.current;
          const stopListeningForLocationChange = $scope.$on('$locationChangeSuccess', () => {
            const currentRoute = $route.current;
            const isNavigationInApp = currentRoute.$$route.template === appRoute.$$route.template;

            // When we navigate within CCR, prevent Angular from re-matching the route and rebuild the app
            if (isNavigationInApp) {
              $route.current = appRoute;
            } else {
              // Any clean up when User leaves the CCR
            }

            $scope.$on('$destroy', () => {
              stopListeningForLocationChange && stopListeningForLocationChange();
              unmountReactApp();
            });
          });
        });
      }
    }
  });