| 
 | 1 | +import { useEffect, useState } from 'react';  | 
 | 2 | +import { Definition, ObjectCloner, Step, StepsConfiguration, ToolboxConfiguration } from 'sequential-workflow-designer';  | 
 | 3 | +import { SequentialWorkflowDesigner, wrapDefinition } from 'sequential-workflow-designer-react';  | 
 | 4 | +import { GlobalEditor } from './GlobalEditor';  | 
 | 5 | +import { StepEditor } from './StepEditor';  | 
 | 6 | +import { createSwitchStep, createTaskStep } from './StepUtils';  | 
 | 7 | + | 
 | 8 | +const startDefinition: Definition = {  | 
 | 9 | +	properties: {},  | 
 | 10 | +	sequence: [createTaskStep(), createSwitchStep()]  | 
 | 11 | +};  | 
 | 12 | + | 
 | 13 | +const toolboxConfiguration: ToolboxConfiguration = {  | 
 | 14 | +	groups: [{ name: 'Steps', steps: [createTaskStep(), createSwitchStep()] }]  | 
 | 15 | +};  | 
 | 16 | + | 
 | 17 | +const stepsConfiguration: StepsConfiguration = {  | 
 | 18 | +	validator: (step: Step) => !!step.name  | 
 | 19 | +};  | 
 | 20 | + | 
 | 21 | +export function App() {  | 
 | 22 | +	const [isVisible, setIsVisible] = useState(true);  | 
 | 23 | +	const [definition, setDefinition] = useState(() => wrapDefinition(startDefinition));  | 
 | 24 | +	const [selectedStepId, setSelectedStepId] = useState<string | null>(null);  | 
 | 25 | +	const [isReadonly, setIsReadonly] = useState(false);  | 
 | 26 | +	const definitionJson = JSON.stringify(definition.value, null, 2);  | 
 | 27 | + | 
 | 28 | +	useEffect(() => {  | 
 | 29 | +		console.log(`definition updated, isValid=${definition.isValid}`);  | 
 | 30 | +	}, [definition]);  | 
 | 31 | + | 
 | 32 | +	function toggleVisibilityClicked() {  | 
 | 33 | +		setIsVisible(!isVisible);  | 
 | 34 | +	}  | 
 | 35 | + | 
 | 36 | +	function toggleSelectionClicked() {  | 
 | 37 | +		const id = definition.value.sequence[0].id;  | 
 | 38 | +		setSelectedStepId(selectedStepId ? null : id);  | 
 | 39 | +	}  | 
 | 40 | + | 
 | 41 | +	function toggleIsReadonlyClicked() {  | 
 | 42 | +		setIsReadonly(!isReadonly);  | 
 | 43 | +	}  | 
 | 44 | + | 
 | 45 | +	function reloadDefinitionClicked() {  | 
 | 46 | +		const newDefinition = ObjectCloner.deepClone(startDefinition);  | 
 | 47 | +		setDefinition(wrapDefinition(newDefinition));  | 
 | 48 | +	}  | 
 | 49 | + | 
 | 50 | +	return (  | 
 | 51 | +		<>  | 
 | 52 | +			{isVisible && (  | 
 | 53 | +				<SequentialWorkflowDesigner  | 
 | 54 | +					undoStackSize={10}  | 
 | 55 | +					definition={definition}  | 
 | 56 | +					onDefinitionChange={setDefinition}  | 
 | 57 | +					selectedStepId={selectedStepId}  | 
 | 58 | +					isReadonly={isReadonly}  | 
 | 59 | +					onSelectedStepIdChanged={setSelectedStepId}  | 
 | 60 | +					toolboxConfiguration={toolboxConfiguration}  | 
 | 61 | +					stepsConfiguration={stepsConfiguration}  | 
 | 62 | +					globalEditor={<GlobalEditor />}  | 
 | 63 | +					stepEditor={<StepEditor />}  | 
 | 64 | +				/>  | 
 | 65 | +			)}  | 
 | 66 | + | 
 | 67 | +			<ul>  | 
 | 68 | +				<li>Definition: {definitionJson.length} bytes</li>  | 
 | 69 | +				<li>Selected step: {selectedStepId}</li>  | 
 | 70 | +				<li>Is readonly: {isReadonly ? '✅ Yes' : 'No'}</li>  | 
 | 71 | +				<li>Is valid: {definition.isValid === undefined ? '?' : definition.isValid ? '✅ Yes' : '⛔ No'}</li>  | 
 | 72 | +			</ul>  | 
 | 73 | + | 
 | 74 | +			<div>  | 
 | 75 | +				<button onClick={toggleVisibilityClicked}>Toggle visibility</button>  | 
 | 76 | +				<button onClick={reloadDefinitionClicked}>Reload definition</button>  | 
 | 77 | +				<button onClick={toggleSelectionClicked}>Toggle selection</button>  | 
 | 78 | +				<button onClick={toggleIsReadonlyClicked}>Toggle readonly</button>  | 
 | 79 | +			</div>  | 
 | 80 | + | 
 | 81 | +			<div>  | 
 | 82 | +				<textarea value={definitionJson} readOnly={true} cols={100} rows={15} />  | 
 | 83 | +			</div>  | 
 | 84 | +		</>  | 
 | 85 | +	);  | 
 | 86 | +}  | 
0 commit comments