From c476582b0b6184e55bf91ced6b2650c681fb5b67 Mon Sep 17 00:00:00 2001 From: Maarten Vleugels Date: Mon, 24 Jun 2024 16:15:35 +0100 Subject: [PATCH] feat(editor): include groups defenitions --- packages/core/src/types.ts | 9 ++ .../tinacms/form-builder/fields-builder.tsx | 85 ++++++++++++++----- 2 files changed, 73 insertions(+), 21 deletions(-) diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index bdc43b1a..5d58dde2 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -1,6 +1,7 @@ import { ComponentType, ReactElement } from "react"; import { PartialDeep } from "type-fest"; import { Locale } from "./locales"; +import { InternalComponentDefinition } from "./_internals"; export type ScalarOrCollection = T | Array; @@ -438,6 +439,13 @@ export type RootParameter = { widgets: Array; }; +export type GroupDefinition = { + key: string; + label: string; + collapsable?: boolean; + collapsed?: boolean; +}; + export type NoCodeComponentDefinition< Values extends Record = Record, Params extends Record = Record @@ -458,6 +466,7 @@ export type NoCodeComponentDefinition< }) => SidebarPreviewVariant | undefined; allowSave?: boolean; rootParams?: RootParameter[]; + groups?: GroupDefinition[]; }; /** diff --git a/packages/editor/src/tinacms/form-builder/fields-builder.tsx b/packages/editor/src/tinacms/form-builder/fields-builder.tsx index 4aad828a..6e281ad6 100644 --- a/packages/editor/src/tinacms/form-builder/fields-builder.tsx +++ b/packages/editor/src/tinacms/form-builder/fields-builder.tsx @@ -1,5 +1,5 @@ import { InternalField } from "@easyblocks/core/_internals"; -import { Colors, Fonts, Typography } from "@easyblocks/design-system"; +import { Colors, Fonts, Icons, Typography } from "@easyblocks/design-system"; import { toArray } from "@easyblocks/utils"; import React, { useContext } from "react"; import styled, { css } from "styled-components"; @@ -25,6 +25,7 @@ import { LocalFieldPlugin } from "../fields/plugins/LocalFIeld"; import { PositionFieldPlugin } from "../fields/plugins/PositionFieldPlugin"; import { FieldPlugin } from "./field-plugin"; import { createFieldController } from "./utils/createFieldController"; +import { GroupDefinition } from "@easyblocks/core"; export interface FieldBuilderProps { form: Form; @@ -154,6 +155,9 @@ export function FieldsBuilder({ form, fields }: FieldsBuilderProps) { const panelContext = useContext(PanelContext); const grouped: Record> = {}; const ungrouped: Array = []; + const groupsDefinitions: { + [key: string]: GroupDefinition; + } = {}; fields.forEach((field) => { if (!shouldFieldBeDisplayed(field)) { @@ -163,6 +167,14 @@ export function FieldsBuilder({ form, fields }: FieldsBuilderProps) { if (field.group) { grouped[field.group] = grouped[field.group] || []; grouped[field.group].push(field); + + const groupDefinition = field.schemaProp.definition.groups?.find( + (group) => group.key === field.group + ); + + if (groupDefinition && !groupsDefinitions[field.group]) { + groupsDefinitions[field.group] = groupDefinition; + } } else { if (field.component === "identity") { return; @@ -198,26 +210,37 @@ export function FieldsBuilder({ form, fields }: FieldsBuilderProps) { {horizontalLine} )} - {Object.keys(grouped).map((groupName) => ( -
- {groupName} - {grouped[groupName].map((field, index, fields) => ( -
- -
- ))} - {horizontalLine} -
- ))} + {Object.keys(grouped).map((groupName) => { + const groupProps = groupsDefinitions[groupName]; + const DetailTag = groupProps?.collapsable ? "details" : "div"; + return ( +
+ + + + {groupProps?.label || groupName} + {groupProps?.collapsable && } + + + {grouped[groupName].map((field, index, fields) => ( +
+ +
+ ))} +
+ {horizontalLine} +
+ ); + })} {ungrouped.map((field, index, fields) => (