diff --git a/src/components/EditorSidePanel/EnumsTab/EnumDetails.jsx b/src/components/EditorSidePanel/EnumsTab/EnumDetails.jsx index 0de3748..6f40f4f 100644 --- a/src/components/EditorSidePanel/EnumsTab/EnumDetails.jsx +++ b/src/components/EditorSidePanel/EnumsTab/EnumDetails.jsx @@ -18,6 +18,7 @@ export default function EnumDetails({ data, i }) { updateEnum(i, { name: value })} onFocus={(e) => setEditField({ name: e.target.value })} onBlur={(e) => { @@ -46,6 +47,7 @@ export default function EnumDetails({ data, i }) { addOnBlur className="my-2" placeholder={t("values")} + validateStatus={data.values.length === 0 ? "error" : "default"} onChange={(v) => updateEnum(i, { values: v })} onFocus={() => setEditField({ values: data.values })} onBlur={() => { diff --git a/src/components/EditorSidePanel/Issues.jsx b/src/components/EditorSidePanel/Issues.jsx index 61335fd..eacbace 100644 --- a/src/components/EditorSidePanel/Issues.jsx +++ b/src/components/EditorSidePanel/Issues.jsx @@ -2,13 +2,14 @@ import { useState, useEffect } from "react"; import { Collapse, Badge } from "@douyinfe/semi-ui"; import { arrayIsEqual } from "../../utils/utils"; import { getIssues } from "../../utils/issues"; -import { useSettings, useTables, useTypes } from "../../hooks"; +import { useEnums, useSettings, useTables, useTypes } from "../../hooks"; import { useTranslation } from "react-i18next"; export default function Issues() { const { types } = useTypes(); const { t } = useTranslation(); const { settings } = useSettings(); + const { enums } = useEnums(); const { tables, relationships, database } = useTables(); const [issues, setIssues] = useState([]); @@ -19,6 +20,7 @@ export default function Issues() { relationships: relationships, types: types, database: database, + enums: enums, }); if (!arrayIsEqual(newIssues, issues)) { @@ -27,7 +29,7 @@ export default function Issues() { }; findIssues(); - }, [tables, relationships, issues, types, database]); + }, [tables, relationships, issues, types, database, enums]); return ( diff --git a/src/i18n/locales/en.js b/src/i18n/locales/en.js index 835d8fb..2998d59 100644 --- a/src/i18n/locales/en.js +++ b/src/i18n/locales/en.js @@ -220,6 +220,9 @@ const en = { add_enum: "Add enum", edit_enum: "{{extra}} Edit enum {{enumName}}", delete_enum: "Delete enum", + enum_w_no_name: "Found enum with no name", + enum_w_no_values: "Found enum '{{enumName}}' with no values", + duplicate_enums: "Duplicate enums with the name '{{enumName}}'", }, }; diff --git a/src/utils/issues.js b/src/utils/issues.js index e2a4fdf..ffffbf1 100644 --- a/src/utils/issues.js +++ b/src/utils/issues.js @@ -9,7 +9,7 @@ function checkDefault(field, database) { if (!field.notNull && field.default.toLowerCase() === "null") return true; - if(!dbToTypes[database][field.type].checkDefault) return true; + if (!dbToTypes[database][field.type].checkDefault) return true; return dbToTypes[database][field.type].checkDefault(field); } @@ -169,6 +169,24 @@ export function getIssues(diagram) { }); }); + const duplicateEnumNames = {}; + diagram.enums.forEach((e) => { + if (e.name === "") { + issues.push(i18n.t("enum_w_no_name")); + } + + if (duplicateEnumNames[e.name]) { + issues.push(i18n.t("duplicate_enums", { enumName: e.name })); + } else { + duplicateEnumNames[e.name] = true; + } + + if (e.values.length === 0) { + issues.push(i18n.t("enum_w_no_values", { enumName: e.name })); + return; + } + }); + const duplicateFKName = {}; diagram.relationships.forEach((r) => { if (duplicateFKName[r.name]) {