From bbbda6ea9fe80dbf5b2b97e896f466b12548eb2b Mon Sep 17 00:00:00 2001 From: Zehao Zhang Date: Thu, 9 Oct 2025 15:22:05 +0800 Subject: [PATCH 1/8] feat(entities-*): datakit - vault resources [KM-1666] --- .../components/free-form/Datakit/constants.ts | 1 + .../Datakit/flow-editor/FlowEditor.vue | 4 +- .../Datakit/flow-editor/VaultSecretPicker.vue | 103 +++++++++ .../flow-editor/composables/useVaultForm.ts | 69 ++++++ .../flow-editor/modal/EditorContent.vue | 69 +----- .../flow-editor/node-forms/NodeFormVault.vue | 61 +++++ .../flow-editor/node-forms/VaultField.vue | 208 ++++++++++++++++++ .../flow-editor/node/NodePropertiesPanel.vue | 3 +- .../Datakit/flow-editor/node/vault.ts | 29 +++ .../{node => side-panel}/NodePanel.vue | 16 +- .../flow-editor/side-panel/ResourcesPanel.vue | 25 +++ .../flow-editor/side-panel/SidePanel.vue | 120 ++++++++++ .../Datakit/flow-editor/side-panel/index.ts | 3 + .../Datakit/flow-editor/store/init.ts | 81 +++++-- .../Datakit/flow-editor/store/store.ts | 17 +- .../free-form/Datakit/schema/strict.ts | 2 + .../entities-plugins/src/locales/en.json | 21 ++ .../src/components/VaultSecretPicker.vue | 23 +- 18 files changed, 755 insertions(+), 100 deletions(-) create mode 100644 packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/VaultSecretPicker.vue create mode 100644 packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/composables/useVaultForm.ts create mode 100644 packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/node-forms/NodeFormVault.vue create mode 100644 packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/node-forms/VaultField.vue create mode 100644 packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/node/vault.ts rename packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/{node => side-panel}/NodePanel.vue (94%) create mode 100644 packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/side-panel/ResourcesPanel.vue create mode 100644 packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/side-panel/SidePanel.vue create mode 100644 packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/side-panel/index.ts diff --git a/packages/entities/entities-plugins/src/components/free-form/Datakit/constants.ts b/packages/entities/entities-plugins/src/components/free-form/Datakit/constants.ts index 8464797fb4..502aa7f97d 100644 --- a/packages/entities/entities-plugins/src/components/free-form/Datakit/constants.ts +++ b/packages/entities/entities-plugins/src/components/free-form/Datakit/constants.ts @@ -5,6 +5,7 @@ import { KUI_SPACE_40 } from '@kong/design-tokens' export const DK_HEADER_HEIGHT = 44 export const DK_SIDE_PANEL_WIDTH = 220 export const DK_NODE_PROPERTIES_PANEL_WIDTH = 366 +export const DK_NODE_PROPERTIES_PANEL_Z_INDEX = 1000 // ensure the panel is under the vault resource modal export const DK_NODE_PROPERTIES_PANEL_OFFSET_TOP = DK_HEADER_HEIGHT + parseFloat(KUI_SPACE_40) diff --git a/packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/FlowEditor.vue b/packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/FlowEditor.vue index f0bf901a63..04529074bf 100644 --- a/packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/FlowEditor.vue +++ b/packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/FlowEditor.vue @@ -49,8 +49,8 @@ const emit = defineEmits<{ error: [msg: string] }>() -function onChange(configNodes: ConfigNode[], uiNodes: UINode[]) { - const nextConfig = { ...formData.config, nodes: configNodes } +function onChange(configNodes: ConfigNode[], uiNodes: UINode[], resources: DatakitConfig['resources']) { + const nextConfig = { ...formData.config, nodes: configNodes, resources } const nextUIData = { ...formData.__ui_data, nodes: uiNodes } formData.config = nextConfig formData.__ui_data = nextUIData diff --git a/packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/VaultSecretPicker.vue b/packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/VaultSecretPicker.vue new file mode 100644 index 0000000000..0612d44c1a --- /dev/null +++ b/packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/VaultSecretPicker.vue @@ -0,0 +1,103 @@ + + + diff --git a/packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/composables/useVaultForm.ts b/packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/composables/useVaultForm.ts new file mode 100644 index 0000000000..744b5a2508 --- /dev/null +++ b/packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/composables/useVaultForm.ts @@ -0,0 +1,69 @@ +import { omit } from 'lodash-es' +import type { FieldName } from '../../types' +import { findFieldByName } from '../store/helpers' +import { useEditorStore } from '../store/store' + +export function useVaultForm() { + const { + addField, + getNodeByName, + removeField, + replaceConfig, + renameField, + disconnectOutEdges, + } = useEditorStore() + + const vaultNode = getNodeByName('vault') + + if (!vaultNode) throw new Error('no vault node') + + const addVault = (name: FieldName, value: string) => { + addField(vaultNode.id, 'output', name, false) + const nextConfig = { + ...vaultNode.config, + [name]: value, + } + replaceConfig(vaultNode.id, nextConfig) + } + + const removeVault = (name: FieldName) => { + const field = findFieldByName(vaultNode, 'output', name) + if (!field) return + const isLastVault = vaultNode.fields.output.length === 1 + removeField(vaultNode.id, field.id, true, false) + const nextConfig = omit(vaultNode.config, name) + replaceConfig(vaultNode.id, nextConfig, !isLastVault) + + // Remove all the connections of vault node if it's the last vault + if (isLastVault) { + disconnectOutEdges(vaultNode.id) + } + } + + const updateVault = (name: FieldName, value: string, commit = true) => { + const nextConfig = { + ...vaultNode.config, + [name]: value, + } + replaceConfig(vaultNode.id, nextConfig, commit) + } + + const renameVault = (oldName: FieldName, newName: FieldName, commit = true) => { + const field = findFieldByName(vaultNode, 'output', oldName) + if (!field) return + renameField(vaultNode.id, field.id, newName, false) + const oldValue = vaultNode.config?.[oldName] ?? '' + const nextConfig = { + ...omit(vaultNode.config, oldName), + [newName]: oldValue, + } + replaceConfig(vaultNode.id, nextConfig, commit) + } + + return { + addVault, + removeVault, + updateVault, + renameVault, + } +} diff --git a/packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/modal/EditorContent.vue b/packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/modal/EditorContent.vue index 87278b3837..726742ac43 100644 --- a/packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/modal/EditorContent.vue +++ b/packages/entities/entities-plugins/src/components/free-form/Datakit/flow-editor/modal/EditorContent.vue @@ -1,20 +1,7 @@