import React, { useEffect, useState } from 'react'; import { Datagrid, DatagridBody, EditButton, List, ShowButton, useResourceContext, useResourceDefinition, } from 'react-admin'; import type { DatagridBodyProps } from 'react-admin'; import type { Field, Resource } from '@api-platform/api-doc-parser'; import FieldGuesser from '../field/FieldGuesser.js'; import FilterGuesser from './FilterGuesser.js'; import Introspecter from '../introspection/Introspecter.js'; import useMercureSubscription from '../mercure/useMercureSubscription.js'; import useDisplayOverrideCode from '../useDisplayOverrideCode.js'; import type { ApiPlatformAdminRecord, IntrospectedListGuesserProps, ListGuesserProps, } from '../types.js'; const getOverrideCode = (schema: Resource, fields: Field[]) => { let code = `If you want to override at least one field, create a ${schema.title}List component with this content:\n`; code += `\n`; code += `import { ListGuesser, FieldGuesser } from "@api-platform/admin";\n`; code += `\n`; code += `export const ${schema.title}List = () => (\n`; code += ` \n`; fields.forEach((field) => { code += ` \n`; }); code += ` \n`; code += `);\n`; code += `\n`; code += `Then, update your main admin component:\n`; code += `\n`; code += `import { HydraAdmin, ResourceGuesser } from "@api-platform/admin";\n`; code += `import { ${schema.title}List } from './${schema.title}List';\n`; code += `\n`; code += `const App = () => (\n`; code += ` \n`; code += ` \n`; code += ` {/* ... */}\n`; code += ` \n`; code += `);\n`; return code; }; export const DatagridBodyWithMercure = (props: DatagridBodyProps) => { const { data } = props; const resource = useResourceContext(props); useMercureSubscription( resource, data?.map((record: ApiPlatformAdminRecord) => record.id), ); return ; }; export const IntrospectedListGuesser = ({ fields, readableFields, writableFields, schema, schemaAnalyzer, datagridSx, bulkActionButtons, rowClick, rowStyle, isRowSelectable, isRowExpandable, body = DatagridBodyWithMercure, header, empty, hover, expand, expandSingle, optimized, size, children, ...props }: IntrospectedListGuesserProps) => { const { hasShow, hasEdit } = useResourceDefinition(props); const [orderParameters, setOrderParameters] = useState([]); useEffect(() => { if (schema) { schemaAnalyzer.getOrderParametersFromSchema(schema).then((parameters) => { setOrderParameters(parameters); }); } }, [schema, schemaAnalyzer]); const displayOverrideCode = useDisplayOverrideCode(); let fieldChildren = children; if (!fieldChildren) { fieldChildren = readableFields.map((field) => { const orderField = orderParameters.find( (orderParameter) => orderParameter.split('.')[0] === field.name, ); return ( ); }); displayOverrideCode(getOverrideCode(schema, readableFields)); } return ( {fieldChildren} {hasShow && } {hasEdit && } ); }; const ListGuesser = ({ filters = , ...props }: ListGuesserProps) => { const resource = useResourceContext(props); if (!resource) { throw new Error('ListGuesser must be used with a resource'); } return ( ); }; export default ListGuesser;