UNPKG

kibana-123

Version:

Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch. Kibana is a snap to setup and start using. Kibana strives to be easy to get started with, while also being flexible and powerful, just like Elastic

186 lines (152 loc) 5.03 kB
/** * @name Vis * * @description This class consists of aggs, params, listeners, title, and type. * - Aggs: Instances of AggConfig. * - Params: The settings in the Options tab. * * Not to be confused with vislib/vis.js. */ import _ from 'lodash'; import AggTypesIndexProvider from 'ui/agg_types/index'; import RegistryVisTypesProvider from 'ui/registry/vis_types'; import VisAggConfigsProvider from 'ui/vis/agg_configs'; import PersistedStateProvider from 'ui/persisted_state/persisted_state'; export default function VisFactory(Notifier, Private) { let aggTypes = Private(AggTypesIndexProvider); let visTypes = Private(RegistryVisTypesProvider); let AggConfigs = Private(VisAggConfigsProvider); const PersistedState = Private(PersistedStateProvider); let notify = new Notifier({ location: 'Vis' }); function Vis(indexPattern, state, uiState) { state = state || {}; if (_.isString(state)) { state = { type: state }; } this.indexPattern = indexPattern; this.setState(state); this.setUiState(uiState); } Vis.convertOldState = function (type, oldState) { if (!type || _.isString(type)) { type = visTypes.byName[type || 'histogram']; } let schemas = type.schemas; // This was put in place to do migrations at runtime. It's used to support people who had saved // visualizations during the 4.0 betas. let aggs = _.transform(oldState, function (newConfigs, oldConfigs, oldGroupName) { let schema = schemas.all.byName[oldGroupName]; if (!schema) { notify.log('unable to match old schema', oldGroupName, 'to a new schema'); return; } oldConfigs.forEach(function (oldConfig) { let agg = { schema: schema.name, type: oldConfig.agg }; let aggType = aggTypes.byName[agg.type]; if (!aggType) { notify.log('unable to find an agg type for old confg', oldConfig); return; } agg.params = _.pick(oldConfig, _.keys(aggType.params.byName)); newConfigs.push(agg); }); }, []); return { type: type, aggs: aggs }; }; Vis.prototype.type = 'histogram'; Vis.prototype.setState = function (state) { this.title = state.title || ''; this.type = state.type || this.type; if (_.isString(this.type)) this.type = visTypes.byName[this.type]; this.listeners = _.assign({}, state.listeners, this.type.listeners); this.params = _.defaults({}, _.cloneDeep(state.params || {}), _.cloneDeep(this.type.params.defaults || {}) ); this.aggs = new AggConfigs(this, state.aggs); }; Vis.prototype.getStateInternal = function (includeDisabled) { return { title: this.title, type: this.type.name, params: this.params, aggs: this.aggs .filter(agg => includeDisabled || agg.enabled) .map(agg => agg.toJSON()) .filter(Boolean), listeners: this.listeners }; }; Vis.prototype.getEnabledState = function () { return this.getStateInternal(false); }; Vis.prototype.getState = function () { return this.getStateInternal(true); }; Vis.prototype.createEditableVis = function () { return this._editableVis || (this._editableVis = this.clone()); }; Vis.prototype.getEditableVis = function () { return this._editableVis || undefined; }; Vis.prototype.clone = function () { const uiJson = this.hasUiState() ? this.getUiState().toJSON() : {}; return new Vis(this.indexPattern, this.getState(), uiJson); }; Vis.prototype.requesting = function () { // Invoke requesting() on each agg. Aggs is an instance of AggConfigs. _.invoke(this.aggs.getRequestAggs(), 'requesting'); }; Vis.prototype.isHierarchical = function () { if (_.isFunction(this.type.hierarchicalData)) { return !!this.type.hierarchicalData(this); } else { return !!this.type.hierarchicalData; } }; Vis.prototype.hasSchemaAgg = function (schemaName, aggTypeName) { let aggs = this.aggs.bySchemaName[schemaName] || []; return aggs.some(function (agg) { if (!agg.type || !agg.type.name) return false; return agg.type.name === aggTypeName; }); }; Vis.prototype.hasUiState = function () { return !!this.__uiState; }; Vis.prototype.setUiState = function (uiState) { if (uiState instanceof PersistedState) { this.__uiState = uiState; } }; Vis.prototype.getUiState = function () { return this.__uiState; }; Vis.prototype.implementsRenderComplete = function () { return this.type.implementsRenderComplete; }; /** * Currently this is only used to extract map-specific information * (e.g. mapZoom, mapCenter). */ Vis.prototype.uiStateVal = function (key, val) { if (this.hasUiState()) { if (_.isUndefined(val)) { return this.__uiState.get(key); } return this.__uiState.set(key, val); } return val; }; return Vis; };