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
118 lines (95 loc) • 3.61 kB
JavaScript
/**
* @name AppState
*
* @extends State
*
* @description Inherits State, which inherits Events. This class seems to be
* concerned with mapping "props" to PersistedState instances, and surfacing the
* ability to destroy those mappings.
*/
import _ from 'lodash';
import modules from 'ui/modules';
import StateManagementStateProvider from 'ui/state_management/state';
import PersistedStatePersistedStateProvider from 'ui/persisted_state/persisted_state';
let urlParam = '_a';
function AppStateProvider(Private, $rootScope, $location) {
let State = Private(StateManagementStateProvider);
let PersistedState = Private(PersistedStatePersistedStateProvider);
let persistedStates;
let eventUnsubscribers;
_.class(AppState).inherits(State);
function AppState(defaults) {
// Initialize persistedStates. This object maps "prop" names to
// PersistedState instances. These are used to make properties "stateful".
persistedStates = {};
// Initialize eventUnsubscribers. These will be called in `destroy`, to
// remove handlers for the 'change' and 'fetch_with_changes' events which
// are dispatched via the rootScope.
eventUnsubscribers = [];
AppState.Super.call(this, urlParam, defaults);
AppState.getAppState._set(this);
}
// if the url param is missing, write it back
AppState.prototype._persistAcrossApps = false;
AppState.prototype.destroy = function () {
AppState.Super.prototype.destroy.call(this);
AppState.getAppState._set(null);
_.callEach(eventUnsubscribers);
};
/**
* @returns PersistedState instance.
*/
AppState.prototype.makeStateful = function (prop) {
if (persistedStates[prop]) return persistedStates[prop];
let self = this;
// set up the ui state
persistedStates[prop] = new PersistedState();
// update the app state when the stateful instance changes
let updateOnChange = function () {
let replaceState = false; // TODO: debouncing logic
self[prop] = persistedStates[prop].getChanges();
// Save state to the URL.
self.save(replaceState);
};
let handlerOnChange = (method) => persistedStates[prop][method]('change', updateOnChange);
handlerOnChange('on');
eventUnsubscribers.push(() => handlerOnChange('off'));
// update the stateful object when the app state changes
let persistOnChange = function (changes) {
if (!changes) return;
if (changes.indexOf(prop) !== -1) {
persistedStates[prop].set(self[prop]);
}
};
let handlePersist = (method) => this[method]('fetch_with_changes', persistOnChange);
handlePersist('on');
eventUnsubscribers.push(() => handlePersist('off'));
// if the thing we're making stateful has an appState value, write to persisted state
if (self[prop]) persistedStates[prop].setSilent(self[prop]);
return persistedStates[prop];
};
AppState.getAppState = (function () {
let currentAppState;
function get() {
return currentAppState;
}
// Checks to see if the appState might already exist, even if it hasn't been newed up
get.previouslyStored = function () {
let search = $location.search();
return search[urlParam] ? true : false;
};
get._set = function (current) {
currentAppState = current;
};
return get;
}());
return AppState;
}
modules.get('kibana/global_state')
.factory('AppState', function (Private) {
return Private(AppStateProvider);
})
.service('getAppState', function (Private) {
return Private(AppStateProvider).getAppState;
});
export default AppStateProvider;