Skip to content

Commit 5c15195

Browse files
committed
Added layout changes and features
1 parent 3bbcf86 commit 5c15195

6 files changed

Lines changed: 106 additions & 13 deletions

File tree

src/renderer/src/components/schema-designer/DesignerCanvas.vue

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ const defaultEdgeOptions = {
3636
3737
const selectedNodeId = ref<string | null>(null)
3838
const expandedNodes = ref(new Set<string>())
39-
const { fitView } = useVueFlow()
39+
const { fitView, setNodes, setEdges } = useVueFlow()
4040
4141
function toggleColumns(nodeId: string): void {
4242
const next = new Set(expandedNodes.value)
@@ -253,12 +253,22 @@ const layoutNodes = computed(() => {
253253
})
254254
255255
watch(
256-
() => layoutNodes.value.length,
257-
(len) => {
258-
if (len > 0) {
256+
layoutNodes,
257+
(newNodes) => {
258+
setNodes(newNodes)
259+
if (newNodes.length > 0) {
259260
setTimeout(() => fitView({ padding: 0.2 }), 50)
260261
}
261-
}
262+
},
263+
{ deep: true }
264+
)
265+
266+
watch(
267+
styledEdges,
268+
(newEdges) => {
269+
setEdges(newEdges as SchemaEdge[])
270+
},
271+
{ deep: true }
262272
)
263273
264274
function onNodeClick(event: NodeMouseEvent): void {
@@ -274,8 +284,6 @@ function onPaneClick(): void {
274284
<div class="h-full w-full relative">
275285
<VueFlow
276286
v-if="schema"
277-
:nodes="layoutNodes"
278-
:edges="styledEdges as any"
279287
:node-types="nodeTypes as any"
280288
:default-edge-options="defaultEdgeOptions"
281289
:fit-view-on-init="true"
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<script setup lang="ts">
2+
import type { SplitterResizeHandleEmits, SplitterResizeHandleProps } from "reka-ui"
3+
import type { HTMLAttributes } from "vue"
4+
import { reactiveOmit } from "@vueuse/core"
5+
import { DragHandleDots2Icon } from '@radix-icons/vue'
6+
import { SplitterResizeHandle, useForwardPropsEmits } from "reka-ui"
7+
import { cn } from "@/lib/utils"
8+
9+
const props = defineProps<SplitterResizeHandleProps & { class?: HTMLAttributes["class"], withHandle?: boolean }>()
10+
const emits = defineEmits<SplitterResizeHandleEmits>()
11+
12+
const delegatedProps = reactiveOmit(props, "class", "withHandle")
13+
const forwarded = useForwardPropsEmits(delegatedProps, emits)
14+
</script>
15+
16+
<template>
17+
<SplitterResizeHandle
18+
data-slot="resizable-handle"
19+
v-bind="forwarded"
20+
:class="cn('bg-border focus-visible:ring-ring relative flex w-px items-center justify-center after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-offset-1 focus-visible:outline-hidden data-[orientation=vertical]:h-px data-[orientation=vertical]:w-full data-[orientation=vertical]:after:left-0 data-[orientation=vertical]:after:h-1 data-[orientation=vertical]:after:w-full data-[orientation=vertical]:after:-translate-y-1/2 data-[orientation=vertical]:after:translate-x-0 [&[data-orientation=vertical]>div]:rotate-90', props.class)"
21+
>
22+
<template v-if="props.withHandle">
23+
<div class="bg-border z-10 flex h-4 w-3 items-center justify-center rounded-xs border">
24+
<slot>
25+
<DragHandleDots2Icon class="size-2.5" />
26+
</slot>
27+
</div>
28+
</template>
29+
</SplitterResizeHandle>
30+
</template>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<script setup lang="ts">
2+
import type { SplitterPanelEmits, SplitterPanelProps } from "reka-ui"
3+
import { SplitterPanel, useForwardExpose, useForwardPropsEmits } from "reka-ui"
4+
5+
const props = defineProps<SplitterPanelProps>()
6+
const emits = defineEmits<SplitterPanelEmits>()
7+
8+
const forwarded = useForwardPropsEmits(props, emits)
9+
const { forwardRef } = useForwardExpose()
10+
</script>
11+
12+
<template>
13+
<SplitterPanel
14+
:ref="forwardRef"
15+
v-slot="slotProps"
16+
data-slot="resizable-panel"
17+
v-bind="forwarded"
18+
>
19+
<slot v-bind="slotProps" />
20+
</SplitterPanel>
21+
</template>
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<script setup lang="ts">
2+
import type { SplitterGroupEmits, SplitterGroupProps } from "reka-ui"
3+
import type { HTMLAttributes } from "vue"
4+
import { reactiveOmit } from "@vueuse/core"
5+
import { SplitterGroup, useForwardPropsEmits } from "reka-ui"
6+
import { cn } from "@/lib/utils"
7+
8+
const props = defineProps<SplitterGroupProps & { class?: HTMLAttributes["class"] }>()
9+
const emits = defineEmits<SplitterGroupEmits>()
10+
11+
const delegatedProps = reactiveOmit(props, "class")
12+
13+
const forwarded = useForwardPropsEmits(delegatedProps, emits)
14+
</script>
15+
16+
<template>
17+
<SplitterGroup
18+
v-slot="slotProps"
19+
data-slot="resizable-panel-group"
20+
v-bind="forwarded"
21+
:class="cn('flex h-full w-full data-[orientation=vertical]:flex-col', props.class)"
22+
>
23+
<slot v-bind="slotProps" />
24+
</SplitterGroup>
25+
</template>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export { default as ResizableHandle } from "./ResizableHandle.vue"
2+
export { default as ResizablePanel } from "./ResizablePanel.vue"
3+
export { default as ResizablePanelGroup } from "./ResizablePanelGroup.vue"

src/renderer/src/views/SchemaDesignerView.vue

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ import SessionStartDialog from '@renderer/components/schema-designer/SessionStar
55
import DesignerToolbar from '@renderer/components/schema-designer/DesignerToolbar.vue'
66
import DesignerChat from '@renderer/components/schema-designer/DesignerChat.vue'
77
import DesignerCanvas from '@renderer/components/schema-designer/DesignerCanvas.vue'
8+
import {
9+
ResizablePanelGroup,
10+
ResizablePanel,
11+
ResizableHandle
12+
} from '@renderer/components/ui/resizable'
813
import type { DatabaseType } from '../../../shared/types'
914
1015
const store = useSchemaDesignerStore()
@@ -30,18 +35,19 @@ async function onStart(config: {
3035
<div class="flex h-full flex-col">
3136
<template v-if="store.hasSession">
3237
<DesignerToolbar />
33-
<div class="flex flex-1 overflow-hidden">
34-
<div class="w-[400px] min-w-[320px] max-w-[500px] border-r border-border flex flex-col">
38+
<ResizablePanelGroup direction="horizontal" class="flex-1 overflow-hidden">
39+
<ResizablePanel :default-size="30" :min-size="20" :max-size="50" class="flex flex-col">
3540
<DesignerChat />
36-
</div>
37-
<div class="flex-1">
41+
</ResizablePanel>
42+
<ResizableHandle with-handle />
43+
<ResizablePanel :default-size="70" :min-size="40" class="flex flex-col">
3844
<DesignerCanvas
3945
:schema="store.schema"
4046
:previous-schema="store.previousSchema"
4147
:filtered-tables="store.filteredTables"
4248
/>
43-
</div>
44-
</div>
49+
</ResizablePanel>
50+
</ResizablePanelGroup>
4551
</template>
4652
<SessionStartDialog v-else @start="onStart" />
4753
</div>

0 commit comments

Comments
 (0)