From 99b59cc0945b8b2d479a0e6318d765011554d374 Mon Sep 17 00:00:00 2001 From: U1 <56990620+CHNHJF@users.noreply.github.com> Date: Fri, 11 Sep 2026 16:40:48 +0800 Subject: [PATCH] feat(structure): rework triggers tab as master-detail layout --- .../structure/TableStructureEditor.vue | 112 ++++++++++++++---- 1 file changed, 86 insertions(+), 26 deletions(-) diff --git a/apps/desktop/src/components/structure/TableStructureEditor.vue b/apps/desktop/src/components/structure/TableStructureEditor.vue index 2d72a2d75b..1a8e9c2c02 100644 --- a/apps/desktop/src/components/structure/TableStructureEditor.vue +++ b/apps/desktop/src/components/structure/TableStructureEditor.vue @@ -398,6 +398,35 @@ const constraintsLoaded = ref(false); const constraintsForTab = computed(() => constraintsForConstraintsTab(constraints.value, tableMetadataCapabilities.value.foreignKeys)); const triggers = ref([]); const triggersLoaded = ref(false); +// Master-detail layout: the list shows one compact row per trigger and the +// selected trigger's editors render in the detail pane below (#8822). +const selectedTriggerId = ref(null); +const selectedTrigger = computed(() => triggers.value.find((trigger) => trigger.id === selectedTriggerId.value) ?? null); +// Inline rename state: the list row itself stays a click-to-select target; +// the pencil button flips the name cell into an input (#8822 feedback). +const renamingTriggerId = ref(null); + +function startRenameTrigger(trigger: EditableStructureTrigger) { + selectedTriggerId.value = trigger.id; + renamingTriggerId.value = trigger.id; +} +watch( + [triggers, selectedTriggerId], + () => { + if (triggers.value.length === 0) { + if (selectedTriggerId.value !== null) selectedTriggerId.value = null; + return; + } + if (!triggers.value.some((trigger) => trigger.id === selectedTriggerId.value)) { + selectedTriggerId.value = triggers.value[0].id; + } + }, + { immediate: true }, +); + +function selectTrigger(trigger: EditableStructureTrigger) { + selectedTriggerId.value = trigger.id; +} const secondaryMetadataLoading = computed(() => indexesLoading.value || foreignKeysLoading.value || constraintsLoading.value || triggersLoading.value); function sameList(left: string[] | null | undefined, right: string[] | null | undefined): boolean { @@ -3474,14 +3503,16 @@ function canEditForeignKeyDraft(foreignKey: EditableStructureForeignKey): boolea function addTrigger() { if (!canEditTriggers.value || triggersLoading.value) return; activeTab.value = "triggers"; - triggers.value.push({ + const draft: EditableStructureTrigger = { id: `new:${uuid()}`, name: "", timing: isOracleTriggerEditor.value ? "BEFORE EACH ROW" : isSqlServerTriggerEditor.value ? "AFTER" : "BEFORE", event: "INSERT", statement: isOracleTriggerEditor.value ? "BEGIN\n NULL;\nEND" : isSqlServerTriggerEditor.value ? "BEGIN\n SET NOCOUNT ON;\nEND" : "BEGIN\n \nEND", markedForDrop: false, - }); + }; + triggers.value.push(draft); + selectedTriggerId.value = draft.id; } function removeNewTrigger(trigger: EditableStructureTrigger) { @@ -4921,47 +4952,76 @@ watch(
{{ t("structureEditor.emptyReadonly") }}
-
-
-
- - +
+ +
+
+ + {{ trigger.name || t("structureEditor.triggerName") }} + + + - + -
- - {{ trigger.original.enabled ? t("damengJobAdmin.enabled") : t("damengJobAdmin.disabled") }} - - - -
+ + {{ trigger.original.enabled ? t("damengJobAdmin.enabled") : t("damengJobAdmin.disabled") }} + + + +
+
+ +
+
+ {{ selectedTrigger.name || t("structureEditor.triggerName") }}