From f6ab5906234cca77e814a2e29121bd36ff182af3 Mon Sep 17 00:00:00 2001 From: 1ilit Date: Tue, 19 Sep 2023 15:51:30 +0300 Subject: [PATCH] Handle issues for custom types --- src/components/issues.jsx | 6 +++-- src/utils/index.js | 49 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/src/components/issues.jsx b/src/components/issues.jsx index bcb822a..300bb11 100644 --- a/src/components/issues.jsx +++ b/src/components/issues.jsx @@ -1,10 +1,11 @@ import React, { useContext, useState, useEffect } from "react"; import { Collapse, Badge } from "@douyinfe/semi-ui"; -import { SettingsContext, TableContext } from "../pages/editor"; +import { SettingsContext, TableContext, TypeContext } from "../pages/editor"; import { validateDiagram, arrayIsEqual } from "../utils"; export default function Issues() { const { settings } = useContext(SettingsContext); + const { types } = useContext(TypeContext); const { tables, relationships } = useContext(TableContext); const [issues, setIssues] = useState([]); @@ -13,6 +14,7 @@ export default function Issues() { const newIssues = validateDiagram({ tables: tables, relationships: relationships, + types: types, }); if (!arrayIsEqual(newIssues, issues)) { @@ -21,7 +23,7 @@ export default function Issues() { }; findIssues(); - }, [tables, relationships, issues]); + }, [tables, relationships, issues, types]); return ( diff --git a/src/utils/index.js b/src/utils/index.js index bd338ef..6706ee7 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -384,7 +384,7 @@ function validateDiagram(diagram) { } else if (field.type === "ENUM" || field.type === "SET") { if (!field.values || field.values.length === 0) { issues.push( - `"${field.name}" field of table "${table.name}" is of type ${field.type} but values have been specified` + `"${field.name}" field of table "${table.name}" is of type ${field.type} but no values have been specified` ); } } @@ -434,6 +434,53 @@ function validateDiagram(diagram) { } }); + const duplicateTypeNames = {}; + diagram.types.forEach((type) => { + if (type.name === "") { + issues.push(`Declared a type with no name`); + } + + if (duplicateTypeNames[type.name]) { + issues.push(`Duplicate types by the name "${type.name}"`); + } else { + duplicateTypeNames[type.name] = true; + } + + if (type.fields.length === 0) { + issues.push(`Declared an empty type "${type.name}" with no fields`); + return; + } + + const duplicateFieldNames = {}; + type.fields.forEach((field) => { + if (field.name === "") { + issues.push(`Empty field name in type "${type.name}"`); + } + + if (field.type === "") { + issues.push(`Empty field type in "${type.name}"`); + } else if (field.type === "ENUM" || field.type === "SET") { + if (!field.values || field.values.length === 0) { + issues.push( + `"${field.name}" field of type "${type.name}" is of type ${field.type} but no values have been specified` + ); + } + } + + if (field.type === "DOUBLE" && field.size !== "") { + issues.push( + `Specifying number of digits for floating point data types is deprecated.` + ); + } + + if (duplicateFieldNames[field.name]) { + issues.push(`Duplicate type fields in "${type.name}"`); + } else { + duplicateFieldNames[field.name] = true; + } + }); + }); + const duplicateFKName = {}; diagram.relationships.forEach((r) => { if (duplicateFKName[r.name]) {