From 88bb19467fcfdf1229b7599c82c1927f111218cf Mon Sep 17 00:00:00 2001 From: RoniMaity Date: Mon, 1 Dec 2025 10:08:09 +0530 Subject: [PATCH 1/2] feat: add checkboxes for created_at and updated_at fields (fixes #14) --- .../EditorSidePanel/TablesTab/TableInfo.jsx | 139 +++++++++++++++++- 1 file changed, 134 insertions(+), 5 deletions(-) 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 + +
); } From 39340ef9a336fd7d76e4a4855fad70720e3354a4 Mon Sep 17 00:00:00 2001 From: RoniMaity Date: Mon, 1 Dec 2025 10:36:20 +0530 Subject: [PATCH 2/2] Update French and Spanish translations with missing keys --- src/i18n/locales/es.js | 8 ++++--- src/i18n/locales/fr.js | 54 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 3 deletions(-) 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", }, };