fix: all lint errors, test + lint pre-commit passing

Frontend:
- Split nodeTypes/edgeTypes into separate .ts files (react-refresh)
- Remove setState-in-effect in NodeModal (key prop reset)
- Fix handleSave accessed before declaration (useRef pattern)
- Exclude src/components/ui/** from eslint (shadcn generated)
- Use defineConfig from vitest/config for test type support

Backend:
- ruff --fix: sort imports, datetime.UTC alias
- Raise line-length to 120, ignore E501 in tests
- Break long update_node/update_edge signatures
- pyproject.toml: per-file-ignores for tests
This commit is contained in:
Pouzor
2026-03-06 23:58:10 +01:00
parent 150302c3f7
commit 44a448e26d
30 changed files with 1731 additions and 63 deletions
@@ -11,8 +11,8 @@ import {
} from '@xyflow/react'
import '@xyflow/react/dist/style.css'
import { useCanvasStore } from '@/stores/canvasStore'
import { nodeTypes } from './nodes'
import { edgeTypes } from './edges'
import { nodeTypes } from './nodes/nodeTypes'
import { edgeTypes } from './edges/edgeTypes'
import type { NodeData, EdgeData } from '@/types'
interface CanvasContainerProps {
@@ -0,0 +1,9 @@
import { HomelableEdge } from './index'
export const edgeTypes = {
ethernet: HomelableEdge,
wifi: HomelableEdge,
iot: HomelableEdge,
vlan: HomelableEdge,
virtual: HomelableEdge,
}
+3 -11
View File
@@ -22,13 +22,13 @@ const EDGE_STYLES: Record<EdgeType, React.CSSProperties> = {
virtual: { stroke: '#8b949e', strokeWidth: 1, strokeDasharray: '4 4' },
}
function HomelableEdge({ id, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, data, selected }: EdgeProps<Edge<EdgeData>>) {
export function HomelableEdge({ id, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, data, selected }: EdgeProps<Edge<EdgeData>>) {
const [edgePath, labelX, labelY] = getBezierPath({ sourceX, sourceY, sourcePosition, targetX, targetY, targetPosition })
const edgeType: EdgeType = data?.type ?? 'ethernet'
const style: React.CSSProperties = {
...EDGE_STYLES[edgeType],
...(edgeType === 'vlan' ? { stroke: getVlanColor(data?.vlan_id) } : {}),
...(edgeType === 'vlan' ? { stroke: getVlanColor(data?.vlan_id as number | undefined) } : {}),
...(selected ? { stroke: '#00d4ff', filter: 'drop-shadow(0 0 4px #00d4ff88)' } : {}),
}
@@ -46,18 +46,10 @@ function HomelableEdge({ id, sourceX, sourceY, targetX, targetY, sourcePosition,
border: '1px solid #30363d',
}}
>
{data.label}
{data.label as string}
</div>
</EdgeLabelRenderer>
)}
</>
)
}
export const edgeTypes = {
ethernet: HomelableEdge,
wifi: HomelableEdge,
iot: HomelableEdge,
vlan: HomelableEdge,
virtual: HomelableEdge,
}
@@ -20,16 +20,3 @@ export const IotNode = (props: N) => <BaseNode {...props} icon={Cpu} glowColor="
export const ApNode = (props: N) => <BaseNode {...props} icon={Wifi} glowColor="#00d4ff" />
export const GenericNode = (props: N) => <BaseNode {...props} icon={Circle} glowColor="#8b949e" />
export const nodeTypes = {
isp: IspNode,
router: RouterNode,
switch: SwitchNode,
server: ServerNode,
proxmox: ProxmoxNode,
vm: VmNode,
lxc: LxcNode,
nas: NasNode,
iot: IotNode,
ap: ApNode,
generic: GenericNode,
}
@@ -0,0 +1,15 @@
import { IspNode, RouterNode, SwitchNode, ServerNode, ProxmoxNode, VmNode, LxcNode, NasNode, IotNode, ApNode, GenericNode } from './index'
export const nodeTypes = {
isp: IspNode,
router: RouterNode,
switch: SwitchNode,
server: ServerNode,
proxmox: ProxmoxNode,
vm: VmNode,
lxc: LxcNode,
nas: NasNode,
iot: IotNode,
ap: ApNode,
generic: GenericNode,
}