Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Visualize] Remove global state in visualize #58352

Merged
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,10 @@
* directly where they are needed.
*/

export { State } from 'ui/state_management/state';
// @ts-ignore
export { GlobalStateProvider } from 'ui/state_management/global_state';
// @ts-ignore
export { StateManagementConfigProvider } from 'ui/state_management/config_provider';
export { PersistedState } from 'ui/persisted_state';

export { subscribeWithScope } from 'ui/utils/subscribe_with_scope';
// @ts-ignore
export { EventsProvider } from 'ui/events';
// @ts-ignore
export { createTopNavDirective, createTopNavHelper } from 'ui/kbn_top_nav/kbn_top_nav';
export { registerTimefilterWithGlobalStateFactory } from 'ui/timefilter/setup_router';
// @ts-ignore
export { KbnUrlProvider, RedirectWhenMissingProvider } from 'ui/url';
export { absoluteToParsedUrl } from 'ui/url/absolute_to_parsed_url';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,11 @@ import {
configureAppAngularModule,
createTopNavDirective,
createTopNavHelper,
EventsProvider,
GlobalStateProvider,
KbnUrlProvider,
RedirectWhenMissingProvider,
IPrivate,
PersistedState,
PrivateProvider,
PromiseServiceCreator,
StateManagementConfigProvider,
} from '../legacy_imports';
import { NavigationPublicPluginStart as NavigationStart } from '../../../../../../plugins/navigation/public';

Expand Down Expand Up @@ -87,71 +83,27 @@ function createLocalAngularModule(core: AppMountContext['core'], navigation: Nav
createLocalI18nModule();
createLocalPrivateModule();
createLocalPromiseModule();
createLocalConfigModule(core);
createLocalKbnUrlModule();
createLocalStateModule();
createLocalPersistedStateModule();
createLocalTopNavModule(navigation);

const visualizeAngularModule: IModule = angular.module(moduleName, [
...thirdPartyAngularDependencies,
'app/visualize/Config',
'app/visualize/I18n',
'app/visualize/Private',
'app/visualize/PersistedState',
'app/visualize/TopNav',
'app/visualize/State',
'app/visualize/KbnUrl',
'app/visualize/Promise',
]);
return visualizeAngularModule;
}

function createLocalStateModule() {
angular
.module('app/visualize/State', [
'app/visualize/Private',
'app/visualize/Config',
'app/visualize/KbnUrl',
'app/visualize/Promise',
'app/visualize/PersistedState',
])
.service('globalState', function(Private: IPrivate) {
return Private(GlobalStateProvider);
});
}

function createLocalPersistedStateModule() {
angular
.module('app/visualize/PersistedState', ['app/visualize/Private', 'app/visualize/Promise'])
.factory('PersistedState', (Private: IPrivate) => {
const Events = Private(EventsProvider);
return class AngularPersistedState extends PersistedState {
constructor(value: any, path: any) {
super(value, path, Events);
}
};
});
}

function createLocalKbnUrlModule() {
angular
.module('app/visualize/KbnUrl', ['app/visualize/Private', 'ngRoute'])
.service('kbnUrl', (Private: IPrivate) => Private(KbnUrlProvider))
.service('redirectWhenMissing', (Private: IPrivate) => Private(RedirectWhenMissingProvider));
}

function createLocalConfigModule(core: AppMountContext['core']) {
angular
.module('app/visualize/Config', ['app/visualize/Private'])
.provider('stateManagementConfig', StateManagementConfigProvider)
.provider('config', () => {
return {
$get: () => ({
get: core.uiSettings.get.bind(core.uiSettings),
}),
};
});
}

