Skip to content

Commit

Permalink
Add createCompositeBlockSelectField helper (#1701)
Browse files Browse the repository at this point in the history
### Description
With this PR a helper function called `createCompositeBlockSelectField`
is added. It simplifies the creation of a select field block by hiding
the verbose definition of Form, Field and Items.

### Acceptance Critiera
- [x] Add changeset

### Example Usage
#### Before
```tsx
// ...
            level: {
                block: createCompositeSetting<HeadlineBlockData["level"]>({
                    defaultValue: "header-one",
                    AdminComponent: ({ state, updateState }) => (
                        <BlocksFinalForm<Pick<HeadlineBlockData, "level">>
                            onSubmit={({ level }) => updateState(level)}
                            initialValues={{ level: state }}
                        >
                            <Field name="level" label="Level" fullWidth>
                                {(props) => (
                                    <FinalFormSelect {...props}>
                                        <MenuItem value="header-one">Header One</MenuItem>
                                        <MenuItem value="header-two">Header Two</MenuItem>
                                        <MenuItem value="header-three">Header Three</MenuItem>
                                        <MenuItem value="header-four">Header Four</MenuItem>
                                        <MenuItem value="header-five">Header Five</MenuItem>
                                        <MenuItem value="header-six">Header Six</MenuItem>
                                    </FinalFormSelect>
                                )}
                            </Field>
                        </BlocksFinalForm>
                    ),
                }),
            },
// ...
```
#### After
```tsx
// ...
            level: {
                block: createCompositeBlockSelectField({
                    defaultValue: "header-one",
                    fieldProps: { label: "Level", fullWidth: true },
                    options: [
                        { value: "header-one", label: "Header One" },
                        { value: "header-two", label: "Header Two" },
                        { value: "header-three", label: "Header Three" },
                        { value: "header-four", label: "Header Four" },
                        { value: "header-five", label: "Header Five" },
                        { value: "header-six", label: "Header Six" },
                    ],
                }),
            },
// ...
```
  • Loading branch information
jomunker authored Mar 7, 2024
1 parent 63e9d26 commit 30d9e0d
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 18 deletions.
7 changes: 7 additions & 0 deletions .changeset/cyan-mayflies-relate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@comet/blocks-admin": minor
---

Add `createCompositeBlockSelectField` helper function

To simplify the creation of a select field blocks by hiding the verbose definition of `Form`, `Field` and items.
30 changes: 12 additions & 18 deletions demo/admin/src/common/blocks/HeadlineBlock.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { SelectField, TextField } from "@comet/admin";
import { TextField } from "@comet/admin";
import { BlockCategory, BlocksFinalForm, createCompositeBlock, createCompositeSetting } from "@comet/blocks-admin";
import { createCompositeBlockSelectField } from "@comet/blocks-admin/lib/blocks/helpers/createCompositeBlockSelectField";
import { createRichTextBlock } from "@comet/cms-admin";
import { MenuItem } from "@mui/material";
import { HeadlineBlockData } from "@src/blocks.generated";
import { LinkBlock } from "@src/common/blocks/LinkBlock";
import * as React from "react";
Expand Down Expand Up @@ -39,23 +39,17 @@ export const HeadlineBlock = createCompositeBlock(
title: "Headline",
},
level: {
block: createCompositeSetting<HeadlineBlockData["level"]>({
block: createCompositeBlockSelectField<HeadlineBlockData["level"]>({
defaultValue: "header-one",
AdminComponent: ({ state, updateState }) => (
<BlocksFinalForm<Pick<HeadlineBlockData, "level">>
onSubmit={({ level }) => updateState(level)}
initialValues={{ level: state }}
>
<SelectField name="level" label="Level" fullWidth>
<MenuItem value="header-one">Header One</MenuItem>
<MenuItem value="header-two">Header Two</MenuItem>
<MenuItem value="header-three">Header Three</MenuItem>
<MenuItem value="header-four">Header Four</MenuItem>
<MenuItem value="header-five">Header Five</MenuItem>
<MenuItem value="header-six">Header Six</MenuItem>
</SelectField>
</BlocksFinalForm>
),
fieldProps: { label: "Level", fullWidth: true },
options: [
{ value: "header-one", label: "Header One" },
{ value: "header-two", label: "Header Two" },
{ value: "header-three", label: "Header Three" },
{ value: "header-four", label: "Header Four" },
{ value: "header-five", label: "Header Five" },
{ value: "header-six", label: "Header Six" },
],
}),
},
},
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { SelectField, SelectFieldProps } from "@comet/admin";
import { MenuItem } from "@mui/material";
import * as React from "react";

import { BlocksFinalForm } from "../../form/BlocksFinalForm";
import { createCompositeSetting } from "./composeBlocks/createCompositeSetting";

interface Options<T extends string | number> {
defaultValue: T;
options: Array<{ value: T; label: React.ReactNode }>;
fieldProps?: Partial<SelectFieldProps<T>>;
}

export function createCompositeBlockSelectField<T extends string | number>({ defaultValue, fieldProps, options }: Options<T>) {
return createCompositeSetting<T>({
defaultValue,
AdminComponent: ({ state, updateState }) => (
<BlocksFinalForm<{ value: typeof state }> onSubmit={({ value }) => updateState(value)} initialValues={{ value: state }}>
<SelectField name="value" {...fieldProps}>
{options.map(({ value, label }) => (
<MenuItem key={value} value={value}>
{label}
</MenuItem>
))}
</SelectField>
</BlocksFinalForm>
),
});
}

0 comments on commit 30d9e0d

Please sign in to comment.