From 6248248f0e97f5080d533f5287d90d6a42062b26 Mon Sep 17 00:00:00 2001 From: ewandor Date: Tue, 6 May 2025 22:14:41 +0200 Subject: [PATCH] Moving list schemas logique to crud lib --- .../src/lib/crud/components/crud-list.tsx | 95 +++++++++++++++++++ gui/rpk-gui/src/pages/firm/base-page/List.tsx | 77 ++------------- 2 files changed, 105 insertions(+), 67 deletions(-) diff --git a/gui/rpk-gui/src/lib/crud/components/crud-list.tsx b/gui/rpk-gui/src/lib/crud/components/crud-list.tsx index e69de29..bb99510 100644 --- a/gui/rpk-gui/src/lib/crud/components/crud-list.tsx +++ b/gui/rpk-gui/src/lib/crud/components/crud-list.tsx @@ -0,0 +1,95 @@ +import { DataGrid, GridColDef, GridColumnVisibilityModel, GridValidRowModel } from "@mui/x-data-grid"; +import { UiSchema } from "@rjsf/utils"; +import React, { useEffect, useState } from "react"; +import { jsonschemaProvider } from "../providers/jsonschema-provider"; +import { CircularProgress } from "@mui/material"; + +type CrudListProps = { + schemaName: string, + uiSchema?: UiSchema, + columnDefinitions: ColumnDefinition[], + dataGridProps: any, + resourceBasePath: string, + onRowClick?: (params: any) => void +} + +type ColumnSchema = { + columns: GridColDef[], + columnVisibilityModel: GridColumnVisibilityModel +} + +type ColumnDefinition = { + field: string, + column: Partial, + hide?: boolean +} + +const CrudList = (props: CrudListProps) => { + const { + dataGridProps, + onRowClick, + schemaName, + columnDefinitions + } = props; + + const [columnSchema, setColumnSchema] = useState>() + const [schemaLoading, setSchemaLoading] = useState(true); + useEffect(() => { + const fetchSchema = async () => { + try { + const resourceColumns = await jsonschemaProvider.getReadResourceColumns(schemaName) + const definedColumns = computeColumnSchema(columnDefinitions, resourceColumns) + setColumnSchema(definedColumns); + console.log(resourceColumns); + setSchemaLoading(false); + } catch (error) { + console.error('Error fetching data:', error); + setSchemaLoading(false); + } + }; + fetchSchema(); + }, []); + + if (schemaLoading || columnSchema === undefined) { + return + } + + return ( + + ) +} + +function computeColumnSchema(definitionColumns: ColumnDefinition[], resourceColumns: GridColDef[]): ColumnSchema { + //reorder resourceColumns as in definition + definitionColumns.slice().reverse().forEach(first => { + resourceColumns.sort(function(x,y){ return x.field == first.field ? -1 : y.field == first.field ? 1 : 0; }); + }) + + let visibilityModel: GridColumnVisibilityModel = {} + resourceColumns.forEach((resource, index) =>{ + visibilityModel[resource.field] = definitionColumns.some(col => col.field == resource.field && !col.hide) + definitionColumns.forEach((def) => { + if (def.field == resource.field) { + resourceColumns[index] = {...resource, ...def.column}; + } + }) + }) + + return { + columns: resourceColumns, + columnVisibilityModel: visibilityModel + } +} + +export default CrudList; diff --git a/gui/rpk-gui/src/pages/firm/base-page/List.tsx b/gui/rpk-gui/src/pages/firm/base-page/List.tsx index 182a713..5fa1c3c 100644 --- a/gui/rpk-gui/src/pages/firm/base-page/List.tsx +++ b/gui/rpk-gui/src/pages/firm/base-page/List.tsx @@ -1,12 +1,12 @@ +import React, { useContext } from "react"; import { Link, useNavigate } from "react-router" import { UiSchema } from "@rjsf/utils"; import { useTranslation } from "@refinedev/core"; import { List as RefineList, useDataGrid } from "@refinedev/mui"; -import { DataGrid, GridColDef, GridValidRowModel, GridColumnVisibilityModel } from "@mui/x-data-grid"; -import React, { useContext, useEffect, useState } from "react"; -import { Button, CircularProgress } from "@mui/material"; +import { Button } from "@mui/material"; +import { GridColDef, GridValidRowModel } from "@mui/x-data-grid"; import { FirmContext } from "../../../contexts/FirmContext"; -import { jsonschemaProvider } from "../../../lib/crud/providers/jsonschema-provider"; +import CrudList from "../../../lib/crud/components/crud-list"; type ListProps = { resource: string, @@ -15,39 +15,12 @@ type ListProps = { uiSchema?: UiSchema, } -type ColumnSchema = { - columns: GridColDef[], - columnVisibilityModel: GridColumnVisibilityModel -} - type ColumnDefinition = { field: string, column: Partial, hide?: boolean } -function computeColumnSchema(definitionColumns: ColumnDefinition[], resourceColumns: GridColDef[]): ColumnSchema { - //reorder resourceColumns as in definition - definitionColumns.slice().reverse().forEach(first => { - resourceColumns.sort(function(x,y){ return x.field == first.field ? -1 : y.field == first.field ? 1 : 0; }); - }) - - let visibilityModel: GridColumnVisibilityModel = {} - resourceColumns.forEach((resource, index) =>{ - visibilityModel[resource.field] = definitionColumns.some(col => col.field == resource.field && !col.hide) - definitionColumns.forEach((def) => { - if (def.field == resource.field) { - resourceColumns[index] = {...resource, ...def.column}; - } - }) - }) - - return { - columns: resourceColumns, - columnVisibilityModel: visibilityModel - } -} - const List = (props: ListProps) => { const { resource, columns, schemaName } = props; const { translate: t } = useTranslation(); @@ -59,32 +32,6 @@ const List = (props: ListProps) => { }); const navigate = useNavigate(); - const [columnSchema, setColumnSchema] = useState>() - const [schemaLoading, setSchemaLoading] = useState(true); - useEffect(() => { - const fetchSchema = async () => { - try { - const resourceColumns = await jsonschemaProvider.getReadResourceColumns(schemaName) - const definedColumns = computeColumnSchema(columns, resourceColumns) - setColumnSchema(definedColumns); - console.log(resourceColumns); - setSchemaLoading(false); - } catch (error) { - console.error('Error fetching data:', error); - setSchemaLoading(false); - } - }; - fetchSchema(); - }, []); - - const handleRowClick = (params: any, event: any) => { - navigate(`edit/${params.id}`) - } - - if (schemaLoading || columnSchema === undefined) { - return - } - if (tableQueryResult.error?.status == 404) { throw tableQueryResult.error } @@ -94,16 +41,12 @@ const List = (props: ListProps) => { - { navigate(`edit/${params.id}`) }} + schemaName={schemaName} + resourceBasePath={resourceBasePath} + columnDefinitions={columns} /> )