@opentiny/tiny-engine-plugin-page 2.6.0-rc.3 → 2.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/package.json +6 -6
package/dist/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/http.ts","../src/PageHistory.vue","../src/PageInputOutput.vue","../meta.js","../src/PageSetting.vue","../src/PageFolderSetting.vue","../src/LayerLines.vue","../src/Tree.vue","../src/PageTree.vue","../src/Main.vue","../src/composable/usePage.ts","../src/composable/index.ts","../src/PageGeneral.vue","../index.ts"],"sourcesContent":["/**\n * Copyright (c) 2023 - present TinyEngine Authors.\n * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd.\n *\n * Use of this source code is governed by an MIT-style license.\n *\n * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,\n * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR\n * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS.\n *\n */\n\nimport { getMetaApi, META_SERVICE } from '@opentiny/tiny-engine-meta-register'\n\n// 页面管理 -- 获取页面列表\nexport const fetchPageList = (appId) => getMetaApi(META_SERVICE.Http).get(`/app-center/api/pages/list/${appId}`)\n\n// 页面管理 -- 获取页面详情\nexport const fetchPageDetail = (pageId) => getMetaApi(META_SERVICE.Http).get(`/app-center/api/pages/detail/${pageId}`)\n\n// 页面管理 -- 删除页面\nexport const requestDeletePage = (pageId) => getMetaApi(META_SERVICE.Http).get(`/app-center/api/pages/delete/${pageId}`)\n\n// 页面管理 -- 新增页面\nexport const requestCreatePage = (params) => getMetaApi(META_SERVICE.Http).post('/app-center/api/pages/create', params)\n\n// 页面管理 -- 保存页面\nexport const handleRouteHomeUpdate = (pageId, params) =>\n getMetaApi(META_SERVICE.Http).post(`/app-center/api/pages/update/${pageId}`, params)\n\n// 页面管理 -- 复制页面\nexport const requestCopyPage = (params) => getMetaApi(META_SERVICE.Http).post('/app-center/api/pages/copy', params)\n\n// 页面管理 -- 获取页面历史备份列表\nexport const fetchPageHistory = (pageId) =>\n getMetaApi(META_SERVICE.Http).get(`/app-center/api/pages/histories?page=${pageId}`)\n\n// 页面管理 -- 还原历史备份\nexport const requestRestorePageHistory = (params) =>\n getMetaApi(META_SERVICE.Http).post('/app-center/api/pageHistory/restore', params)\n\n// 页面管理 -- 查看历史备份详情\nexport const fetchHistoryDetail = (pageId) =>\n getMetaApi(META_SERVICE.Http).get(`/app-center/api/pages/histories/${pageId}`)\n\nexport const requestUpdatePage = (pageId, params) =>\n getMetaApi(META_SERVICE.Http).post(`/app-center/api/pages/update/${pageId}`, params)\n\nexport default {\n fetchPageList,\n fetchPageDetail,\n requestDeletePage,\n requestCreatePage,\n requestCopyPage,\n fetchPageHistory,\n fetchHistoryDetail,\n handleRouteHomeUpdate,\n requestRestorePageHistory,\n requestUpdatePage\n}\n","<template>\n <block-history-list :history=\"list\" @preview=\"previewHistory\" @restore=\"restoreHistory\"></block-history-list>\n</template>\n\n<script lang=\"ts\">\nimport { ref, watchEffect } from 'vue'\nimport { BlockHistoryList } from '@opentiny/tiny-engine-common'\nimport { previewPage } from '@opentiny/tiny-engine-common/js/preview'\nimport { usePage, useBlock, useModal, getMetaApi, META_SERVICE } from '@opentiny/tiny-engine-meta-register'\nimport { fetchPageHistory } from './http'\n\nexport default {\n components: {\n BlockHistoryList\n },\n props: {\n curPageData: {\n type: Object,\n default: () => ({})\n }\n },\n emits: ['restorePage'],\n setup(props, { emit }) {\n const { pageSettingState, getFamily } = usePage()\n const { getDateFromNow } = useBlock()\n const { confirm } = useModal()\n const list = ref([])\n\n const getHistoryList = (pageId) => {\n const { id, version } = getMetaApi(META_SERVICE.GlobalService).getBaseInfo()\n const params = version ? `&app=${id}&version=${version}` : ''\n\n if (pageId) {\n fetchPageHistory(pageId + params).then((data) => {\n if (!data) {\n return\n }\n data.forEach((item) => {\n item.backupTitle = item.message\n item.backupTime = getDateFromNow(new Date(item.time))\n })\n list.value = data.reverse()\n })\n } else {\n list.value = []\n }\n }\n\n watchEffect(() => {\n const pageId = pageSettingState.currentPageData?.id || ''\n getHistoryList(pageId)\n })\n\n const previewHistory = async (item) => {\n if (item) {\n const params = {\n ...item,\n id: Number(item.page),\n history: item.id\n }\n params.ancestors = await getFamily(params)\n previewPage(params, true)\n }\n }\n\n const restoreHistory = (item) => {\n confirm({\n title: '提示',\n message: '您即将还原历史页面,是否继续还原?',\n exec: () => {\n emit('restorePage', item)\n }\n })\n }\n\n return {\n list,\n previewHistory,\n restoreHistory\n }\n }\n}\n</script>\n","<template>\n <div class=\"input-or-output\">\n <meta-code-editor\n :modelValue=\"inputValue\"\n title=\"输入配置\"\n button-text=\"输入配置\"\n language=\"json\"\n :buttonShowContent=\"hasContent(inputValue)\"\n single\n @save=\"saveInputValue\"\n >\n <template #icon>\n <svg-icon class=\"edit-btn-icon\" name=\"to-edit\"></svg-icon>\n </template>\n </meta-code-editor>\n <div class=\"input-output-tips\">传递给页面的参数(类似组件的输入属性)</div>\n <meta-code-editor\n :modelValue=\"outputValue\"\n title=\"输出配置\"\n button-text=\"输出配置\"\n language=\"json\"\n :buttonShowContent=\"hasContent(outputValue)\"\n single\n @save=\"saveOutputValue\"\n >\n <template #icon>\n <svg-icon class=\"edit-btn-icon\" name=\"to-edit\"></svg-icon>\n </template>\n </meta-code-editor>\n <div class=\"input-output-div\">页面传递出的事件(类似组件触发的输出事件)</div>\n\n <tiny-checkbox class=\"selectHome\" v-model=\"pageSettingState.currentPageData.isBody\"\n ><span>设为根元素为Body</span>\n </tiny-checkbox>\n <div class=\"input-output-div\">默认为div</div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { ref, watchEffect, computed } from 'vue'\nimport { Checkbox } from '@opentiny/vue'\nimport { MetaCodeEditor } from '@opentiny/tiny-engine-common'\nimport { usePage, useNotify } from '@opentiny/tiny-engine-meta-register'\n\nexport default {\n components: {\n MetaCodeEditor,\n TinyCheckbox: Checkbox\n },\n setup() {\n const inputValue = ref('')\n const outputValue = ref('')\n const { pageSettingState } = usePage()\n const currentPageData = computed(() => pageSettingState.currentPageData)\n watchEffect(() => {\n inputValue.value = pageSettingState.currentPageData['page_content']?.inputs || ''\n outputValue.value = pageSettingState.currentPageData['page_content']?.outputs || ''\n })\n\n const saveInputValue = (data) => {\n try {\n const inputsData = JSON.parse(data.content)\n inputValue.value = data.content\n currentPageData.value['page_content'].inputs = inputsData\n } catch (err) {\n useNotify({\n title: '输入配置保存失败(必须符合JSON格式)',\n message: `${err?.message || err}`,\n type: 'error'\n })\n }\n }\n const saveOutputValue = (data) => {\n try {\n const outputsData = JSON.parse(data.content)\n outputValue.value = data.content\n currentPageData.value['page_content'].outputs = outputsData\n } catch (err) {\n useNotify({\n title: '输出配置保存失败(必须符合JSON格式)',\n message: `${err?.message || err}`,\n type: 'error'\n })\n }\n }\n\n const hasContent = (value) =>\n (Array.isArray(value) && value.length > 0) || (typeof value === 'object' && Object.keys(value).length > 0)\n\n return {\n inputValue,\n outputValue,\n saveInputValue,\n saveOutputValue,\n pageSettingState,\n hasContent\n }\n }\n}\n</script>\n\n<style lang=\"less\" scoped>\n.input-or-output {\n color: var(--te-page-manage-input-or-output-text-color);\n .life-cycle-alert {\n color: var(--te-page-manage-life-cycle-alert-text-color);\n height: 28px;\n padding: 6px;\n border: 0;\n font-size: 11px;\n margin-bottom: 12px;\n :deep(.tiny-alert__close) {\n top: 7px;\n }\n }\n\n .input-output-tips,\n .input-output-div {\n color: var(--te-page-manage-life-cycle-alert-text-color);\n margin-top: 4px;\n height: 16px;\n line-height: 16px;\n }\n .input-output-tips {\n margin-bottom: 12px;\n }\n .selectHome {\n margin-top: 12px;\n }\n .edit-btn-icon {\n color: var(--te-page-manage-icon-color);\n margin-right: 6px;\n }\n :deep(.edit-btn) {\n flex: none;\n display: flex;\n align-items: center;\n }\n}\n</style>\n","export default {\n id: 'engine.plugins.appmanage',\n title: '页面',\n type: 'plugins',\n icon: 'plugin-icon-page',\n align: 'leftTop'\n}\n","<template>\n <plugin-setting\n v-if=\"isShow\"\n :fixed-name=\"PLUGIN_NAME.AppManage\"\n :align=\"align\"\n :title=\"state.title\"\n class=\"page-plugin-setting\"\n >\n <template #header>\n <button-group>\n <tiny-button type=\"primary\" @click=\"savePageSetting\">保存</tiny-button>\n <svg-button\n v-if=\"!pageSettingState.isNew\"\n name=\"text-copy-page\"\n placement=\"bottom\"\n tips=\"复制页面\"\n @click=\"copyPage\"\n ></svg-button>\n <svg-button v-if=\"!pageSettingState.isNew\" name=\"delete\" tips=\"删除页面\" @click=\"deletePage\"></svg-button>\n <svg-button name=\"close\" @click=\"cancelPageSetting\"></svg-button>\n </button-group>\n </template>\n\n <template #content>\n <div class=\"page-setting-content\">\n <tiny-collapse v-model=\"state.activeName\" class=\"page-setting-collapse\">\n <tiny-collapse-item title=\"基本设置\" :name=\"PAGE_SETTING_SESSION.general\">\n <component :is=\"pageGeneral\" ref=\"pageGeneralRef\" :isFolder=\"isFolder\"></component>\n </tiny-collapse-item>\n\n <tiny-collapse-item\n class=\"base-setting\"\n v-if=\"pageSettingState.currentPageData.group !== 'public'\"\n title=\"输入输出\"\n :name=\"PAGE_SETTING_SESSION.inputOutput\"\n >\n <page-input-output></page-input-output>\n </tiny-collapse-item>\n <tiny-collapse-item\n class=\"input-output\"\n v-if=\"pageSettingState.currentPageData.group !== 'public'\"\n title=\"页面生命周期配置\"\n :name=\"PAGE_SETTING_SESSION.lifeCycles\"\n >\n <div class=\"life-cycles-container\">\n <life-cycles\n :bindLifeCycles=\"pageSettingState.currentPageData.page_content?.lifeCycles\"\n @updatePageLifeCycles=\"updatePageLifeCycles\"\n ></life-cycles>\n </div>\n </tiny-collapse-item>\n\n <tiny-collapse-item class=\"history-source\" title=\"历史备份\" :name=\"PAGE_SETTING_SESSION.history\">\n <page-history @restorePage=\"restorePage\"></page-history>\n </tiny-collapse-item>\n </tiny-collapse>\n </div>\n </template>\n </plugin-setting>\n</template>\n\n<script lang=\"jsx\">\nimport { reactive, ref, computed, onActivated, onDeactivated } from 'vue'\nimport { Button, Collapse, CollapseItem, Input } from '@opentiny/vue'\nimport { PluginSetting, ButtonGroup, SvgButton, LifeCycles } from '@opentiny/tiny-engine-common'\nimport {\n useLayout,\n usePage,\n useCanvas,\n useModal,\n useNotify,\n getMergeRegistry,\n getMetaApi,\n META_SERVICE,\n useMessage\n} from '@opentiny/tiny-engine-meta-register'\nimport { extend, isEqual } from '@opentiny/vue-renderless/common/object'\nimport { constants } from '@opentiny/tiny-engine-utils'\nimport { isVsCodeEnv } from '@opentiny/tiny-engine-common/js/environments'\nimport { handlePageUpdate } from '@opentiny/tiny-engine-common/js/http'\nimport { generatePage } from '@opentiny/tiny-engine-common/js/vscodeGenerateFile'\nimport PageHistory from './PageHistory.vue'\nimport PageInputOutput from './PageInputOutput.vue'\nimport meta from '../meta'\nimport http from './http'\n\nconst { COMPONENT_NAME } = constants\nconst isShow = ref(false)\n\nexport const openPageSettingPanel = () => {\n isShow.value = true\n}\n\nexport const closePageSettingPanel = () => {\n isShow.value = false\n\n const { resetPageData } = usePage()\n\n resetPageData()\n}\n\nconst PAGE_SETTING_SESSION = {\n general: 'general',\n inputOutput: 'inputOutput',\n lifeCycles: 'lifeCycles',\n history: 'history'\n}\n\nexport default {\n components: {\n TinyButton: Button,\n TinyCollapse: Collapse,\n TinyCollapseItem: CollapseItem,\n PageInputOutput,\n LifeCycles,\n PageHistory,\n PluginSetting,\n SvgButton,\n ButtonGroup\n },\n props: {\n isFolder: {\n type: Boolean,\n default: false\n }\n },\n emits: ['openNewPage'],\n setup(props, { emit }) {\n const { requestCreatePage, requestDeletePage } = http\n const {\n getDefaultPage,\n pageSettingState,\n changeTreeData,\n isCurrentDataSame,\n initCurrentPageData,\n isTemporaryPage,\n STATIC_PAGE_GROUP_ID,\n updatePageSettingAfterSave\n } = usePage()\n const { pageState, initData } = useCanvas()\n const { confirm } = useModal()\n const registry = getMergeRegistry(meta.type, meta.id)\n const pageGeneral = registry.components.PageGeneral\n const beforeCreatePage = registry?.options?.beforeCreatePage\n const pageGeneralRef = ref(null)\n\n const { PLUGIN_NAME, getPluginByLayout } = useLayout()\n const align = computed(() => getPluginByLayout(PLUGIN_NAME.AppManage))\n const { subscribe, unsubscribe } = useMessage()\n\n // 初始化订阅\n let subscriber = null\n\n // 组件激活时订阅\n onActivated(() => {\n subscriber = subscribe({\n topic: 'page-saved',\n callback: () => {\n // 当收到页面保存事件时,更新页面设置状态\n updatePageSettingAfterSave()\n }\n })\n })\n\n // 组件卸载或失活时取消订阅\n onDeactivated(() => {\n if (subscriber) {\n unsubscribe(subscriber)\n }\n })\n\n const state = reactive({\n activeName: Object.values(PAGE_SETTING_SESSION),\n title: '页面设置',\n historyMessage: ''\n })\n\n const cancelPageSetting = () => {\n if (isEqual(pageSettingState.currentPageData, pageSettingState.currentPageDataCopy)) {\n closePageSettingPanel()\n } else {\n confirm({\n title: '提示',\n message: '您即将使用未保存的更改关闭此页。是否要在关闭之前放弃这些更改?',\n exec: () => {\n if (!pageSettingState.isNew) {\n changeTreeData(pageSettingState.oldParentId, pageSettingState.currentPageData.parentId)\n Object.assign(pageSettingState.currentPageData, pageSettingState.currentPageDataCopy)\n }\n closePageSettingPanel()\n }\n })\n }\n }\n\n const createPage = async () => {\n const { page_content, ...other } = getDefaultPage()\n const { page_content: page_content_state, ...pageSettingStateOther } = pageSettingState.currentPageData\n const createParams = {\n ...other,\n ...pageSettingStateOther,\n page_content: {\n ...page_content,\n ...page_content_state,\n fileName: pageSettingState.currentPageData.name\n },\n app: getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id,\n isPage: true\n }\n\n if (createParams.id) {\n delete createParams.id\n delete createParams._id\n }\n if (beforeCreatePage) {\n await beforeCreatePage(createParams)\n }\n\n try {\n const data = await requestCreatePage(createParams)\n\n await pageSettingState.updateTreeData()\n pageSettingState.isNew = false\n isTemporaryPage.saved = false\n emit('openNewPage', data)\n closePageSettingPanel()\n useLayout().closePlugin()\n useNotify({\n type: 'success',\n message: '新建页面成功!'\n })\n if (isVsCodeEnv) {\n generatePage(data)\n }\n } catch (err) {\n useNotify({\n type: 'error',\n title: '新建页面失败',\n message: JSON.stringify(err?.message || err)\n })\n }\n }\n\n const updatePage = (id, params, isUpdateTree = true) => {\n const routerChange = pageSettingState.currentPageDataCopy.route !== pageSettingState.currentPageData.route\n const isCurEditPage = pageState?.currentPage?.id === id\n const updateParams = {\n id,\n params,\n routerChange,\n isCurEditPage,\n isUpdateTree\n }\n\n return handlePageUpdate(updateParams)\n }\n\n const restorePage = (pageData) => {\n const currentData = {\n ...pageData,\n id: pageData.page\n }\n\n const unnecessaryFields = ['page', 'backupTime', 'backupTitle', 'time']\n unnecessaryFields.forEach((key) => delete currentData[key])\n\n const params = {\n ...pageSettingState.currentPageData,\n ...currentData,\n message: '还原页面'\n }\n\n updatePage(currentData.id, params).then((data) => {\n // 还原的页面是当前页,需要同步更新画布\n if (pageState?.currentPage?.id === data?.id) {\n initData(data.page_content, data)\n }\n initCurrentPageData(data)\n })\n }\n\n const editPage = async () => {\n // 更新页面\n const { id, name, page_content } = pageSettingState.currentPageData\n const params = {\n ...pageSettingState.currentPageData,\n page_content: {\n ...page_content,\n fileName: name\n }\n }\n\n const res = await updatePage(id, params)\n\n initCurrentPageData(res)\n }\n\n const updatePageLifeCycles = (val) => {\n if (!val) {\n return\n }\n\n const pageContent = pageSettingState.currentPageData.page_content\n\n pageContent.lifeCycles = {\n ...(pageContent.lifeCycles || {}),\n ...val\n }\n }\n\n const copyPageData = () => {\n const data = pageSettingState.currentPageData\n const copyData = extend(true, {}, data)\n\n pageSettingState.isNew = true\n copyData.name = `${copyData.name}Copy`\n copyData.route = `${copyData.route}Copy`\n pageSettingState.currentPageData = copyData\n pageSettingState.currentPageDataCopy = extend(true, {}, copyData)\n pageSettingState.defaultPage = null\n }\n\n const copyPage = () => {\n if (!isCurrentDataSame()) {\n confirm({\n title: '提示',\n message: '您即将复制的页面有更改未保存,是否确定跳过更改直接复制?',\n exec: () => {\n changeTreeData(pageSettingState.oldParentId, pageSettingState.currentPageData.parentId)\n Object.assign(pageSettingState.currentPageData, pageSettingState.currentPageDataCopy)\n copyPageData()\n }\n })\n } else {\n copyPageData()\n }\n }\n\n const settingDefaultPage = async () => {\n const params = { ...pageSettingState.defaultPage, isDefault: true }\n updatePage(pageSettingState.defaultPage?.id, params, false).then((res) => {\n if (res) {\n editPage()\n }\n })\n }\n\n const createHistoryMessage = () => {\n if (pageSettingState.isNew) {\n pageSettingState.currentPageData.message = 'Page auto save'\n createPage()\n } else {\n const title = '创建历史备份信息'\n const messageRender = {\n render: () => <Input placeholder=\"历史备份信息\" v-model={state.historyMessage}></Input>\n }\n const exec = () => {\n pageSettingState.currentPageData.message = state.historyMessage.trim() || 'Page auto save'\n if (pageSettingState.defaultPage?.id) {\n settingDefaultPage()\n } else {\n editPage()\n }\n state.historyMessage = ''\n }\n\n confirm({ title, message: messageRender, exec })\n }\n }\n\n const savePageSetting = () => {\n pageGeneralRef.value.validGeneralForm().then(createHistoryMessage)\n }\n\n const collectAllPage = (staticPageList = []) => {\n if (!Array.isArray(staticPageList)) {\n return []\n }\n\n const pageList = []\n\n staticPageList.forEach((pageItem) => {\n if (pageItem?.isPage) {\n pageList.push(pageItem)\n\n return\n }\n\n if (!pageItem?.isPage && pageItem?.children?.length) {\n pageList.push(...collectAllPage(pageItem.children))\n }\n })\n\n return pageList\n }\n\n const deletePage = () => {\n if (pageSettingState.treeDataMapping[pageSettingState.currentPageData.id]?.children?.length) {\n useNotify({\n type: 'error',\n message: '此页面存在子页面或子文件夹,不能删除!'\n })\n\n return\n }\n\n confirm({\n title: '提示',\n message: '您是否要删除页面?',\n exec: () => {\n const id = pageSettingState.currentPageData?.id || ''\n requestDeletePage(id)\n .then(() => {\n pageSettingState.updateTreeData().then((pages) => {\n if (pageState?.currentPage?.id !== id) {\n return\n }\n\n const staticPageList = (pages || []).find(({ groupId }) => groupId === STATIC_PAGE_GROUP_ID)?.data || []\n const pageList = collectAllPage(staticPageList)\n\n const pageHome = pageList.find((page) => page.isHome)\n const firstPage = pageList?.[0]\n const defaultPage = {\n componentName: COMPONENT_NAME.Page\n }\n\n emit('openNewPage', pageHome || firstPage || defaultPage)\n })\n\n closePageSettingPanel()\n useNotify({ message: '删除页面成功!', type: 'success' })\n })\n .catch(() => {\n useNotify({ message: '删除页面失败!', type: 'error' })\n })\n }\n })\n }\n\n return {\n align,\n PLUGIN_NAME,\n state,\n isShow,\n savePageSetting,\n copyPage,\n pageSettingState,\n pageGeneral,\n pageGeneralRef,\n deletePage,\n cancelPageSetting,\n closePageSettingPanel,\n updatePageLifeCycles,\n restorePage,\n PAGE_SETTING_SESSION\n }\n }\n}\n</script>\n\n<style lang=\"less\" scoped>\n.block-add-content {\n display: flex;\n flex-direction: column;\n height: calc(100% - 45px);\n}\n\n.page-plugin-setting {\n :deep(.plugin-setting-header) {\n border: 0;\n }\n\n :deep(.plugin-setting-content) {\n padding: 0 0 16px 0;\n }\n\n :deep(.tiny-collapse) {\n border-bottom: 0;\n }\n}\n\n.page-setting-collapse {\n :deep(.tiny-collapse-item__header) {\n &,\n &.is-active {\n &::before {\n border: none;\n }\n }\n\n .svg-icon {\n margin-right: 6px;\n }\n }\n :deep(.tiny-collapse-item__content) {\n padding: 0 12px 12px;\n }\n}\n</style>\n","<template>\n <plugin-setting\n v-if=\"isShow\"\n :fixed-name=\"PLUGIN_NAME.AppManage\"\n :align=\"align\"\n :title=\"state.title\"\n class=\"pageFolder-plugin-setting\"\n >\n <template #header>\n <button-group>\n <tiny-button type=\"primary\" @click=\"saveFolderSetting\">保存</tiny-button>\n <svg-button\n v-if=\"!pageSettingState.isNew\"\n name=\"delete\"\n placement=\"bottom\"\n tips=\"删除\"\n @click=\"deleteFolder\"\n ></svg-button>\n <svg-button class=\"close-plugin-setting-icon\" name=\"close\" @click=\"closeFolderSetting\"></svg-button>\n </button-group>\n </template>\n\n <template #content>\n <div class=\"page-setting-content\">\n <tiny-collapse v-model=\"state.activeName\">\n <tiny-collapse-item title=\"基本设置\" name=\"folderGeneralRef\">\n <component :is=\"pageGeneral\" ref=\"folderGeneralRef\" :isFolder=\"isFolder\"></component>\n </tiny-collapse-item>\n </tiny-collapse>\n </div>\n </template>\n </plugin-setting>\n</template>\n\n<script lang=\"ts\">\nimport { reactive, ref, computed } from 'vue'\nimport { Button, Collapse, CollapseItem } from '@opentiny/vue'\nimport { PluginSetting, SvgButton, ButtonGroup } from '@opentiny/tiny-engine-common'\nimport {\n usePage,\n useLayout,\n useModal,\n useNotify,\n getMergeRegistry,\n getMetaApi,\n META_SERVICE\n} from '@opentiny/tiny-engine-meta-register'\nimport { isEqual } from '@opentiny/vue-renderless/common/object'\nimport throttle from '@opentiny/vue-renderless/common/deps/throttle'\nimport meta from '../meta'\nimport http from './http'\n\nconst isShow = ref(false)\nexport const openFolderSettingPanel = () => {\n isShow.value = true\n}\n\nexport const closeFolderSettingPanel = () => {\n isShow.value = false\n\n const { resetPageData } = usePage()\n\n resetPageData()\n}\n\nexport default {\n components: {\n TinyButton: Button,\n TinyCollapse: Collapse,\n TinyCollapseItem: CollapseItem,\n PluginSetting,\n SvgButton,\n ButtonGroup\n },\n props: {\n isFolder: {\n type: Boolean,\n default: false\n }\n },\n setup() {\n const state = reactive({\n activeName: ['folderGeneralRef'],\n title: '文件夹设置'\n })\n const { requestCreatePage, requestUpdatePage, requestDeletePage } = http\n const { pageSettingState, changeTreeData } = usePage()\n const { confirm } = useModal()\n const registry = getMergeRegistry(meta.type, meta.id)\n const pageGeneral = registry.components.PageGeneral\n const folderGeneralRef = ref(null)\n\n const { PLUGIN_NAME, getPluginByLayout } = useLayout()\n const align = computed(() => getPluginByLayout(PLUGIN_NAME.AppManage))\n\n const closeFolderSetting = () => {\n if (isEqual(pageSettingState.currentPageData, pageSettingState.currentPageDataCopy)) {\n closeFolderSettingPanel()\n } else {\n confirm({\n title: '提示',\n message: '您即将使用未保存的更改关闭此页。是否要在关闭之前放弃这些更改?',\n exec: () => {\n if (!pageSettingState.isNew) {\n changeTreeData(pageSettingState.oldParentId, pageSettingState.currentPageData.parentId)\n Object.assign(pageSettingState.currentPageData, pageSettingState.currentPageDataCopy)\n }\n closeFolderSettingPanel()\n }\n })\n }\n }\n\n const createFolder = () => {\n const data = pageSettingState.currentPageData\n const createParams = {\n ...data,\n app: getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id,\n isPage: false\n }\n\n requestCreatePage(createParams)\n .then(() => {\n pageSettingState.updateTreeData()\n pageSettingState.isNew = false\n closeFolderSettingPanel()\n useNotify({\n type: 'success',\n message: '新建文件夹成功!'\n })\n })\n .catch((error) => {\n useNotify({\n type: 'error',\n title: '新建文件夹失败',\n message: JSON.stringify(error?.message || error)\n })\n })\n }\n\n const updateFolder = () => {\n const { id } = pageSettingState.currentPageData\n\n requestUpdatePage(id, { ...pageSettingState.currentPageData, page_content: null })\n .then(() => {\n pageSettingState.updateTreeData()\n pageSettingState.isNew = false\n closeFolderSettingPanel()\n useNotify({\n type: 'success',\n message: '更新文件夹成功!'\n })\n })\n .catch((error) => {\n useNotify({\n type: 'error',\n title: '更新文件夹失败',\n message: JSON.stringify(error?.message || error)\n })\n })\n }\n\n const saveFolderSetting = () => {\n folderGeneralRef.value.validGeneralForm().then(() => {\n if (pageSettingState.isNew) {\n createFolder()\n } else {\n updateFolder()\n }\n })\n }\n\n const deleteFolder = () => {\n if (pageSettingState.treeDataMapping[pageSettingState.currentPageData.id]?.children?.length) {\n useNotify({\n type: 'error',\n message: '此文件夹不是空文件夹,不能删除!'\n })\n\n return\n }\n\n confirm({\n title: '提示',\n message: '您是否要删除文件夹?',\n exec: () => {\n const id = pageSettingState.currentPageData?.id || ''\n\n requestDeletePage(id)\n .then(() => {\n pageSettingState.updateTreeData()\n closeFolderSettingPanel()\n useNotify({\n type: 'success',\n message: '删除文件夹成功!'\n })\n })\n .catch((error) => {\n useNotify({\n type: 'success',\n title: '删除文件夹失败!',\n message: JSON.stringify(error?.message || error)\n })\n })\n }\n })\n }\n\n return {\n align,\n PLUGIN_NAME,\n saveFolderSetting,\n deleteFolder: throttle(5000, true, deleteFolder),\n pageGeneral,\n folderGeneralRef,\n closeFolderSettingPanel,\n isShow,\n state,\n pageSettingState,\n closeFolderSetting\n }\n }\n}\n</script>\n\n<style lang=\"less\" scoped>\n.pageFolder-plugin-setting {\n :deep(.plugin-setting-header) {\n border: 0;\n }\n :deep(.plugin-setting-content) {\n padding: 0 0 16px 0;\n }\n\n :deep(.tiny-collapse) {\n border-bottom: 0;\n }\n}\n</style>\n","<template>\n <span v-for=\"i in level - 1\" :key=\"i\" class=\"gap\">\n <svg v-if=\"lineData[i]\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <line x1=\"8\" y1=\"0\" x2=\"8\" y2=\"12\" stroke=\"#EBEBEB\" stroke-width=\"1\" />\n <line v-if=\"(lineData[i] & 1) === 1\" x1=\"8\" y1=\"12\" x2=\"20\" y2=\"12\" stroke=\"#EBEBEB\" stroke-width=\"1\" />\n <line v-if=\"((lineData[i] >> 1) & 1) === 1\" x1=\"8\" y1=\"12\" x2=\"8\" y2=\"24\" stroke=\"#EBEBEB\" stroke-width=\"1\" />\n </svg>\n </span>\n</template>\n\n<script lang=\"ts\" setup>\nimport { defineProps } from 'vue'\n\ndefineProps({\n level: {\n type: Number,\n required: true\n },\n lineData: {\n type: Object,\n required: true\n }\n})\n</script>\n\n<style scoped>\n.gap {\n width: 24px;\n height: 24px;\n flex-shrink: 0;\n}\n</style>\n","<template>\n <div\n :class=\"['draggable-tree', 'border-transparent', { 'hover-border-color': hoveringNodeId === rootId }]\"\n @dragover=\"handleContainerDragOver\"\n @dragenter=\"handleContainerDragOver\"\n @dragleave=\"handleContainerDragLeave\"\n @drop=\"handleDrop($event, { id: rootId })\"\n >\n <div\n v-for=\"(node, rowIndex) of filteredNodesWithAncestors\"\n v-show=\"!node.collapsed\"\n :class=\"[\n 'row',\n 'border-transparent',\n {\n active: String(active) === String(node.id),\n ['hover-border-color']: hoveringNodeId === node.id\n }\n ]\"\n :key=\"node.id\"\n :draggable=\"draggable ? 'true' : undefined\"\n @dragstart=\"handleDragStart($event, node)\"\n @dragover=\"handleDragOver($event, node)\"\n @dragenter=\"handleDragOver($event, node)\"\n @drop=\"handleDrop($event, node)\"\n @dragend=\"handleDragEnd\"\n >\n <div class=\"content\" @click=\"handleClickRow($event, node)\">\n <layer-lines :line-data=\"layerLine[rowIndex]\" :level=\"node.level\"></layer-lines>\n <div class=\"prefix-icon\" @click=\"handleSwitchCollapse(node)\">\n <svg-icon v-if=\"node.rawData.isPage\" :name=\"collapseMap[node.id] ? 'page-collection' : 'page'\"></svg-icon>\n <svg-icon v-else :name=\"collapseMap[node.id] ? 'folder' : 'folder-wold'\"></svg-icon>\n </div>\n <label>{{ node.label }}</label>\n </div>\n <slot name=\"row-suffix\" :node=\"node\"></slot>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, defineEmits, defineProps, ref, watch } from 'vue'\nimport LayerLines from './LayerLines.vue'\n\nconst props = defineProps({\n data: {\n type: Object,\n required: true\n },\n idKey: {\n type: String,\n default: 'id'\n },\n labelKey: {\n type: String,\n default: 'label'\n },\n childrenKey: {\n type: String,\n default: 'children'\n },\n active: {\n type: String\n },\n filterValue: {\n type: String,\n default: ''\n },\n rootId: {\n type: [String, Number],\n default: 'root'\n },\n draggable: {\n type: Boolean,\n default: false\n }\n})\n\nconst emit = defineEmits(['clickRow', 'moveNode'])\n\nconst useCollapseMap = () => {\n const collapseMap = ref<Record<string, boolean>>({})\n\n const setCollapse = (id: string | number, value: boolean) => {\n collapseMap.value[id] = value\n }\n\n const switchCollapse = (id: string | number) => {\n collapseMap.value[id] = !collapseMap.value[id]\n }\n\n return { collapseMap, setCollapse, switchCollapse }\n}\n\nconst { collapseMap, setCollapse, switchCollapse } = useCollapseMap()\n\ninterface TreeNode {\n id: string | number\n label: string\n parentId?: string | number\n level: number\n collapsed?: boolean\n rawData?: any\n}\n\nconst handleSwitchCollapse = (node: TreeNode) => {\n const children = node.rawData[props.childrenKey]\n if (Array.isArray(children) && children.length > 0) {\n switchCollapse(node.id)\n }\n}\n\nconst flattenTreeData = (node: any, parentId?: string | number, level = 0, collapsed = false): TreeNode[] => {\n const { idKey, labelKey, childrenKey } = props\n\n const currentNode = {\n id: node[idKey],\n label: node[labelKey],\n parentId,\n level,\n collapsed,\n rawData: node\n }\n const result: TreeNode[] = [currentNode]\n\n const children = node[childrenKey]\n\n if (Array.isArray(children)) {\n for (const child of children) {\n result.push(...flattenTreeData(child, currentNode.id, level + 1, collapsed || collapseMap.value[currentNode.id]))\n }\n }\n\n return result\n}\n\nconst nodes = computed(() => {\n return flattenTreeData({ [props.idKey]: props.rootId, [props.childrenKey]: props.data }).slice(1)\n})\n\nconst nodesMap = computed<Record<string | number, TreeNode>>(() => {\n return nodes.value.reduce((result, node) => {\n result[node.id] = node\n return result\n }, {} as Record<string | number, TreeNode>)\n})\n\nconst getAncestorIds = (nodeId: string | number): (string | number)[] => {\n const currentNode = nodesMap.value[nodeId]\n\n if (!currentNode || !currentNode.parentId) {\n return []\n }\n\n const ancestors = getAncestorIds(currentNode.parentId)\n\n ancestors.push(currentNode.parentId)\n\n return ancestors\n}\n\nconst filteredNodes = ref<TreeNode[]>([])\n\n// 下面两个 watch 对应的两个重新计算 filteredNodes 的场景。场景2比场景1多了展开匹配到的节点的操作\n\n// 场景1. 页面树的结构发生变化,或者有节点收起或者展开,重新计算 filteredNodes\nwatch(nodes, (nodes) => {\n filteredNodes.value = nodes.filter((node) => node.label.toLowerCase().includes(props.filterValue.toLowerCase()))\n})\n\n// 场景2. 过滤条件发生变化,重新计算 filteredNodes,并且展开匹配到的节点\nwatch(\n () => props.filterValue,\n (filterValue) => {\n const filtered = nodes.value.filter((node) => node.label.toLowerCase().includes(filterValue.toLowerCase()))\n\n let collapseMapChanged = false\n\n filtered.forEach((node) => {\n // 每个节点的祖先节点中,如果存在折叠的节点,则展开\n for (const id of getAncestorIds(node.id)) {\n if (collapseMap.value[id]) {\n setCollapse(id, false)\n collapseMapChanged = true\n }\n }\n })\n\n // - 如果 collapseMap 有变化,会自动重新计算 nodes,更新路径:\n // props.filterValue -> collapseMap -> nodes -> filteredNodes -> filteredNodesWithAncestors\n // - 如果 collapseMap 没有变化,则重新设置 filteredNodes,更新路径:\n // props.filterValue -> filteredNodes -> filteredNodesWithAncestors\n if (!collapseMapChanged) {\n filteredNodes.value = filtered\n }\n }\n)\n\nconst filteredNodesWithAncestors = computed(() => {\n const idSet = new Set()\n\n for (const node of filteredNodes.value) {\n idSet.add(node.id)\n for (const id of getAncestorIds(node.id)) {\n idSet.add(id)\n }\n }\n\n return nodes.value.filter((node) => idSet.has(node.id))\n})\n\nconst lines = {\n node: 0b01, // └\n layer: 0b10, // │\n layerNode: 0b11 // ├\n}\n\nconst layerLine = computed(() => {\n const result: Record<number, Record<number, number>> = {}\n\n const nodes = filteredNodesWithAncestors.value\n\n for (const [index, node] of nodes.entries()) {\n result[index] = result[index] || {}\n result[index][node.level - 1] = lines.node\n\n if (node.parentId !== props.rootId) {\n const parentIndex = nodes.findIndex((item) => item.id === node.parentId)\n for (let i = parentIndex + 1; i < index; i++) {\n result[i][node.level - 1] = (result[i][node.level - 1] || 0) | lines.layer\n }\n }\n }\n\n return result\n})\n\nconst handleClickRow = (event: MouseEvent, node: TreeNode) => {\n // 点击事件来自折叠图标,不触发 clickRow 事件。点击事件仍然可以冒泡\n const currentTarget = event.currentTarget as HTMLElement\n if (currentTarget.querySelector('div.prefix-icon')?.contains(event.target as Node)) {\n return\n }\n\n emit('clickRow', node)\n}\n\nconst draggedNode = ref<TreeNode | null>(null)\nconst hoveringNodeId = ref<string | number | null>(null)\n\nconst handleDragStart = (_event: DragEvent, node: TreeNode) => {\n if (!props.draggable) {\n return\n }\n\n draggedNode.value = node\n}\n\n// dragover和dragenter事件回调函数都为handleDragOver。跨行拖动时,禁止拖拽图标可能会闪一下,所以将dragenter事件也加上回调函数\nconst handleDragOver = (event: DragEvent, node: TreeNode) => {\n if (!props.draggable) {\n return\n }\n\n const isDescendant = getAncestorIds(node.id).includes(draggedNode.value!.id)\n\n if (!isDescendant) {\n // 阻止默认行为以允许放置\n event.preventDefault()\n hoveringNodeId.value = node.id\n } else {\n hoveringNodeId.value = null\n }\n}\n\nconst handleDrop = (event: DragEvent, node: Pick<TreeNode, 'id'>) => {\n event.preventDefault()\n\n const dragged = draggedNode.value\n draggedNode.value = null\n\n if (!dragged) {\n return\n }\n\n const isDescendant = getAncestorIds(node.id).includes(dragged.id)\n\n if (!isDescendant && dragged.id !== node.id && dragged.parentId !== node.id) {\n emit('moveNode', dragged, node)\n }\n}\n\nconst handleDragEnd = () => {\n hoveringNodeId.value = null\n}\n\nconst handleContainerDragOver = (event: DragEvent) => {\n if (!props.draggable) {\n return\n }\n\n if (event.target !== event.currentTarget) {\n return\n }\n event.preventDefault()\n // 拖拽到根节点\n hoveringNodeId.value = props.rootId\n}\n\nconst handleContainerDragLeave = (event: DragEvent) => {\n if (!props.draggable) {\n return\n }\n\n if (event.target !== event.currentTarget) {\n return\n }\n // drag时光标超出了drag zone,清除悬停框\n hoveringNodeId.value = null\n}\n</script>\n\n<style lang=\"less\" scoped>\n.draggable-tree {\n padding: 6px 0;\n overflow-x: auto;\n .row {\n width: fit-content;\n min-width: 100%;\n height: 24px;\n padding: 0 12px;\n margin: 0 -1px;\n display: flex;\n align-items: center;\n &,\n * {\n cursor: pointer;\n }\n &:hover {\n background-color: var(--te-page-manage-draggable-row-bg-color-hover);\n }\n\n .content {\n flex: 1;\n display: flex;\n align-items: center;\n overflow: hidden;\n }\n label {\n flex: 1;\n font-size: 12px;\n line-height: 18px;\n white-space: nowrap;\n }\n .prefix-icon {\n display: flex;\n align-items: center;\n margin-right: 8px;\n svg {\n color: var(--te-page-manage-draggable-icon-color);\n }\n }\n &.active {\n background-color: var(--te-page-manage-draggable-row-bg-color-hover);\n color: var(--te-page-manage-draggable-text-color);\n svg {\n color: var(--te-page-manage-draggable-icon-color);\n }\n }\n }\n}\n.border-transparent {\n border: 1px solid transparent;\n}\n.hover-border-color {\n border-color: var(--te-page-manage-draggable-border-color);\n overflow: hidden;\n}\n</style>\n","<template>\n <div class=\"app-manage-search\">\n <tiny-search v-model=\"state.pageSearchValue\" clearable placeholder=\"搜索\">\n <template #prefix>\n <tiny-icon-search />\n </template>\n </tiny-search>\n </div>\n\n <tiny-collapse v-model=\"state.collapseValue\" class=\"page-manage-collapse lowcode-scrollbar\">\n <tiny-collapse-item v-for=\"(groupItem, index) in pageSettingState.pages\" :key=\"index\" :name=\"groupItem.groupId\">\n <template #title>\n <span class=\"title\">{{ groupItem.groupName }}</span>\n </template>\n <div class=\"app-manage-tree\">\n <draggable-tree\n :data=\"groupItem.data\"\n label-key=\"name\"\n :active=\"state.currentNodeData.id\"\n :filter-value=\"state.pageSearchValue\"\n :root-id=\"pageSettingState.ROOT_ID\"\n :draggable=\"groupItem.groupId === STATIC_PAGE_GROUP_ID\"\n @click-row=\"handleClickRow\"\n @move-node=\"handleMoveNode\"\n >\n <template #row-suffix=\"{ node }\">\n <div :class=\"['actions']\">\n <svg-button v-if=\"isPageLocked(node.rawData)\" name=\"locked\" :hoverBgColor=\"false\"></svg-button>\n <svg-button v-if=\"node.rawData.isHome\" name=\"home\" :hoverBgColor=\"false\"></svg-button>\n <tiny-popover\n :ref=\"(el) => setPopoverRef(el, node.id)\"\n placement=\"bottom-start\"\n :visible-arrow=\"false\"\n popper-class=\"page-tree-row-operation-list\"\n >\n <div class=\"operation-list\">\n <div\n v-for=\"(operation, index) in getRowOperations(groupItem.groupId, node)\"\n :key=\"index\"\n :class=\"[operation.type === 'divider' ? 'divider' : 'item'].concat(operation.class || [])\"\n @click=\"operation.action?.(node)\"\n >\n {{ operation.label }}\n </div>\n </div>\n <template #reference>\n <svg-button name=\"ellipsis\" class=\"auto-hidden\" :hoverBgColor=\"false\"></svg-button>\n </template>\n </tiny-popover>\n </div>\n </template>\n </draggable-tree>\n </div>\n </tiny-collapse-item>\n </tiny-collapse>\n</template>\n\n<script lang=\"tsx\">\nimport { reactive, onMounted, onUnmounted } from 'vue'\nimport { Search, Collapse, CollapseItem, Popover } from '@opentiny/vue'\nimport { IconFolderOpened, IconFolderClosed, IconSearch } from '@opentiny/vue-icon'\nimport {\n useCanvas,\n useModal,\n usePage,\n useNotify,\n useMessage,\n getMetaApi,\n getOptions,\n META_SERVICE\n} from '@opentiny/tiny-engine-meta-register'\nimport { isEqual } from '@opentiny/vue-renderless/common/object'\nimport { getCanvasStatus } from '@opentiny/tiny-engine-common/js/canvas'\nimport { handlePageUpdate } from '@opentiny/tiny-engine-common/js/http'\nimport { constants } from '@opentiny/tiny-engine-utils'\nimport { closePageSettingPanel } from './PageSetting.vue'\nimport { closeFolderSettingPanel } from './PageFolderSetting.vue'\nimport http from './http'\nimport DraggableTree from './Tree.vue'\nimport { SvgButton } from '@opentiny/tiny-engine-common'\nimport meta from '../meta'\n\nconst { PAGE_STATUS } = constants\n\nexport default {\n components: {\n TinySearch: Search,\n TinyCollapse: Collapse,\n TinyCollapseItem: CollapseItem,\n TinyIconSearch: IconSearch(),\n TinyPopover: Popover,\n DraggableTree,\n SvgButton\n },\n props: {\n isFolder: {\n type: Boolean,\n default: false\n }\n },\n emits: ['openSettingPanel', 'add', 'createPage', 'createFolder', 'settingHome'],\n setup(props, { emit }) {\n const { confirm } = useModal()\n const { pageState, isBlock, isSaved } = useCanvas()\n const {\n pageSettingState,\n changeTreeData,\n isCurrentDataSame,\n getPageList,\n resetPageData,\n STATIC_PAGE_GROUP_ID,\n COMMON_PAGE_GROUP_ID,\n switchPage: switchPageById\n } = usePage()\n const { fetchPageDetail, requestUpdatePage } = http\n const getAppId = () => getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id\n const { customPageOperations = [] } = getOptions(meta.id)\n\n const state = reactive({\n pageSearchValue: '',\n collapseValue: [STATIC_PAGE_GROUP_ID, COMMON_PAGE_GROUP_ID],\n currentNodeData: { id: getMetaApi(META_SERVICE.GlobalService).getBaseInfo().pageId }\n })\n\n const { subscribe, unsubscribe } = useMessage()\n\n let subscriber = null\n\n onMounted(() => {\n subscriber = subscribe({\n topic: 'locationHistoryChanged',\n callback: (data) => {\n if (data.pageId) {\n state.currentNodeData = { id: data.pageId }\n } else if (isBlock()) {\n state.currentNodeData = {}\n }\n },\n subscriber: 'pageTree'\n })\n })\n\n onUnmounted(() => {\n if (subscriber) {\n unsubscribe(subscriber)\n }\n })\n\n const refreshPageList = async (appId) => {\n const pages = await getPageList(appId)\n\n return pages\n }\n\n pageSettingState.updateTreeData = async () => {\n const pageList = await refreshPageList(getAppId())\n return pageList\n }\n\n const switchPage = (data) => {\n state.currentNodeData = data\n\n switchPageById(data.id).then(() => {\n closePageSettingPanel()\n closeFolderSettingPanel()\n })\n }\n\n const nodeClick = (e, pageData) => {\n e?.stopPropagation()\n\n const { id, isPage } = pageData\n\n // 区块切换回页面需要重新加载页面\n if ((!isBlock() && id === state?.currentNodeData?.id) || !isPage) {\n return\n }\n\n if (isSaved() && isCurrentDataSame()) {\n switchPage(pageData)\n } else {\n confirm({\n title: '提示',\n message: `${isBlock() ? '区块' : '页面'}尚未保存,是否要继续切换?`,\n exec: () => {\n changeTreeData(pageSettingState.oldParentId, pageSettingState.currentPageData.parentId)\n Object.assign(pageSettingState.currentPageData, pageSettingState.currentPageDataCopy)\n switchPage(pageData)\n }\n })\n }\n }\n\n const openSettingPanel = (e, pageData, isPageLocked) => {\n e?.stopPropagation()\n\n if (isPageLocked && pageData.isPage) {\n const username = pageData.occupier?.username || ''\n\n useModal().message({\n message: `您点击的页面被${username}锁定,暂时无法编辑,请联系解锁`\n })\n\n return\n }\n\n if (isEqual(pageSettingState.currentPageData, pageSettingState.currentPageDataCopy)) {\n emit('openSettingPanel', pageData)\n } else {\n confirm({\n title: '提示',\n message: `当前页面或文件夹${pageSettingState.currentPageData.name}尚未保存,是否要继续切换?`,\n exec: () => {\n changeTreeData(pageSettingState.oldParentId, pageSettingState.currentPageData.parentId)\n Object.assign(pageSettingState.currentPageData, pageSettingState.currentPageDataCopy)\n emit('openSettingPanel', pageData)\n }\n })\n }\n }\n\n const popoverRefs = {}\n const setPopoverRef = (el, nodeId) => {\n popoverRefs[nodeId] = el\n }\n\n const handleClickRow = (node) => {\n nodeClick(null, node.rawData)\n }\n\n const isPageLocked = (pageData) => {\n return getCanvasStatus(pageData.occupier).state === PAGE_STATUS.Lock\n }\n\n const handleClickPageSettings = (node) => {\n openSettingPanel(null, node.rawData, isPageLocked(node.rawData))\n }\n\n const createPage = (node) => {\n emit('createPage', 'staticPages', node.id)\n }\n\n const createFolder = (node) => {\n emit('createFolder', node.id)\n }\n\n const settingHome = (node) => {\n emit('settingHome', node)\n }\n\n const rowOperations = [\n { type: 'settings', label: '设置', action: handleClickPageSettings },\n { type: 'divider' },\n { type: 'createPage', label: '新建子页面', action: createPage },\n { type: 'createFolder', label: '新建子文件夹', action: createFolder },\n { type: 'settingHome', label: '设置为主页', action: settingHome },\n ...customPageOperations\n // TODO 复制和删除的逻辑耦合在其他组件内,暂时屏蔽\n // { type: 'divider' },\n // { type: 'copy', label: '复制页面', action: copyPage },\n // { type: 'delete', label: '删除', class: ['danger'], action: deleteNode }\n ].map((item) => ({\n ...item,\n action: (node) => {\n item.action?.(node, emit)\n // 点击 action 后,关闭 popover 弹窗\n popoverRefs[node.id]?.doClose?.()\n }\n }))\n\n const getRowOperations = (groupId, node) => {\n if (groupId === COMMON_PAGE_GROUP_ID) {\n return rowOperations.slice(0, 1)\n }\n if (!node.rawData.isPage || node.rawData.group === 'public') {\n return rowOperations.filter((item) => item.type !== 'settingHome')\n }\n // TODO 复制逻辑暂时屏蔽\n // if (!node.rawData.isPage) {\n // return rowOperations.filter((item) => item.type !== 'copy')\n // }\n\n return rowOperations\n }\n\n const updatePage = (pageDetail) => {\n const { id, name, page_content } = pageDetail\n const params = {\n ...pageDetail,\n page_content: {\n ...page_content,\n fileName: name\n }\n }\n\n const isCurEditPage = pageState?.currentPage?.id === id\n const updateParams = {\n id,\n params,\n isCurEditPage\n }\n\n return handlePageUpdate(updateParams)\n }\n\n const updateFolder = (pageDetail) => {\n const { id } = pageDetail\n\n // requestUpdatePage加了then和catch回调函数,而handlePageUpdate没有加,是因为handlePageUpdate内部都已经有了类似逻辑\n return requestUpdatePage(id, { ...pageDetail, page_content: null })\n .then(() => {\n useNotify({\n type: 'success',\n message: '更新文件夹成功!'\n })\n })\n .catch((error) => {\n useNotify({\n type: 'error',\n title: '更新文件夹失败',\n message: JSON.stringify(error?.message || error)\n })\n })\n .finally(() => {\n pageSettingState.updateTreeData()\n pageSettingState.isNew = false\n })\n }\n\n const handleMoveNode = (dragged, newParent) => {\n if (isEqual(pageSettingState.currentPageData, pageSettingState.currentPageDataCopy)) {\n closePageSettingPanel()\n closeFolderSettingPanel()\n pageSettingState.currentPageData.id = dragged.id\n changeTreeData(newParent.id, dragged.parentId)\n resetPageData()\n // TODO 页面更换父节点后,原来每次变更需要填写变更信息\n fetchPageDetail(dragged.id)\n .then((pageDetail) => {\n pageDetail.parentId = newParent.id\n if (pageDetail.isPage) {\n pageDetail.isDefault = false\n updatePage(pageDetail)\n } else {\n updateFolder(pageDetail)\n }\n })\n .catch((error) => {\n useNotify({\n type: 'error',\n title: '移动页面文件/文件夹失败',\n message: JSON.stringify(error?.message || error)\n })\n })\n } else {\n confirm({\n title: '提示',\n message: '更改尚未保存,是否要放弃这些更改?',\n exec: () => {\n if (!pageSettingState.isNew) {\n changeTreeData(pageSettingState.oldParentId, pageSettingState.currentPageData.parentId)\n Object.assign(pageSettingState.currentPageData, pageSettingState.currentPageDataCopy)\n }\n closePageSettingPanel()\n }\n })\n }\n }\n\n useMessage().subscribe({\n topic: 'app_id_changed',\n subscriber: 'page_tree_app_id_changed',\n callback: (appId) => {\n refreshPageList(appId)\n }\n })\n\n const createPublicPage = (e) => {\n e.stopPropagation()\n e.preventDefault()\n emit('add')\n }\n\n onUnmounted(() => {\n useMessage().unsubscribe({\n topic: 'app_id_changed',\n subscriber: 'page_tree_app_id_changed'\n })\n })\n\n return {\n createPublicPage,\n state,\n switchPage,\n pageSettingState,\n setPopoverRef,\n IconFolderOpened: IconFolderOpened(),\n IconFolderClosed: IconFolderClosed(),\n getRowOperations,\n handleClickRow,\n handleMoveNode,\n isPageLocked,\n handleClickPageSettings,\n STATIC_PAGE_GROUP_ID\n }\n }\n}\n</script>\n\n<style lang=\"less\" scoped>\n.app-manage-search {\n padding: 0 12px 12px 12px;\n}\n\n.page-manage-collapse {\n height: calc(100% - 95px);\n overflow-y: auto;\n .app-manage-public-page {\n position: absolute;\n right: 0;\n cursor: pointer;\n svg {\n font-size: 22px;\n }\n }\n :deep(.tiny-collapse-item__header) {\n &,\n &.is-active {\n &::before {\n border: none;\n }\n }\n }\n :deep(.tiny-collapse-item) {\n border-left: 0;\n border-right: 0;\n }\n :deep(.tiny-collapse-item__content) {\n padding: 0 0 12px 0;\n }\n}\n\n.page-manage-collapse.page-manage-collapse {\n :deep(.tiny-collapse-item__content) {\n padding-top: 0;\n }\n}\n\n.app-manage-tree {\n .actions {\n display: flex;\n align-items: center;\n svg {\n color: var(--te-page-manage-icon-color);\n outline: none;\n }\n .auto-hidden {\n visibility: hidden;\n }\n }\n .row:hover .actions .auto-hidden {\n visibility: visible;\n }\n}\n</style>\n\n<style lang=\"less\">\n.tiny-popover.tiny-popper[x-placement].page-tree-row-operation-list {\n padding: 0;\n margin-top: 4px;\n .operation-list {\n min-width: 110px;\n padding: 8px 0;\n & > div {\n padding: 0 12px;\n }\n .item {\n height: 24px;\n font-size: 12px;\n line-height: 18px;\n cursor: pointer;\n display: flex;\n align-items: center;\n &:hover {\n background-color: var(--te-page-manage-operation-list-item-bg-color-hover);\n }\n }\n .divider {\n height: 8px;\n display: flex;\n align-items: center;\n &::after {\n content: '';\n display: block;\n width: 100%;\n height: 1px;\n background-color: var(--te-page-manage-operation-list-item-border-color-divider);\n }\n }\n .danger {\n color: var(--te-page-manage-operation-list-text-color-error);\n }\n }\n}\n</style>\n","<template>\n <div class=\"plugin-page\">\n <plugin-panel\n :title=\"title\"\n :fixed-name=\"PLUGIN_NAME.AppManage\"\n :fixedPanels=\"fixedPanels\"\n @close=\"pluginPanelClosed\"\n :docsUrl=\"docsUrl\"\n :docsContent=\"docsContent\"\n :isShowDocsIcon=\"true\"\n >\n <template #header>\n <svg-button\n class=\"add-folder-icon\"\n name=\"add-folder\"\n placement=\"bottom\"\n tips=\"新建文件夹\"\n @click=\"createNewFolder()\"\n ></svg-button>\n <svg-button\n class=\"new-page-icon\"\n name=\"new-page\"\n placement=\"bottom\"\n tips=\"新建页面\"\n @click=\"createNewPage('staticPages')\"\n ></svg-button>\n </template>\n <template #content>\n <page-tree\n ref=\"pageTreeRef\"\n :isFolder=\"state.isFolder\"\n @add=\"createNewPage('publicPages')\"\n @openSettingPanel=\"openSettingPanel\"\n @createPage=\"createNewPage\"\n @createFolder=\"createNewFolder\"\n @settingHome=\"settingHome\"\n ></page-tree>\n </template>\n </plugin-panel>\n <page-setting :isFolder=\"state.isFolder\" @openNewPage=\"openNewPage\"></page-setting>\n <page-folder-setting :isFolder=\"state.isFolder\"></page-folder-setting>\n </div>\n</template>\n\n<script lang=\"tsx\">\nimport { reactive, ref, watchEffect, provide } from 'vue'\nimport { useCanvas, usePage, useHelp, useModal, useNotify, useLayout } from '@opentiny/tiny-engine-meta-register'\nimport { PluginPanel, SvgButton } from '@opentiny/tiny-engine-common'\nimport { extend } from '@opentiny/vue-renderless/common/object'\nimport PageSetting, { openPageSettingPanel, closePageSettingPanel } from './PageSetting.vue'\nimport PageFolderSetting, { openFolderSettingPanel, closeFolderSettingPanel } from './PageFolderSetting.vue'\nimport PageTree from './PageTree.vue'\nimport { fetchPageDetail, handleRouteHomeUpdate } from './http'\n\nexport const api = {\n getPageById: async (id) => {\n if (id) {\n return fetchPageDetail(id)\n }\n\n return undefined\n },\n openPageSettingPanel\n}\n\nexport default {\n components: {\n PageSetting,\n PluginPanel,\n SvgButton,\n PageFolderSetting,\n PageTree\n },\n props: {\n title: {\n type: String,\n default: '页面'\n },\n fixedPanels: {\n type: Array\n }\n },\n emits: ['close'],\n setup(props, { emit }) {\n const { confirm } = useModal()\n const { pageState } = useCanvas()\n const { pageSettingState, getDefaultPage, isTemporaryPage, initCurrentPageData } = usePage()\n\n const { PLUGIN_NAME } = useLayout()\n\n const panelState = reactive({\n emitEvent: emit\n })\n\n provide('panelState', panelState)\n\n const pageTreeRef = ref(null)\n const ROOT_ID = pageSettingState.ROOT_ID\n const docsUrl = useHelp().getDocsUrl('page')\n const docsContent = '在这里新增页面/文件夹,还可以对已有的页面进行生命周期管理。'\n\n const state = reactive({\n isFolder: false\n })\n\n const createNewPage = (group, parentId = ROOT_ID) => {\n closeFolderSettingPanel()\n pageSettingState.isNew = true\n try {\n const defaultPage = getDefaultPage()\n if (!defaultPage) {\n throw new Error('Failed to get default page configuration')\n }\n pageSettingState.currentPageData = {\n ...getDefaultPage(),\n ...defaultPage,\n parentId,\n route: '',\n name: 'Untitled',\n page_content: {\n lifeCycles: {}\n },\n group\n }\n } catch (error) {\n throw new Error(error)\n // console.error('Failed to create new page:', error)\n }\n pageSettingState.currentPageDataCopy = extend(true, {}, pageSettingState.currentPageData)\n state.isFolder = false\n openPageSettingPanel()\n }\n\n const createNewFolder = (parentId = ROOT_ID) => {\n closePageSettingPanel()\n pageSettingState.isNew = true\n pageSettingState.currentPageData = { parentId, route: '', name: 'untitled' }\n pageSettingState.currentPageDataCopy = extend(true, {}, pageSettingState.currentPageData)\n state.isFolder = true\n openFolderSettingPanel()\n }\n\n const settingHome = (node) => {\n confirm({\n title: '提示',\n type: 'warning ',\n message: '是否确定要将此页面设置为主页?',\n exec: () => {\n const params = { ...node.rawData, isHome: true }\n\n handleRouteHomeUpdate(node.id, params)\n .then(() => {\n pageSettingState.updateTreeData()\n pageSettingState.isNew = false\n useNotify({ message: '主页设置成功!', type: 'success' })\n })\n .catch(() => {\n useNotify({ message: '主页设置失败!', type: 'error' })\n })\n }\n })\n }\n\n watchEffect(() => {\n if (isTemporaryPage.saved) {\n openPageSettingPanel()\n }\n })\n\n const openSettingPanel = async (pageData) => {\n state.isFolder = !pageData.isPage\n pageSettingState.isNew = false\n\n const isPageChange = pageData.id !== pageSettingState.currentPageData.id\n\n if (state.isFolder) {\n if (isPageChange) {\n closePageSettingPanel()\n }\n openFolderSettingPanel()\n } else {\n if (isPageChange) {\n closeFolderSettingPanel()\n }\n openPageSettingPanel()\n }\n const pageDetail = await fetchPageDetail(pageData?.id)\n initCurrentPageData(pageDetail)\n }\n\n provide('openSettingPanel', openSettingPanel)\n\n const pluginPanelClosed = () => {\n emit('close')\n closePageSettingPanel()\n closeFolderSettingPanel()\n }\n\n const openNewPage = (data) => {\n pageTreeRef.value.switchPage(data)\n }\n\n return {\n PLUGIN_NAME,\n state,\n pageState,\n openNewPage,\n pageTreeRef,\n pluginPanelClosed,\n openSettingPanel,\n createNewFolder,\n createNewPage,\n docsUrl,\n docsContent,\n settingHome\n }\n }\n}\n</script>\n\n<style lang=\"less\" scoped>\n:deep(.tiny-button) {\n border-radius: 4px;\n height: 24px;\n line-height: 24px;\n}\n.plugin-page {\n height: 100%;\n}\n</style>\n","/**\n * Copyright (c) 2023 - present TinyEngine Authors.\n * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd.\n *\n * Use of this source code is governed by an MIT-style license.\n *\n * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,\n * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR\n * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS.\n *\n */\n\nimport { reactive, ref } from 'vue'\nimport { extend, isEqual as isValuesEqual } from '@opentiny/vue-renderless/common/object'\nimport { constants } from '@opentiny/tiny-engine-utils'\nimport { getCanvasStatus } from '@opentiny/tiny-engine-common/js/canvas'\nimport {\n useCanvas,\n useLayout,\n useBreadcrumb,\n useModal,\n useNotify,\n getMetaApi,\n META_SERVICE\n} from '@opentiny/tiny-engine-meta-register'\nimport http from '../http'\n\nconst { ELEMENT_TAG, COMPONENT_NAME } = constants\n\nimport { getOptions } from '@opentiny/tiny-engine-meta-register'\n\nconst DEFAULT_PAGE = {\n app: '',\n name: '',\n route: '',\n page_content: {\n componentName: 'Page',\n css: '',\n props: {},\n lifeCycles: {},\n children: [],\n dataSource: {\n list: []\n },\n state: {},\n methods: {},\n utils: [],\n bridge: [],\n inputs: [],\n outputs: []\n },\n isHome: false,\n parentId: 'none',\n isBody: false,\n group: 'staticPages'\n}\n\nconst selectedTemplateCard = ref(null)\n\nexport interface PageData {\n id: string | number\n parentId: string | number\n [x: string]: any\n}\n\nexport interface PageNode {\n id: string | number\n parentId: string | number\n children?: PageNode[]\n}\n\nexport interface PageSettingState {\n currentPageDataCopy: PageData\n currentPageData: PageData\n pages: any[]\n oldParentId?: string | number | null\n isNew: boolean\n ROOT_ID: string\n updateTreeData?: any\n treeDataMapping: Record<string, any>\n defaultPage?: any\n}\n\nconst pageSettingState = reactive<PageSettingState>({\n currentPageDataCopy: {} as PageData, // 记录当前页最开始的状态,当用户点击取消按钮的时候恢复到初始状态\n currentPageData: {} as PageData, // 当前配置页面的数据\n pages: [],\n oldParentId: null,\n isNew: false,\n ROOT_ID: '0', // 根节点ID\n updateTreeData: null,\n treeDataMapping: {},\n defaultPage: null // 当前页设置的默认页\n})\n\nconst isTemporaryPage = reactive({\n saved: false\n})\n\nconst STATIC_PAGE_GROUP_ID = 0\nconst COMMON_PAGE_GROUP_ID = 1\n\nexport interface PageOptions {\n pageBaseStyle: {\n className: string\n style: string\n }\n}\n\nexport interface MaterialsOptions {\n useBaseStyle: any\n blockBaseStyle: { className: string; style: string }\n componentBaseStyle: { className: string; style: string }\n}\n\nconst generateCssString = (pageOptions: PageOptions, materialsOptions: MaterialsOptions) => {\n if (!pageOptions?.pageBaseStyle?.className || !pageOptions?.pageBaseStyle?.style) {\n return ''\n }\n\n const formatCssRule = (className: string, style: string) => `.${className} {\\n ${style.trim()}\\n}\\n`\n const baseStyle = `.${pageOptions.pageBaseStyle.className}{\\r\\n ${pageOptions.pageBaseStyle.style}\\r\\n}\\r\\n`\n\n if (!materialsOptions.useBaseStyle) {\n return baseStyle\n }\n\n return [\n formatCssRule(pageOptions.pageBaseStyle.className, pageOptions.pageBaseStyle.style),\n formatCssRule(materialsOptions.blockBaseStyle.className, materialsOptions.blockBaseStyle.style),\n formatCssRule(materialsOptions.componentBaseStyle.className, materialsOptions.componentBaseStyle.style)\n ].join('\\n')\n}\n\nconst getDefaultPage = () => {\n const materialsOptions = getOptions('engine.plugins.materials')\n const pageOptions = getOptions('engine.plugins.appmanage')\n\n if (!materialsOptions || !pageOptions || !pageOptions.pageBaseStyle) {\n return { ...DEFAULT_PAGE }\n }\n\n return {\n ...DEFAULT_PAGE,\n page_content: {\n ...DEFAULT_PAGE.page_content,\n props: {\n ...DEFAULT_PAGE.page_content.props,\n className: pageOptions.pageBaseStyle.className\n },\n css: generateCssString(pageOptions, materialsOptions)\n }\n }\n}\n\n/**\n * 更新配置页面数据\n */\nconst syncPageContent = () => {\n const { getBaseInfo } = getMetaApi(META_SERVICE.GlobalService)\n\n // 只有当前页面设置的ID与正在编辑的页面ID一致时才同步内容\n // 避免将正在编辑的页面内容错误同步到其他打开的页面设置中\n if (pageSettingState.currentPageData.id === Number.parseInt(getBaseInfo().pageId)) {\n const pageContent = useCanvas().getPageSchema()\n\n // 此处赋值是确保页面内容与当前画布保持同步。\n // 当用户在画布中编辑页面内容时,这些变更存储在Canvas内部状态,\n // 但pageSettingState中的currentPageData.page_content并不会自动更新。\n // 不同步会导致:\n // 1. 保存检测失效 - isCurrentDataSame()无法检测到真实变更\n // 2. 未保存提示缺失 - 用户离开页面时不会收到未保存变更警告\n pageSettingState.currentPageData.page_content = pageContent\n }\n}\n\n/**\n * 在页面保存后更新页面设置状态\n * 当用户通过工具栏保存按钮保存页面时,需要调用此方法来同步currentPageDataCopy\n * 以确保isCurrentDataSame()能够正确判断页面是否被修改\n */\nconst updatePageSettingAfterSave = () => {\n syncPageContent()\n pageSettingState.currentPageDataCopy = extend(true, {}, pageSettingState.currentPageData)\n}\n\nconst isCurrentDataSame = () => {\n syncPageContent()\n\n const data: Record<string, any> = pageSettingState.currentPageData || {}\n const dataCopy: Record<string, any> = pageSettingState.currentPageDataCopy || {}\n let isEqual = true\n\n Object.keys(dataCopy).some((item) => {\n // 页面比较是否更改,为了减少判断次数,不需要判断以下字段\n if (['children', 'label', 'createdBy', 'assets', 'occupier'].includes(item)) {\n return false\n } else if (item === 'page_content') {\n const obj = {\n inputs: dataCopy[item].inputs,\n outputs: dataCopy[item].outputs,\n lifeCycles: dataCopy[item].lifeCycles,\n children: dataCopy[item].children\n }\n const objCopy = {\n inputs: data[item].inputs,\n outputs: data[item].outputs,\n lifeCycles: data[item].lifeCycles,\n children: data[item].children\n }\n\n if (JSON.stringify(obj) !== JSON.stringify(objCopy)) {\n isEqual = false\n }\n } else {\n if (!isValuesEqual(dataCopy[item], data[item])) {\n isEqual = false\n }\n }\n\n return !isEqual\n })\n\n return isEqual\n}\n\nconst getParentNode = (parentId: string) => {\n return parentId === pageSettingState.ROOT_ID\n ? { id: pageSettingState.ROOT_ID, children: pageSettingState.pages[STATIC_PAGE_GROUP_ID].data }\n : pageSettingState.treeDataMapping[parentId]\n}\n\nconst changeTreeData = (newParentId: string, oldParentId: string) => {\n if (newParentId && oldParentId && String(newParentId) !== String(oldParentId)) {\n const folderData = getParentNode(newParentId)\n const parentData = getParentNode(oldParentId)\n\n if (!folderData || !parentData) {\n return\n }\n\n const currentPageDataId = pageSettingState.currentPageData.id\n const curDataIndex = parentData.children?.findIndex?.(({ id }: { id: string }) => id === currentPageDataId)\n\n if (curDataIndex > -1) {\n const splicedPageData = parentData.children.splice(curDataIndex, 1)[0]\n if (!folderData.children) {\n folderData.children = []\n }\n folderData.children.unshift(splicedPageData)\n }\n }\n}\n\nconst getPageContent = () => {\n return pageSettingState.currentPageData.page_content || {}\n}\n\nconst initCurrentPageData = (pageDetail: PageData) => {\n pageSettingState.currentPageData = pageDetail\n pageSettingState.currentPageDataCopy = extend(true, {}, pageDetail)\n pageSettingState.oldParentId = pageDetail.parentId\n}\n\nconst resetPageData = () => {\n pageSettingState.currentPageData = {} as PageData\n pageSettingState.currentPageDataCopy = {} as PageData\n pageSettingState.oldParentId = null\n pageSettingState.defaultPage = null\n}\n\n// 判断当前页面内容是否有修改\nconst isChangePageData = () => !isValuesEqual(pageSettingState.currentPageData, pageSettingState.currentPageDataCopy)\n\nconst generateTree = (data: PageData[]) => {\n const { ROOT_ID } = pageSettingState\n\n const treeDataMapping: Record<string, PageNode> = { [ROOT_ID]: { id: ROOT_ID, parentId: '' } }\n\n data.forEach((item) => {\n treeDataMapping[item.id] = item\n })\n\n data.forEach((item) => {\n const parentNode = treeDataMapping[item.parentId]\n\n if (!parentNode) {\n return\n }\n\n parentNode.children = parentNode.children || []\n parentNode.children.push(item)\n })\n\n return treeDataMapping\n}\n\ninterface GroupData {\n groupName: string\n groupId: number\n data: PageData[]\n}\n\nconst getPageList = async (appId?: string) => {\n const pagesData: any[] = await http.fetchPageList(appId || getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id)\n\n const firstGroupData: GroupData = { groupName: '静态页面', groupId: STATIC_PAGE_GROUP_ID, data: [] }\n const secondGroupData: GroupData = { groupName: '公共页面', groupId: COMMON_PAGE_GROUP_ID, data: [] }\n\n pagesData.forEach((item) => {\n const namedNode = item.name ? item : { ...item, name: item.folderName, group: 'staticPages' }\n const node = item.meta\n ? {\n ...item,\n ...item.meta,\n name: item.fileName,\n isPage: true,\n isBody: item.meta.rootElement === ELEMENT_TAG.Body\n }\n : namedNode\n\n const { children, ...other } = node\n\n if (node.group === 'staticPages') {\n firstGroupData.data.push(other)\n } else {\n secondGroupData.data.push(other)\n }\n })\n\n const firstGroupTreeData = generateTree(firstGroupData.data)\n const secondGroupTreeData = generateTree(secondGroupData.data)\n pageSettingState.treeDataMapping = { ...firstGroupTreeData, ...secondGroupTreeData }\n firstGroupData.data = firstGroupTreeData[pageSettingState.ROOT_ID].children || []\n pageSettingState.pages = [firstGroupData, secondGroupData]\n return pageSettingState.pages\n}\n\nconst getAncestorsRecursively = (id: string): any[] => {\n if (id === pageSettingState.ROOT_ID) {\n return []\n }\n\n const pageNode = pageSettingState.treeDataMapping[id]\n\n return [pageNode].concat(getAncestorsRecursively(pageNode.parentId))\n}\n\n/**\n * @param {string | number} id page Id\n * @param {boolean} withFolders default `false`\n * @returns {(string | number)[]}\n */\nconst getAncestors = async (id: string, withFolders?: boolean) => {\n if (pageSettingState.pages.length === 0) {\n await getPageList()\n }\n\n if (!pageSettingState.treeDataMapping[id]) {\n return null\n }\n\n const ancestorsWithSelf = getAncestorsRecursively(id)\n const ancestors = ancestorsWithSelf.slice(1).reverse()\n\n const predicate = withFolders ? () => true : (item: { isPage: boolean }) => item.isPage\n\n return ancestors.filter(predicate).map((item) => item.id)\n}\n\n/**\n * 打平数组内的文件夹,确保返回的数组每个都是页面而不是文件夹\n * @param {Array<{isPage: boolean, children?: any[]} & Record<string, any>} pagesOrFolders 页面或者文件夹数组\n * @returns\n */\nconst flatternFolder = (pagesOrFolders: Array<{ isPage: boolean; children?: any[] } & Record<string, any>>) => {\n // 页面数组中没有文件夹,无需处理\n if (pagesOrFolders.every((item) => item.isPage)) {\n return pagesOrFolders\n }\n\n const flattened = pagesOrFolders\n .map((page) => {\n if (page.isPage) {\n return page\n }\n // 如果是文件夹,返回子节点数组,后面flat会打平这一层\n return (page.children || []).map((child) => ({\n ...child,\n routePath: `${page.routePath || page.route}/${child.route}`\n }))\n })\n .flat()\n\n return flatternFolder(flattened)\n}\n\n/**\n * 获取所有的页面直接子节点,如果子节点是文件夹,则文件夹下的节点也算直接子节点\n * @param {string | number} id\n * @returns\n */\nconst getPageChildren = async (id: string) => {\n if (pageSettingState.pages.length === 0) {\n await getPageList()\n }\n\n const pageNode = pageSettingState.treeDataMapping[id]\n\n if (!Array.isArray(pageNode?.children)) {\n return []\n }\n\n return flatternFolder(pageNode.children)\n}\n\nconst clearCurrentState = () => {\n const { pageState } = useCanvas()\n\n pageState.currentVm = null\n pageState.hoverVm = null\n pageState.properties = {}\n pageState.pageSchema = null\n}\n\nconst switchPage = (pageId: string | number, clearPreview = false) => {\n // 切换页面时清空 选中节点信息状态\n clearCurrentState()\n\n // pageId !== 0 防止 pageId 为 0 的时候判断不出来\n if (pageId !== 0 && !pageId) {\n if (clearPreview) {\n getMetaApi(META_SERVICE.GlobalService).updateParams({ pageId: '', previewId: '' })\n } else {\n getMetaApi(META_SERVICE.GlobalService).updatePageId('')\n }\n useCanvas().initData({ componentName: COMPONENT_NAME.Page, props: {} }, {})\n useLayout().layoutState.pageStatus = {\n state: 'empty',\n data: {}\n }\n\n return\n }\n\n return http\n .fetchPageDetail(pageId)\n .then((data: { [x: string]: any; isPage: boolean; name: string; occupier: any }) => {\n if (data.isPage) {\n // 应该改成让 Breadcrumb 插件去监听变化\n useBreadcrumb().setBreadcrumbPage([data.name])\n }\n\n if (clearPreview) {\n getMetaApi(META_SERVICE.GlobalService).updateParams({ pageId, previewId: '' })\n } else {\n getMetaApi(META_SERVICE.GlobalService).updatePageId(pageId)\n }\n useLayout().closePlugin()\n useLayout().layoutState.pageStatus = getCanvasStatus(data.occupier)\n useCanvas().initData(data['page_content'], data)\n })\n .catch(() => {\n useNotify({\n type: 'error',\n message: '切换页面失败,目标页面不存在'\n })\n })\n}\n\nconst switchPageWithConfirm = (pageId: string, clearPreview = false) => {\n const checkPageSaved = () => {\n const { isSaved, isBlock } = useCanvas()\n\n return new Promise((resolve) => {\n if (isSaved()) {\n resolve(true)\n return\n }\n\n useModal().confirm({\n title: '提示',\n message: `${isBlock() ? '区块' : '页面'}尚未保存,是否要继续切换?`,\n exec: () => {\n resolve(true)\n },\n cancel: () => {\n resolve(false)\n }\n })\n })\n }\n\n checkPageSaved().then((proceed) => {\n if (proceed) {\n switchPage(pageId, clearPreview)\n }\n })\n}\n\nconst updatePageContent = (\n familyPages: { id: any; page_content: any }[],\n currentPage: { id: string; page_content?: any }\n) => {\n const currentPageSchema = familyPages.find((item) => item.id === currentPage.id)\n // 替换为当前页面最新的 schema\n if (currentPageSchema) {\n currentPageSchema.page_content = currentPage.page_content\n }\n}\n\nconst fetchPageDetailIfNeeded = async (page: { page_content: any; id: string }) => {\n if (!page.page_content) {\n try {\n const pageDetail = await http.fetchPageDetail(page.id)\n page.page_content = pageDetail.page_content\n } catch (error) {\n page.page_content = {}\n throw new Error(String(error))\n }\n }\n}\n\nconst updateParentId = (page: { parentId: any }, pages: any[], index: number, ROOT_ID: string) => {\n if (page.parentId !== ROOT_ID && !pages.find((item) => item.id === page.parentId)) {\n page.parentId = pages[index - 1]?.id ? pages[index - 1].id : ROOT_ID\n }\n}\n\nconst handlePageDetail = async (pages: any[]) => {\n const { ROOT_ID } = pageSettingState\n\n if (pages.length > 0) {\n await Promise.all(\n pages.map(async (page, index) => {\n await fetchPageDetailIfNeeded(page)\n updateParentId(page, pages, index, ROOT_ID)\n })\n )\n }\n}\n\nconst getFamily = async (currentPage: { id: string }) => {\n if (pageSettingState.pages.length === 0) {\n await getPageList()\n }\n\n const familyPages = getAncestorsRecursively(currentPage.id)\n .filter((item) => item.isPage)\n .reverse()\n .map((item) => ({\n id: item.id,\n page_content: item.page_content,\n name: item.name,\n parentId: item.parentId,\n route: item.route,\n isPage: item.isPage,\n isBody: item.isBody,\n isHome: item.isHome,\n group: item.group,\n isDefault: item.isDefault,\n depth: item.depth\n }))\n\n await handlePageDetail(familyPages)\n\n updatePageContent(familyPages, currentPage)\n\n return familyPages\n}\n\nexport default () => {\n return {\n getDefaultPage,\n selectedTemplateCard,\n pageSettingState,\n isTemporaryPage,\n isCurrentDataSame,\n changeTreeData,\n getPageContent,\n resetPageData,\n initCurrentPageData,\n isChangePageData,\n getPageList,\n getAncestors,\n switchPage,\n switchPageWithConfirm,\n getFamily,\n getPageChildren,\n updatePageSettingAfterSave,\n STATIC_PAGE_GROUP_ID,\n COMMON_PAGE_GROUP_ID\n }\n}\n","import { HOOK_NAME } from '@opentiny/tiny-engine-meta-register'\nimport usePage from './usePage'\n\nexport const PageService = {\n id: 'engine.service.page',\n type: 'MetaService',\n apis: usePage(),\n composable: {\n name: HOOK_NAME.usePage\n }\n}\n","<template>\n <div class=\"general-config\">\n <tiny-form\n ref=\"generalForm\"\n :model=\"pageSettingState.currentPageData\"\n :rules=\"isFolder ? folderRules : pageRules\"\n label-width=\"120px\"\n validate-type=\"text\"\n :inline-message=\"true\"\n :label-align=\"true\"\n label-position=\"top\"\n class=\"general-config-form\"\n >\n <tiny-form-item v-if=\"!isFolder\" prop=\"group\" label=\"页面类型\" class=\"form-item-page-type\">\n <tiny-radio v-model=\"pageSettingState.currentPageData.group\" class=\"page-type-radio\" label=\"staticPages\">\n 静态页面\n </tiny-radio>\n <tiny-radio v-model=\"pageSettingState.currentPageData.group\" class=\"page-type-radio\" label=\"publicPages\">\n 公共页面\n </tiny-radio>\n </tiny-form-item>\n <tiny-form-item prop=\"name\" :label=\"`${isFolder ? '文件夹' : '页面'}名称`\">\n <tiny-input\n v-model=\"pageSettingState.currentPageData.name\"\n :placeholder=\"`请设置${isFolder ? '文件夹' : '页面'}名称`\"\n ></tiny-input>\n </tiny-form-item>\n\n <tiny-form-item\n v-if=\"pageSettingState.currentPageData.group !== 'publicPages'\"\n label=\"父文件夹/父页面\"\n prop=\"parentId\"\n >\n <tiny-select\n v-model=\"pageParentId\"\n value-field=\"id\"\n render-type=\"tree\"\n :tree-op=\"treeFolderOp\"\n text-field=\"name\"\n placeholder=\"请选择父文件夹/父页面\"\n popper-class=\"parent-fold-select-dropdown\"\n @change=\"changeParentForderId\"\n ></tiny-select>\n </tiny-form-item>\n\n <tiny-form-item label=\"页面路由\" prop=\"route\">\n <tiny-input v-model=\"pageSettingState.currentPageData.route\" placeholder=\"请设置路由\"> </tiny-input>\n <div class=\"tip\">\n <span class=\"text\" v-if=\"!pageSettingState.currentPageData.route\">路由将以website.com开头</span>\n <span class=\"route-text\" v-else>\n <span class=\"tip-text\">website.com/</span>\n <span class=\"tip-text-dim\">{{ currentRoute }}</span>\n </span>\n </div>\n </tiny-form-item>\n <tiny-form-item\n v-if=\"pageSettingState.currentPageData.group !== 'publicPages' && !isFolder && state.childPageOp?.length\"\n label=\"设置默认跳转页\"\n prop=\"isDefault\"\n >\n <tiny-select\n v-model=\"state.defaultPageId\"\n :options=\"state.childPageOp\"\n placeholder=\"请选择默认跳转页\"\n @change=\"changeDefaultPage\"\n ></tiny-select>\n <div v-if=\"state.defaultPageId\" class=\"tip\">\n <div class=\"tip-text\">访问</div>\n <span class=\"tip-text-dim\">/{{ currentRoute }}</span>\n <div class=\"tip-text\">路由,默认跳转</div>\n <span class=\"tip-text-dim\">/{{ currentRoute }}/{{ pageSettingState?.defaultPage?.route }}</span>\n </div>\n </tiny-form-item>\n </tiny-form>\n </div>\n</template>\n\n<script lang=\"tsx\">\nimport { ref, computed, watchEffect, reactive } from 'vue'\nimport { Form, FormItem, Input, Select, Radio } from '@opentiny/vue'\nimport { iconFile } from '@opentiny/vue-icon'\nimport { usePage } from '@opentiny/tiny-engine-meta-register'\nimport { REGEXP_PAGE_NAME, REGEXP_FOLDER_NAME, REGEXP_ROUTE } from '@opentiny/tiny-engine-common/js/verification'\n\nexport default {\n components: {\n TinyForm: Form,\n TinyFormItem: FormItem,\n TinyInput: Input,\n TinySelect: Select,\n TinyRadio: Radio\n },\n props: {\n modelValue: {\n type: Object,\n default: () => ({})\n },\n isFolder: {\n type: Boolean,\n default: false\n }\n },\n setup() {\n const { pageSettingState, changeTreeData, STATIC_PAGE_GROUP_ID, getPageChildren } = usePage()\n const ROOT_ID = pageSettingState.ROOT_ID\n\n const pageParentId = computed({\n get() {\n return String(pageSettingState.currentPageData.parentId)\n },\n set(value) {\n pageSettingState.currentPageData.parentId = value\n }\n })\n\n const oldParentId = ref(pageParentId.value)\n const state = reactive({\n childPageList: [],\n childPageOp: [],\n defaultPageId: ''\n })\n\n const setChildAndDefaultPage = async (id) => {\n if (pageSettingState.isNew) {\n state.childPageList = []\n state.childPageOp = []\n state.defaultPageId = ''\n } else {\n state.childPageList = await getPageChildren(id)\n const defaultPage = state.childPageList?.find((item) => item.isDefault)\n pageSettingState.defaultPage = defaultPage ? defaultPage : null\n state.defaultPageId = defaultPage ? defaultPage.id : ''\n state.childPageOp = state.childPageList.map((item) => {\n return {\n value: item.id,\n label: item.name,\n icon: iconFile()\n }\n })\n }\n }\n\n const changeDefaultPage = () => {\n pageSettingState.defaultPage = state.childPageList.find((item) => item.id === state.defaultPageId)\n }\n\n watchEffect(() => {\n oldParentId.value = pageSettingState.oldParentId\n setChildAndDefaultPage(pageSettingState.currentPageData?.id)\n })\n\n const currentRoute = computed(() => {\n let route = pageSettingState.currentPageData.route || ''\n let parentId = pageParentId.value\n\n while (parentId !== ROOT_ID) {\n const parent = pageSettingState.treeDataMapping[parentId]\n if (!parent) {\n break\n }\n route = `${parent.route}/${route}`\n parentId = parent.parentId\n }\n if (route.startsWith('/')) {\n route = route.slice(1)\n }\n\n return route\n })\n\n // 新建页面/更新页面校验规则\n const pageRules = {\n name: [\n { required: true, message: '请输入页面 ID' },\n {\n pattern: REGEXP_PAGE_NAME,\n message: '只允许包含英文字母,且为大写开头驼峰格式, 如DemoPage'\n },\n {\n min: 3,\n max: 25,\n message: '长度在 3 到 25 个字符'\n }\n ],\n route: [\n {\n required: true,\n message: '请输入页面路由'\n },\n {\n pattern: REGEXP_ROUTE,\n message: '只允许包含英文字母、数字、下横线_、中横线-、正斜杠/, 且以英文字母开头'\n }\n ]\n }\n const folderRules = {\n name: [\n { required: true, message: '请输入页面文件夹 ID' },\n {\n pattern: REGEXP_FOLDER_NAME,\n message: '只允许包含英文字母、数字、下横线_、中横线-, 且以英文字母开头'\n },\n { min: 3, max: 25, message: '长度在 3 到 25 个字符' }\n ],\n route: [\n { required: true, message: '请输入页面文件夹路由' },\n {\n pattern: REGEXP_ROUTE,\n message: '只允许包含英文字母、数字、下横线_、中横线-、正斜杠/, 且以英文字母开头'\n }\n ],\n group: [{ required: true, message: '必须选择页面类型' }]\n }\n\n const pageToTreeData = (page) => {\n const { id, name, isPage, children } = page\n\n const result = { id: String(id), name, isPage }\n\n if (Array.isArray(children)) {\n result.children = children\n .filter((page) => page.id !== pageSettingState.currentPageData.id)\n .map((page) => pageToTreeData(page))\n }\n\n return result\n }\n\n const getNodeIcon = (data) => {\n if (data.id === ROOT_ID) {\n return null\n }\n\n if (data.isPage) {\n return <SvgIcon name=\"text-page-common\"></SvgIcon>\n }\n\n return <SvgIcon name=\"text-page-folder\"></SvgIcon>\n }\n\n const treeFolderOp = computed(() => {\n const staticPages = pageSettingState.pages[STATIC_PAGE_GROUP_ID]?.data || []\n const dummyRoot = pageToTreeData({ children: [{ name: '无', id: ROOT_ID }].concat(staticPages) })\n const data = dummyRoot.children\n const options = {\n data: data,\n shrinkIcon: null,\n expandIcon: null,\n renderContent: (_h, { node, data }) => {\n return (\n <>\n {getNodeIcon(data)}\n <div>{node.label}</div>\n </>\n )\n }\n }\n\n return options\n })\n\n const generalForm = ref(null)\n\n const validGeneralForm = () => {\n return new Promise((resolve) => {\n generalForm.value.validate((valid) => {\n if (valid) {\n resolve(valid)\n }\n })\n })\n }\n\n const changeParentForderId = (value) => {\n changeTreeData(value.id, oldParentId.value)\n oldParentId.value = value.id\n }\n\n return {\n pageRules,\n folderRules,\n pageSettingState,\n pageParentId,\n generalForm,\n validGeneralForm,\n treeFolderOp,\n currentRoute,\n changeParentForderId,\n state,\n changeDefaultPage\n }\n }\n}\n</script>\n\n<style lang=\"less\" scoped>\n.general-config {\n .general-config-form {\n .input-head {\n color: var(--te-page-manage-input-head-text-color);\n }\n :deep(.tiny-form-item) {\n margin-bottom: 16px;\n .tiny-input-group__prepend {\n border: 1px solid var(--te-page-manage-input-border-color);\n background: var(--te-page-manage-input-bg-color);\n }\n .page-type-radio {\n color: var(--te-page-manage-title-text-color);\n }\n .tiny-form-item__label {\n height: 24px;\n line-height: 18px;\n font-size: 12px;\n color: var(--te-page-manage-text-color);\n }\n }\n }\n .tip {\n color: var(--te-page-manage-tip-color);\n font-size: 12px;\n border-radius: 3px;\n margin-top: 4px;\n width: 100%;\n word-wrap: break-word;\n height: auto;\n line-height: 16px;\n .text {\n color: var(--te-page-manage-tip-text-color);\n }\n .tip-text {\n width: 100%;\n color: var(--te-page-manage-tip-text-color);\n }\n .tip-text-dim {\n color: var(--te-page-manage-tip-dim-text-color);\n }\n }\n}\n</style>\n<style lang=\"less\">\n.tiny-select-dropdown.parent-fold-select-dropdown {\n padding: 8px;\n .tiny-tree {\n .tiny-tree-node {\n .tiny-tree-node__content {\n padding: 0;\n background-color: var(--te-page-manage-tree-node-bg-color);\n &:hover {\n background-color: var(--te-page-manage-tree-node-bg-color-hover);\n }\n // 移除子节点的的背景色,才能保证鼠标hover到.tiny-tree-node__content节点任意位置时,整行都有hover状态的背景色\n .tiny-tree-node__content-left,\n .tiny-tree-node__content-left .tiny-tree-node__content-box {\n background-color: unset;\n &:hover {\n background-color: unset;\n }\n }\n .tiny-tree-node__content-left {\n padding: 0;\n .tree-node-icon {\n margin: 0;\n }\n .tiny-tree-node__content-box {\n padding: 0 12px;\n svg {\n margin-right: 8px;\n }\n }\n .tiny-tree-node__label {\n font-size: 12px;\n }\n }\n }\n }\n }\n}\n</style>\n","/**\n * Copyright (c) 2023 - present TinyEngine Authors.\n * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd.\n *\n * Use of this source code is governed by an MIT-style license.\n *\n * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,\n * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR\n * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS.\n *\n */\n\nimport entry, { api } from './src/Main.vue'\nimport metaData from './meta'\nimport { PageService } from './src/composable/index'\nimport PageGeneral from './src/PageGeneral.vue'\nimport './src/styles/vars.less'\n\nexport default {\n ...metaData,\n apis: api,\n entry,\n options: {\n pageBaseStyle: {\n className: 'page-base-style',\n style: 'padding: 24px;background: #FFFFFF;'\n }\n },\n components: {\n PageGeneral\n },\n metas: [PageService]\n}\n\nexport { PageService }\n"],"names":["fetchPageList","appId","getMetaApi","META_SERVICE","fetchPageDetail","pageId","requestDeletePage","requestCreatePage","params","handleRouteHomeUpdate","requestCopyPage","fetchPageHistory","requestRestorePageHistory","fetchHistoryDetail","requestUpdatePage","http","_sfc_main$8","BlockHistoryList","props","emit","pageSettingState","getFamily","usePage","getDateFromNow","useBlock","confirm","useModal","list","ref","getHistoryList","id","version","data","item","watchEffect","_a","previewPage","_createBlock","_component_block_history_list","$setup","_sfc_main$7","MetaCodeEditor","Checkbox","inputValue","outputValue","currentPageData","computed","_b","inputsData","err","useNotify","outputsData","value","_hoisted_1","_openBlock","_createElementBlock","_createVNode","_component_meta_code_editor","_withCtx","_component_svg_icon","_cache","_createElementVNode","_component_tiny_checkbox","$event","metaData","COMPONENT_NAME","constants","isShow","openPageSettingPanel","closePageSettingPanel","resetPageData","PAGE_SETTING_SESSION","general","inputOutput","lifeCycles","history","_sfc_main$6","components","TinyButton","Button","TinyCollapse","Collapse","TinyCollapseItem","CollapseItem","PageInputOutput","LifeCycles","PageHistory","PluginSetting","SvgButton","ButtonGroup","isFolder","type","Boolean","default","emits","setup","getDefaultPage","changeTreeData","isCurrentDataSame","initCurrentPageData","isTemporaryPage","STATIC_PAGE_GROUP_ID","updatePageSettingAfterSave","pageState","initData","useCanvas","registry","getMergeRegistry","meta","pageGeneral","PageGeneral","beforeCreatePage","options","pageGeneralRef","PLUGIN_NAME","getPluginByLayout","useLayout","align","AppManage","subscribe","unsubscribe","useMessage","subscriber","onActivated","topic","callback","onDeactivated","state","reactive","activeName","Object","values","title","historyMessage","cancelPageSetting","isEqual","currentPageDataCopy","message","exec","isNew","oldParentId","parentId","assign","createPage","page_content","other","page_content_state","pageSettingStateOther","createParams","fileName","name","app","GlobalService","getBaseInfo","isPage","_id","updateTreeData","saved","closePlugin","isVsCodeEnv","generatePage","JSON","stringify","updatePage","isUpdateTree","routerChange","route","isCurEditPage","currentPage","handlePageUpdate","restorePage","pageData","currentData","page","unnecessaryFields","forEach","key","then","editPage","res","updatePageLifeCycles","val","pageContent","copyPageData","copyData","extend","defaultPage","copyPage","settingDefaultPage","isDefault","createHistoryMessage","render","Input","trim","savePageSetting","validGeneralForm","collectAllPage","staticPageList","Array","isArray","pageList","pageItem","push","children","length","deletePage","treeDataMapping","pages","find","groupId","pageHome","isHome","firstPage","componentName","Page","catch","_hoisted_2","_component_plugin_setting","_component_button_group","_component_tiny_button","_component_svg_button","_component_tiny_collapse","_component_tiny_collapse_item","_resolveDynamicComponent","$props","_component_page_input_output","_component_life_cycles","_component_page_history","openFolderSettingPanel","closeFolderSettingPanel","_sfc_main$5","folderGeneralRef","closeFolderSetting","createFolder","error","updateFolder","throttle","_createTextVNode","_createCommentVNode","_Fragment","_renderList","__props","i","_hoisted_3","__emit","useCollapseMap","collapseMap","switchCollapse","setCollapse","handleSwitchCollapse","node","flattenTreeData","level","collapsed","idKey","labelKey","childrenKey","currentNode","result","child","nodes","nodesMap","getAncestorIds","nodeId","ancestors","filteredNodes","watch","filterValue","filtered","collapseMapChanged","filteredNodesWithAncestors","idSet","lines","layerLine","index","parentIndex","handleClickRow","event","draggedNode","hoveringNodeId","handleDragStart","_event","handleDragOver","handleDrop","dragged","handleDragEnd","handleContainerDragOver","handleContainerDragLeave","_normalizeClass","rowIndex","LayerLines","_unref","_toDisplayString","_renderSlot","_ctx","_vShow","PAGE_STATUS","_sfc_main$2","TinySearch","Search","TinyIconSearch","IconSearch","TinyPopover","Popover","DraggableTree","isBlock","isSaved","getPageList","COMMON_PAGE_GROUP_ID","switchPage","switchPageById","getAppId","customPageOperations","getOptions","pageSearchValue","collapseValue","currentNodeData","onMounted","onUnmounted","refreshPageList","nodeClick","e","openSettingPanel","isPageLocked","username","occupier","popoverRefs","setPopoverRef","el","rawData","getCanvasStatus","Lock","handleClickPageSettings","rowOperations","label","action","map","doClose","getRowOperations","slice","group","filter","pageDetail","finally","handleMoveNode","newParent","createPublicPage","stopPropagation","preventDefault","IconFolderOpened","IconFolderClosed","_hoisted_5","_component_tiny_search","_component_tiny_icon_search","groupItem","_component_draggable_tree","_hoisted_4","_component_tiny_popover","operation","_hoisted_6","api","getPageById","_sfc_main$1","PageSetting","PluginPanel","PageFolderSetting","PageTree","String","fixedPanels","panelState","emitEvent","provide","pageTreeRef","ROOT_ID","docsUrl","useHelp","getDocsUrl","docsContent","createNewPage","Error","createNewFolder","settingHome","isPageChange","openNewPage","pluginPanelClosed","_component_plugin_panel","_component_page_tree","_component_page_setting","_component_page_folder_setting","ELEMENT_TAG","DEFAULT_PAGE","selectedTemplateCard","generateCssString","pageOptions","materialsOptions","formatCssRule","className","style","baseStyle","syncPageContent","dataCopy","obj","objCopy","isValuesEqual","getParentNode","newParentId","folderData","parentData","currentPageDataId","curDataIndex","splicedPageData","getPageContent","isChangePageData","generateTree","parentNode","pagesData","firstGroupData","secondGroupData","namedNode","firstGroupTreeData","secondGroupTreeData","getAncestorsRecursively","pageNode","getAncestors","withFolders","predicate","flatternFolder","pagesOrFolders","flattened","getPageChildren","clearCurrentState","clearPreview","useBreadcrumb","switchPageWithConfirm","resolve","proceed","updatePageContent","familyPages","currentPageSchema","fetchPageDetailIfNeeded","updateParentId","handlePageDetail","PageService","HOOK_NAME","_sfc_main","TinyForm","Form","TinyFormItem","FormItem","TinyInput","TinySelect","Select","TinyRadio","Radio","modelValue","pageParentId","get","set","childPageList","childPageOp","defaultPageId","setChildAndDefaultPage","icon","iconFile","changeDefaultPage","currentRoute","parent","startsWith","pageRules","required","pattern","REGEXP_PAGE_NAME","min","max","REGEXP_ROUTE","folderRules","REGEXP_FOLDER_NAME","pageToTreeData","getNodeIcon","_resolveComponent","treeFolderOp","staticPages","concat","shrinkIcon","expandIcon","renderContent","_h","generalForm","Promise","validate","valid","changeParentForderId","_hoisted_7","_hoisted_8","_component_tiny_form","_component_tiny_form_item","_component_tiny_radio","_component_tiny_input","_component_tiny_select","entry"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opentiny/tiny-engine-plugin-page",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.1",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -25,12 +25,12 @@
|
|
|
25
25
|
"license": "MIT",
|
|
26
26
|
"homepage": "https://opentiny.design/tiny-engine",
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@opentiny/tiny-engine-common": "2.6.
|
|
29
|
-
"@opentiny/tiny-engine-meta-register": "2.6.
|
|
30
|
-
"@opentiny/tiny-engine-utils": "2.6.
|
|
28
|
+
"@opentiny/tiny-engine-common": "2.6.1",
|
|
29
|
+
"@opentiny/tiny-engine-meta-register": "2.6.1",
|
|
30
|
+
"@opentiny/tiny-engine-utils": "2.6.1"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@opentiny/tiny-engine-vite-plugin-meta-comments": "2.6.
|
|
33
|
+
"@opentiny/tiny-engine-vite-plugin-meta-comments": "2.6.1",
|
|
34
34
|
"@vitejs/plugin-vue": "^5.1.2",
|
|
35
35
|
"@vitejs/plugin-vue-jsx": "^4.0.1",
|
|
36
36
|
"vite": "^5.4.2"
|
|
@@ -41,5 +41,5 @@
|
|
|
41
41
|
"@opentiny/vue-renderless": "^3.20.0",
|
|
42
42
|
"vue": "^3.4.15"
|
|
43
43
|
},
|
|
44
|
-
"gitHead": "
|
|
44
|
+
"gitHead": "81baa12c2e7fd029f62d377387c9f2726f1f559b"
|
|
45
45
|
}
|