Skip to content

Commit 0034f0e

Browse files
committed
feat(react-formio): register FormBuilder, FormEdit, etc to the container components
1 parent 6551167 commit 0034f0e

17 files changed

+240
-105
lines changed

.storybook/main.ts

+4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ const config: StorybookConfig = {
1010
titlePrefix: "Styling",
1111
directory: "../packages/tailwind-formio"
1212
},
13+
{
14+
titlePrefix: "Atoms",
15+
directory: "../packages/react-formio/src/atoms"
16+
},
1317
{
1418
titlePrefix: "Molecules",
1519
directory: "../packages/react-formio/src/molecules"

packages/react-formio/src/molecules/pagination/Pagination.spec.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { fireEvent, render, screen } from "@testing-library/react";
22

3-
import { Pagination } from "./Pagination";
3+
import { Pagination } from "./all";
44

55
const args: any = {
66
pageSizes: [10, 25, 50, 100],
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1+
import "../forms/select/all.ts";
12
export * from "./Pagination";
23
export * from "./PaginationButton";

packages/react-formio/src/molecules/table/filters/DefaultColumnFilter.spec.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import "../../../molecules/forms/select/all.ts";
2+
13
import { act, fireEvent, render, screen } from "@testing-library/react";
24

35
import { DefaultColumnFilter } from "./DefaultColumnFilter";

packages/react-formio/src/molecules/table/filters/SelectColumnFilter.spec.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import "../../../molecules/forms/select/all.ts";
2+
13
import { render, screen } from "@testing-library/react";
24

35
import { SelectColumnFilter } from "./SelectColumnFilter";

packages/react-formio/src/organisms/form/builder/FormBuilder.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { CSSProperties } from "react";
22

3+
import { registerComponent } from "../../../registries/components";
34
import { useFormBuilder, UseFormBuilderProps } from "./useFormBuilder";
45

56
export function FormBuilder({
@@ -23,3 +24,5 @@ export function FormBuilder({
2324
</div>
2425
);
2526
}
27+
28+
registerComponent("FormBuilder", FormBuilder);

packages/react-formio/src/organisms/form/builder/FormEdit.stories.tsx

+32-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,43 @@
11
import { Meta, StoryObj } from "@storybook/react";
22

3-
import { FormEdit } from "./FormEdit";
3+
import { FormEdit, FormParameters } from "./all";
44
import { defaultDisplayChoices } from "./FormParameters";
5-
5+
console.log(FormParameters);
66
/**
7+
* Form Edit component to edit form schema using the form builder.
8+
*
9+
* ## Usage
710
*
811
* ```tsx
12+
* import {FormEdit} from "@tsed/react-formio/organisms/form/builder/all";
13+
*
14+
* or
15+
*
16+
* // register needed components
17+
* import "@tsed/react-formio/atoms/icon/Icon";
18+
* import "@tsed/react-formio/molecules/button/Button";
19+
* import "@tsed/react-formio/molecules/forms/input-text/InputText";
20+
* import "@tsed/react-formio/molecules/forms/select/Select";
21+
* import "@tsed/react-formio/molecules/forms/select/components/HtmlSelect";
22+
* import "@tsed/react-formio/molecules/forms/input-tags/InputTags";
23+
* import "@tsed/react-formio/organisms/form/builder/FormParameters";
24+
* import "@tsed/react-formio/organisms/form/builder/FormBuilder";
25+
* import "@tsed/react-formio/organisms/form/builder/FormEditCtas";
26+
*
27+
* // use FormEdit component
928
* import {FormEdit} from "@tsed/react-formio/organisms/form/builder/FormEdit";
1029
* ```
30+
*
31+
* ## Override FormEdit
32+
*
33+
* This component is registered with the name `FormEdit` and can be overridden with the following code:
34+
*
35+
* ```ts
36+
* registerComponent("FormEdit", MyFormEditComponent);
37+
* registerComponent("FormEditCtas", MyFormEditCtasComponent);
38+
* registerComponent("FormBuilder", MyFormBuilderComponent);
39+
* registerComponent("FormParameters", MyFormParametersComponent);
40+
* ```
1141
*/
1242
export default {
1343
title: "form/builder/FormEdit",

packages/react-formio/src/organisms/form/builder/FormEdit.tsx

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import type { FormOptions } from "../../../interfaces";
2-
import { FormBuilder } from "./FormBuilder";
3-
import { FormEditCTAs } from "./FormEditCtas";
4-
import { FormParameters } from "./FormParameters";
2+
import { getComponent } from "../../../registries/components";
3+
import { FormBuilder as DefaultFormBuilder } from "./FormBuilder";
4+
import { FormEditCTAs as DefaultFormEditCTAs } from "./FormEditCtas";
5+
import { FormParameters as DefaultFormParameters } from "./FormParameters";
56
import { FormBuilderEvents } from "./useFormBuilder";
67
import { useFormEdit, UseFormEditHookProps } from "./useFormEdit";
78

@@ -28,7 +29,10 @@ export function FormEdit({
2829
});
2930

3031
const { options = {} } = props;
31-
32+
const FormParameters = getComponent<typeof DefaultFormParameters>("FormParameters");
33+
const FormBuilder = getComponent<typeof DefaultFormBuilder>("FormBuilder");
34+
const FormEditCTAs = getComponent<typeof DefaultFormEditCTAs>("FormEditCTAs");
35+
console.log(FormParameters, FormBuilder, FormEditCTAs);
3236
return (
3337
<div className='form-edit-container'>
3438
<div className='form-edit'>

packages/react-formio/src/organisms/form/builder/FormEditCtas.tsx

+23-20
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { ReactElement } from "react";
22

3+
import { Icon as DefaultIcon } from "../../../atoms/icon/Icon";
34
import { useTooltip } from "../../../hooks/useTooltip";
45
import type { FormOptions } from "../../../interfaces";
5-
import { iconClass } from "../../../utils/iconClass";
6+
import { Button as DefaultButton } from "../../../molecules/button/Button";
7+
import { getComponent, registerComponent } from "../../../registries/components";
68

79
export interface FormEditCTAsProps extends Record<string, unknown> {
810
saveText?: string;
@@ -55,40 +57,41 @@ export function FormEditCTAs({
5557
title: t("Reset all changes")
5658
});
5759

60+
const Button = getComponent<typeof DefaultButton>("Button");
61+
const Icon = getComponent<typeof DefaultIcon>("Icon");
62+
5863
return (
5964
<div className={"form-edit__actions"}>
6065
<div>
61-
<button
62-
className={`btn btn-primary btn-save flex ${disabled ? "disabled" : ""}`}
63-
disabled={disabled}
64-
onClick={() => !disabled && onSubmit && onSubmit()}
65-
>
66-
<i className={`mr-1 ${iconClass(options.iconset, "save")}`} />
66+
<Button variant='primary' className='btn-save' disabled={disabled} onClick={() => onSubmit?.()}>
67+
<Icon name='save' iconset={options.iconset} />
6768
{saveText}
68-
</button>
69+
</Button>
6970

7071
<div>
71-
<button className={`btn btn-light btn-undo ${hasUndo ? "" : "disabled"}`} onClick={() => onUndo && onUndo()} ref={undoTooltipRef}>
72-
<i className={iconClass(options.iconset, "undo")} />
73-
</button>
72+
<Button variant='light' className='btn-undo' disabled={!hasUndo} onClick={() => onUndo?.()} ref={undoTooltipRef}>
73+
<Icon name='undo' iconset={options.iconset} />
74+
</Button>
7475

75-
<button className={`btn btn-light btn-redo ${hasRedo ? "" : "disabled"}`} onClick={() => onRedo && onRedo()} ref={redoTooltipRef}>
76-
<i className={iconClass(options.iconset, "redo")} />
77-
</button>
76+
<Button variant='light' className='btn-redo' disabled={!hasRedo} onClick={() => onRedo?.()} ref={redoTooltipRef}>
77+
<Icon name='redo' iconset={options.iconset} />
78+
</Button>
7879
</div>
7980

8081
<div>
8182
{onCopy && (
82-
<button className='btn btn-light' onClick={() => onCopy()} ref={copyTooltipRef!}>
83-
<i className={iconClass(options.iconset, "copy")} />
84-
</button>
83+
<Button variant='light' className='btn-copy' onClick={() => onCopy()} ref={copyTooltipRef}>
84+
<Icon name='copy' iconset={options.iconset} />
85+
</Button>
8586
)}
8687

87-
<button className={`btn btn-light btn-reset`} onClick={() => onReset && onReset()} ref={resetTooltipRef!}>
88-
<i className={iconClass(options.iconset, "reset")} />
89-
</button>
88+
<Button variant='light' className='btn-reset' onClick={() => onReset && onReset()} ref={resetTooltipRef!}>
89+
<Icon name='reset' iconset={options.iconset} />
90+
</Button>
9091
</div>
9192
</div>
9293
</div>
9394
);
9495
}
96+
97+
registerComponent("FormEditCTAs", FormEditCTAs);

packages/react-formio/src/organisms/form/builder/FormParameters.tsx

+14-8
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import { ReactElement } from "react";
22

33
import type { FormType } from "../../../interfaces";
44
import { InputTags } from "../../../molecules/forms/input-tags/InputTags";
5-
import { InputText } from "../../../molecules/forms/input-text/InputText";
6-
import { Select } from "../../../molecules/forms/select/Select";
5+
import { InputText as DefaultInputText } from "../../../molecules/forms/input-text/InputText";
6+
import { Select as DefaultSelect } from "../../../molecules/forms/select/Select";
7+
import { getComponent, registerComponent } from "../../../registries/components";
78

89
export const defaultDisplayChoices = [
910
{ label: "Form", value: "form" },
@@ -34,6 +35,9 @@ export function FormParameters({
3435
}: FormParametersProps): ReactElement {
3536
const hasTypeChoices = typeChoices && typeChoices.length > 1;
3637

38+
const InputText = getComponent<typeof DefaultInputText>("InputText");
39+
const Select = getComponent<typeof DefaultSelect>("Select");
40+
3741
return (
3842
<div className={`form-edit__settings ${className}`}>
3943
<div>
@@ -43,7 +47,7 @@ export function FormParameters({
4347
name={"title"}
4448
required={true}
4549
value={form.title}
46-
disabled={!!readonly["title"]}
50+
disabled={readonly["title"]}
4751
onChange={onChange}
4852
/>
4953
</div>
@@ -53,7 +57,7 @@ export function FormParameters({
5357
placeholder='Enter the form machine name'
5458
name={"name"}
5559
required={true}
56-
disabled={!!readonly["name"]}
60+
disabled={readonly["name"]}
5761
value={form.name}
5862
onChange={onChange}
5963
/>
@@ -72,7 +76,7 @@ export function FormParameters({
7276
}
7377
required={true}
7478
value={form.path}
75-
disabled={!!readonly["path"]}
79+
disabled={readonly["path"]}
7680
style={{ textTransform: "lowercase", width: "120px" }}
7781
onChange={onChange}
7882
/>
@@ -81,15 +85,15 @@ export function FormParameters({
8185
<Select
8286
label={"Display as"}
8387
name={"display"}
84-
disabled={!!readonly["display"]}
88+
disabled={readonly["display"]}
8589
value={form.display}
86-
choices={displayChoices}
90+
options={displayChoices}
8791
onChange={onChange}
8892
/>
8993
</div>
9094
{hasTypeChoices && (
9195
<div>
92-
<Select label={"Type"} name={"type"} value={form.type} choices={typeChoices} onChange={onChange} />
96+
<Select label={"Type"} name={"type"} value={form.type} options={typeChoices} onChange={onChange} />
9397
</div>
9498
)}
9599
{enableTags && (
@@ -100,3 +104,5 @@ export function FormParameters({
100104
</div>
101105
);
102106
}
107+
108+
registerComponent("FormParameters", FormParameters);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import "../../../atoms/icon/Icon";
2+
import "../../../molecules/button/Button";
3+
import "../../../molecules/forms/input-text/InputText";
4+
import "../../../molecules/forms/select/Select";
5+
import "../../../molecules/forms/select/components/HtmlSelect";
6+
import "../../../molecules/forms/input-tags/InputTags";
7+
8+
export * from "./FormBuilder";
9+
export * from "./FormEdit";
10+
export * from "./FormEditCtas";
11+
export * from "./FormParameters";
12+
export * from "./useFormBuilder";
13+
export * from "./useFormEdit";

packages/react-formio/src/organisms/table/actions/ActionsTable.spec.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import "../../../molecules/forms/select/all.ts";
2+
13
import { fireEvent, render, screen } from "@testing-library/react";
24
import userEvent from "@testing-library/user-event";
35

packages/react-formio/src/organisms/table/actions/ActionsTable.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export function ActionsTable({
3737
data-testid={"action-table-select"}
3838
name={"actions"}
3939
value={currentAction}
40-
choices={[{ label: i18n("Select an action"), value: "" }].concat(availableActions)}
40+
options={[{ label: i18n("Select an action"), value: "" }].concat(availableActions)}
4141
onChange={(name: string, action: string) => setAction(action)}
4242
/>
4343
<div className={"pl-3"}>

packages/react-formio/src/organisms/table/forms/FormsTable.stories.tsx

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
import "../../../molecules/button/Button";
2+
import "../../../molecules/forms/input-text/InputText";
3+
import "../../../molecules/forms/select/all";
4+
import "../../../molecules/pagination/all";
5+
16
import tailwind from "@tsed/tailwind-formio";
27

38
import { FormsTable } from "./FormsTable";

packages/react-formio/src/organisms/table/submissions/SubmissionsTable.stories.tsx

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
import "../../../molecules/button/Button";
2+
import "../../../molecules/forms/input-text/InputText";
3+
import "../../../molecules/forms/select/all";
4+
import "../../../molecules/pagination/all";
5+
16
import { useState } from "react";
27

38
import { mapPagination } from "../../../utils/mapPagination";

0 commit comments

Comments
 (0)