mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-09-06 16:02:23 +00:00
* Add note component
* save note size and position
* move add note button up
* nit
* Add markdown support
* wip
* fix add sticky note button
* fix text update
* Add sticky note to saved flow data
* add note color picker
* Introduce node multiselect
* Add group notes
* Adapt layout to group node
* create a note manager class
* clean reactivity
* clean
* improve adaptive layout to group note
* modify layout based on cached text height
* fined grained graph rendering for notes
* separate noteManager into editor and render
* separate noteManager into editor and render
* create a note change observer
* render note node from context
* simplify note state managment
* show note in flow viewer
* clean dirty changes
* clean selection manager
* fix layout check
* improve bg surface select
* Handle z-index for stacked group notes
* clean selection manager
* exclude notes from rect select
* Allow switch between selection modes with keyboard keys
* improve selection box styling
* prevent dragging note when editing
* nit
* Simplify selection using svelte flow built in feature
* handle note selection separately
* Add min size for notes
* improve selection toggle
* improve mode switch
* make size and position optional for group notes
* Improve initial viewport position
* Add context menu for the canevas
* nit
* Add node context menu
* improve note select
* use clickoutside for note deselect
* use pointerdown outside to close context menu
* nit
* fix selection issues
* make edges non selectable
* improve color palette
* fix backend
* fix backend check
* cargo lock restore
* Add toggle to display notes
* fix note selection
* nit
* account for css offset in for loop
* fix multiple selection pannel styling
* clear flow selection when creating note
* Improve placeholder and note default text
* Escape note edit mode when pressing Esc
* Allow note edition in local dev
* clean
* Handle subflow selection
* prevent group note resizing
* nit
* allow notes in flow expand
* Improve multi select panel
* Allow context menu in note mode
* Add event listenner to fix pane click deselect
* prevent zoom in text area in notes
* improve bounding box styling
* Use control for box selection for non mac users
* nit
* clean notes groups
* nit
* use portal for note actions
* handle assets node when computing note layout
* Simplify layout compute for notes
* use smart color choice for notes
* Switch display note when adding a new note
* clean code
* improve group note bound size calculation
* simplify AI tool nodes and asset handling
* nit
* nit
* improve flow centering
* create group note button
* Improve selection of nodes
* Revert "Improve selection of nodes"
This reverts commit d2c40d82b1.
* refert backend changes
* nit
* improve graph selection
* clean
* make backend work except job runs
* fix notSelectable
---------
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
83 lines
2.5 KiB
Svelte
83 lines
2.5 KiB
Svelte
<script lang="ts">
|
|
import { ViewportPortal, type Node } from '@xyflow/svelte'
|
|
import { calculateNodesBoundsWithOffset } from './util'
|
|
import { StickyNote } from 'lucide-svelte'
|
|
import Button from '../common/button/Button.svelte'
|
|
import { getNoteEditorContext } from './noteEditor.svelte'
|
|
import { getGraphContext } from './graphContext'
|
|
import { tick } from 'svelte'
|
|
|
|
interface Props {
|
|
selectedNodes: string[]
|
|
allNodes: (Node & { type: string })[]
|
|
}
|
|
|
|
let { selectedNodes, allNodes }: Props = $props()
|
|
|
|
// Get NoteEditor context for group note creation
|
|
const noteEditorContext = getNoteEditorContext()
|
|
// Get Graph context for clearFlowSelection function
|
|
const graphContext = getGraphContext()
|
|
|
|
function handleAddGroupNote() {
|
|
if (selectedNodes.length > 0 && noteEditorContext?.noteEditor && graphContext) {
|
|
// Create the group note first
|
|
noteEditorContext.noteEditor.createGroupNote(selectedNodes)
|
|
|
|
// Wait for next tick to ensure DOM updates
|
|
tick().then(() => {
|
|
graphContext?.clearFlowSelection?.()
|
|
graphContext?.selectionManager.clearSelection()
|
|
})
|
|
}
|
|
}
|
|
|
|
let bounds = $derived(() => {
|
|
if (selectedNodes.length === 0) {
|
|
return null
|
|
}
|
|
|
|
// Calculate flow coordinates bounds, accounting for CSS offset and expanded subflows
|
|
const { minX, minY, maxX, maxY } = calculateNodesBoundsWithOffset(selectedNodes, allNodes)
|
|
|
|
// Add padding in flow coordinates
|
|
const padding = 4
|
|
|
|
// Return flow coordinates directly - ViewportPortal handles transformation
|
|
return {
|
|
x: minX - padding,
|
|
y: minY - padding,
|
|
width: maxX - minX + 2 * padding,
|
|
height: maxY - minY + 2 * padding
|
|
}
|
|
})
|
|
</script>
|
|
|
|
{#if bounds() && selectedNodes.length > 1}
|
|
{@const currentBounds = bounds()!}
|
|
<ViewportPortal target="front">
|
|
<div
|
|
class={'absolute cursor-pointer bg-surface-selected/40 rounded-md pointer-events-none'}
|
|
style:transform="translate({currentBounds.x}px, {currentBounds.y}px)"
|
|
style:width="{currentBounds.width}px"
|
|
style:height="{currentBounds.height}px"
|
|
style:z-index="10"
|
|
>
|
|
<!-- Add Group Note Button positioned in top-right corner -->
|
|
{#if noteEditorContext?.noteEditor}
|
|
<div class="absolute -top-4 -right-1 z-20" style="pointer-events: auto;">
|
|
<Button
|
|
unifiedSize="sm"
|
|
variant="accent"
|
|
title="Create group note ({selectedNodes.length} nodes)"
|
|
onclick={handleAddGroupNote}
|
|
startIcon={{ icon: StickyNote }}
|
|
>
|
|
Create group note ({selectedNodes.length} nodes)
|
|
</Button>
|
|
</div>
|
|
{/if}
|
|
</div>
|
|
</ViewportPortal>
|
|
{/if}
|