Skip to content
Snippets Groups Projects
Commit f0affba87273 authored by Frank Bessou's avatar Frank Bessou :spider_web:
Browse files

feat: add form helpers to get inputp props of a given attribute

parent f1817685a9fb
No related branches found
No related tags found
1 merge request!13Topic/default/form helper
Pipeline #39298 passed
......@@ -30,6 +30,7 @@
import { createDataProvider } from "ra-cubicweb/dist";
import { schema } from "./schema";
import { formHelpers } from "./formHelpers";
const MuseumShow = (props: ShowProps) => (
<Show {...props}>
......@@ -46,15 +47,18 @@
</Show>
);
const MuseumEdit = (props: EditProps) => (
<Edit {...props}>
<SimpleForm>
<NumberInput source="id" />
<TextInput source="name" />
<NumberInput source="latitude" />
<NumberInput source="longitude" />
<TextInput source="postal_address" />
</SimpleForm>
</Edit>
);
const MuseumEdit = (props: EditProps) => {
const inputProps = formHelpers["Museum"].getInputProps;
return (
<Edit {...props}>
<SimpleForm>
<NumberField source="id" />
<TextInput {...inputProps("name")} />
<NumberInput {...inputProps("latitude")} />
<NumberInput {...inputProps("longitude")} />
<TextInput {...inputProps("postal_address")} />
</SimpleForm>
</Edit>
);
};
......@@ -60,23 +64,26 @@
const MuseumCreate = (props: CreateProps) => (
<Create {...props}>
<SimpleForm>
<TextInput source="name" />
<NumberInput source="latitude" />
<NumberInput source="longitude" />
<TextInput source="postal_address" />
<ReferenceInput
label="City"
source="is_in"
reference="City"
sort={{ field: "name", order: "ASC" }}
filterToQuery={(text: string) => ({ name: text })}
>
<AutocompleteInput optionText="name" />
</ReferenceInput>
</SimpleForm>
</Create>
);
const MuseumCreate = (props: CreateProps) => {
const inputProps = formHelpers["Museum"].getInputProps;
return (
<Create {...props}>
<SimpleForm>
<TextInput {...inputProps("name")} />
<NumberInput {...inputProps("latitude")} />
<NumberInput {...inputProps("longitude")} />
<TextInput {...inputProps("postal_address")} />
<ReferenceInput
label="City"
source="is_in"
reference="City"
sort={{ field: "name", order: "ASC" }}
filterToQuery={(text: string) => ({ name: text })}
>
<AutocompleteInput optionText="name" />
</ReferenceInput>
</SimpleForm>
</Create>
);
};
const MuseumFilter = (props: Omit<FilterProps, "children">) => (
<Filter {...props}>
......
import { createFormHelpers } from "ra-cubicweb/dist/createFormHelpers";
import { schema } from "./schema";
export const formHelpers = createFormHelpers(schema);
import { createFormHelpers } from "../createFormHelpers";
const schema = {
entities: {
User: {
login: { type: "String" } as const,
},
},
relationsDefinitions: [],
};
describe("FormHelper", () => {
const formHelpers = createFormHelpers(schema);
describe("getInputProps", () => {
it("returns first argument as source property", () => {
const props = formHelpers.User.getInputProps("login");
expect(props.source).toBe("login");
});
});
});
import { InputProps, required } from "ra-core";
import { Schema, SchemaEntityTypes } from "./Schema";
type FormHelpers<S extends Schema> = {
[EntityType in SchemaEntityTypes<S>]: {
getInputProps: (attrName: keyof S["entities"][EntityType]) => InputProps;
};
};
export function createFormHelpers<S extends Schema>(schema: S): FormHelpers<S> {
type EntityAttributeNames<EntityType extends SchemaEntityTypes<S>> = Extract<
keyof S["entities"][EntityType],
string
>;
function getInputProps<EntityType extends SchemaEntityTypes<S>>(
entityType: SchemaEntityTypes<S>,
attributeName: EntityAttributeNames<EntityType>
) {
const entitySchema = schema.entities[entityType];
const props: InputProps = {
source: attributeName,
};
if (entitySchema[attributeName].required) {
props.validate = [required()];
}
return props;
}
return Object.fromEntries(
(Object.keys(schema.entities) as SchemaEntityTypes<S>[]).map(
(entityType) => {
return [
entityType,
{
getInputProps: <EntityType extends SchemaEntityTypes<S>>(
attributeName: EntityAttributeNames<EntityType>
) => getInputProps(entityType, attributeName),
},
];
}
)
) as FormHelpers<S>;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment