Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
10 changes: 4 additions & 6 deletions config/sample-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 1 addition & 2 deletions pkg/server/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
10 changes: 5 additions & 5 deletions web/src/api/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,11 @@ export const getNamespaces = (forcedNamespace?: string): Promise<string[]> => {
};

export const getResources = (namespace: string, kind: string, forcedNamespace?: string): Promise<string[]> => {
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}]`);
}
Expand Down
82 changes: 48 additions & 34 deletions web/src/components/toolbar/filters-toolbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@ export const FiltersToolbar: React.FC<FiltersToolbarProps> = ({
const { t } = useTranslation('plugin__netobserv-plugin');
const [indicator, setIndicator] = React.useState<Indicator>(ValidatedOptions.default);
const [message, setMessage] = React.useState<string | undefined>();
const [selectedFilter, setSelectedFilter] = React.useState<FilterDefinition>(
findFilter(filterDefinitions, 'src_namespace')!
const [selectedFilter, setSelectedFilter] = React.useState<FilterDefinition | null>(
findFilter(filterDefinitions, 'src_namespace') || filterDefinitions.length ? filterDefinitions[0] : null
);
const [selectedCompare, setSelectedCompare] = React.useState<FilterCompare>(FilterCompare.equal);
const [showFilters, setShowFilters] = useLocalStorage<boolean>(localStorageShowFiltersKey, true);
Expand Down Expand Up @@ -89,6 +89,10 @@ export const FiltersToolbar: React.FC<FiltersToolbarProps> = ({

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;
Expand All @@ -111,6 +115,10 @@ export const FiltersToolbar: React.FC<FiltersToolbarProps> = ({
);

const getFilterControl = React.useCallback(() => {
if (selectedFilter === null) {
return <></>;
}

const commonProps = {
filterDefinition: selectedFilter,
addFilter: addFilter,
Expand All @@ -133,6 +141,43 @@ export const FiltersToolbar: React.FC<FiltersToolbarProps> = ({
}
}, [selectedFilter, addFilter, setMessageWithDelay, indicator, selectedCompare]);

const getFilterToolbar = React.useCallback(() => {
if (selectedFilter === null) {
return <></>;
}

return (
<ToolbarItem className="flex-start">
<Tooltip
//css hide tooltip here to avoid render issue
className={`filters-tooltip${_.isEmpty(message) ? '-empty' : ''}`}
isVisible={!_.isEmpty(message)}
content={message}
trigger={_.isEmpty(message) ? 'manual' : 'click'}
enableFlip={false}
position={'top'}
>
<div>
<InputGroup>
<FiltersDropdown
filterDefinitions={filterDefinitions}
selectedFilter={selectedFilter}
setSelectedFilter={setSelectedFilter}
/>
<CompareFilter
value={selectedCompare}
setValue={setSelectedCompare}
component={selectedFilter.component}
/>
{getFilterControl()}
</InputGroup>
<FilterHints def={selectedFilter} />
</div>
</Tooltip>
</ToolbarItem>
);
}, [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);
Expand All @@ -156,38 +201,7 @@ export const FiltersToolbar: React.FC<FiltersToolbarProps> = ({
<QuickFilters quickFilters={quickFilters} activeFilters={filters?.list || []} setFilters={setFiltersList} />
</ToolbarItem>
)}
{!isForced && (
<>
<ToolbarItem className="flex-start">
<Tooltip
//css hide tooltip here to avoid render issue
className={`filters-tooltip${_.isEmpty(message) ? '-empty' : ''}`}
isVisible={!_.isEmpty(message)}
content={message}
trigger={_.isEmpty(message) ? 'manual' : 'click'}
enableFlip={false}
position={'top'}
>
<div>
<InputGroup>
<FiltersDropdown
filterDefinitions={filterDefinitions}
selectedFilter={selectedFilter}
setSelectedFilter={setSelectedFilter}
/>
<CompareFilter
value={selectedCompare}
setValue={setSelectedCompare}
component={selectedFilter.component}
/>
{getFilterControl()}
</InputGroup>
<FilterHints def={selectedFilter} />
</div>
</Tooltip>
</ToolbarItem>
</>
)}
{!isForced && getFilterToolbar()}
{showHideText && (
<ToolbarItem className="flex-start">
<Button
Expand Down
Loading