Skip to content

Commit fd00ebc

Browse files
author
nicosammito
committed
feat: enhance FunctionNodeTriggerComponent with reference handling and icon integration
1 parent 76e4c0a commit fd00ebc

2 files changed

Lines changed: 97 additions & 4 deletions

File tree

src/packages/ce/src/function/components/nodes/FunctionNodeDefaultComponent.tsx

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export const FunctionNodeDefaultComponent: React.FC<FunctionNodeDefaultComponent
2929
const node = React.useMemo(() => flowService.getNodeById(data.flowId, data.nodeId), [flowStore, data])
3030
const definition = React.useMemo(() => node ? functionService.getById(node.functionDefinition?.id!!) : undefined, [functionStore, data, node])
3131
const validation = useNodeValidation(data.nodeId, data.flowId)
32+
3233
const activeTabId = React.useMemo(() => {
3334
return fileTabsService.getActiveTab()?.id
3435
}, [fileTabsStore, fileTabsService]);
@@ -142,7 +143,7 @@ export const FunctionNodeDefaultComponent: React.FC<FunctionNodeDefaultComponent
142143
borderColor={activeTabId == id ? "info" : undefined}
143144
className={`d-flow-node ${activeTabId == id ? "d-flow-node--active" : ""} ${isReferenced === false ? "d-flow-node--notReferenced" : ""}`}
144145
color={"primary"} style={{
145-
...(isReferenced === true ? {boxShadow: `0 0 1px 0 ${data.color}`} : {}),
146+
...(isReferenced === true ? {boxShadow: `0 0 5rem 0 ${withAlpha(data.color, 0.25)}`} : {}),
146147
}}>
147148

148149
<Handle
@@ -185,3 +186,57 @@ export const FunctionNodeDefaultComponent: React.FC<FunctionNodeDefaultComponent
185186
</Card>
186187
);
187188
})
189+
190+
type RGBA = {
191+
r: number
192+
g: number
193+
b: number
194+
a: number
195+
}
196+
197+
const clamp01 = (v: number) => Math.min(Math.max(v, 0), 1)
198+
199+
const parseCssColorToRgba = (color: string): RGBA => {
200+
if (typeof document === "undefined") {
201+
return {r: 0, g: 0, b: 0, a: 1}
202+
}
203+
204+
const el = document.createElement("span")
205+
el.style.color = color
206+
document.body.appendChild(el)
207+
208+
const computed = getComputedStyle(el).color
209+
document.body.removeChild(el)
210+
211+
const match = computed.match(
212+
/rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)(?:\s*,\s*([\d.]+))?\s*\)/
213+
)
214+
215+
if (!match) {
216+
return {r: 0, g: 0, b: 0, a: 1}
217+
}
218+
219+
return {
220+
r: Math.round(Number(match[1])),
221+
g: Math.round(Number(match[2])),
222+
b: Math.round(Number(match[3])),
223+
a: match[4] !== undefined ? Number(match[4]) : 1,
224+
}
225+
}
226+
227+
const mixColorRgb = (color: string, level: number) => {
228+
const w = clamp01(level * 0.1)
229+
230+
const c1 = parseCssColorToRgba(color)
231+
const c2 = parseCssColorToRgba("#070514")
232+
233+
const mix = (a: number, b: number) =>
234+
Math.round(a * (1 - w) + b * w)
235+
236+
return `rgb(${mix(c1.r, c2.r)}, ${mix(c1.g, c2.g)}, ${mix(c1.b, c2.b)})`
237+
}
238+
239+
const withAlpha = (color: string, alpha: number) => {
240+
const c = parseCssColorToRgba(color)
241+
return `rgba(${c.r}, ${c.g}, ${c.b}, ${clamp01(alpha)})`
242+
}

