From 0731ac3b6e49eb40a02b7d382ae01ead8b124daf Mon Sep 17 00:00:00 2001 From: ewandor Date: Tue, 13 May 2025 20:30:34 +0200 Subject: [PATCH] Implementing enum references for columns and filters --- api/rpk-api/firm/contract/models.py | 4 ++-- api/rpk-api/firm/entity/models.py | 2 +- .../src/lib/crud/components/crud-filters.tsx | 1 - .../lib/crud/providers/jsonschema-provider.tsx | 16 +++++++++++++++- gui/rpk-gui/src/pages/firm/ContractRoutes.tsx | 2 ++ gui/rpk-gui/src/pages/firm/DraftRoutes.tsx | 4 +++- 6 files changed, 23 insertions(+), 6 deletions(-) diff --git a/api/rpk-api/firm/contract/models.py b/api/rpk-api/firm/contract/models.py index ac4dce5..4c20c00 100644 --- a/api/rpk-api/firm/contract/models.py +++ b/api/rpk-api/firm/contract/models.py @@ -210,14 +210,14 @@ def replace_variables_in_value(variables, value: str): class ContractDraftFilters(FilterSchema): - status: Optional[str] = None + status__in: Optional[list[str]] = None class Constants(Filter.Constants): model = ContractDraft search_model_fields = ["label"] class ContractFilters(FilterSchema): - status: Optional[str] = None + status__in: Optional[list[str]] = None class Constants(Filter.Constants): model = Contract diff --git a/api/rpk-api/firm/entity/models.py b/api/rpk-api/firm/entity/models.py index 70253a5..b1c9b46 100644 --- a/api/rpk-api/firm/entity/models.py +++ b/api/rpk-api/firm/entity/models.py @@ -83,7 +83,7 @@ class Entity(CrudDocument): class EntityDataFilter(Filter): - type__in: Optional[list[EntityTypeEnum]] = None + type__in: Optional[list[str]] = None class Constants(Filter.Constants): model = EntityType diff --git a/gui/rpk-gui/src/lib/crud/components/crud-filters.tsx b/gui/rpk-gui/src/lib/crud/components/crud-filters.tsx index 5301f19..a2312ca 100644 --- a/gui/rpk-gui/src/lib/crud/components/crud-filters.tsx +++ b/gui/rpk-gui/src/lib/crud/components/crud-filters.tsx @@ -29,7 +29,6 @@ const CrudFilters = (props: CrudFiltersProps) => { setHasSearch(await jsonschemaProvider.hasSearch(resourcePath)) const resourceFilters = await jsonschemaProvider.getListFilters(resourceName, resourcePath) setFiltersSchema(resourceFilters); - console.log(resourceFilters); setFiltersLoading(false); } catch (error) { console.error('Error fetching data:', error); diff --git a/gui/rpk-gui/src/lib/crud/providers/jsonschema-provider.tsx b/gui/rpk-gui/src/lib/crud/providers/jsonschema-provider.tsx index a2457be..8492f7e 100644 --- a/gui/rpk-gui/src/lib/crud/providers/jsonschema-provider.tsx +++ b/gui/rpk-gui/src/lib/crud/providers/jsonschema-provider.tsx @@ -170,6 +170,8 @@ const getFieldFilterType = (fieldName: string, field: RJSFSchema): string => { enumValues.push(f.const) } return `enum(${enumValues.join("|")})` + } else if (is_enum(field) && field.enum != undefined) { + return `enum(${field.enum.join("|")})` } else if (field.hasOwnProperty('type')) { if (field.type == "string" && field.format == "date-time") { return "dateTime"; @@ -193,6 +195,13 @@ function buildColumns (rawSchemas: RJSFSchema, resourceName: string, prefix: str let resource = structuredClone(jst.getResource(resourceName)); let result: GridColDef[] = []; + if (is_enum(resource) && prefix !== undefined) { + return [{ + field: prefix, + headerName: i18n.t(`schemas.${shortResourceName}.${convertCamelToSnake(prefix)}`) as string, + type: "string" + }]; + } for (const prop_name in resource.properties) { let prop = resource.properties[prop_name]; @@ -469,7 +478,12 @@ const JsonSchemaTraverser = class { if (is_array(resource) && property_name == 'items') { return resource.items as RJSFSchema; } else if (is_object(resource) && resource.properties !== undefined && property_name in resource.properties!) { - return resource.properties[property_name] as RJSFSchema; + const prop = resource.properties[property_name]; + if (is_reference(prop)) { + const subresourceName = get_reference_name(prop); + return this.getResource(subresourceName); + } + return prop as RJSFSchema; } else if (is_reference(resource)) { let subresourceName = get_reference_name(resource); let subresource = this.getResource(subresourceName); diff --git a/gui/rpk-gui/src/pages/firm/ContractRoutes.tsx b/gui/rpk-gui/src/pages/firm/ContractRoutes.tsx index d7ec645..b24c6e8 100644 --- a/gui/rpk-gui/src/pages/firm/ContractRoutes.tsx +++ b/gui/rpk-gui/src/pages/firm/ContractRoutes.tsx @@ -25,6 +25,8 @@ export const ContractRoutes = () => { const ListContract = () => { const columns = [ { field: "label", column: { flex: 1 }}, + { field: "status", column: { width: 160 }}, + { field: "updated_at", column: { width: 160 }}, ]; return resource={`contracts`} schemaName={"Contract"} columns={columns} /> } diff --git a/gui/rpk-gui/src/pages/firm/DraftRoutes.tsx b/gui/rpk-gui/src/pages/firm/DraftRoutes.tsx index b157a51..4543886 100644 --- a/gui/rpk-gui/src/pages/firm/DraftRoutes.tsx +++ b/gui/rpk-gui/src/pages/firm/DraftRoutes.tsx @@ -29,7 +29,9 @@ export const DraftRoutes = () => { const ListDraft = () => { const columns = [ - { field: "label", column: { flex: 1 }}, + { field: "label", column: { flex: 1 }}, + { field: "status", column: { width: 160 }}, + { field: "updated_at", column: { width: 160 }}, ]; return resource={`contracts/drafts`} columns={columns} schemaName={"Contract"} /> }