function createLocalPromiseModule() {
angular.module('app/visualize/Promise', []).service('Promise', PromiseServiceCreator);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
import angular from 'angular';
import _ from 'lodash';
import { Subscription } from 'rxjs';
import { map } from 'rxjs/operators';
import { i18n } from '@kbn/i18n';
import { createHashHistory } from 'history';

import React from 'react';
import { FormattedMessage } from '@kbn/i18n/react';
Expand All @@ -29,13 +31,16 @@ import { VisualizeConstants } from '../visualize_constants';
import { getEditBreadcrumbs } from '../breadcrumbs';

import { addHelpMenuToAppChrome } from '../help_menu/help_menu_util';
import { FilterStateManager } from '../../../../../data/public';
import { unhashUrl } from '../../../../../../../plugins/kibana_utils/public';
import {
unhashUrl,
createKbnUrlStateStorage,
} from '../../../../../../../plugins/kibana_utils/public';
import { kbnBaseUrl } from '../../../../../../../plugins/kibana_legacy/public';
import {
SavedObjectSaveModal,
showSaveModal,
} from '../../../../../../../plugins/saved_objects/public';
import { syncAppFilters, syncQuery } from '../../../../../../../plugins/data/public';

import { initVisEditorDirective } from './visualization_editor';
import { initVisualizationDirective } from './visualization';
Expand Down Expand Up @@ -65,28 +70,19 @@ export function initEditorDirective(app, deps) {

function VisualizeAppController(
$scope,
$element,
$route,
$window,
$injector,
$timeout,
kbnUrl,
redirectWhenMissing,
Promise,
globalState,
config
redirectWhenMissing
) {
const {
indexPatterns,
localStorage,
visualizeCapabilities,
share,
data: {
query: {
filterManager,
timefilter: { timefilter },
},
},
data: { query: queryService },
toastNotifications,
chrome,
getBasePath,
Expand All @@ -97,6 +93,19 @@ function VisualizeAppController(
setActiveUrl,
} = getServices();

const kbnUrlStateStorage = createKbnUrlStateStorage({
history: createHashHistory(),
useHash: uiSettings.get('state:storeInSessionStorage'),
});

const {
filterManager,
timefilter: { timefilter },
} = queryService;

// syncs `_g` portion of url with query services
const { stop: stopSyncingGlobalStateWithUrl } = syncQuery(queryService, kbnUrlStateStorage);

// Retrieve the resolved SavedVis instance.
const savedVis = $route.current.locals.savedVis;
const _applyVis = () => {
Expand Down Expand Up @@ -283,27 +292,16 @@ function VisualizeAppController(
linked: !!savedVis.savedSearchId,
};

const useHash = config.get('state:storeInSessionStorage');
const { stateContainer, stopStateSync } = useVisualizeAppState({
useHash,
stateDefaults,
kbnUrlStateStorage,
});

const filterStateManager = new FilterStateManager(
globalState,
() => {
// Temporary AppState replacement
return {
set filters(_filters) {
stateContainer.transitions.set('filters', _filters);
},
get filters() {
return stateContainer.getState().filters;
},
};
},
filterManager
);
const stopSyncingAppFilters = syncAppFilters(filterManager, {
set: _filters => stateContainer.transitions.set('filters', _filters),
get: () => stateContainer.getState().filters,
state$: stateContainer.state$.pipe(map(state => state.filters)),
});

// The savedVis is pulled from elasticsearch, but the appState is pulled from the url, with the
// defaults applied. If the url was from a previous session which included modifications to the
Expand Down Expand Up @@ -387,7 +385,6 @@ function VisualizeAppController(
};

$scope.timeRange = timefilter.getTime();
$scope.opts = _.pick($scope, 'savedVis', 'isAddToDashMode');

const unsubscribeStateUpdates = stateContainer.subscribe(state => {
const newQuery = migrateLegacyQuery(state.query);
Expand Down Expand Up @@ -437,11 +434,11 @@ function VisualizeAppController(

// update the searchSource when query updates
$scope.fetch = function() {
const { query, filters, linked } = stateContainer.getState();
const { query, linked } = stateContainer.getState();
$scope.query = query;
$scope.linked = linked;
savedVis.searchSource.setField('query', query);
savedVis.searchSource.setField('filter', filters);
savedVis.searchSource.setField('filter', $scope.filters);
$scope.$broadcast('render');
};

Expand All @@ -450,7 +447,6 @@ function VisualizeAppController(
subscribeWithScope($scope, filterManager.getUpdates$(), {
next: () => {
$scope.filters = filterManager.getFilters();
$scope.globalFilters = filterManager.getGlobalFilters();
},
})
);
Expand All @@ -465,13 +461,14 @@ function VisualizeAppController(
$scope._handler.destroy();
}
savedVis.destroy();
filterStateManager.destroy();
subscriptions.unsubscribe();
$scope.vis.off('apply', _applyVis);

unsubscribePersisted();
unsubscribeStateUpdates();
stopStateSync();
stopSyncingGlobalStateWithUrl();
stopSyncingAppFilters();
});

$timeout(() => {
Expand Down Expand Up @@ -512,7 +509,6 @@ function VisualizeAppController(
delete $scope.savedQuery;
stateContainer.transitions.removeSavedQuery(defaultQuery);
filterManager.setFilters(filterManager.getGlobalFilters());
$scope.fetch();
};

const updateStateFromSavedQuery = savedQuery => {
Expand All @@ -531,8 +527,6 @@ function VisualizeAppController(
timefilter.setRefreshInterval(savedQuery.attributes.timefilter.refreshInterval);
}
}

$scope.fetch();
};

// update the query if savedQuery is stored
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,20 @@
* under the License.
*/

import { createHashHistory } from 'history';
import { isFunction, omit } from 'lodash';

import { migrateAppState } from './migrate_app_state';
import {
createKbnUrlStateStorage,
createStateContainer,
syncState,
IKbnUrlStateStorage,
} from '../../../../../../../../plugins/kibana_utils/public';
import { PureVisState, VisualizeAppState, VisualizeAppStateTransitions } from '../../types';

const STATE_STORAGE_KEY = '_a';

interface Arguments {
useHash: boolean;
kbnUrlStateStorage: IKbnUrlStateStorage;
stateDefaults: VisualizeAppState;
}

Expand All @@ -41,12 +40,7 @@ function toObject(state: PureVisState): PureVisState {
});
}

export function useVisualizeAppState({ useHash, stateDefaults }: Arguments) {
const history = createHashHistory();
const kbnUrlStateStorage = createKbnUrlStateStorage({
useHash,
history,
});
export function useVisualizeAppState({ stateDefaults, kbnUrlStateStorage }: Arguments) {
const urlState = kbnUrlStateStorage.get<VisualizeAppState>(STATE_STORAGE_KEY);
const initialState = migrateAppState({
...stateDefaults,
Expand Down

This file was deleted.

Loading