diff --git a/package-lock.json b/package-lock.json index 0c9e631..90d0a28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,7 @@ }, "devDependencies": { "@vitejs/plugin-react": "latest", + "typescript": "^6.0.3", "vite": "latest" } }, @@ -4103,6 +4104,19 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", diff --git a/package.json b/package.json index 61dfdc5..73ae1ae 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ }, "devDependencies": { "@vitejs/plugin-react": "latest", + "typescript": "^6.0.3", "vite": "latest" } } diff --git a/react-openapi/components/EnhancedTable.tsx b/react-openapi/components/EnhancedTable.tsx index 5b28b54..ddc37ea 100644 --- a/react-openapi/components/EnhancedTable.tsx +++ b/react-openapi/components/EnhancedTable.tsx @@ -100,7 +100,7 @@ export default function EnhancedTable({ } if (muiType === 'singleSelect') { - col.valueOptions = toGridValueOptions(getFieldOptions(field)); + (col as GridColDef & { valueOptions: any[] }).valueOptions = toGridValueOptions(getFieldOptions(field)); } return col; diff --git a/react-openapi/components/FilterBar.tsx b/react-openapi/components/FilterBar.tsx index f751fe4..766cb32 100644 --- a/react-openapi/components/FilterBar.tsx +++ b/react-openapi/components/FilterBar.tsx @@ -130,6 +130,7 @@ function extractOptions( if (Array.isArray(df)) { const parts = df.map((k) => item[k]).filter((v) => v != null); if (parts.length > 0) return parts.join(" "); + return null; } const v = item[df]; if (v != null) return String(v); diff --git a/react-openapi/components/ResourceView.tsx b/react-openapi/components/ResourceView.tsx index f3930bf..bbabac4 100644 --- a/react-openapi/components/ResourceView.tsx +++ b/react-openapi/components/ResourceView.tsx @@ -201,7 +201,7 @@ export default function ResourceView({ config, onNavigateToResource, fieldCompon ) : ( - navigate(`/admin/${config.name}/edit/${id}`)} - /> + />} )} diff --git a/react-openapi/components/fields/DefaultFieldComponents.ts b/react-openapi/components/fields/DefaultFieldComponents.ts index 1c783bd..46012d2 100644 --- a/react-openapi/components/fields/DefaultFieldComponents.ts +++ b/react-openapi/components/fields/DefaultFieldComponents.ts @@ -1,4 +1,5 @@ -import { FieldComponents } from '../../types/overrides'; +import * as React from 'react'; +import { FieldComponents, FieldComponentProps } from '../../types/overrides'; import TextFieldEntry from './TextField'; import NumberField from './NumberField'; import BooleanField from './BooleanField'; @@ -8,6 +9,19 @@ import RelationField from './RelationField'; import ImageUploadField from './ImageUploadField'; import FallbackField from './FallbackField'; +const WrappedImageUploadField = (props: FieldComponentProps) => + React.createElement(ImageUploadField, { + label: props.field.label, + value: props.value || '', + onUpload: async (file: File) => { + const url = await props.uploadFile?.(file); + if (url) props.onChange(url); + }, + uploading: props.uploading, + baseUrl: props.baseUrl || '', + disabled: props.disabled, + }); + export const defaultFieldComponents: FieldComponents = { string: TextFieldEntry, markdown: TextFieldEntry, @@ -16,7 +30,7 @@ export const defaultFieldComponents: FieldComponents = { date: DateField, datetime: DateField, enum: EnumField, - image: ImageUploadField, + image: WrappedImageUploadField, relation: RelationField, default: FallbackField, }; diff --git a/react-openapi/components/fields/FormField.tsx b/react-openapi/components/fields/FormField.tsx index ce9750f..ff06784 100644 --- a/react-openapi/components/fields/FormField.tsx +++ b/react-openapi/components/fields/FormField.tsx @@ -9,9 +9,9 @@ export interface FormFieldProps { value: any; onChange: (val: any) => void; disabled?: boolean; - uploadFile: (file: File) => Promise; - uploading: boolean; - baseUrl: string; + uploadFile?: (file: File) => Promise; + uploading?: boolean; + baseUrl?: string; relationDataMap?: Record; components: FieldComponents; } @@ -51,9 +51,9 @@ export default function FormField({ value={childProps.value} onChange={childProps.onChange} disabled={childProps.disabled} - uploadFile={childProps.uploadFile!} - uploading={childProps.uploading!} - baseUrl={childProps.baseUrl!} + uploadFile={childProps.uploadFile} + uploading={childProps.uploading} + baseUrl={childProps.baseUrl} relationDataMap={childProps.relationDataMap} components={components} /> diff --git a/react-openapi/components/fields/RelationField.tsx b/react-openapi/components/fields/RelationField.tsx index d381428..0c28a02 100644 --- a/react-openapi/components/fields/RelationField.tsx +++ b/react-openapi/components/fields/RelationField.tsx @@ -7,7 +7,7 @@ export default function RelationField({ field, value, onChange, disabled, relati return null; } - const relationData = relationDataMap[field.relation].data; + const relationData = relationDataMap[field.relation]; const isArrayRelation = field.type === 'array'; const options = getFieldOptions(field, relationData); const keyField = field.enumOption?.key ?? 'id'; diff --git a/react-openapi/hooks/useResource.ts b/react-openapi/hooks/useResource.ts index 58b034e..5f0bf28 100644 --- a/react-openapi/hooks/useResource.ts +++ b/react-openapi/hooks/useResource.ts @@ -78,7 +78,7 @@ export function useResource(config: ResourceConfig | undefined, options const res = await api.put(`${endpoint}/${id}`, data); return res.data; }, - onSuccess: (updatedItem) => { + onSuccess: (updatedItem: any) => { const id = updatedItem[primaryKey]; queryClient.invalidateQueries({ queryKey: [name, "list"] }); queryClient.invalidateQueries({ queryKey: [name, "detail", id] }); @@ -93,7 +93,7 @@ export function useResource(config: ResourceConfig | undefined, options const res = await api.patch(`${endpoint}/${id}`, data); return res.data; }, - onSuccess: (updatedItem) => { + onSuccess: (updatedItem: any) => { const listId = updatedItem[primaryKey]; queryClient.invalidateQueries({ queryKey: [name, "list"] }); queryClient.invalidateQueries({ queryKey: [name, "detail", listId] }); diff --git a/react-openapi/utils/openapi_loader.ts b/react-openapi/utils/openapi_loader.ts index 069ca1b..eca557a 100644 --- a/react-openapi/utils/openapi_loader.ts +++ b/react-openapi/utils/openapi_loader.ts @@ -222,8 +222,9 @@ export async function loadConfigFromOpenApi(baseUrl: string, configuration: Reco // Collect standalone enum schemas (e.g. FetchRequestStatus, AccountType, etc.) const enums: Record = {}; - if (api.components?.schemas) { - for (const [name, schema] of Object.entries(api.components.schemas) as [string, any]) { + const apiDoc = api as any; + if (apiDoc.components?.schemas) { + for (const [name, schema] of Object.entries(apiDoc.components.schemas) as [string, any]) { if (schema.enum) { enums[name] = schema.enum; } diff --git a/src/FetchRequests.tsx b/src/FetchRequests.tsx index cbbbada..3895c2f 100644 --- a/src/FetchRequests.tsx +++ b/src/FetchRequests.tsx @@ -326,9 +326,9 @@ export default function FetchRequests() { )} - {startDateField && components?.DateField ? ( + {startDateField && components?.date ? ( - )} - {endDateField && components?.DateField ? ( + {endDateField && components?.date ? ( - - {startDateField && components?.DateField ? ( + {startDateField && components?.datetime ? ( - )} - {endDateField && components?.DateField ? ( + {endDateField && components?.datetime ? ( -