* Added xyflow and updated imports * Fix changing node.width to node.measured.width * Updated NodeType to follow new API * Fixed note node data type * Created AllNodeType to contain note node type * Changed flow types to follow new type from reactflow 12 * Updated flowStore to work with new types * Updated flowStore and reactFlowUtils to work with custom edge type * Updated updateAllNodes to use new type * Updated PageComponent to follow new names for node dragging and edge reconnect * Made selected prop be optional * Changed reactFlowInstance to have nodes and edges type * Updated updateAllComponent to follow new types * Updated ReactFlowUtils with new types * Updated reactFlowUtils type * Updated all reactFlowUtils to be generic * Updated handleRenderComponent with Connection type * Updated node description and name with null checks for names * Added check if node is genericNode on nodeOutputField * Updated note node type * Updated nodestatus with selected null check * Updated notenode with new node type * Update NodeType imports to be AllNodeType * Fix more lint issues * Fixed react flow button css * ✨ (freeze.spec.ts): add zoomOut utility function to handle zooming out in tests for better code reusability and readability 📝 (decisionFlow.spec.ts): import zoomOut utility function to handle zooming out in tests for better code reusability and readability 📝 (zoom-out.ts): create zoomOut utility function to handle zooming out in tests for better code reusability and readability * 🐛 (generalBugs-shard-10.spec.ts): fix test to wait for the element with class "border-ring-frozen" to be visible before asserting its count * 📝 (generalBugs-shard-10.spec.ts): remove unnecessary locator click on element with id 'react-flow-id' to improve test reliability and maintainability * 📝 (SelectionMenuComponent): add data-testid attribute to differentiate error-group-node and group-node components 📝 (similarity.spec.ts): refactor dragTo calls to use targetPosition for better accuracy, replace zoom_out clicks with zoomOut function, updateOldComponents function to handle outdated components 📝 (generalBugs-shard-5.spec.ts): replace zoom_out clicks with zoomOut function, add waitForSelector for group-node before clicking, remove unnecessary mouse interactions 📝 (intComponent.spec.ts): replace zoom_out clicks with zoomOut function, click on div-generic-node component 📝 (keyPairListComponent.spec.ts): click on div-generic-node component, adjustScreenView function call 📝 (nestedComponent.spec.ts): remove unnecessary click on react-flow-id element 📝 (generalBugs-shard-7.spec.ts): replace zoom_out clicks with zoomOut function * ✨ (stop-building.spec.ts): Add new utility functions to improve code modularity and readability 🔧 (stop-building.spec.ts): Refactor drag and drop operations to use utility functions for better maintainability 🔧 (stop-building.spec.ts): Refactor zoom out operations to use utility function for consistency 🔧 (stop-building.spec.ts): Refactor component positioning operations to use utility functions for clarity 🔧 (stop-building.spec.ts): Refactor outdated components and filled API keys handling to use utility functions for reusability 🔧 (stop-building.spec.ts): Refactor fit view operation to use utility function for consistency * ✨ (generalBugs-shard-9.spec.ts): refactor test to use initialGPTsetup function for GPT setup instead of manual steps to improve code readability and maintainability * ✨ (store-shard-2.spec.ts): Increase timeout for clicking "api-key-button-store" to 200000ms for better test stability ✨ (deleteComponents.spec.ts, deleteFlows.spec.ts, store-shard-1.spec.ts, store-shard-3.spec.ts): Increase timeout for clicking "api-key-button-store" to 200000ms for better test stability ✨ (store-shard-1.spec.ts, store-shard-3.spec.ts): Remove unnecessary waitForSelector and add timeout of 200000ms for clicking "api-key-button-store" for better test stability * ✨ (fileUploadComponent.spec.ts): update dragTo method calls with targetPosition option to specify the position of the drag action * ✨ (decisionFlow.spec.ts): add explicit wait for an element to be attached before interacting with it to improve test reliability 🐛 (sticky-notes.spec.ts): fix test by adding keyboard press to simulate pressing the Escape key to close a modal before checking text length * ✅ (sticky-notes.spec.ts): update assertion to use 'toHaveCount' matcher for improved test readability and reliability * Added function to make controls horizontal * ✨ (sticky-notes.spec.ts): update selector for textMarkdown to improve test reliability and readability --------- Co-authored-by: cristhianzl <cristhian.lousa@gmail.com>
114 lines
3.5 KiB
TypeScript
114 lines
3.5 KiB
TypeScript
import {
|
|
COLOR_OPTIONS,
|
|
NOTE_NODE_MAX_HEIGHT,
|
|
NOTE_NODE_MAX_WIDTH,
|
|
NOTE_NODE_MIN_HEIGHT,
|
|
NOTE_NODE_MIN_WIDTH,
|
|
} from "@/constants/constants";
|
|
import { NoteDataType } from "@/types/flow";
|
|
import { cn } from "@/utils/utils";
|
|
import { NodeResizer } from "@xyflow/react";
|
|
import { useEffect, useMemo, useRef, useState } from "react";
|
|
import NodeDescription from "../GenericNode/components/NodeDescription";
|
|
import NoteToolbarComponent from "./NoteToolbarComponent";
|
|
function NoteNode({
|
|
data,
|
|
selected,
|
|
}: {
|
|
data: NoteDataType;
|
|
selected?: boolean;
|
|
}) {
|
|
const bgColor =
|
|
Object.keys(COLOR_OPTIONS).find(
|
|
(key) => key === data.node?.template.backgroundColor,
|
|
) ?? Object.keys(COLOR_OPTIONS)[0];
|
|
const nodeDiv = useRef<HTMLDivElement>(null);
|
|
const [size, setSize] = useState({ width: 0, height: 0 });
|
|
//tricky to start the description with the right size
|
|
useEffect(() => {
|
|
if (nodeDiv.current) {
|
|
setSize({
|
|
width: nodeDiv.current.offsetWidth - 25,
|
|
height: nodeDiv.current.offsetHeight - 25,
|
|
});
|
|
}
|
|
}, []);
|
|
|
|
const MemoNoteToolbarComponent = useMemo(
|
|
() =>
|
|
selected ? (
|
|
<div className={cn("absolute -top-12 left-1/2 z-50 -translate-x-1/2")}>
|
|
<NoteToolbarComponent data={data} bgColor={bgColor} />
|
|
</div>
|
|
) : (
|
|
<></>
|
|
),
|
|
[data, bgColor, selected],
|
|
);
|
|
return (
|
|
<>
|
|
<NodeResizer
|
|
minWidth={NOTE_NODE_MIN_WIDTH}
|
|
minHeight={NOTE_NODE_MIN_HEIGHT}
|
|
maxHeight={NOTE_NODE_MAX_HEIGHT}
|
|
maxWidth={NOTE_NODE_MAX_WIDTH}
|
|
onResize={(_, params) => {
|
|
const { width, height } = params;
|
|
setSize({ width: width - 25, height: height - 25 });
|
|
}}
|
|
isVisible={selected}
|
|
lineClassName="!border !border-muted-foreground"
|
|
/>
|
|
<div
|
|
data-testid="note_node"
|
|
style={{
|
|
maxHeight: NOTE_NODE_MAX_HEIGHT,
|
|
maxWidth: NOTE_NODE_MAX_WIDTH,
|
|
minWidth: NOTE_NODE_MIN_WIDTH,
|
|
minHeight: NOTE_NODE_MIN_HEIGHT,
|
|
backgroundColor: COLOR_OPTIONS[bgColor] ?? "#00000000",
|
|
}}
|
|
ref={nodeDiv}
|
|
className={cn(
|
|
"relative flex h-full w-full flex-col gap-3 rounded-xl p-3 transition-all",
|
|
COLOR_OPTIONS[bgColor] !== null &&
|
|
`border ${!selected && "-z-50 shadow-sm"}`,
|
|
)}
|
|
>
|
|
{MemoNoteToolbarComponent}
|
|
<div
|
|
style={{
|
|
width: size.width,
|
|
height: size.height,
|
|
display: "flex",
|
|
}}
|
|
>
|
|
<NodeDescription
|
|
inputClassName={cn(
|
|
"border-0 ring-0 focus:ring-0 resize-none shadow-none rounded-sm h-full w-full",
|
|
COLOR_OPTIONS[bgColor] === null
|
|
? ""
|
|
: "dark:!ring-background dark:text-background",
|
|
)}
|
|
mdClassName={cn(
|
|
COLOR_OPTIONS[bgColor] === null
|
|
? "dark:prose-invert"
|
|
: "dark:!text-background",
|
|
)}
|
|
style={{ backgroundColor: COLOR_OPTIONS[bgColor] ?? "#00000000" }}
|
|
charLimit={2500}
|
|
nodeId={data.id}
|
|
selected={selected}
|
|
description={data.node?.description}
|
|
emptyPlaceholder="Double-click to start typing or enter Markdown..."
|
|
placeholderClassName={
|
|
COLOR_OPTIONS[bgColor] === null ? "" : "dark:!text-background"
|
|
}
|
|
/>
|
|
</div>
|
|
</div>
|
|
</>
|
|
);
|
|
}
|
|
|
|
export default NoteNode;
|