From ac66e45ddd8f688c3f49e4e0fc3121ded838d046 Mon Sep 17 00:00:00 2001 From: caichi <54824604+caichi-t@users.noreply.github.com> Date: Tue, 19 Mar 2024 14:48:00 +0900 Subject: [PATCH] fix(web): improve the performance related to the group (#1104) * remove redundant code * fix: jumping to ia new model when creating it * fix: unify model and group * remove redundant code * fix: getGroups and getGroup * add test for creating group * fix: createGroup test behavior * fix: default value bug * fix: remove graphql api from GroupItem --- web/e2e/project/item/fields/group.spec.ts | 2 + web/e2e/project/schema.spec.ts | 44 +++- web/e2e/project/utils/group.ts | 1 - .../molecules/Common/Form/GroupItem/hooks.ts | 20 -- .../molecules/Common/Form/GroupItem/index.tsx | 21 +- .../MultiValueField/MultiValueGroup/index.tsx | 18 +- .../molecules/Content/Details/index.tsx | 8 +- .../ComplexFieldComponents/GroupField.tsx | 7 +- .../molecules/Content/Form/index.tsx | 42 ++-- .../molecules/Model/ModelsList/Groups.tsx | 9 +- .../molecules/Model/ModelsList/GroupsList.tsx | 13 +- .../molecules/Model/ModelsList/Models.tsx | 9 +- .../molecules/Model/ModelsList/ModelsList.tsx | 17 +- web/src/components/molecules/Schema/index.tsx | 98 ++++---- .../Project/Content/ContentDetails/hooks.ts | 112 +++++----- .../Project/Content/ContentDetails/index.tsx | 5 +- .../Project/Content/ContentList/index.tsx | 1 + .../organisms/Project/ModelsMenu/hooks.ts | 15 +- .../organisms/Project/ModelsMenu/index.tsx | 23 +- .../organisms/Project/Schema/hooks.ts | 210 +++++++++++------- .../organisms/Project/Schema/index.tsx | 61 ++--- web/src/gql/graphql-client-api.tsx | 54 +---- web/src/gql/queries/group.ts | 52 ----- 23 files changed, 359 insertions(+), 483 deletions(-) delete mode 100644 web/src/components/molecules/Common/Form/GroupItem/hooks.ts diff --git a/web/e2e/project/item/fields/group.spec.ts b/web/e2e/project/item/fields/group.spec.ts index 4a0671bfbc..91d0e465ed 100644 --- a/web/e2e/project/item/fields/group.spec.ts +++ b/web/e2e/project/item/fields/group.spec.ts @@ -116,6 +116,7 @@ test("Group field creating and updating has succeeded", async ({ page }) => { await expect(page.getByRole("alert").last()).toContainText("Successfully updated field!"); await closeNotification(page); await page.getByText("Content").click(); + await page.getByText("e2e model name").click(); await page.getByRole("link", { name: "edit", exact: true }).click(); await expect(page.getByRole("main")).toContainText("new text1(unique)"); await expect(page.getByRole("main")).toContainText("new text1 description"); @@ -304,6 +305,7 @@ test("Group field editing has succeeded", async ({ page }) => { await closeNotification(page); await page.getByText("Content").click(); + await page.getByText("e2e model name").click(); await page.getByRole("button", { name: "plus New Item" }).click(); await page.getByRole("button", { name: "plus New" }).click(); await expect(page.getByRole("textbox").nth(0)).toHaveValue("text1"); diff --git a/web/e2e/project/schema.spec.ts b/web/e2e/project/schema.spec.ts index a8846cca7d..6f97e7e358 100644 --- a/web/e2e/project/schema.spec.ts +++ b/web/e2e/project/schema.spec.ts @@ -33,14 +33,46 @@ test("Group CRUD has succeeded", async ({ page }) => { await crudGroup(page); }); +test("Group creating from adding field has succeeded", async ({ page }) => { + await createModel(page); + await page.locator("li").filter({ hasText: "Group" }).locator("div").first().click(); + await page.getByRole("button", { name: "Create Group" }).click(); + await expect(page.getByLabel("New Group")).toContainText("New Group"); + await expect(page.getByRole("button", { name: "OK" })).toBeDisabled(); + + await page.getByLabel("New Group").locator("#name").click(); + await page.getByLabel("New Group").locator("#name").fill("e2e group name"); + await page.getByLabel("New Group").locator("#key").click(); + await page.getByLabel("New Group").locator("#key").fill("e2e-group-key"); + await page.getByRole("button", { name: "OK" }).click(); + await expect(page.getByRole("alert").last()).toContainText("Successfully created group!"); + await closeNotification(page); + await expect( + page.getByRole("menuitem", { name: "e2e group name" }).locator("span"), + ).toBeVisible(); + await expect(page.getByText("e2e group name#e2e-group-key")).toBeVisible(); + await expect(page.getByText("FieldsMeta Data")).not.toBeVisible(); + await expect( + page.locator("li").filter({ hasText: "Reference" }).locator("div").first(), + ).not.toBeVisible(); + await expect( + page.locator("li").filter({ hasText: "Group" }).locator("div").first(), + ).not.toBeVisible(); + await page.locator("li").filter({ hasText: "Text" }).locator("div").first().click(); + await handleFieldForm(page, "text"); + await expect(page.getByRole("alert").last()).toContainText("Successfully created field!"); + await closeNotification(page); + await page.getByText("e2e model name").click(); + await page.locator("li").filter({ hasText: "Group" }).locator("div").first().click(); + await expect(page.getByRole("heading", { name: "Create Group" })).toBeVisible(); + await page.getByLabel("Select Group").click(); + await expect(page.getByText("e2e group name #e2e-group-key")).toBeVisible(); + await page.getByRole("button", { name: "Cancel" }).click(); +}); + test("Text field CRUD has succeeded", async ({ page }) => { await createModel(page); - await page - .locator("li") - .filter({ hasText: "TextHeading and titles, one-" }) - .locator("div") - .first() - .click(); + await page.locator("li").filter({ hasText: "Text" }).locator("div").first().click(); await handleFieldForm(page, "text"); await expect(page.getByRole("alert").last()).toContainText("Successfully created field!"); await closeNotification(page); diff --git a/web/e2e/project/utils/group.ts b/web/e2e/project/utils/group.ts index 5ce159cc50..ce16a258a5 100644 --- a/web/e2e/project/utils/group.ts +++ b/web/e2e/project/utils/group.ts @@ -13,7 +13,6 @@ export async function createGroup(page: Page) { await page.getByRole("button", { name: "OK" }).click(); await expect(page.getByRole("alert").last()).toContainText("Successfully created group!"); await closeNotification(page); - await page.getByText("e2e group name").click(); await expect(page.getByTitle("e2e group name")).toBeVisible(); await expect(page.getByText("#e2e-group-key")).toBeVisible(); } diff --git a/web/src/components/molecules/Common/Form/GroupItem/hooks.ts b/web/src/components/molecules/Common/Form/GroupItem/hooks.ts deleted file mode 100644 index c0ecf3d4e5..0000000000 --- a/web/src/components/molecules/Common/Form/GroupItem/hooks.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { useMemo } from "react"; - -import { fromGraphQLGroup } from "@reearth-cms/components/organisms/DataConverters/schema"; -import { useGetGroupQuery, Group } from "@reearth-cms/gql/graphql-client-api"; - -export default (groupId?: string) => { - const { data } = useGetGroupQuery({ - fetchPolicy: "no-cache", - variables: { id: groupId ?? "" }, - skip: !groupId, - }); - - const group = useMemo(() => { - return fromGraphQLGroup(data?.node as Group); - }, [data?.node]); - - return { - group, - }; -}; diff --git a/web/src/components/molecules/Common/Form/GroupItem/index.tsx b/web/src/components/molecules/Common/Form/GroupItem/index.tsx index 7ebd6bc343..1c3ce4142a 100644 --- a/web/src/components/molecules/Common/Form/GroupItem/index.tsx +++ b/web/src/components/molecules/Common/Form/GroupItem/index.tsx @@ -1,5 +1,5 @@ import styled from "@emotion/styled"; -import { useCallback, useMemo, MouseEvent } from "react"; +import { useCallback, useMemo, MouseEvent, useState, useEffect } from "react"; import Collapse from "@reearth-cms/components/atoms/Collapse"; import Icon from "@reearth-cms/components/atoms/Icon"; @@ -13,14 +13,12 @@ import { import { DefaultField } from "@reearth-cms/components/molecules/Content/Form/fields/FieldComponents"; import { FIELD_TYPE_COMPONENT_MAP } from "@reearth-cms/components/molecules/Content/Form/fields/FieldTypesMap"; import { FormItem, ItemAsset } from "@reearth-cms/components/molecules/Content/types"; -import { Field } from "@reearth-cms/components/molecules/Schema/types"; +import { Field, Group } from "@reearth-cms/components/molecules/Schema/types"; import { AssetSortType, SortDirection, } from "@reearth-cms/components/organisms/Project/Asset/AssetList/hooks"; -import useHooks from "./hooks"; - type Props = { value?: string; onChange?: (value: string) => void; @@ -68,6 +66,7 @@ type Props = { disableMoveUp?: boolean; disableMoveDown?: boolean; onGetAsset: (assetId: string) => Promise; + onGroupGet: (id: string) => Promise; }; const GroupItem: React.FC = ({ @@ -112,11 +111,21 @@ const GroupItem: React.FC = ({ disableMoveUp, disableMoveDown, onGetAsset, + onGroupGet, }) => { const { Panel } = Collapse; - const { group } = useHooks(parentField?.typeProperty?.groupId); - const fields = useMemo(() => group?.schema.fields, [group?.schema.fields]); + const [fields, setFields] = useState(); + + useEffect(() => { + const handleFieldsSet = async (id: string) => { + const group = await onGroupGet(id); + setFields(group?.schema.fields); + }; + + if (parentField?.typeProperty?.groupId) handleFieldsSet(parentField.typeProperty.groupId); + }, [onGroupGet, parentField?.typeProperty?.groupId]); + const itemGroupId = useMemo(() => value ?? "", [value]); const handleMoveUp = useCallback( diff --git a/web/src/components/molecules/Common/MultiValueField/MultiValueGroup/index.tsx b/web/src/components/molecules/Common/MultiValueField/MultiValueGroup/index.tsx index 040c8334ca..001a131341 100644 --- a/web/src/components/molecules/Common/MultiValueField/MultiValueGroup/index.tsx +++ b/web/src/components/molecules/Common/MultiValueField/MultiValueGroup/index.tsx @@ -1,6 +1,6 @@ import styled from "@emotion/styled"; import moment from "moment"; -import { useCallback, useEffect, useMemo } from "react"; +import { useCallback, useEffect } from "react"; import Button from "@reearth-cms/components/atoms/Button"; import { FormInstance } from "@reearth-cms/components/atoms/Form"; @@ -26,7 +26,6 @@ type Props = { onChange?: (value: string[]) => void; parentField: Field; form?: FormInstance; - groups?: Group[]; fields?: Field[]; linkedItemsModalList?: FormItem[]; linkItemModalTitle: string; @@ -65,12 +64,12 @@ type Props = { setFileList: (fileList: UploadFile[]) => void; setUploadModalVisibility: (visible: boolean) => void; onGetAsset: (assetId: string) => Promise; + onGroupGet: (id: string) => Promise; }; const MultiValueGroup: React.FC = ({ className, parentField, - groups, form, fields, value = [], @@ -108,6 +107,7 @@ const MultiValueGroup: React.FC = ({ setFileList, setUploadModalVisibility, onGetAsset, + onGroupGet, }) => { const t = useT(); @@ -126,12 +126,7 @@ const MultiValueGroup: React.FC = ({ [onChange, value], ); - const group = useMemo( - () => groups?.find(g => g.id === parentField.typeProperty?.groupId), - [groups, parentField.typeProperty?.groupId], - ); - - const handleAdd = useCallback(() => { + const handleAdd = useCallback(async () => { const currentValues = value || []; const itemGroupId = newID(); @@ -143,6 +138,8 @@ const MultiValueGroup: React.FC = ({ // set default value const newValues = { ...form?.getFieldsValue() }; + if (!parentField.typeProperty?.groupId) return; + const group = await onGroupGet(parentField.typeProperty.groupId); group?.schema.fields.forEach((field: Field) => { const defaultValue = field.typeProperty?.defaultValue; const setValue = (value: any) => { @@ -177,7 +174,7 @@ const MultiValueGroup: React.FC = ({ break; } }); - }, [form, group?.schema.fields, onChange, value]); + }, [form, onChange, onGroupGet, parentField.typeProperty?.groupId, value]); return (
@@ -227,6 +224,7 @@ const MultiValueGroup: React.FC = ({ disableMoveUp={key === 0} disableMoveDown={key === value.length - 1} onGetAsset={onGetAsset} + onGroupGet={onGroupGet} /> ); diff --git a/web/src/components/molecules/Content/Details/index.tsx b/web/src/components/molecules/Content/Details/index.tsx index 4ec82c27e7..f4aab54726 100644 --- a/web/src/components/molecules/Content/Details/index.tsx +++ b/web/src/components/molecules/Content/Details/index.tsx @@ -16,7 +16,7 @@ import { SortDirection, } from "@reearth-cms/components/organisms/Project/Asset/AssetList/hooks"; -export type Props = { +type Props = { linkedItemsModalList?: FormItem[]; showPublishAction?: boolean; requests: Request[]; @@ -40,7 +40,6 @@ export type Props = { commentsPanel?: JSX.Element; requestModalShown: boolean; addItemToRequestModalShown: boolean; - groups?: Group[]; workspaceUserMembers: UserMember[]; totalCount: number; page: number; @@ -102,6 +101,7 @@ export type Props = { onAddItemToRequestModalClose: () => void; onAddItemToRequestModalOpen: () => void; onGetAsset: (assetId: string) => Promise; + onGroupGet: (id: string) => Promise; }; const ContentDetailsMolecule: React.FC = ({ @@ -129,7 +129,6 @@ const ContentDetailsMolecule: React.FC = ({ requestModalShown, addItemToRequestModalShown, workspaceUserMembers, - groups, totalCount, page, pageSize, @@ -173,6 +172,7 @@ const ContentDetailsMolecule: React.FC = ({ onAddItemToRequestModalOpen, onAssetTableChange, onGetAsset, + onGroupGet, }) => { return ( = ({ ) : ( = ({ onAddItemToRequestModalClose={onAddItemToRequestModalClose} workspaceUserMembers={workspaceUserMembers} onGetAsset={onGetAsset} + onGroupGet={onGroupGet} /> ) } diff --git a/web/src/components/molecules/Content/Form/fields/ComplexFieldComponents/GroupField.tsx b/web/src/components/molecules/Content/Form/fields/ComplexFieldComponents/GroupField.tsx index b86089009f..cabd94b897 100644 --- a/web/src/components/molecules/Content/Form/fields/ComplexFieldComponents/GroupField.tsx +++ b/web/src/components/molecules/Content/Form/fields/ComplexFieldComponents/GroupField.tsx @@ -15,7 +15,6 @@ import { interface GroupFieldProps { field: Field; form?: FormInstance; - groups?: Group[]; linkedItemsModalList?: FormItem[]; linkItemModalTitle: string; formItemsData: FormItem[]; @@ -53,12 +52,12 @@ interface GroupFieldProps { setFileList: (fileList: UploadFile[]) => void; setUploadModalVisibility: (visible: boolean) => void; onGetAsset: (assetId: string) => Promise; + onGroupGet: (id: string) => Promise; } const GroupField: React.FC = ({ field, form, - groups, linkedItemsModalList, linkItemModalTitle, formItemsData, @@ -92,6 +91,7 @@ const GroupField: React.FC = ({ setFileList, setUploadModalVisibility, onGetAsset, + onGroupGet, }) => { return ( = ({ = ({ setFileList={setFileList} setUploadModalVisibility={setUploadModalVisibility} onGetAsset={onGetAsset} + onGroupGet={onGroupGet} /> ) : ( = ({ setFileList={setFileList} setUploadModalVisibility={setUploadModalVisibility} onGetAsset={onGetAsset} + onGroupGet={onGroupGet} /> )} diff --git a/web/src/components/molecules/Content/Form/index.tsx b/web/src/components/molecules/Content/Form/index.tsx index a6a570cffe..4b713abcee 100644 --- a/web/src/components/molecules/Content/Form/index.tsx +++ b/web/src/components/molecules/Content/Form/index.tsx @@ -38,9 +38,8 @@ import { AssetField, GroupField, ReferenceField } from "./fields/ComplexFieldCom import { DefaultField } from "./fields/FieldComponents"; import { FIELD_TYPE_COMPONENT_MAP } from "./fields/FieldTypesMap"; -export interface Props { +interface Props { item?: Item; - groups?: Group[]; linkedItemsModalList?: FormItem[]; showPublishAction?: boolean; requests: Request[]; @@ -119,11 +118,11 @@ export interface Props { onAddItemToRequestModalClose: () => void; onAddItemToRequestModalOpen: () => void; onGetAsset: (assetId: string) => Promise; + onGroupGet: (id: string) => Promise; } const ContentForm: React.FC = ({ item, - groups, linkedItemsModalList, showPublishAction, requests, @@ -185,6 +184,7 @@ const ContentForm: React.FC = ({ onAddItemToRequestModalClose, onAddItemToRequestModalOpen, onGetAsset, + onGroupGet, }) => { const t = useT(); const [form] = Form.useForm(); @@ -328,16 +328,18 @@ const ContentForm: React.FC = ({ const handleSubmit = useCallback(async () => { try { const modelFields = new Map((model?.schema.fields || []).map(field => [field.id, field])); - const groupIdsInCurrentModel = new Set(); - model?.schema.fields?.forEach(field => { - if (field.type === "Group") groupIdsInCurrentModel.add(field.typeProperty?.groupId); - }); const groupFields = new Map(); - groups - ?.filter(group => groupIdsInCurrentModel.has(group.id)) - .forEach(group => { - group?.schema.fields?.forEach(field => groupFields.set(field.id, field)); - }); + if (model) { + await Promise.all( + model.schema.fields.map(async field => { + if (field.typeProperty?.groupId) { + const group = await onGroupGet(field.typeProperty.groupId); + group?.schema.fields?.forEach(field => groupFields.set(field.id, field)); + } + }), + ); + } + const values = await form.validateFields(); const fields: ItemField[] = []; for (const [key, value] of Object.entries(values)) { @@ -394,19 +396,7 @@ const ContentForm: React.FC = ({ } catch (info) { console.log("Validate Failed:", info); } - }, [ - model?.schema.fields, - model?.schema.id, - model?.metadataSchema?.fields, - model?.metadataSchema?.id, - groups, - form, - metaForm, - itemId, - inputValueGet, - onItemUpdate, - onItemCreate, - ]); + }, [model, form, metaForm, itemId, onGroupGet, inputValueGet, onItemUpdate, onItemCreate]); const handleMetaUpdate = useCallback(async () => { if (!itemId || !item?.metadata?.id) return; @@ -573,7 +563,6 @@ const ContentForm: React.FC = ({ = ({ setFileList={setFileList} setUploadModalVisibility={setUploadModalVisibility} onGetAsset={onGetAsset} + onGroupGet={onGroupGet} /> ); diff --git a/web/src/components/molecules/Model/ModelsList/Groups.tsx b/web/src/components/molecules/Model/ModelsList/Groups.tsx index e2303363c5..58d4911a53 100644 --- a/web/src/components/molecules/Model/ModelsList/Groups.tsx +++ b/web/src/components/molecules/Model/ModelsList/Groups.tsx @@ -1,15 +1,12 @@ import GroupsList from "@reearth-cms/components/molecules/Model/ModelsList/GroupsList"; -import { SelectedSchemaType } from "@reearth-cms/components/molecules/Schema"; import FormModal from "@reearth-cms/components/molecules/Schema/FormModal"; import { Group } from "@reearth-cms/components/molecules/Schema/types"; -export type Props = { - className?: string; +type Props = { title: string; collapsed?: boolean; selectedKey?: string; groups?: Group[]; - selectedSchemaType?: SelectedSchemaType; open: boolean; onModalOpen: () => void; onGroupKeyCheck: (key: string, ignoredKey?: string) => Promise; @@ -19,11 +16,9 @@ export type Props = { }; const Groups: React.FC = ({ - className, collapsed, selectedKey, groups, - selectedSchemaType, open, onModalOpen, onGroupKeyCheck, @@ -34,10 +29,8 @@ const Groups: React.FC = ({ return ( <> void; onGroupSelect?: (groupId: string) => void; }; const GroupsList: React.FC = ({ - className, selectedKey, groups, - selectedSchemaType, collapsed, onModalOpen, onGroupSelect, @@ -30,8 +25,8 @@ const GroupsList: React.FC = ({ const t = useT(); const selectedKeys = useMemo(() => { - return selectedSchemaType && selectedSchemaType === "group" && selectedKey ? [selectedKey] : []; - }, [selectedKey, selectedSchemaType]); + return selectedKey ? [selectedKey] : []; + }, [selectedKey]); const handleClick = useCallback( (e: MenuInfo) => { @@ -41,7 +36,7 @@ const GroupsList: React.FC = ({ ); return ( - + {collapsed ? ( ) : ( diff --git a/web/src/components/molecules/Model/ModelsList/Models.tsx b/web/src/components/molecules/Model/ModelsList/Models.tsx index dc9b68c59b..4172ef4994 100644 --- a/web/src/components/molecules/Model/ModelsList/Models.tsx +++ b/web/src/components/molecules/Model/ModelsList/Models.tsx @@ -1,16 +1,13 @@ import ModelsList from "@reearth-cms/components/molecules/Model/ModelsList/ModelsList"; import { Model } from "@reearth-cms/components/molecules/Model/types"; -import { SelectedSchemaType } from "@reearth-cms/components/molecules/Schema"; import FormModal from "@reearth-cms/components/molecules/Schema/FormModal"; import { ModelFormValues } from "@reearth-cms/components/molecules/Schema/types"; -export interface Props { - className?: string; +interface Props { title: string; collapsed?: boolean; selectedKey?: string; models?: Model[]; - selectedSchemaType?: SelectedSchemaType; open?: boolean; onModalOpen: () => void; onModelKeyCheck: (key: string, ignoredKey?: string | undefined) => Promise; @@ -21,11 +18,9 @@ export interface Props { } const Models: React.FC = ({ - className, collapsed, selectedKey, models, - selectedSchemaType, open, onModalOpen, onModelKeyCheck, @@ -37,10 +32,8 @@ const Models: React.FC = ({ return ( <> void; onModelSelect: (modelId: string) => void; @@ -21,10 +18,8 @@ export type Props = { }; const ModelsList: React.FC = ({ - className, selectedKey, models, - selectedSchemaType, collapsed, onModalOpen, onModelSelect, @@ -51,12 +46,8 @@ const ModelsList: React.FC = ({ ); const selectedKeys = useMemo(() => { - return !selectedSchemaType - ? [selectedKey ?? ""] - : selectedSchemaType === "model" && selectedKey - ? [selectedKey] - : []; - }, [selectedKey, selectedSchemaType]); + return selectedKey ? [selectedKey] : []; + }, [selectedKey]); const items = useMemo(() => { return models @@ -73,7 +64,7 @@ const ModelsList: React.FC = ({ }, [collapsed, models]); return ( - + {collapsed ? ( ) : ( diff --git a/web/src/components/molecules/Schema/index.tsx b/web/src/components/molecules/Schema/index.tsx index 84df1ff680..2fcf6de0f3 100644 --- a/web/src/components/molecules/Schema/index.tsx +++ b/web/src/components/molecules/Schema/index.tsx @@ -14,16 +14,13 @@ import ModelFieldList from "@reearth-cms/components/molecules/Schema/ModelFieldL import { Field, FieldType, Group } from "@reearth-cms/components/molecules/Schema/types"; import { useT } from "@reearth-cms/i18n"; -export type Props = { +type Props = { + data?: Model | Group; collapsed?: boolean; - model?: Model; - group?: Group; - onModelModalOpen: () => void; - onModelDeletionModalOpen: () => void; - onGroupModalOpen: () => void; - onGroupDeletionModalOpen: () => void; + onModalOpen: () => void; + onDeletionModalOpen: () => void; modelsMenu?: JSX.Element; - selectedSchemaType?: SelectedSchemaType; + selectedSchemaType: SelectedSchemaType; setIsMeta?: (isMeta: boolean) => void; onCollapse?: (collapse: boolean) => void; onFieldReorder: (data: Field[]) => Promise | void; @@ -36,13 +33,10 @@ export type Tab = "fields" | "meta-data"; export type SelectedSchemaType = "model" | "group"; const Schema: React.FC = ({ + data, collapsed, - model, - group, - onModelModalOpen, - onModelDeletionModalOpen, - onGroupModalOpen, - onGroupDeletionModalOpen, + onModalOpen, + onDeletionModalOpen, modelsMenu, selectedSchemaType, setIsMeta, @@ -55,41 +49,32 @@ const Schema: React.FC = ({ const t = useT(); const [tab, setTab] = useState("fields"); - const handleEdit = useCallback(() => { - selectedSchemaType === "model" ? onModelModalOpen() : onGroupModalOpen(); - }, [onModelModalOpen, onGroupModalOpen, selectedSchemaType]); - - const handleDelete = useCallback(() => { - selectedSchemaType === "model" ? onModelDeletionModalOpen() : onGroupDeletionModalOpen(); - }, [onGroupDeletionModalOpen, onModelDeletionModalOpen, selectedSchemaType]); - const dropdownItems = useMemo( () => [ { key: "edit", label: t("Edit"), icon: , - onClick: handleEdit, + onClick: onModalOpen, }, { key: "delete", label: t("Delete"), icon: , - onClick: handleDelete, + onClick: onDeletionModalOpen, danger: true, }, ], - [handleDelete, handleEdit, t], + [onDeletionModalOpen, onModalOpen, t], ); const DropdownMenu = useCallback( - () => - model || group ? ( - -