mirror of https://github.com/portainer/portainer
fix(edge/devices): search waiting room devices [EE-5895] (#10014)
parent
0ef4aad79a
commit
d514eeec86
|
@ -54,6 +54,7 @@ export interface Props<
|
|||
description?: ReactNode;
|
||||
pageCount?: number;
|
||||
highlightedItemId?: string;
|
||||
page?: number;
|
||||
onPageChange?(page: number): void;
|
||||
|
||||
settingsManager: GlobalTableState<BasicTableSettings>;
|
||||
|
@ -82,6 +83,7 @@ export function Datatable<
|
|||
totalCount = dataset.length,
|
||||
description,
|
||||
pageCount,
|
||||
page,
|
||||
onPageChange = () => null,
|
||||
settingsManager: settings,
|
||||
renderRow = defaultRenderRow,
|
||||
|
@ -108,6 +110,7 @@ export function Datatable<
|
|||
initialState: {
|
||||
pagination: {
|
||||
pageSize: settings.pageSize,
|
||||
pageIndex: page,
|
||||
},
|
||||
sorting: settings.sortBy ? [settings.sortBy] : [],
|
||||
globalFilter: settings.search,
|
||||
|
@ -172,7 +175,7 @@ export function Datatable<
|
|||
<DatatableFooter
|
||||
onPageChange={handlePageChange}
|
||||
onPageSizeChange={handlePageSizeChange}
|
||||
page={tableState.pagination.pageIndex}
|
||||
page={typeof page === 'number' ? page : tableState.pagination.pageIndex}
|
||||
pageSize={tableState.pagination.pageSize}
|
||||
totalCount={totalCount}
|
||||
totalSelected={selectedItems.length}
|
||||
|
|
|
@ -9,11 +9,22 @@ import { useEnvironments } from './useEnvironments';
|
|||
|
||||
const storageKey = 'edge-devices-waiting-room';
|
||||
|
||||
const settingsStore = createPersistedStore(storageKey, 'Name');
|
||||
const settingsStore = createPersistedStore(storageKey);
|
||||
|
||||
export function Datatable() {
|
||||
const tableState = useTableState(settingsStore, storageKey);
|
||||
const { data: environments, totalCount, isLoading } = useEnvironments();
|
||||
const {
|
||||
data: environments,
|
||||
totalCount,
|
||||
isLoading,
|
||||
page,
|
||||
setPage,
|
||||
} = useEnvironments({
|
||||
pageLimit: tableState.pageSize,
|
||||
search: tableState.search,
|
||||
});
|
||||
|
||||
const pageCount = Math.ceil(totalCount / tableState.pageSize);
|
||||
|
||||
return (
|
||||
<GenericDatatable
|
||||
|
@ -27,6 +38,9 @@ export function Datatable() {
|
|||
)}
|
||||
isLoading={isLoading}
|
||||
totalCount={totalCount}
|
||||
pageCount={pageCount}
|
||||
page={page}
|
||||
onPageChange={setPage}
|
||||
description={<Filter />}
|
||||
/>
|
||||
);
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import _ from 'lodash';
|
||||
import { useEffect, useMemo, useState } from 'react';
|
||||
|
||||
import { useTags } from '@/portainer/tags/queries';
|
||||
import { useEdgeGroups } from '@/react/edge/edge-groups/queries/useEdgeGroups';
|
||||
|
@ -10,27 +11,59 @@ import { WaitingRoomEnvironment } from '../types';
|
|||
|
||||
import { useFilterStore } from './filter-store';
|
||||
|
||||
export function useEnvironments() {
|
||||
export function useEnvironments({
|
||||
pageLimit = 10,
|
||||
search,
|
||||
}: {
|
||||
pageLimit: number;
|
||||
search: string;
|
||||
}) {
|
||||
const [page, setPage] = useState(0);
|
||||
const filterStore = useFilterStore();
|
||||
const edgeGroupsQuery = useEdgeGroups();
|
||||
|
||||
const filterByEnvironmentsIds = filterStore.edgeGroups.length
|
||||
? _.compact(
|
||||
filterStore.edgeGroups.flatMap(
|
||||
(groupId) =>
|
||||
edgeGroupsQuery.data?.find((g) => g.Id === groupId)?.Endpoints
|
||||
)
|
||||
)
|
||||
: undefined;
|
||||
const filterByEnvironmentsIds = useMemo(
|
||||
() =>
|
||||
filterStore.edgeGroups.length
|
||||
? _.compact(
|
||||
filterStore.edgeGroups.flatMap(
|
||||
(groupId) =>
|
||||
edgeGroupsQuery.data?.find((g) => g.Id === groupId)?.Endpoints
|
||||
)
|
||||
)
|
||||
: undefined,
|
||||
[edgeGroupsQuery.data, filterStore.edgeGroups]
|
||||
);
|
||||
|
||||
const query = useMemo(
|
||||
() => ({
|
||||
pageLimit,
|
||||
edgeDeviceUntrusted: true,
|
||||
excludeSnapshots: true,
|
||||
types: EdgeTypes,
|
||||
tagIds: filterStore.tags.length ? filterStore.tags : undefined,
|
||||
groupIds: filterStore.groups.length ? filterStore.groups : undefined,
|
||||
endpointIds: filterByEnvironmentsIds,
|
||||
edgeCheckInPassedSeconds: filterStore.checkIn,
|
||||
search,
|
||||
}),
|
||||
[
|
||||
filterByEnvironmentsIds,
|
||||
filterStore.checkIn,
|
||||
filterStore.groups,
|
||||
filterStore.tags,
|
||||
pageLimit,
|
||||
search,
|
||||
]
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
setPage(0);
|
||||
}, [query]);
|
||||
|
||||
const environmentsQuery = useEnvironmentList({
|
||||
edgeDeviceUntrusted: true,
|
||||
excludeSnapshots: true,
|
||||
types: EdgeTypes,
|
||||
tagIds: filterStore.tags.length ? filterStore.tags : undefined,
|
||||
groupIds: filterStore.groups.length ? filterStore.groups : undefined,
|
||||
endpointIds: filterByEnvironmentsIds,
|
||||
edgeCheckInPassedSeconds: filterStore.checkIn,
|
||||
page: page + 1,
|
||||
...query,
|
||||
});
|
||||
|
||||
const groupsQuery = useGroups({
|
||||
|
@ -52,24 +85,45 @@ export function useEnvironments() {
|
|||
Object.fromEntries(tags.map((tag) => [tag.ID, tag.Name] as const)),
|
||||
});
|
||||
|
||||
const envs: Array<WaitingRoomEnvironment> =
|
||||
environmentsQuery.environments.map((env) => ({
|
||||
...env,
|
||||
Group: (env.GroupId !== 1 && groupsQuery.data?.[env.GroupId]) || '',
|
||||
EdgeGroups:
|
||||
environmentEdgeGroupsQuery.data?.[env.Id]?.map((env) => env.group) ||
|
||||
[],
|
||||
Tags:
|
||||
_.compact(env.TagIds?.map((tagId) => tagsQuery.data?.[tagId])) || [],
|
||||
}));
|
||||
const envs: Array<WaitingRoomEnvironment> = useMemo(
|
||||
() =>
|
||||
environmentsQuery.environments.map((env) => ({
|
||||
...env,
|
||||
Group: (env.GroupId !== 1 && groupsQuery.data?.[env.GroupId]) || '',
|
||||
EdgeGroups:
|
||||
environmentEdgeGroupsQuery.data?.[env.Id]?.map((env) => env.group) ||
|
||||
[],
|
||||
Tags:
|
||||
_.compact(env.TagIds?.map((tagId) => tagsQuery.data?.[tagId])) || [],
|
||||
})),
|
||||
[
|
||||
environmentEdgeGroupsQuery.data,
|
||||
environmentsQuery.environments,
|
||||
groupsQuery.data,
|
||||
tagsQuery.data,
|
||||
]
|
||||
);
|
||||
|
||||
return {
|
||||
data: envs,
|
||||
isLoading:
|
||||
environmentsQuery.isLoading ||
|
||||
groupsQuery.isLoading ||
|
||||
environmentEdgeGroupsQuery.isLoading ||
|
||||
return useMemo(
|
||||
() => ({
|
||||
data: envs,
|
||||
isLoading:
|
||||
environmentsQuery.isLoading ||
|
||||
groupsQuery.isLoading ||
|
||||
environmentEdgeGroupsQuery.isLoading ||
|
||||
tagsQuery.isLoading,
|
||||
totalCount: environmentsQuery.totalCount,
|
||||
page,
|
||||
setPage,
|
||||
}),
|
||||
[
|
||||
environmentEdgeGroupsQuery.isLoading,
|
||||
environmentsQuery.isLoading,
|
||||
environmentsQuery.totalCount,
|
||||
envs,
|
||||
groupsQuery.isLoading,
|
||||
page,
|
||||
tagsQuery.isLoading,
|
||||
totalCount: environmentsQuery.totalCount,
|
||||
};
|
||||
]
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue