Commit 9d45cfe2 authored by Hines, Jesse's avatar Hines, Jesse
Browse files

Fix sim sort

parent fae81883
Loading
Loading
Loading
Loading
+8 −28
Original line number Diff line number Diff line
@@ -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));
@@ -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);
@@ -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
+41 −4
Original line number Diff line number Diff line
@@ -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,
@@ -106,7 +145,6 @@ export const simulationSchedulerJobs = (
    limit?: number,
    fields?: string[], sort?: string[],
    filters?: string[],
    currentTimestamp?: string,
  }
) => {
  let searchParams: string[] = []
@@ -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,