From aaf712e4825d1830e893065ee052383ba22461e3 Mon Sep 17 00:00:00 2001 From: Martti Malmi Date: Thu, 31 Aug 2023 19:00:02 +0300 Subject: [PATCH] contenteditable explorer nodes --- src/js/views/explorer/ExplorerNode.tsx | 7 +++- src/js/views/explorer/ExplorerNodeValue.tsx | 46 +++++++++++++++++++-- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/js/views/explorer/ExplorerNode.tsx b/src/js/views/explorer/ExplorerNode.tsx index 3766905c..dd8a190a 100644 --- a/src/js/views/explorer/ExplorerNode.tsx +++ b/src/js/views/explorer/ExplorerNode.tsx @@ -64,8 +64,11 @@ export default function ExplorerNode({ {displayName}
- {' '} - {/* Using the new component */} + node.put(v)} + />
diff --git a/src/js/views/explorer/ExplorerNodeValue.tsx b/src/js/views/explorer/ExplorerNodeValue.tsx index ded280a3..85460684 100644 --- a/src/js/views/explorer/ExplorerNodeValue.tsx +++ b/src/js/views/explorer/ExplorerNodeValue.tsx @@ -1,14 +1,17 @@ -import { useState } from 'react'; +import { useState, useEffect, useRef } from 'react'; const VALUE_TRUNCATE_LENGTH = 50; type ExplorerNodeValueProps = { value: any; displayName: string; + setValue: (value: any) => void; }; -const ExplorerNodeValue: React.FC = ({ displayName, value }) => { +const ExplorerNodeValue: React.FC = ({ displayName, value, setValue }) => { const [showMore, setShowMore] = useState(false); + const [editableValue, setEditableValue] = useState(JSON.stringify(value)); + const inputRef = useRef(null); const truncateValue = () => { if (displayName === 'priv' || displayName === 'key') { @@ -19,6 +22,23 @@ const ExplorerNodeValue: React.FC = ({ displayName, valu : value; }; + const handleBlur = () => { + let parsedValue; + try { + parsedValue = JSON.parse(editableValue); + } catch (e) { + parsedValue = editableValue; + } + setValue(parsedValue); + }; + + useEffect(() => { + // Handling unmount + return () => { + handleBlur(); + }; + }, []); + if (typeof value === 'string') { return ( @@ -30,12 +50,30 @@ const ExplorerNodeValue: React.FC = ({ displayName, valu Show {showMore ? 'less' : 'more'}{' '} )} - "{showMore ? value : truncateValue()}" + setEditableValue(e.currentTarget.textContent)} + > + {showMore ? value : truncateValue()} + ); } - return {JSON.stringify(value)}; + return ( + + setEditableValue(e.currentTarget.textContent)} + > + {JSON.stringify(value)} + + + ); }; export default ExplorerNodeValue;