diff --git a/gui/rpk-gui/src/lib/crud/components/base-form.tsx b/gui/rpk-gui/src/lib/crud/components/base-form.tsx index f2638d9..3f62435 100644 --- a/gui/rpk-gui/src/lib/crud/components/base-form.tsx +++ b/gui/rpk-gui/src/lib/crud/components/base-form.tsx @@ -4,6 +4,7 @@ import { RegistryFieldsType, RegistryWidgetsType, RJSFSchema, UiSchema } from "@ import CrudTextWidget from "./widgets/crud-text-widget"; import UnionEnumField from "./fields/union-enum"; import { ResourceContext } from "../contexts/ResourceContext"; +import { ReactNode } from "react"; type BaseFormProps = { schema: RJSFSchema, @@ -12,6 +13,7 @@ type BaseFormProps = { onChange?: (data: any) => void, uiSchema?: UiSchema, formData?: any, + children?: ReactNode } export const customWidgets: RegistryWidgetsType = { @@ -23,7 +25,7 @@ export const customFields: RegistryFieldsType = { } export const BaseForm: React.FC = (props) => { - const { schema, uiSchema, resourceBasePath, formData, onSubmit, onChange } = props; + const { schema, uiSchema, resourceBasePath, formData, children, onSubmit, onChange } = props; return ( @@ -37,6 +39,7 @@ export const BaseForm: React.FC = (props) => { widgets={customWidgets} fields={customFields} onChange={(e, id) => onChange != undefined && onChange(e.formData)} + children={children} /> ) diff --git a/gui/rpk-gui/src/lib/crud/components/crud-form.tsx b/gui/rpk-gui/src/lib/crud/components/crud-form.tsx index 14f78c1..5c97b87 100644 --- a/gui/rpk-gui/src/lib/crud/components/crud-form.tsx +++ b/gui/rpk-gui/src/lib/crud/components/crud-form.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from "react"; +import { ReactNode, useEffect, useState } from "react"; import { CircularProgress } from "@mui/material"; import { useForm } from "@refinedev/core"; import { UiSchema } from "@rjsf/utils"; @@ -12,11 +12,12 @@ type CrudFormProps = { resource: string, id?: string, onSuccess?: (data: any) => void, - defaultValue?: any + defaultValue?: any, + children?: ReactNode } export const CrudForm: React.FC = (props) => { - const { schemaName, uiSchema, resourceBasePath="" ,resource, id, onSuccess, defaultValue } = props; + const { schemaName, uiSchema, resourceBasePath="" ,resource, id, onSuccess, defaultValue, children } = props; const { onFinish, query, formLoading } = useForm({ resource: resourceBasePath == "" ? resource : `${resourceBasePath}/${resource}`, @@ -57,6 +58,7 @@ export const CrudForm: React.FC = (props) => { onSubmit={ (data: any) => onFinish(data) } + children={children} /> ) } diff --git a/gui/rpk-gui/src/pages/firm/DraftRoutes.tsx b/gui/rpk-gui/src/pages/firm/DraftRoutes.tsx index 79d5b67..07255af 100644 --- a/gui/rpk-gui/src/pages/firm/DraftRoutes.tsx +++ b/gui/rpk-gui/src/pages/firm/DraftRoutes.tsx @@ -1,4 +1,11 @@ import { Route, Routes } from "react-router"; +import { CircularProgress } from "@mui/material"; +import React, { useContext, useState } from "react"; +import { useOne } from "@refinedev/core"; +import { BaseForm } from "../../lib/crud/components/base-form"; +import { ForeignKeyReference, ForeignKeySchema } from "../../lib/crud/components/widgets/foreign-key"; + +import { FirmContext } from "../../contexts/FirmContext"; import List from "./base-page/List"; import Edit from "./base-page/Edit"; import New from "./base-page/New"; @@ -29,6 +36,79 @@ const EditDraft = () => { return resource={`contracts/drafts`} schemaName={"ContractDraft"} /> } -const CreateDraft = () => { - return resource={`contracts/drafts`} schemaName={"ContractDraft"} /> +type ForeignKeySubSchema = ForeignKeySchema & { + properties: { [key: string]: { foreignKey: { reference: ForeignKeyReference } } } +} + +const CreateDraft = () => { + const [chosenDraft, setChosenDraft] = useState(null) + const { currentFirm } = useContext(FirmContext); + const resourceBasePath = `firm/${currentFirm.instance}/${currentFirm.firm}` + const templateFieldSchema: ForeignKeySubSchema = { + type: "object", + properties: { + template_id: { + type: "string", + title: "Find a template", + foreignKey: { + reference: { + resource: "templates/contracts", + schema: "ContractTemplate" + } + } + } + }, + }; + + const templateForm = ( + { + const { template_id } = data; + setChosenDraft(template_id); + }} + > +   + + ) + + if (chosenDraft !== null) { + return ( + <> + {templateForm} + + + ) + } + + return ( + <> + {templateForm} + resource={`contracts/drafts`} schemaName={"ContractDraft"} /> + + ) +} + +const CreateDraftFromTemplate = (props: { template_id: string }) => { + const { template_id } = props; + const { currentFirm } = useContext(FirmContext); + const resourceBasePath = `firm/${currentFirm.instance}/${currentFirm.firm}` + const resource = "templates/contracts" + const { data, isLoading } = useOne({ + resource: `${resourceBasePath}/${resource}`, + id: template_id + }); + + if (isLoading || data === undefined) { + return + } + + let template = { ...data.data }; + template.provisions = data.data.provisions.map((item: any) => { + return { provision: {type: "template", provision_template_id: item.provision_template_id} } + }) + + return resource={`contracts/drafts`} schemaName={"ContractDraft"} defaultValue={ template }/> } diff --git a/gui/rpk-gui/src/pages/firm/base-page/Edit.tsx b/gui/rpk-gui/src/pages/firm/base-page/Edit.tsx index 150e80e..2f2e756 100644 --- a/gui/rpk-gui/src/pages/firm/base-page/Edit.tsx +++ b/gui/rpk-gui/src/pages/firm/base-page/Edit.tsx @@ -1,8 +1,12 @@ -import { CrudForm } from "../../../lib/crud/components/crud-form"; import { UiSchema } from "@rjsf/utils"; import { useParams } from "react-router"; import { useContext } from "react"; +import { Button } from "@mui/material"; +import DeleteIcon from '@mui/icons-material/Delete'; +import SaveIcon from '@mui/icons-material/Save'; import { FirmContext } from "../../../contexts/FirmContext"; +import { CrudForm } from "../../../lib/crud/components/crud-form"; +import Stack from "@mui/material/Stack"; type EditProps = { resource: string, @@ -17,13 +21,26 @@ const Edit = (props: EditProps) => { const { record_id } = useParams(); return ( - + <> + + + + + + + ) }