From 45a331a9362144204f3177478fdf65131d96d00f Mon Sep 17 00:00:00 2001 From: Stefan Verhoeven Date: Wed, 9 Oct 2024 14:35:18 +0200 Subject: [PATCH 1/4] Clicking in workflow config toml text will show form for that node Fixes #20 --- CHANGELOG.md | 6 +++ packages/core/package.json | 4 +- packages/core/src/HighlightedCode.stories.tsx | 17 +++++++ packages/core/src/HighlightedCode.tsx | 24 ++++++++- packages/core/src/TextPanel.tsx | 16 +++++- packages/core/src/toml.test.ts | 50 ++++++++++++++++++- packages/core/src/toml.ts | 24 +++++++++ yarn.lock | 10 ++-- 8 files changed, 139 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd1fe775..82b0e36b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## @i-vresse/wb-core 3.2.2 - 2024-10-09 + +### Added + +- Configure node by clicking in workflow config toml text ([#20](https://github.com/i-VRESSE/workflow-builder/issues/20)) + ## @i-vresse/wb-core 3.2.1 - 2024-08-26 ### Fixed diff --git a/packages/core/package.json b/packages/core/package.json index f4a8a38e..55714354 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@i-vresse/wb-core", - "version": "3.2.1", + "version": "3.2.2", "description": "React components to construct a workflow builder application", "keywords": [ "react", @@ -50,7 +50,7 @@ "@types/file-saver": "^2.0.4", "@types/js-yaml": "^4.0.5", "@types/papaparse": "^5.3.2", - "@types/react-syntax-highlighter": "^13.5.2", + "@types/react-syntax-highlighter": "^15.5.0", "@vitest/coverage-v8": "^1.5.3", "babel-loader": "^8.2.5", "c8": "^7.11.0", diff --git a/packages/core/src/HighlightedCode.stories.tsx b/packages/core/src/HighlightedCode.stories.tsx index abc402df..ee105ad3 100644 --- a/packages/core/src/HighlightedCode.stories.tsx +++ b/packages/core/src/HighlightedCode.stories.tsx @@ -1,5 +1,6 @@ import { HighlightedCode } from './HighlightedCode' import { ComponentMeta, ComponentStory } from '@storybook/react' +import { action } from '@storybook/addon-actions' const story: ComponentMeta = { title: 'HighlightedCode', @@ -25,3 +26,19 @@ prop3 = 'b' prop2 = 'x' ` } + +export const SecondStory = Template.bind({}) +SecondStory.args = { + code: ` +prop1 = 'xx' +prop3 = 'cc' +prop2 = 'vv' + +[node1] + +prop1 = 'a' +prop3 = 'b' +prop2 = 'x' +`, + onClick: action('onClick') +} diff --git a/packages/core/src/HighlightedCode.tsx b/packages/core/src/HighlightedCode.tsx index 1f215894..65735096 100644 --- a/packages/core/src/HighlightedCode.tsx +++ b/packages/core/src/HighlightedCode.tsx @@ -10,14 +10,34 @@ export interface IProps { * The piece of code in TOML format */ code: string + onClick?: (lineNumber: number) => void } /** * Render piece of TOML formatted text in colors. */ -export const HighlightedCode = ({ code }: IProps): JSX.Element => ( +export const HighlightedCode = ({ code, onClick }: IProps): JSX.Element => (
- + ({ + style: { display: 'block', cursor: 'pointer' }, + onClick () { + if (onClick != null) { + onClick(lineNumber) + } + } + })} + // onClick only works with showLineNumbers, so enable and hide + showLineNumbers + lineNumberStyle={(props) => { + return { + display: 'none' + } + }} + > {code}
diff --git a/packages/core/src/TextPanel.tsx b/packages/core/src/TextPanel.tsx index 156e3c7c..5f0b93ef 100644 --- a/packages/core/src/TextPanel.tsx +++ b/packages/core/src/TextPanel.tsx @@ -1,7 +1,8 @@ import React from 'react' import { HighlightedCode } from './HighlightedCode' -import { useText } from './store' +import { useText, useWorkflow } from './store' +import { lines2node } from './toml' // TODO highlighter is 1/3 of dist/vendor.js, look for lighter alternative // Already tried to use dynamic import: @@ -10,18 +11,29 @@ import { useText } from './store' export const TextPanel = (): JSX.Element => { const code = useText() + const { selectNode, selectGlobalEdit } = useWorkflow() async function copy2clipboard (): Promise { await navigator.permissions.query({ name: 'clipboard-write' } as any) await navigator.clipboard.writeText(code) } + function onClickLine (lineNumber: number): void { + const lookup = lines2node(code) + const nodeIndex = lookup[lineNumber] + if (nodeIndex === -1) { + selectGlobalEdit() + } else { + selectNode(nodeIndex) + } + } + return (
- +