Files
windmill/frontend/src/lib/components/graph/ViewportSynchronizer.svelte
centdix 04d2ef419d feat(flow): Add graph diff visualizer (#6948)
* graph mode

* show colors

* show module diff viewer button

* better diff logic

* small width merge graph diff

* invert logic

* simplify

* better logic

* put removed modules in initial position

* nit

* nit

* fix conflicting ids

* fix

* add shadowed for after

* better position logic

* fix

* cleaning

* use splitpanes

* add toggle

* fix

* sync move

* icons

* handle zoom

* left header snippet

* cleaning

* cleaning

* remove stats

* big cleaning

* fix

* fix

* fix

* remove not working logic

* invert logic

* nit

* use in deploymentui

* fix typo

* no custom style

* handle nested

* simpler logic

* fix

* fix
2025-11-01 15:17:56 +01:00

64 lines
1.8 KiB
Svelte

<script lang="ts">
import { useSvelteFlow, type Viewport } from '@xyflow/svelte'
import { tick, untrack } from 'svelte'
interface Props {
sharedViewport: Viewport
onLocalChange: (viewport: Viewport, isUserInitiated: boolean) => void
}
let { sharedViewport, onLocalChange }: Props = $props()
const { setViewport, getViewport } = useSvelteFlow()
let isApplyingSharedChange = false
// Watch for shared viewport changes and apply them locally
$effect(() => {
;(sharedViewport.x, sharedViewport.y, sharedViewport.zoom)
untrack(() => {
if (!isApplyingSharedChange) {
setViewport(sharedViewport, { duration: 0 })
}
})
})
// Export function to be called when local viewport changes (from onmove)
export async function handleLocalViewportChange(
event: MouseEvent | TouchEvent | null,
viewport: Viewport
) {
// Only propagate user-initiated changes (not programmatic ones)
const isUserInitiated = event !== null
if (isUserInitiated) {
isApplyingSharedChange = true
onLocalChange(viewport, isUserInitiated)
await tick()
isApplyingSharedChange = false
}
}
export async function zoomIn() {
const viewport = getViewport()
const newZoom = Math.min(viewport.zoom + 0.1, 1.2)
setViewport({ ...viewport, zoom: newZoom })
await tick()
const updatedViewport = getViewport()
isApplyingSharedChange = true
onLocalChange(updatedViewport, false)
await tick()
isApplyingSharedChange = false
}
export async function zoomOut() {
const viewport = getViewport()
const newZoom = Math.max(viewport.zoom - 0.1, 0.2)
setViewport({ ...viewport, zoom: newZoom })
await tick()
const updatedViewport = getViewport()
isApplyingSharedChange = true
onLocalChange(updatedViewport, false)
await tick()
isApplyingSharedChange = false
}
</script>