diff --git a/src/components/EditorSidePanel/TablesTab/TableInfo.jsx b/src/components/EditorSidePanel/TablesTab/TableInfo.jsx
index 85da449a1..431d10854 100644
--- a/src/components/EditorSidePanel/TablesTab/TableInfo.jsx
+++ b/src/components/EditorSidePanel/TablesTab/TableInfo.jsx
@@ -6,6 +6,7 @@ import {
Button,
Card,
Select,
+ Checkbox,
} from "@douyinfe/semi-ui";
import ColorPicker from "../ColorPicker";
import { IconDeleteStroked } from "@douyinfe/semi-icons";
@@ -72,11 +73,11 @@ export default function TableInfo({ data }) {
const inheritedFieldNames =
Array.isArray(data.inherits) && data.inherits.length > 0
? data.inherits
- .map((parentName) => {
- const parent = tables.find((t) => t.name === parentName);
- return parent ? parent.fields.map((f) => f.name) : [];
- })
- .flat()
+ .map((parentName) => {
+ const parent = tables.find((t) => t.name === parentName);
+ return parent ? parent.fields.map((f) => f.name) : [];
+ })
+ .flat()
: [];
return (
@@ -337,6 +338,134 @@ export default function TableInfo({ data }) {
/>
+
+ f.name === "created_at")}
+ disabled={layout.readOnly}
+ onChange={(e) => {
+ const exists = data.fields.some((f) => f.name === "created_at");
+ if (e.target.checked && !exists) {
+ const id = nanoid();
+ const newField = {
+ id,
+ name: "created_at",
+ type: "TIMESTAMP",
+ default: "CURRENT_TIMESTAMP",
+ check: "",
+ primary: false,
+ unique: false,
+ notNull: false,
+ increment: false,
+ comment: "",
+ };
+ setUndoStack((prev) => [
+ ...prev,
+ {
+ action: Action.EDIT,
+ element: ObjectType.TABLE,
+ component: "field_add",
+ tid: data.id,
+ fid: id,
+ message: t("edit_table", {
+ tableName: data.name,
+ extra: "[add created_at]",
+ }),
+ },
+ ]);
+ setRedoStack([]);
+ updateTable(data.id, {
+ fields: [...data.fields, newField],
+ });
+ } else if (!e.target.checked && exists) {
+ const field = data.fields.find((f) => f.name === "created_at");
+ setUndoStack((prev) => [
+ ...prev,
+ {
+ action: Action.EDIT,
+ element: ObjectType.TABLE,
+ component: "field_delete",
+ tid: data.id,
+ fid: field.id,
+ data: field,
+ message: t("edit_table", {
+ tableName: data.name,
+ extra: "[delete created_at]",
+ }),
+ },
+ ]);
+ setRedoStack([]);
+ updateTable(data.id, {
+ fields: data.fields.filter((f) => f.name !== "created_at"),
+ });
+ }
+ }}
+ >
+ created_at
+
+ f.name === "updated_at")}
+ disabled={layout.readOnly}
+ onChange={(e) => {
+ const exists = data.fields.some((f) => f.name === "updated_at");
+ if (e.target.checked && !exists) {
+ const id = nanoid();
+ const newField = {
+ id,
+ name: "updated_at",
+ type: "TIMESTAMP",
+ default: "CURRENT_TIMESTAMP",
+ check: "",
+ primary: false,
+ unique: false,
+ notNull: false,
+ increment: false,
+ comment: "",
+ };
+ setUndoStack((prev) => [
+ ...prev,
+ {
+ action: Action.EDIT,
+ element: ObjectType.TABLE,
+ component: "field_add",
+ tid: data.id,
+ fid: id,
+ message: t("edit_table", {
+ tableName: data.name,
+ extra: "[add updated_at]",
+ }),
+ },
+ ]);
+ setRedoStack([]);
+ updateTable(data.id, {
+ fields: [...data.fields, newField],
+ });
+ } else if (!e.target.checked && exists) {
+ const field = data.fields.find((f) => f.name === "updated_at");
+ setUndoStack((prev) => [
+ ...prev,
+ {
+ action: Action.EDIT,
+ element: ObjectType.TABLE,
+ component: "field_delete",
+ tid: data.id,
+ fid: field.id,
+ data: field,
+ message: t("edit_table", {
+ tableName: data.name,
+ extra: "[delete updated_at]",
+ }),
+ },
+ ]);
+ setRedoStack([]);
+ updateTable(data.id, {
+ fields: data.fields.filter((f) => f.name !== "updated_at"),
+ });
+ }
+ }}
+ >
+ updated_at
+
+
);
}
diff --git a/src/i18n/locales/es.js b/src/i18n/locales/es.js
index c246c5d16..58bedce4e 100644
--- a/src/i18n/locales/es.js
+++ b/src/i18n/locales/es.js
@@ -229,8 +229,8 @@ const es = {
not_found: "No encontrado",
pick_db: "Elegir base de datos",
generic: "Genérico",
- generic_description:
- "Los diagramas genéricos se pueden exportar a cualquier formato SQL, pero soportan un número limitado de tipos de datos.",
+ generic_description:
+ "Los diagramas genéricos se pueden exportar a cualquier formato SQL, pero soportan un número limitado de tipos de datos.",
enums: "Enumeraciones",
add_enum: "Añadir enumeración",
edit_enum: "{{extra}} Editar enumeración {{enumName}}",
@@ -249,7 +249,7 @@ const es = {
copy_link: "Copiar enlace",
readme: "README",
failed_to_load: "Error al cargar. Asegurate de que el enlace sea correcto.",
- share_info:
+ share_info:
"* Compartir este enlace no creará una sesión de colaboración en tiempo real.",
show_relationship_labels: "Mostrar etiquetas de relación",
docs: "Documentación",
@@ -279,6 +279,8 @@ const es = {
failed_to_record_version: "Error al grabar versión",
failed_to_load_diagram: "Error al cargar diagrama",
see_all: "Ver todo",
+ insert_sql: "Insertar SQL",
+ upload_file: "Subir archivo",
},
};
diff --git a/src/i18n/locales/fr.js b/src/i18n/locales/fr.js
index 56251ab22..605f5bba4 100644
--- a/src/i18n/locales/fr.js
+++ b/src/i18n/locales/fr.js
@@ -217,7 +217,61 @@ const fr = {
edit_relationship: "{{extra}} Modifier la relation {{refName}}",
delete_relationship: "Supprimer la relation {{refName}}",
not_found: "Non trouvé",
+ pick_db: "Choisir une base de données",
+ generic: "Générique",
+ generic_description:
+ "Les diagrammes génériques peuvent être exportés vers n'importe quelle saveur SQL mais supportent peu de types de données.",
+ enums: "Énumérations",
+ add_enum: "Ajouter une énumération",
+ edit_enum: "{{extra}} Modifier l'énumération {{enumName}}",
+ delete_enum: "Supprimer l'énumération",
+ enum_w_no_name: "Énumération trouvée sans nom",
+ enum_w_no_values: "Énumération '{{enumName}}' trouvée sans valeurs",
+ duplicate_enums: "Énumérations en double avec le nom '{{enumName}}'",
+ enum_deleted: "Énumération supprimée",
+ no_enums: "Aucune énumération",
+ no_enums_text: "Définissez les énumérations ici",
+ declare_array: "Déclarer un tableau",
+ empty_index_name: "Index déclaré sans nom dans la table '{{tableName}}'",
+ didnt_find_diagram: "Oups! Diagramme introuvable.",
+ unsigned: "Non signé",
+ share: "Partager",
+ unshare: "Arrêter le partage",
+ copy_link: "Copier le lien",
readme: "README",
+ failed_to_load: "Échec du chargement. Assurez-vous que le lien est correct.",
+ share_info:
+ "* Le partage de ce lien ne créera pas une session de collaboration en temps réel.",
+ show_relationship_labels: "Afficher les étiquettes de relation",
+ docs: "Docs",
+ supported_types: "Types de fichiers supportés:",
+ bulk_update: "Mise à jour en masse",
+ multiselect: "Sélection multiple",
+ export_saved_data: "Exporter les données enregistrées",
+ dbml_view: "Vue DBML",
+ tab_view: "Vue par onglets",
+ label: "Étiquette",
+ many_side_label: "Étiquette côté plusieurs(n)",
+ version: "Version",
+ versions: "Versions",
+ no_saved_versions: "Aucune version enregistrée",
+ record_version: "Enregistrer une version",
+ commited_at: "Validé à",
+ read_only: "Lecture seule",
+ continue: "Continuer",
+ restore_version: "Restaurer la version",
+ restore_warning: "Le chargement d'une autre version écrasera toutes les modifications.",
+ return_to_current: "Retour au diagramme",
+ no_changes_to_record: "Aucun changement à enregistrer",
+ click_to_view: "Cliquez pour voir",
+ load_more: "Charger plus",
+ clear_cache: "Vider le cache",
+ cache_cleared: "Cache vidé",
+ failed_to_record_version: "Échec de l'enregistrement de la version",
+ failed_to_load_diagram: "Échec du chargement du diagramme",
+ see_all: "Voir tout",
+ insert_sql: "Insérer SQL",
+ upload_file: "Télécharger un fichier",
},
};