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 ? (
-