2023-12-13 14:32:57 +03:00
|
|
|
'use client';
|
|
|
|
|
2023-09-04 20:37:55 +03:00
|
|
|
import { useCallback, useMemo, useState } from 'react';
|
2023-08-01 21:55:18 +03:00
|
|
|
|
2024-05-17 15:48:54 +03:00
|
|
|
import BadgeHelp from '@/components/info/BadgeHelp';
|
2024-03-20 15:27:32 +03:00
|
|
|
import GraphUI, { GraphEdge, GraphNode } from '@/components/ui/GraphUI';
|
2024-01-04 19:38:12 +03:00
|
|
|
import Modal, { ModalProps } from '@/components/ui/Modal';
|
2024-05-17 15:48:54 +03:00
|
|
|
import Overlay from '@/components/ui/Overlay';
|
2024-04-01 19:07:20 +03:00
|
|
|
import { useConceptOptions } from '@/context/OptionsContext';
|
2024-05-17 15:48:54 +03:00
|
|
|
import { HelpTopic } from '@/models/miscellaneous';
|
2023-12-13 14:32:57 +03:00
|
|
|
import { SyntaxTree } from '@/models/rslang';
|
2024-01-06 03:15:02 +03:00
|
|
|
import { graphDarkT, graphLightT } from '@/styling/color';
|
|
|
|
import { colorBgSyntaxTree } from '@/styling/color';
|
2024-06-09 20:41:33 +03:00
|
|
|
import { PARAMETER, resources } from '@/utils/constants';
|
2023-12-13 14:32:57 +03:00
|
|
|
import { labelSyntaxTree } from '@/utils/labels';
|
2023-07-29 03:31:21 +03:00
|
|
|
|
2023-12-28 14:04:44 +03:00
|
|
|
interface DlgShowASTProps extends Pick<ModalProps, 'hideWindow'> {
|
|
|
|
syntaxTree: SyntaxTree;
|
|
|
|
expression: string;
|
2023-07-29 03:31:21 +03:00
|
|
|
}
|
|
|
|
|
2023-08-01 21:55:18 +03:00
|
|
|
function DlgShowAST({ hideWindow, syntaxTree, expression }: DlgShowASTProps) {
|
2024-04-01 19:07:20 +03:00
|
|
|
const { darkMode, colors } = useConceptOptions();
|
2023-09-04 20:37:55 +03:00
|
|
|
const [hoverID, setHoverID] = useState<number | undefined>(undefined);
|
2023-12-28 14:04:44 +03:00
|
|
|
const hoverNode = useMemo(() => syntaxTree.find(node => node.uid === hoverID), [hoverID, syntaxTree]);
|
2023-09-09 20:36:55 +03:00
|
|
|
|
2023-08-01 21:55:18 +03:00
|
|
|
const nodes: GraphNode[] = useMemo(
|
2023-12-28 14:04:44 +03:00
|
|
|
() =>
|
|
|
|
syntaxTree.map(node => ({
|
|
|
|
id: String(node.uid),
|
|
|
|
label: labelSyntaxTree(node),
|
|
|
|
fill: colorBgSyntaxTree(node, colors)
|
|
|
|
})),
|
|
|
|
[syntaxTree, colors]
|
|
|
|
);
|
2023-08-01 21:55:18 +03:00
|
|
|
|
2023-12-28 14:04:44 +03:00
|
|
|
const edges: GraphEdge[] = useMemo(() => {
|
2023-08-01 21:55:18 +03:00
|
|
|
const result: GraphEdge[] = [];
|
|
|
|
syntaxTree.forEach(node => {
|
2023-08-22 20:29:07 +03:00
|
|
|
if (node.parent !== node.uid) {
|
2023-08-01 21:55:18 +03:00
|
|
|
result.push({
|
|
|
|
id: String(node.uid),
|
|
|
|
source: String(node.parent),
|
|
|
|
target: String(node.uid)
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return result;
|
|
|
|
}, [syntaxTree]);
|
2023-07-29 03:31:21 +03:00
|
|
|
|
2023-12-28 14:04:44 +03:00
|
|
|
const handleHoverIn = useCallback((node: GraphNode) => setHoverID(Number(node.id)), []);
|
2023-09-04 20:37:55 +03:00
|
|
|
|
2023-12-28 14:04:44 +03:00
|
|
|
const handleHoverOut = useCallback(() => setHoverID(undefined), []);
|
2023-09-04 20:37:55 +03:00
|
|
|
|
2023-07-29 03:31:21 +03:00
|
|
|
return (
|
2023-12-28 14:04:44 +03:00
|
|
|
<Modal readonly hideWindow={hideWindow} className='px-6'>
|
2024-05-17 15:48:54 +03:00
|
|
|
<Overlay position='left-[-1rem] top-[0.25rem]'>
|
2024-06-09 20:41:33 +03:00
|
|
|
<BadgeHelp topic={HelpTopic.UI_FORMULA_TREE} className={PARAMETER.TOOLTIP_WIDTH} />
|
2024-05-17 15:48:54 +03:00
|
|
|
</Overlay>
|
2023-12-28 14:04:44 +03:00
|
|
|
<div className='my-2 text-lg text-center'>
|
|
|
|
{!hoverNode ? expression : null}
|
|
|
|
{hoverNode ? (
|
|
|
|
<div>
|
|
|
|
<span>{expression.slice(0, hoverNode.start)}</span>
|
|
|
|
<span className='clr-selected'>{expression.slice(hoverNode.start, hoverNode.finish)}</span>
|
|
|
|
<span>{expression.slice(hoverNode.finish)}</span>
|
|
|
|
</div>
|
|
|
|
) : null}
|
|
|
|
</div>
|
2024-06-05 18:07:02 +03:00
|
|
|
<div className='relative w-[calc(100vw-6rem-2px)] h-[calc(100svh-14rem-2px)]'>
|
2023-12-28 14:04:44 +03:00
|
|
|
<GraphUI
|
2024-04-03 15:51:57 +03:00
|
|
|
animated={false}
|
2023-12-28 14:04:44 +03:00
|
|
|
nodes={nodes}
|
|
|
|
edges={edges}
|
|
|
|
layoutType='hierarchicalTd'
|
|
|
|
labelFontUrl={resources.graph_font}
|
|
|
|
theme={darkMode ? graphDarkT : graphLightT}
|
|
|
|
onNodePointerOver={handleHoverIn}
|
|
|
|
onNodePointerOut={handleHoverOut}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</Modal>
|
|
|
|
);
|
2023-07-29 03:31:21 +03:00
|
|
|
}
|
|
|
|
|
2023-12-28 14:04:44 +03:00
|
|
|
export default DlgShowAST;
|