Loading src/routes/simulations.index.tsx +8 −28 Original line number Diff line number Diff line Loading @@ -4,18 +4,15 @@ import { SimulationListControls } from "../components/simulations/list/Simulatio import { SimulationsDataGrid } from "../components/simulations/list/SimulationsDataGrid"; import { columns as SimulationColumns } from "../components/simulations/list/SimulationsGridColumns"; import { useInfiniteQuery } from "@tanstack/react-query"; import axios from "axios"; import { Simulation } from "../models/Simulation.model"; import { operatorCombinator, sortCombinator } from "../util/filterCombinator"; import { ListResponse } from "../util/queryOptions"; import { SortDirection } from "../models/filters/sortDetails.model"; import { cloneDeep } from "lodash"; import { simulationList } from "../util/queryOptions"; export const Route = createFileRoute("/simulations/")({ component: SimulationList, }); const pageLimit = 18; function SimulationList() { const [columns, setColumns] = useState(structuredClone(SimulationColumns)); Loading @@ -28,30 +25,14 @@ function SimulationList() { hasNextPage, isFetchingNextPage, } = useInfiniteQuery({ queryKey: ["simulation", "list", columns], queryFn: async ({ pageParam }) => { const sortParams = sortCombinator(columns); const filterParams = operatorCombinator(columns); const fields = `&fields=all`; const params = fields + (sortParams ? "&" : "") + sortParams + (filterParams ? "&" : "") + filterParams; const res = await axios.get<ListResponse<Simulation>>( `/frontier/simulation/list?limit=${pageLimit}&offset=${pageParam * pageLimit}${params}`, ); return res.data; }, initialPageParam: 0, getNextPageParam: (lastPage, allPages) => allPages.length <= lastPage.total_results / pageLimit ? allPages.length : undefined, refetchOnWindowFocus: false, ...simulationList({ limit: 18, fields: ["all"], sort: sortCombinator(columns), filters: operatorCombinator(columns), }) }); const simulations = data?.pages.map((page) => page.results).flat() ?? []; const onSort = (columnName: string, direction: SortDirection) => { const updatedColumns = cloneDeep(columns); Loading @@ -66,7 +47,6 @@ function SimulationList() { setColumns(updatedColumns); }; const simulations = data?.pages.map((page) => page.results).flat() ?? []; return ( <div className="flex flex-1 flex-col"> <SimulationListControls Loading src/util/queryOptions.ts +41 −4 Original line number Diff line number Diff line Loading @@ -43,6 +43,45 @@ export const simulationConfigurationQueryOptions = (simulationId: string) => staleTime: (query) => query.state.data?.execution_end ? Infinity : 1000, }); /** * Query jobs from the job endpoint. * sort should be passed as a list like ["desc:state", "asc:sim_id"] * filters is in the format ["state=eq:RUNNING"] * This should be passed to useInfiniteQuery * TODO: allow passing sort/filters in cleaner format than raw query params. */ export const simulationList = ( params?: { limit?: number, fields?: string[], sort?: string[], filters?: string[], } ) => { let searchParams: string[] = [] // axios adds `[]` to array params so we'll serialize it manually instead searchParams.push(...(params?.sort?.map(s => `sort=${s}`) ?? [])); // Just specify filters as an array of ["job_id=eq:1"] for now searchParams.push(...(params?.filters ?? [])); const limit = params?.limit ?? 100; return infiniteQueryOptions({ queryKey: ["simulation", "list", params], queryFn: async ({ pageParam }) => { const res = await axios.get<ListResponse<Simulation>>( `/frontier/simulation/list?${searchParams.join("&")}`, { params: { limit: limit, offset: pageParam, fields: params?.fields?.join(","), }, }); return res.data; }, initialPageParam: 0, getNextPageParam: (lastPage, _allPages, lastPageParam, _allPageParams) => (lastPageParam + limit < lastPage.total_results) ? lastPageParam + limit : undefined, }) } export const simulationCoolingCDUQueryOptions = ( simulationId: string, params?: TimeSeriesParams, Loading Loading @@ -106,7 +145,6 @@ export const simulationSchedulerJobs = ( limit?: number, fields?: string[], sort?: string[], filters?: string[], currentTimestamp?: string, } ) => { let searchParams: string[] = [] Loading @@ -119,9 +157,8 @@ export const simulationSchedulerJobs = ( return infiniteQueryOptions({ queryKey: ["simulation", "scheduler", "jobs", simulationId, params], queryFn: async ({ pageParam }) => { const res = await axios.get<{ offset: number; limit: number, total_results: number, results: Job[]; }>(`/frontier/simulation/${simulationId}/scheduler/jobs?${searchParams.join("&")}`, { const res = await axios.get<ListResponse<Job>>( `/frontier/simulation/${simulationId}/scheduler/jobs?${searchParams.join("&")}`, { params: { start: params?.start, end: params?.end, limit: limit, offset: pageParam, Loading Loading
src/routes/simulations.index.tsx +8 −28 Original line number Diff line number Diff line Loading @@ -4,18 +4,15 @@ import { SimulationListControls } from "../components/simulations/list/Simulatio import { SimulationsDataGrid } from "../components/simulations/list/SimulationsDataGrid"; import { columns as SimulationColumns } from "../components/simulations/list/SimulationsGridColumns"; import { useInfiniteQuery } from "@tanstack/react-query"; import axios from "axios"; import { Simulation } from "../models/Simulation.model"; import { operatorCombinator, sortCombinator } from "../util/filterCombinator"; import { ListResponse } from "../util/queryOptions"; import { SortDirection } from "../models/filters/sortDetails.model"; import { cloneDeep } from "lodash"; import { simulationList } from "../util/queryOptions"; export const Route = createFileRoute("/simulations/")({ component: SimulationList, }); const pageLimit = 18; function SimulationList() { const [columns, setColumns] = useState(structuredClone(SimulationColumns)); Loading @@ -28,30 +25,14 @@ function SimulationList() { hasNextPage, isFetchingNextPage, } = useInfiniteQuery({ queryKey: ["simulation", "list", columns], queryFn: async ({ pageParam }) => { const sortParams = sortCombinator(columns); const filterParams = operatorCombinator(columns); const fields = `&fields=all`; const params = fields + (sortParams ? "&" : "") + sortParams + (filterParams ? "&" : "") + filterParams; const res = await axios.get<ListResponse<Simulation>>( `/frontier/simulation/list?limit=${pageLimit}&offset=${pageParam * pageLimit}${params}`, ); return res.data; }, initialPageParam: 0, getNextPageParam: (lastPage, allPages) => allPages.length <= lastPage.total_results / pageLimit ? allPages.length : undefined, refetchOnWindowFocus: false, ...simulationList({ limit: 18, fields: ["all"], sort: sortCombinator(columns), filters: operatorCombinator(columns), }) }); const simulations = data?.pages.map((page) => page.results).flat() ?? []; const onSort = (columnName: string, direction: SortDirection) => { const updatedColumns = cloneDeep(columns); Loading @@ -66,7 +47,6 @@ function SimulationList() { setColumns(updatedColumns); }; const simulations = data?.pages.map((page) => page.results).flat() ?? []; return ( <div className="flex flex-1 flex-col"> <SimulationListControls Loading
src/util/queryOptions.ts +41 −4 Original line number Diff line number Diff line Loading @@ -43,6 +43,45 @@ export const simulationConfigurationQueryOptions = (simulationId: string) => staleTime: (query) => query.state.data?.execution_end ? Infinity : 1000, }); /** * Query jobs from the job endpoint. * sort should be passed as a list like ["desc:state", "asc:sim_id"] * filters is in the format ["state=eq:RUNNING"] * This should be passed to useInfiniteQuery * TODO: allow passing sort/filters in cleaner format than raw query params. */ export const simulationList = ( params?: { limit?: number, fields?: string[], sort?: string[], filters?: string[], } ) => { let searchParams: string[] = [] // axios adds `[]` to array params so we'll serialize it manually instead searchParams.push(...(params?.sort?.map(s => `sort=${s}`) ?? [])); // Just specify filters as an array of ["job_id=eq:1"] for now searchParams.push(...(params?.filters ?? [])); const limit = params?.limit ?? 100; return infiniteQueryOptions({ queryKey: ["simulation", "list", params], queryFn: async ({ pageParam }) => { const res = await axios.get<ListResponse<Simulation>>( `/frontier/simulation/list?${searchParams.join("&")}`, { params: { limit: limit, offset: pageParam, fields: params?.fields?.join(","), }, }); return res.data; }, initialPageParam: 0, getNextPageParam: (lastPage, _allPages, lastPageParam, _allPageParams) => (lastPageParam + limit < lastPage.total_results) ? lastPageParam + limit : undefined, }) } export const simulationCoolingCDUQueryOptions = ( simulationId: string, params?: TimeSeriesParams, Loading Loading @@ -106,7 +145,6 @@ export const simulationSchedulerJobs = ( limit?: number, fields?: string[], sort?: string[], filters?: string[], currentTimestamp?: string, } ) => { let searchParams: string[] = [] Loading @@ -119,9 +157,8 @@ export const simulationSchedulerJobs = ( return infiniteQueryOptions({ queryKey: ["simulation", "scheduler", "jobs", simulationId, params], queryFn: async ({ pageParam }) => { const res = await axios.get<{ offset: number; limit: number, total_results: number, results: Job[]; }>(`/frontier/simulation/${simulationId}/scheduler/jobs?${searchParams.join("&")}`, { const res = await axios.get<ListResponse<Job>>( `/frontier/simulation/${simulationId}/scheduler/jobs?${searchParams.join("&")}`, { params: { start: params?.start, end: params?.end, limit: limit, offset: pageParam, Loading