1- import React from 'react' ;
1+ import React , { useState } from 'react' ;
22import { produce } from 'immer' ;
33import { CanvasSchemaContext } from './canvas-schema.context' ;
44import {
@@ -157,6 +157,75 @@ export const CanvasSchemaProvider: React.FC<Props> = props => {
157157 } ) ) ;
158158 } ;
159159
160+ const duplicateSelectedTable = ( ) => {
161+ setSchema ( prevSchema => {
162+ if ( ! prevSchema . selectedElementId ) return prevSchema ;
163+
164+ const selectedTable = prevSchema . tables . find (
165+ table => table . id === prevSchema . selectedElementId
166+ ) ;
167+
168+ if ( ! selectedTable ) return prevSchema ;
169+
170+ // Create duplicate with new IDs
171+ const duplicateTable : TableVm = {
172+ ...selectedTable ,
173+ id : crypto . randomUUID ( ) , // Generate new ID
174+ x : selectedTable . x + 50 , // Offset position
175+ y : selectedTable . y + 50 ,
176+ fields : selectedTable . fields . map ( field => ( {
177+ ...field ,
178+ id : crypto . randomUUID ( ) , // New IDs for fields
179+ } ) ) ,
180+ } ;
181+
182+ return {
183+ ...prevSchema ,
184+ tables : [ ...prevSchema . tables , duplicateTable ] ,
185+ isPristine : false ,
186+ } ;
187+ } ) ;
188+ } ;
189+
190+ const [ clipboardTable , setClipboardTable ] = useState < TableVm | null > ( null ) ;
191+ const [ pasteOffset , setPasteOffset ] = useState ( { x : 0 , y : 0 } ) ;
192+
193+ const copySelectedTable = ( ) => {
194+ const selectedTable = canvasSchema . tables . find (
195+ table => table . id === canvasSchema . selectedElementId
196+ ) ;
197+ if ( selectedTable ) {
198+ setClipboardTable ( selectedTable ) ;
199+ setPasteOffset ( { x : 0 , y : 0 } ) ; // Reset offset on copy
200+ }
201+ } ;
202+
203+ const pasteTable = ( ) => {
204+ if ( clipboardTable ) {
205+ // Increment offset
206+ const newOffset = { x : pasteOffset . x + 50 , y : pasteOffset . y + 50 } ;
207+
208+ const newTable : TableVm = {
209+ ...clipboardTable ,
210+ id : crypto . randomUUID ( ) ,
211+ x : clipboardTable . x + newOffset . x ,
212+ y : clipboardTable . y + newOffset . y ,
213+ fields : clipboardTable . fields . map ( field => ( {
214+ ...field ,
215+ id : crypto . randomUUID ( ) ,
216+ } ) ) ,
217+ } ;
218+
219+ setSchema ( prev => ( {
220+ ...prev ,
221+ tables : [ ...prev . tables , newTable ] ,
222+ isPristine : false ,
223+ } ) ) ;
224+
225+ setPasteOffset ( newOffset ) ;
226+ }
227+ } ;
228+
160229 return (
161230 < CanvasSchemaContext . Provider
162231 value = { {
@@ -177,6 +246,10 @@ export const CanvasSchemaProvider: React.FC<Props> = props => {
177246 updateFullRelation,
178247 deleteSelectedItem,
179248 switchIsPristine : switchIsPristine ,
249+ duplicateSelectedTable,
250+ copySelectedTable,
251+ pasteTable,
252+ hasClipboardContent : Boolean ( clipboardTable ) ,
180253 } }
181254 >
182255 { children }
0 commit comments