src/packages/ce/src/function/components/nodes/FunctionNodeTriggerComponent.tsx

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import React, {memo} from "react";
2-
import {Handle, Node, NodeProps, Position, useReactFlow, useStore} from "@xyflow/react";
2+
import {Handle, Node, NodeProps, Position} from "@xyflow/react";
33
import {Badge, Card, Flex, Text, useService, useStore as usePictorStore} from "@code0-tech/pictor";
44
import {FunctionNodeComponentProps} from "@edition/function/components/nodes/FunctionNodeComponent";
55
import {FileTabsService} from "@code0-tech/pictor/dist/components/file-tabs/FileTabs.service";
66
import {FlowTypeService} from "@edition/flowtype/services/FlowType.service";
77
import {FlowService} from "@edition/flow/services/Flow.service";
8-
import {IconBolt} from "@tabler/icons-react";
8+
import {IconBolt, IconVariable} from "@tabler/icons-react";
99
import {FunctionFileTriggerComponent} from "@edition/function/components/files/FunctionFileTriggerComponent";
10+
import {NodeFunction} from "@code0-tech/sagittarius-graphql-types";
1011

1112

1213
export type FunctionNodeTriggerComponentProps = NodeProps<Node<FunctionNodeComponentProps>>
@@ -15,6 +16,7 @@ export const FunctionNodeTriggerComponent: React.FC<FunctionNodeTriggerComponent
1516

1617
const {data, id} = props
1718
const fileTabsService = useService(FileTabsService)
19+
const fileTabsStore = usePictorStore(FileTabsService)
1820
const flowTypeService = useService(FlowTypeService)
1921
const flowTypeStore = usePictorStore(FlowTypeService)
2022
const flowService = useService(FlowService)
@@ -38,12 +40,34 @@ export const FunctionNodeTriggerComponent: React.FC<FunctionNodeTriggerComponent
3840
})
3941
}, [])
4042

43+
const activeTabId = React.useMemo(
44+
() => fileTabsService.getActiveTab()?.id,
45+
[fileTabsStore, fileTabsService]
46+
);
47+
48+
const isReferenced = React.useMemo(() => {
49+
50+
const activeNode = flowService.getNodeById(data.flowId, activeTabId as NodeFunction['id'])
51+
const isActiveNodeReferencingCurrentNode = activeNode?.parameters?.nodes?.some(p => p?.value?.__typename === "ReferenceValue" && !p.value.nodeFunctionId)
52+
const hasReferences = activeNode?.parameters?.nodes?.some(p => p?.value?.__typename === "ReferenceValue")
53+
54+
if (isActiveNodeReferencingCurrentNode) {
55+
return true
56+
} else if (hasReferences && !isActiveNodeReferencingCurrentNode && activeTabId !== data.nodeId) {
57+
return false
58+
}
59+
60+
return undefined
61+
62+
}, [flowStore, activeTabId, data.flowId])
63+
4164
return <Card variant={"normal"}
4265
color={"info"}
4366
paddingSize={"xs"}
4467
key={id}
4568
data-flow-refernce={id}
46-
className={`d-flow-node ${fileTabsService.getActiveTab()?.id == id ? "d-flow-node--active" : undefined}`}>
69+
className={`d-flow-node ${fileTabsService.getActiveTab()?.id == id ? "d-flow-node--active" : undefined}`}
70+
style={{...(isReferenced === true ? {boxShadow: `0 0 5rem 0 rgba(112, 255, 178, 0.25)`} : {}),}}>
4771

4872
<Badge color={"info"}
4973
pos={"absolute"}
@@ -60,6 +84,20 @@ export const FunctionNodeTriggerComponent: React.FC<FunctionNodeTriggerComponent
6084
</Text>
6185
</Flex>
6286

87+
{
88+
isReferenced === true ? (
89+
<div className={"d-flow-node__isReferenced"} style={{
90+
position: "absolute",
91+
top: "50%",
92+
left: "-0.5rem",
93+
transform: "translate(-100%, -50%)",
94+
display: "flex"
95+
}}>
96+
<IconVariable className={"d-flow-node__isReferenced-icon"} color={"#70ffb2"} size={13}/>
97+
</div>
98+
) : null
99+
}
100+
63101
<Handle
64102
isConnectable={false}
65103
type="source"

0 commit comments

Comments
 (0)