Skip to content

Commit b3c4771

Browse files
authored
feat(canvas/render): add router onion skinning preview (#1063)
1 parent 789e06a commit b3c4771

File tree

5 files changed

+114
-5
lines changed

5 files changed

+114
-5
lines changed

packages/canvas/DesignCanvas/src/DesignCanvas.vue

+19
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,24 @@ export default {
247247
})
248248
})
249249
250+
function updatePreviewId(previewId, replace = false) {
251+
const url = new URL(window.location.href)
252+
if (previewId) {
253+
if (previewId === url.searchParams.get('previewid')) {
254+
return
255+
}
256+
url.searchParams.set('previewid', previewId)
257+
} else {
258+
url.searchParams.delete('previewid')
259+
}
260+
if (replace) {
261+
window.history.replaceState({}, '', url)
262+
} else {
263+
window.history.pushState({}, '', url)
264+
}
265+
usePage().postLocationHistoryChanged({ previewId })
266+
}
267+
250268
return {
251269
removeNode,
252270
canvasSrc,
@@ -264,6 +282,7 @@ export default {
264282
getPageAncestors: usePage().getAncestors,
265283
getBaseInfo: () => getMetaApi(META_SERVICE.GlobalService).getBaseInfo(),
266284
addHistoryDataChangedCallback,
285+
updatePreviewId,
267286
ast,
268287
getBlockByName: useMaterial().getBlockByName,
269288
useModal,

packages/canvas/render/src/RenderMain.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { getPageAncestors } from './material-function/page-getter'
2828
import CanvasEmpty from './canvas-function/CanvasEmpty.vue'
2929
import { setCurrentPage } from './canvas-function/page-switcher'
3030
import { useThrottleFn } from '@vueuse/core'
31+
import { useRouterPreview } from './canvas-function/router-preview'
3132

3233
// global-context singleton
3334
const { context: globalContext, setContext: setGlobalContext } = useContext()
@@ -135,7 +136,7 @@ export default defineComponent({
135136
pageContext.setCssScopeId(props.cssScopeId || `data-te-page-${pageContext.pageId}`)
136137
if (props.entry) {
137138
provide('page-ancestors', pageAncestors)
138-
139+
provide('page-preview', useRouterPreview().previewPath)
139140
const updatePageAncestor = () => {
140141
if (routerViewSetting.viewMode === 'standalone') {
141142
pageAncestors.value = []
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import { onUnmounted, ref } from 'vue'
2+
import { getController } from './controller'
3+
import { getPageAncestors } from '../material-function/page-getter'
4+
5+
export function useRouterPreview() {
6+
const pageId = ref(getController().getBaseInfo().pageId)
7+
const previewId = ref(getController().getBaseInfo().previewId)
8+
const updatePreviewId = getController().updatePreviewId
9+
const previewFullPath = ref([])
10+
const previewPath = ref([])
11+
12+
async function calcNewPreviewFullPath() {
13+
if (!pageId.value) {
14+
if (previewId.value) {
15+
updatePreviewId(undefined, true)
16+
return
17+
}
18+
previewFullPath.value = []
19+
previewPath.value = []
20+
return
21+
}
22+
if (!previewId.value) {
23+
previewFullPath.value = await getPageAncestors(pageId.value)
24+
previewPath.value = []
25+
return
26+
}
27+
28+
if (previewFullPath.value[previewFullPath.value.length - 1] !== previewId.value) {
29+
// previewId changed
30+
const fullPath = await getPageAncestors(previewId.value)
31+
if (fullPath.includes(pageId.value)) {
32+
previewFullPath.value = fullPath
33+
} else {
34+
updatePreviewId(pageId.value, true)
35+
}
36+
}
37+
38+
if (previewFullPath.value.includes(pageId.value)) {
39+
// only pageId changed and fast move
40+
const fastJumpIndex = previewFullPath.value.indexOf(pageId.value)
41+
if (fastJumpIndex + 1 < previewFullPath.value.length) {
42+
previewPath.value = previewFullPath.value.slice(fastJumpIndex + 1)
43+
} else {
44+
previewPath.value = []
45+
}
46+
} else {
47+
previewFullPath.value = await getPageAncestors(pageId.value)
48+
previewPath.value = []
49+
updatePreviewId(pageId.value, true)
50+
}
51+
}
52+
53+
const cancel = getController().addHistoryDataChangedCallback(() => {
54+
const newPageId = getController().getBaseInfo().pageId
55+
const newPreviewId = getController().getBaseInfo().previewId
56+
const pageIdChanged = newPageId !== pageId.value
57+
const previewIdChanged = newPreviewId !== previewId.value
58+
if (pageIdChanged) {
59+
pageId.value = newPageId
60+
}
61+
if (previewIdChanged) {
62+
previewId.value = newPreviewId
63+
}
64+
if (previewIdChanged || pageIdChanged) {
65+
calcNewPreviewFullPath()
66+
}
67+
})
68+
69+
onUnmounted(() => {
70+
cancel()
71+
})
72+
73+
calcNewPreviewFullPath()
74+
75+
return {
76+
previewPath,
77+
previewFullPath
78+
}
79+
}

packages/canvas/render/src/render.ts

+12-4
Original file line numberDiff line numberDiff line change
@@ -212,11 +212,13 @@ const getChildren = (schema, mergeScope, pageContext) => {
212212
}
213213
function getRenderPageId(currentPageId, isPageStart) {
214214
const pagePathFromRoot = (inject('page-ancestors') as Ref<any[]>).value
215+
const pagePreviewFromCurrentPageChild = (inject('page-preview') as Ref<any[]>).value
216+
const fullPath = [...pagePathFromRoot, ...pagePreviewFromCurrentPageChild]
215217

216218
function getNextChild(currentPageId) {
217-
const index = pagePathFromRoot.indexOf(currentPageId)
218-
if (index > -1 && index + 1 < pagePathFromRoot.length) {
219-
return pagePathFromRoot[index + 1]
219+
const index = fullPath.indexOf(currentPageId)
220+
if (index > -1 && index + 1 < fullPath.length) {
221+
return fullPath[index + 1]
220222
}
221223
return null
222224
}
@@ -256,7 +258,13 @@ export const renderer = defineComponent({
256258
if (renderPageId) {
257259
return h(getPage(renderPageId), {
258260
key: ancestors,
259-
[DESIGN_TAGKEY]: `${componentName}`
261+
[DESIGN_TAGKEY]: `${componentName}`,
262+
...(pageContext.active && !isPageStart
263+
? {
264+
[DESIGN_UIDKEY]: schema.id,
265+
draggable: true
266+
}
267+
: {})
260268
})
261269
}
262270
}

packages/common/composable/defaultGlobalService.js

+2
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ const getBaseInfo = () => {
66
const id = paramsMap.get('id')
77
const blockId = paramsMap.get('blockid')
88
const pageId = paramsMap.get('pageid')
9+
const previewId = paramsMap.get('previewid')
910
const type = paramsMap.get('type')
1011
const version = paramsMap.get('version')
1112

1213
return {
1314
type: type || 'app',
1415
id,
1516
pageId,
17+
previewId,
1618
blockId,
1719
version
1820
}

0 commit comments

Comments
 (0)