Fix duplicate page
This commit is contained in:
parent
a82e077085
commit
fc321cc757
5 changed files with 77 additions and 8 deletions
|
@ -108,6 +108,11 @@ const tlcss = css`
|
||||||
U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
html,
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--tl-zoom: 1;
|
--tl-zoom: 1;
|
||||||
--tl-scale: calc(1 / var(--tl-zoom));
|
--tl-scale: calc(1 / var(--tl-zoom));
|
||||||
|
|
|
@ -18,7 +18,12 @@ const canDeleteSelector = (s: Data) => {
|
||||||
return Object.keys(s.document.pages).length > 1
|
return Object.keys(s.document.pages).length > 1
|
||||||
}
|
}
|
||||||
|
|
||||||
export function PageOptionsDialog({ page }: { page: TLDrawPage }): JSX.Element {
|
interface PageOptionsDialogProps {
|
||||||
|
page: TLDrawPage
|
||||||
|
onOpen?: () => void
|
||||||
|
}
|
||||||
|
|
||||||
|
export function PageOptionsDialog({ page, onOpen }: PageOptionsDialogProps): JSX.Element {
|
||||||
const { tlstate, useSelector } = useTLDrawContext()
|
const { tlstate, useSelector } = useTLDrawContext()
|
||||||
|
|
||||||
const [isOpen, setIsOpen] = React.useState(false)
|
const [isOpen, setIsOpen] = React.useState(false)
|
||||||
|
@ -46,6 +51,7 @@ export function PageOptionsDialog({ page }: { page: TLDrawPage }): JSX.Element {
|
||||||
setIsOpen(isOpen)
|
setIsOpen(isOpen)
|
||||||
|
|
||||||
if (isOpen) {
|
if (isOpen) {
|
||||||
|
onOpen?.()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,7 @@ export const MenuTextInput = styled('input', {
|
||||||
outline: 'none',
|
outline: 'none',
|
||||||
background: '$input',
|
background: '$input',
|
||||||
borderRadius: '4px',
|
borderRadius: '4px',
|
||||||
font: '$ui',
|
fontFamily: '$ui',
|
||||||
fontSize: '$1',
|
fontSize: '$1',
|
||||||
|
userSelect: 'all',
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,10 +1,67 @@
|
||||||
import type { TLDrawShape, Data, Command } from '~types'
|
import type { Data, Command } from '~types'
|
||||||
import { TLDR } from '~state/tldr'
|
import { Utils } from '@tldraw/core'
|
||||||
|
|
||||||
|
export function duplicatePage(data: Data, pageId: string): Command {
|
||||||
|
const newId = Utils.uniqueId()
|
||||||
|
const { currentPageId } = data.appState
|
||||||
|
|
||||||
|
console.log('duplicating')
|
||||||
|
|
||||||
|
const page = data.document.pages[pageId]
|
||||||
|
|
||||||
|
const nextPage = {
|
||||||
|
...page,
|
||||||
|
id: newId,
|
||||||
|
...Object.fromEntries(
|
||||||
|
Object.entries(page.shapes).map(([id, shape]) => {
|
||||||
|
return [
|
||||||
|
id,
|
||||||
|
{
|
||||||
|
...shape,
|
||||||
|
parentId: shape.parentId === pageId ? newId : shape.parentId,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
})
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
export function duplicatePage(data: Data, id: string): Command {
|
|
||||||
return {
|
return {
|
||||||
id: 'duplicate_page',
|
id: 'duplicate_page',
|
||||||
before: {},
|
before: {
|
||||||
after: {},
|
appState: {
|
||||||
|
currentPageId,
|
||||||
|
},
|
||||||
|
document: {
|
||||||
|
pages: {
|
||||||
|
[newId]: undefined,
|
||||||
|
},
|
||||||
|
pageStates: {
|
||||||
|
[newId]: undefined,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
after: {
|
||||||
|
appState: {
|
||||||
|
currentPageId: newId,
|
||||||
|
},
|
||||||
|
document: {
|
||||||
|
pages: {
|
||||||
|
[newId]: nextPage,
|
||||||
|
},
|
||||||
|
pageStates: {
|
||||||
|
[newId]: {
|
||||||
|
...page,
|
||||||
|
id: newId,
|
||||||
|
selectedIds: [],
|
||||||
|
camera: { point: [-window.innerWidth / 2, -window.innerHeight / 2], zoom: 1 },
|
||||||
|
currentParentId: newId,
|
||||||
|
editingId: undefined,
|
||||||
|
bindingId: undefined,
|
||||||
|
hoveredId: undefined,
|
||||||
|
pointedId: undefined,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,7 +173,7 @@ export class TLDrawState implements TLCallbacks {
|
||||||
})
|
})
|
||||||
|
|
||||||
const changedShapeIds = Object.values(page.shapes)
|
const changedShapeIds = Object.values(page.shapes)
|
||||||
.filter((shape) => prevPage.shapes[shape.id] !== shape)
|
.filter((shape) => prevPage?.shapes[shape.id] !== shape)
|
||||||
.map((shape) => shape.id)
|
.map((shape) => shape.id)
|
||||||
|
|
||||||
this.data.document.pages[pageId] = page
|
this.data.document.pages[pageId] = page
|
||||||
|
|
Loading…
Reference in a new issue