Skip to content

Commit

Permalink
convert Topology filters localStorage to userSettings
Browse files Browse the repository at this point in the history
  • Loading branch information
sahil143 committed Nov 25, 2020
1 parent a223cbe commit 8ed58c5
Show file tree
Hide file tree
Showing 10 changed files with 92 additions and 100 deletions.
1 change: 0 additions & 1 deletion frontend/packages/topology/src/__tests__/Graph.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ describe('Graph', () => {
application={''}
eventSourceEnabled
onSelectTab={() => {}}
onFiltersChange={() => {}}
onSupportedFiltersChange={() => {}}
onSupportedKindsChange={() => {}}
/>,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import EmptyState from '@console/dev-console/src/components/EmptyState';
import { ModelContext, ExtensibleModel } from '../../data-transforms/ModelContext';
import TopologyView from './TopologyView';
import { TopologyViewType } from '../../topology-types';
import { FilterProvider } from '../../filters/FilterProvider';

interface TopologyDataRendererProps {
viewType: TopologyViewType;
Expand Down Expand Up @@ -49,7 +50,9 @@ const TopologyDataRenderer: React.FC<TopologyDataRendererProps> = observer(
loadError={loadError}
EmptyMsg={EmptyMsg}
>
<TopologyView viewType={viewType} model={model} namespace={namespace} />
<FilterProvider>
<TopologyView viewType={viewType} model={model} namespace={namespace} />
</FilterProvider>
</StatusBox>
);
},
Expand Down
16 changes: 4 additions & 12 deletions frontend/packages/topology/src/components/page/TopologyView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import { useAddToProjectAccess } from '@console/dev-console/src/utils/useAddToPr
import { getEventSourceStatus } from '@console/knative-plugin/src/topology/knative-topology-utils';
import {
CreateConnectionGetter,
DisplayFilters,
GraphData,
TopologyApplyDisplayOptions,
TopologyDisplayFilterType,
Expand All @@ -27,16 +26,12 @@ import {
} from '../../extensions/topology';
import { getTopologySearchQuery, useAppliedDisplayFilters, useDisplayFilters } from '../../filters';
import { updateModelFromFilters } from '../../data-transforms/updateModelFromFilters';
import {
setSupportedTopologyFilters,
setSupportedTopologyKinds,
setTopologyFilters,
} from '../../redux/action';
import { setSupportedTopologyFilters, setSupportedTopologyKinds } from '../../redux/action';
import Topology from '../graph-view/Topology';
import TopologyListView from '../list-view/TopologyListView';
import TopologyFilterBar from '../../filters/TopologyFilterBar';
import { getTopologySideBar } from '../side-bar/TopologySideBar';

import { FilterContext } from '../../filters/FilterProvider';
import './TopologyView.scss';

const FILTER_ACTIVE_CLASS = 'odc-m-filter-active';
Expand All @@ -48,7 +43,7 @@ interface StateProps {

interface DispatchProps {
onSelectTab?: (name: string) => void;
onFiltersChange: (filters: DisplayFilters) => void;
// onFiltersChange: (filters: DisplayFilters) => void;
onSupportedFiltersChange: (supportedFilterIds: string[]) => void;
onSupportedKindsChange: (supportedKinds: { [key: string]: number }) => void;
}
Expand All @@ -67,10 +62,10 @@ export const ConnectedTopologyView: React.FC<ComponentProps> = ({
viewType,
eventSourceEnabled,
application,
onFiltersChange,
onSupportedFiltersChange,
onSupportedKindsChange,
}) => {
const { setTopologyFilters: onFiltersChange } = React.useContext(FilterContext);
const [filteredModel, setFilteredModel] = React.useState<Model>();
const [selectedEntity, setSelectedEntity] = React.useState<GraphElement>(null);
const [visualization, setVisualization] = React.useState<Visualization>();
Expand Down Expand Up @@ -282,9 +277,6 @@ const TopologyStateToProps = (state: RootState): StateProps => {

const TopologyDispatchToProps = (dispatch): DispatchProps => ({
onSelectTab: (name) => dispatch(selectOverviewDetailsTab(name)),
onFiltersChange: (filters: DisplayFilters) => {
dispatch(setTopologyFilters(filters));
},
onSupportedFiltersChange: (supportedFilterIds: string[]) => {
dispatch(setSupportedTopologyFilters(supportedFilterIds));
},
Expand Down
70 changes: 70 additions & 0 deletions frontend/packages/topology/src/filters/FilterProvider.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import * as React from 'react';
import { useUserSettings } from '@console/shared';
import { getDefaultAppliedFilters } from '../redux/reducer';
import { DEFAULT_TOPOLOGY_FILTERS } from './const';
import { getAppliedFilters } from '../redux/action';
import { DisplayFilters } from '../topology-types';

const TOPOLOGY_DISPLAY_FILTERS_CONFIG_MAP_KEY = `devcosole.topology.filters`;

const getTopologyFilters = (appliedFilters) => {
const filters = [...DEFAULT_TOPOLOGY_FILTERS];
filters.forEach((filter) => {
if (appliedFilters[filter.id] !== undefined) {
filter.value = appliedFilters[filter.id];
}
});

return filters;
};

type AppliedFilters = { [filterKey: string]: boolean };
type SetTopologyFilters = (filters: DisplayFilters) => void;

const useFilterContextValues = (): [
DisplayFilters,
AppliedFilters,
boolean,
SetTopologyFilters,
] => {
const [appliedFilters, setAppliedFilters, appliedFiltersLoaded] = useUserSettings(
TOPOLOGY_DISPLAY_FILTERS_CONFIG_MAP_KEY,
getDefaultAppliedFilters(),
);
const [filtersLoaded, setFiltersLoaded] = React.useState<boolean>(false);
const [filters, setFilters] = React.useState<DisplayFilters>([]);

React.useEffect(() => {
if (appliedFiltersLoaded && !filtersLoaded) {
setFilters(getTopologyFilters(appliedFilters));
setFiltersLoaded(true);
}
}, [appliedFilters, appliedFiltersLoaded, filtersLoaded]);

const setTopologyFilters = React.useCallback(
(displayFilters: DisplayFilters) => {
setFilters(displayFilters);
setAppliedFilters(getAppliedFilters(displayFilters));
},
[setAppliedFilters],
);

return [filters, appliedFilters, appliedFilters && filtersLoaded, setTopologyFilters];
};

type FilterContextType = {
filters?: DisplayFilters;
appliedFilters?: AppliedFilters;
setTopologyFilters?: SetTopologyFilters;
};

export const FilterContext = React.createContext<FilterContextType>({});

export const FilterProvider: React.FC = ({ children }) => {
const [filters, appliedFilters, loaded, setTopologyFilters] = useFilterContextValues();
return (
<FilterContext.Provider value={{ filters, appliedFilters, setTopologyFilters }}>
{loaded ? children : null}
</FilterContext.Provider>
);
};
47 changes: 7 additions & 40 deletions frontend/packages/topology/src/filters/TopologyFilterBar.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import * as React from 'react';
import { Dispatch } from 'redux';
import { connect } from 'react-redux';
import {
Toolbar,
Expand All @@ -20,12 +19,10 @@ import { useK8sWatchResource } from '@console/internal/components/utils/k8s-watc
import { TextFilter } from '@console/internal/components/factory';
import { K8sResourceKind, referenceForModel } from '@console/internal/module/k8s';
import { ConsoleLinkModel } from '@console/internal/models';
import { setTopologyFilters } from '../redux/action';
import { DisplayFilters, TopologyViewType } from '../topology-types';
import { TopologyViewType } from '../topology-types';
import {
getSupportedTopologyFilters,
getSupportedTopologyKinds,
getTopologyFilters,
onSearchChange,
} from './filter-utils';
import FilterDropdown from './FilterDropdown';
Expand All @@ -34,36 +31,31 @@ import QuickSearchButton from './quick-search/QuickSearchButton';
import { getNamespaceDashboardKialiLink } from '../utils/topology-utils';

import './TopologyFilterBar.scss';
import { FilterContext } from './FilterProvider';

type StateProps = {
filters: DisplayFilters;
supportedFilters: string[];
supportedKinds: { [key: string]: number };
namespace: string;
};

type DispatchProps = {
onFiltersChange: (filters: DisplayFilters) => void;
};

type OwnProps = {
visualization?: Visualization;
viewType: TopologyViewType;
};

type MergeProps = StateProps & DispatchProps & OwnProps;

type TopologyFilterBarProps = MergeProps;
type TopologyFilterBarProps = StateProps & OwnProps;

const TopologyFilterBar: React.FC<TopologyFilterBarProps> = ({
filters,
// filters,
supportedFilters,
supportedKinds,
onFiltersChange,
// onFiltersChange,
visualization,
viewType,
namespace,
}) => {
const { filters, setTopologyFilters: onFiltersChange } = React.useContext(FilterContext);
const [consoleLinks] = useK8sWatchResource<K8sResourceKind[]>({
isList: true,
kind: referenceForModel(ConsoleLinkModel),
Expand Down Expand Up @@ -151,36 +143,11 @@ const TopologyFilterBar: React.FC<TopologyFilterBarProps> = ({

const mapStateToProps = (state: RootState): StateProps => {
const states = {
filters: getTopologyFilters(state),
supportedFilters: getSupportedTopologyFilters(state),
supportedKinds: getSupportedTopologyKinds(state),
namespace: getActiveNamespace(state),
};
return states;
};

const dispatchToProps = (dispatch: Dispatch): DispatchProps => ({
onFiltersChange: (filters: DisplayFilters) => {
dispatch(setTopologyFilters(filters));
},
});

const mergeProps = (
{ filters, supportedFilters, supportedKinds, namespace }: StateProps,
{ onFiltersChange }: DispatchProps,
{ visualization, viewType }: OwnProps,
): MergeProps => ({
filters,
supportedFilters,
supportedKinds,
namespace,
onFiltersChange,
visualization,
viewType,
});

export default connect<StateProps, DispatchProps, OwnProps, MergeProps>(
mapStateToProps,
dispatchToProps,
mergeProps,
)(TopologyFilterBar);
export default connect<StateProps>(mapStateToProps)(TopologyFilterBar);
12 changes: 0 additions & 12 deletions frontend/packages/topology/src/filters/filter-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import {
removeQueryArgument,
setQueryArgument,
} from '@console/internal/components/utils';
import { getDefaultTopologyFilters } from '../redux/reducer';
import { getAppliedFilters } from '../redux/action';
import {
DisplayFilters,
TopologyDisplayFilterType,
Expand All @@ -24,11 +22,6 @@ export const onSearchChange = (searchQuery: string): void => {
}
};

export const getTopologyFilters = (state: RootState): DisplayFilters => {
const topology = state?.plugins?.devconsole?.topology;
return topology ? topology.get('filters') : getDefaultTopologyFilters();
};

export const getSupportedTopologyFilters = (state: RootState): string[] => {
const topology = state?.plugins?.devconsole?.topology;
return topology ? topology.get('supportedFilters') : DEFAULT_TOPOLOGY_FILTERS.map((f) => f.id);
Expand All @@ -39,11 +32,6 @@ export const getSupportedTopologyKinds = (state: RootState): { [key: string]: nu
return topology ? topology.get('supportedKinds') : {};
};

export const getAppliedTopologyFilters = (state: RootState): string[] => {
const topology = state?.plugins?.devconsole?.topology;
return topology ? topology.get('appliedFilters') : getAppliedFilters(DEFAULT_TOPOLOGY_FILTERS);
};

export const getTopologySearchQuery = () => getQueryArgument(TOPOLOGY_SEARCH_FILTER_KEY) ?? '';

export const getFilterById = (id: string, filters: DisplayFilters): TopologyDisplayOption => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@
// FIXME upgrading redux types is causing many errors at this time
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
// @ts-ignore
import { useSelector } from 'react-redux';
import { RootState } from '@console/internal/redux';
import { DisplayFilters } from '../topology-types';
import { getAppliedTopologyFilters } from './filter-utils';
import { useContext } from 'react';
import { FilterContext } from './FilterProvider';

const useAppliedDisplayFilters = (): DisplayFilters => {
return useSelector((state: RootState) => getAppliedTopologyFilters(state));
const useAppliedDisplayFilters = (): { [filiterKey: string]: boolean } => {
return useContext(FilterContext).appliedFilters;
};

export { useAppliedDisplayFilters };
10 changes: 3 additions & 7 deletions frontend/packages/topology/src/filters/useDisplayFilters.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
// FIXME upgrading redux types is causing many errors at this time
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
// @ts-ignore
import { useSelector } from 'react-redux';
import { RootState } from '@console/internal/redux';
import { DisplayFilters } from '../topology-types';
import { getTopologyFilters } from './filter-utils';
import { useDeepCompareMemoize } from '@console/shared/src';
import { FilterContext } from './FilterProvider';
import { useContext } from 'react';

const useDisplayFilters = (): DisplayFilters => {
const filters = useSelector((state: RootState) => getTopologyFilters(state));
const { filters } = useContext(FilterContext);
return useDeepCompareMemoize(filters);
};

Expand Down
10 changes: 0 additions & 10 deletions frontend/packages/topology/src/redux/action.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { GraphModel } from '@patternfly/react-topology';
import { RootState } from '@console/internal/redux';
import { action, ActionType } from 'typesafe-actions';
import { TOPOLOGY_DISPLAY_FILTERS_LOCAL_STORAGE_KEY } from './const';
import { DisplayFilters } from '../topology-types';

export enum Actions {
Expand All @@ -22,14 +21,6 @@ export const getAppliedFilters = (filters: DisplayFilters): { [id: string]: bool
}, {});
};

export const setTopologyFilters = (filters: DisplayFilters) => {
localStorage.setItem(
TOPOLOGY_DISPLAY_FILTERS_LOCAL_STORAGE_KEY,
JSON.stringify(getAppliedFilters(filters)),
);
return action(Actions.topologyFilters, { filters });
};

export const setSupportedTopologyFilters = (supportedFilters: string[]) => {
return action(Actions.supportedTopologyFilters, { supportedFilters });
};
Expand All @@ -48,7 +39,6 @@ export const getTopologyGraphModel = (state: RootState, namespace: string): Grap
};

const actions = {
setTopologyFilters,
setSupportedTopologyFilters,
setSupportedTopologyKinds,
setTopologyGraphModel,
Expand Down
8 changes: 0 additions & 8 deletions frontend/packages/topology/src/redux/reducer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,19 +37,11 @@ export const getDefaultTopologyFilters = () => {
export default (state: State, action: TopologyAction) => {
if (!state) {
return Map({
filters: getDefaultTopologyFilters(),
appliedFilters: getDefaultAppliedFilters(),
supportedFilters: DEFAULT_TOPOLOGY_FILTERS.map((f) => f.id),
supportedKinds: {},
});
}

if (action.type === Actions.topologyFilters) {
return state
.set('filters', action.payload.filters)
.set('appliedFilters', getAppliedFilters(action.payload.filters));
}

if (action.type === Actions.supportedTopologyFilters) {
return state.set('supportedFilters', action.payload.supportedFilters);
}
Expand Down

0 comments on commit 8ed58c5

Please sign in to comment.