diff --git a/config/sample-config.yaml b/config/sample-config.yaml index 80870395c..291cda9df 100644 --- a/config/sample-config.yaml +++ b/config/sample-config.yaml @@ -758,26 +758,24 @@ frontend: name: Resource component: autocomplete category: source - placeholder: 'E.g: Pod.default.my-pod' + placeholder: 'E.g: Deployment.example.my-dep or Pod.default.my-pod' hint: Specify an existing resource from its kind, namespace and name. examples: |- Specify a kind, namespace and name from existing: - Select kind first from suggestions - - Then Select namespace from suggestions + - Then select namespace from suggestions - Finally select name from suggestions - You can also directly specify a kind, namespace and name like pod.openshift.apiserver - id: dst_resource name: Resource component: autocomplete category: destination - placeholder: 'E.g: Pod.default.my-pod' + placeholder: 'E.g: Deployment.example.my-dep or Pod.default.my-pod' hint: Specify an existing resource from its kind, namespace and name. examples: |- Specify a kind, namespace and name from existing: - Select kind first from suggestions - - Then Select namespace from suggestions + - Then select namespace from suggestions - Finally select name from suggestions - You can also directly specify a kind, namespace and name like pod.openshift.apiserver - id: src_address name: IP component: text diff --git a/pkg/server/routes.go b/pkg/server/routes.go index d4a3de92e..f2cb594dc 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -53,8 +53,7 @@ func setupRoutes(ctx context.Context, cfg *config.Config, authChecker auth.Check api.HandleFunc("/resources/clusters", h.GetClusters(ctx)) api.HandleFunc("/resources/zones", h.GetZones(ctx)) api.HandleFunc("/resources/namespaces", h.GetNamespaces(ctx)) - api.HandleFunc("/resources/namespace/{namespace}/kind/{kind}/names", h.GetNames(ctx)) - api.HandleFunc("/resources/kind/{kind}/names", h.GetNames(ctx)) + api.HandleFunc("/resources/names", h.GetNames(ctx)) // Frontend files api.HandleFunc("/frontend-config", h.GetFrontendConfig()) diff --git a/web/src/api/routes.ts b/web/src/api/routes.ts index 85072a600..bb945ed5d 100644 --- a/web/src/api/routes.ts +++ b/web/src/api/routes.ts @@ -96,11 +96,11 @@ export const getNamespaces = (forcedNamespace?: string): Promise => { }; export const getResources = (namespace: string, kind: string, forcedNamespace?: string): Promise => { - const params = { namespace: forcedNamespace }; - const url = namespace - ? `${ContextSingleton.getHost()}/api/resources/namespace/${namespace}/kind/${kind}/names` - : `${ContextSingleton.getHost()}/api/resources/kind/${kind}/names`; - return axios.get(url, { params }).then(r => { + const params = { + namespace: forcedNamespace || namespace, + kind + }; + return axios.get(ContextSingleton.getHost() + '/api/resources/names', { params }).then(r => { if (r.status >= 400) { throw new Error(`${r.statusText} [code=${r.status}]`); } diff --git a/web/src/components/toolbar/filters-toolbar.tsx b/web/src/components/toolbar/filters-toolbar.tsx index b4aaa154a..9c970a18c 100644 --- a/web/src/components/toolbar/filters-toolbar.tsx +++ b/web/src/components/toolbar/filters-toolbar.tsx @@ -59,8 +59,8 @@ export const FiltersToolbar: React.FC = ({ const { t } = useTranslation('plugin__netobserv-plugin'); const [indicator, setIndicator] = React.useState(ValidatedOptions.default); const [message, setMessage] = React.useState(); - const [selectedFilter, setSelectedFilter] = React.useState( - findFilter(filterDefinitions, 'src_namespace')! + const [selectedFilter, setSelectedFilter] = React.useState( + findFilter(filterDefinitions, 'src_namespace') || filterDefinitions.length ? filterDefinitions[0] : null ); const [selectedCompare, setSelectedCompare] = React.useState(FilterCompare.equal); const [showFilters, setShowFilters] = useLocalStorage(localStorageShowFiltersKey, true); @@ -89,6 +89,10 @@ export const FiltersToolbar: React.FC = ({ const addFilter = React.useCallback( (filterValue: FilterValue) => { + if (selectedFilter === null) { + console.error('addFilter called with', selectedFilter); + return false; + } const newFilters = _.cloneDeep(filters?.list) || []; const not = selectedCompare === FilterCompare.notEqual; const moreThan = selectedCompare === FilterCompare.moreThanOrEqual; @@ -111,6 +115,10 @@ export const FiltersToolbar: React.FC = ({ ); const getFilterControl = React.useCallback(() => { + if (selectedFilter === null) { + return <>; + } + const commonProps = { filterDefinition: selectedFilter, addFilter: addFilter, @@ -133,6 +141,43 @@ export const FiltersToolbar: React.FC = ({ } }, [selectedFilter, addFilter, setMessageWithDelay, indicator, selectedCompare]); + const getFilterToolbar = React.useCallback(() => { + if (selectedFilter === null) { + return <>; + } + + return ( + + +
+ + + + {getFilterControl()} + + +
+
+
+ ); + }, [filterDefinitions, getFilterControl, message, selectedCompare, selectedFilter]); + const isForced = !_.isEmpty(forcedFilters); const filtersOrForced = isForced ? forcedFilters : filters; const defaultFilters = quickFilters.filter(qf => qf.default).flatMap(qf => qf.filters); @@ -156,38 +201,7 @@ export const FiltersToolbar: React.FC = ({ )} - {!isForced && ( - <> - - -
- - - - {getFilterControl()} - - -
-
-
- - )} + {!isForced && getFilterToolbar()} {showHideText && (