@maketribe/ms-app 3.2.38 → 3.2.39
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/cjs/components/basic/doc-editor/core/nodes/RichElementNode.js.map +1 -1
- package/dist/cjs/components/basic/doc-editor/core/plugins/LexicalRichTextPlugin/index.vue.js +8 -6
- package/dist/cjs/components/basic/doc-editor/core/plugins/LexicalRichTextPlugin/index.vue.js.map +1 -1
- package/dist/cjs/components/basic/doc-editor/plugins/TemplatePlugin/commands.js +2 -0
- package/dist/cjs/components/basic/doc-editor/plugins/TemplatePlugin/commands.js.map +1 -1
- package/dist/cjs/components/basic/doc-editor/plugins/TemplatePlugin/composables.js +71 -2
- package/dist/cjs/components/basic/doc-editor/plugins/TemplatePlugin/composables.js.map +1 -1
- package/dist/cjs/components/basic/doc-editor/plugins/TemplatePlugin/index.vue.js +8 -0
- package/dist/cjs/components/basic/doc-editor/plugins/TemplatePlugin/index.vue.js.map +1 -1
- package/dist/cjs/components/basic/doc-editor/themes/doc-editor-edit.css.js +1 -1
- package/dist/cjs/components/basic/doc-editor/themes/doc-editor-edit.css.js.map +1 -1
- package/dist/cjs/modules/cms/components/part-tree/index.vue.js +12 -3
- package/dist/cjs/modules/cms/components/part-tree/index.vue.js.map +1 -1
- package/dist/cjs/modules/cms/dataviews/cms-articles/CmsArticlesForm.js +1 -1
- package/dist/cjs/modules/cms/dataviews/cms-articles/CmsArticlesForm.js.map +1 -1
- package/dist/cjs/modules/cms/dataviews/cms-articles/CmsArticlesTable.js +3 -2
- package/dist/cjs/modules/cms/dataviews/cms-articles/CmsArticlesTable.js.map +1 -1
- package/dist/cjs/modules/cms/pages/cms-contents/components/article-list.vue.js +1 -1
- package/dist/cjs/modules/cms/pages/cms-contents/components/article-list.vue.js.map +1 -1
- package/dist/esm/components/basic/doc-editor/core/nodes/RichElementNode.js.map +1 -1
- package/dist/esm/components/basic/doc-editor/core/plugins/LexicalRichTextPlugin/index.vue.js +9 -7
- package/dist/esm/components/basic/doc-editor/core/plugins/LexicalRichTextPlugin/index.vue.js.map +1 -1
- package/dist/esm/components/basic/doc-editor/plugins/TemplatePlugin/commands.js +2 -0
- package/dist/esm/components/basic/doc-editor/plugins/TemplatePlugin/commands.js.map +1 -1
- package/dist/esm/components/basic/doc-editor/plugins/TemplatePlugin/composables.js +72 -3
- package/dist/esm/components/basic/doc-editor/plugins/TemplatePlugin/composables.js.map +1 -1
- package/dist/esm/components/basic/doc-editor/plugins/TemplatePlugin/index.vue.js +10 -2
- package/dist/esm/components/basic/doc-editor/plugins/TemplatePlugin/index.vue.js.map +1 -1
- package/dist/esm/components/basic/doc-editor/themes/doc-editor-edit.css.js +1 -1
- package/dist/esm/components/basic/doc-editor/themes/doc-editor-edit.css.js.map +1 -1
- package/dist/esm/modules/cms/components/part-tree/index.vue.js +12 -3
- package/dist/esm/modules/cms/components/part-tree/index.vue.js.map +1 -1
- package/dist/esm/modules/cms/dataviews/cms-articles/CmsArticlesForm.js +1 -1
- package/dist/esm/modules/cms/dataviews/cms-articles/CmsArticlesForm.js.map +1 -1
- package/dist/esm/modules/cms/dataviews/cms-articles/CmsArticlesTable.js +3 -2
- package/dist/esm/modules/cms/dataviews/cms-articles/CmsArticlesTable.js.map +1 -1
- package/dist/esm/modules/cms/pages/cms-contents/components/article-list.vue.js +1 -1
- package/dist/esm/modules/cms/pages/cms-contents/components/article-list.vue.js.map +1 -1
- package/dist/types/components/basic/doc-editor/plugins/TemplatePlugin/commands.d.ts +4 -0
- package/dist/types/components/basic/doc-editor/plugins/TemplatePlugin/composables.d.ts +7 -0
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"article-list.vue.js","sources":["../../../../../../../src/modules/cms/pages/cms-contents/components/article-list.vue"],"sourcesContent":["<template>\r\n <MKDataTable :data-table=\"articlesDv\" :auto-load=\"false\" class=\"mk-cms-article-list\">\r\n <el-empty v-if=\"part && part.cmsPartTypeId == 1\" description=\"外链栏目下无文章内容\" />\r\n <MKTableView v-else-if=\"part\" :data-table=\"articlesDv\">\r\n <el-scrollbar class=\"mk-cms-article-list__content\" style=\"box-sizing: border-box;font-size: 0;\"\r\n v-if=\"articlesDv.getList().length > 0\">\r\n <el-card class=\"mk-cms-article-list__item\" v-for=\"article in articlesDv.getList()\" :key=\"article.id\">\r\n <div class=\"mk-cms-article-list__item__content\">\r\n <div class=\"left\">\r\n <el-image class=\"cover-image\" :src=\"article.cover\" fit=\"contain\">\r\n <template #error>\r\n <MKSvgIcon iconClass=\"Picture\" />\r\n </template>\r\n </el-image>\r\n </div>\r\n <div class=\"right\">\r\n <div class=\"top\">\r\n <div class=\"title\" :title=\"article.title\"> {{ article.title }}</div>\r\n <div class=\"tags\">\r\n <el-tag class=\"tag\" v-if=\"CmsSettings.content.useTop && article.isTop == 1\"\r\n @click=\"changeArticleStatus(article, 'isTop', 0)\">置顶</el-tag>\r\n <el-tag class=\"tag\" v-if=\"CmsSettings.content.useNew && article.isNew == 1\"\r\n @click=\"changeArticleStatus(article, 'isNew', 0)\">最新</el-tag>\r\n <el-tag class=\"tag\" v-if=\"CmsSettings.content.useHotRecommend && article.isHotRecommend == 1\"\r\n @click=\"changeArticleStatus(article, 'isHotRecommend', 0)\">热门推荐</el-tag>\r\n <el-tag class=\"tag\" v-if=\"CmsSettings.content.usePartRecommend && article.isPartRecommend == 1\"\r\n @click=\"changeArticleStatus(article, 'isPartRecommend', 0)\">栏目推荐</el-tag>\r\n </div>\r\n </div>\r\n <div class=\"sub-title\" v-if=\"article.subTitle\" :title=\"article.subTitle\"> {{ article.subTitle }}</div>\r\n <div class=\"desc\">\r\n {{ article.desc }}\r\n </div>\r\n <div class=\"footer\">\r\n <div class=\"ext\">\r\n <div class=\"author\">\r\n <MKSvgIcon iconClass=\"UserFilled\"></MKSvgIcon>\r\n 作者 : {{ article.author || \"-\" }}\r\n </div>\r\n <div class=\"publish-time\" v-if=\"article.releaseDate\">\r\n <MKSvgIcon iconClass=\"Timer\"></MKSvgIcon>\r\n 发布时间 : {{ article.releaseDate }}\r\n </div>\r\n </div>\r\n <div class=\"tools\">\r\n <el-button type=\"primary\" size=\"large\" @click=\"editArticleHandle(article)\" text>\r\n 编辑\r\n </el-button>\r\n <el-button type=\"danger\" size=\"large\" @click=\"deleteArticleHandle(article)\" text>\r\n 删除\r\n </el-button>\r\n <!-- <a v-if=\"CmsSettings.publish.mode == 'static' && article.url\" :href=\"article.url\" target=\"_blank\">\r\n <el-button type=\"primary\" size=\"large\" text>访问</el-button>\r\n </a> -->\r\n <a :href=\"'/api/cms/content/preview/content/' + article.cmsPartId + '/' + article.id\"\r\n v-if=\"CmsSettings.publish.mode == 'static'\" target=\"_blank\">\r\n <el-button type=\"primary\" size=\"large\" text>预览</el-button>\r\n </a>\r\n <el-dropdown>\r\n <el-button type=\"primary\" size=\"large\" text>\r\n 更多\r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item v-if=\"CmsSettings.publish.mode == 'static' && article.url\">\r\n <a style=\"text-decoration: none;color: #606266;\"\r\n v-if=\"CmsSettings.publish.mode == 'static' && article.url\" :href=\"article.url\"\r\n target=\"_blank\">\r\n 访问\r\n </a>\r\n </el-dropdown-item>\r\n <el-dropdown-item @click=\"publishArticleHandle(article)\">\r\n 发布\r\n </el-dropdown-item>\r\n <el-dropdown-item v-if=\"CmsSettings.content.useTop && article.isTop == 0\"\r\n @click=\"changeArticleStatus(article, 'isTop', 1)\">设为置顶</el-dropdown-item>\r\n <el-dropdown-item v-if=\"CmsSettings.content.useNew && article.isNew == 0\"\r\n @click=\"changeArticleStatus(article, 'isNew', 1)\">设为最新</el-dropdown-item>\r\n <el-dropdown-item v-if=\"CmsSettings.content.useHotRecommend && article.isHotRecommend == 0\"\r\n @click=\"changeArticleStatus(article, 'isHotRecommend', 1)\">设为热门推荐</el-dropdown-item>\r\n <el-dropdown-item v-if=\"CmsSettings.content.usePartRecommend && article.isPartRecommend == 0\"\r\n @click=\"changeArticleStatus(article, 'isPartRecommend', 1)\">设为栏目推荐</el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </el-card>\r\n </el-scrollbar>\r\n <el-empty v-if=\"articlesDv.getList().length <= 0\" description=\"暂无文章内容\" />\r\n </MKTableView>\r\n </MKDataTable>\r\n</template>\r\n<script setup lang='ts'>\r\nimport { MKTableView } from \"../../../../../components\"\r\nimport { CmsArticlesTable, CmsArticlesForm } from \"../../../dataviews\"\r\nimport { reactive, defineProps, watch, onMounted } from \"vue\";\r\nimport { Dialoger, isWhereFilter, Messager } from '@maketribe/dm'\r\nimport { useRouter } from \"vue-router\";\r\nimport { useCmsSettings } from \"../../../cms-settings\"\r\n// cms 配置\r\nconst CmsSettings = useCmsSettings();\r\n\r\n// 文章\r\nconst articlesDv = reactive(new CmsArticlesTable()) as CmsArticlesTable;\r\n// 发布文章表单\r\nconst articleForm = reactive(new CmsArticlesForm()) as CmsArticlesForm;\r\n// 草稿文章\r\nconst draftArticleForm = reactive(new CmsArticlesForm()) as CmsArticlesForm;\r\n\r\n// 参数\r\nconst props = defineProps({\r\n part: { type: Object, default: null }\r\n})\r\n\r\nconst router = useRouter();\r\n\r\n//改变文章指定,最新,推荐状态\r\nconst changeArticleStatus = async (article: any, item: string, status: number) => {\r\n const text: Record<string, string[]> = {\r\n \"isTop\": ['取消置顶', '设为置顶'],\r\n \"isNew\": ['取消最新', '设为最新'],\r\n \"isHotRecommend\": ['取消热门推荐', '设为热门推荐'],\r\n \"isPartRecommend\": ['取消栏目推荐', '设为栏目推荐'],\r\n }\r\n\r\n const isConfirm = await Dialoger.confirm({\r\n title: \"修改文章状态\",\r\n message: `是否${text[item][status]}?`,\r\n type: \"warning\"\r\n })\r\n if (!isConfirm) {\r\n return\r\n }\r\n try {\r\n\r\n articlesDv.getLoadingManager().startLoading();\r\n await articleForm.editRecord(article.id)\r\n const isSuccess = await articleForm.simpleSubmit({\r\n id: article.id,\r\n [item]: status\r\n })\r\n\r\n if (isSuccess) {\r\n articlesDv.load();\r\n }\r\n } finally {\r\n articlesDv.getLoadingManager().completeLoading();\r\n }\r\n\r\n\r\n}\r\n\r\n// 初始化\r\nonMounted(() => {\r\n articleForm.init();\r\n draftArticleForm.init();\r\n\r\n // 监听栏目数据变化\r\n watch(() => props.part, (item: any) => {\r\n if (item.cmsPartTypeId != 1) {\r\n \r\n const dataFilter = articlesDv.dataFilter;\r\n\r\n if (isWhereFilter(dataFilter)) {\r\n\r\n const defaultGroup = dataFilter.getDefaultGroup();\r\n\r\n defaultGroup.clear();\r\n defaultGroup.addCondition(\"cmsPartId\", \"=\", item.id);\r\n // 只查草稿\r\n defaultGroup.addCondition(\"isDraft\", \"=\", 1);\r\n }\r\n\r\n articlesDv.load()\r\n }\r\n }, { immediate: true })\r\n})\r\n\r\n/**\r\n * 删除文章\r\n */\r\nconst deleteArticleHandle = async (item: any) => {\r\n const isConfirm = await Dialoger.confirm({\r\n title: \"删除文章?\",\r\n message: \"是否删除文章?\",\r\n type: \"warning\"\r\n })\r\n\r\n if (!isConfirm) { return; }\r\n await articlesDv.deleteAfterRefresh(item.id);\r\n}\r\n\r\n/**\r\n * 编辑文章\r\n */\r\nconst editArticleHandle = (item: any, isEdit = false) => {\r\n router.push({ path: \"/cms/article\", query: { id: isEdit ? undefined : item.id, partId: isEdit ? item.id : undefined } })\r\n}\r\n\r\n// 添加记录\r\narticlesDv.addRecordEvent.on(() => editArticleHandle(props.part, true))\r\n\r\n/**\r\n * fault文章\r\n * @param article \r\n */\r\nconst publishArticleHandle = async (article: any) => {\r\n\r\n try {\r\n\r\n if (await Dialoger.confirm({ title: \"文章发布\", message: \"是否发布文章?\", type: \"warning\" })) {\r\n\r\n articlesDv.getLoadingManager().startLoading();\r\n\r\n // 调用发布接口\r\n const response: any = await CmsArticlesForm.publish(CmsSettings.publish.mode, article.cmsPartId, article.id);\r\n\r\n if (response.data.code !== 200) {\r\n Messager.error({ message: response.data.msg });\r\n return;\r\n }\r\n\r\n Messager.success({ message: \"发布成功\" });\r\n }\r\n\r\n } finally {\r\n articlesDv.getLoadingManager().completeLoading();\r\n }\r\n}\r\n\r\n\r\n</script>\r\n"],"names":["useCmsSettings","reactive","CmsArticlesTable","CmsArticlesForm","useRouter","Dialoger","onMounted","watch","isWhereFilter","Messager"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"article-list.vue.js","sources":["../../../../../../../src/modules/cms/pages/cms-contents/components/article-list.vue"],"sourcesContent":["<template>\r\n <MKDataTable :data-table=\"articlesDv\" :auto-load=\"false\" class=\"mk-cms-article-list\">\r\n <el-empty v-if=\"part && part.cmsPartTypeId == 1\" description=\"外链栏目下无文章内容\" />\r\n <MKTableView v-else-if=\"part\" :data-table=\"articlesDv\">\r\n <el-scrollbar class=\"mk-cms-article-list__content\" style=\"box-sizing: border-box;font-size: 0;\"\r\n v-if=\"articlesDv.getList().length > 0\">\r\n <el-card class=\"mk-cms-article-list__item\" v-for=\"article in articlesDv.getList()\" :key=\"article.id\">\r\n <div class=\"mk-cms-article-list__item__content\">\r\n <div class=\"left\">\r\n <el-image class=\"cover-image\" :src=\"article.cover\" fit=\"contain\">\r\n <template #error>\r\n <MKSvgIcon iconClass=\"Picture\" />\r\n </template>\r\n </el-image>\r\n </div>\r\n <div class=\"right\">\r\n <div class=\"top\">\r\n <div class=\"title\" :title=\"article.title\"> {{ article.title }}</div>\r\n <div class=\"tags\">\r\n <el-tag class=\"tag\" v-if=\"CmsSettings.content.useTop && article.isTop == 1\"\r\n @click=\"changeArticleStatus(article, 'isTop', 0)\">置顶</el-tag>\r\n <el-tag class=\"tag\" v-if=\"CmsSettings.content.useNew && article.isNew == 1\"\r\n @click=\"changeArticleStatus(article, 'isNew', 0)\">最新</el-tag>\r\n <el-tag class=\"tag\" v-if=\"CmsSettings.content.useHotRecommend && article.isHotRecommend == 1\"\r\n @click=\"changeArticleStatus(article, 'isHotRecommend', 0)\">热门推荐</el-tag>\r\n <el-tag class=\"tag\" v-if=\"CmsSettings.content.usePartRecommend && article.isPartRecommend == 1\"\r\n @click=\"changeArticleStatus(article, 'isPartRecommend', 0)\">栏目推荐</el-tag>\r\n </div>\r\n </div>\r\n <div class=\"sub-title\" v-if=\"article.subTitle\" :title=\"article.subTitle\"> {{ article.subTitle }}</div>\r\n <div class=\"desc\">\r\n {{ article.desc }}\r\n </div>\r\n <div class=\"footer\">\r\n <div class=\"ext\">\r\n <div class=\"author\">\r\n <MKSvgIcon iconClass=\"UserFilled\"></MKSvgIcon>\r\n 作者 : {{ article.author || \"-\" }}\r\n </div>\r\n <div class=\"publish-time\" v-if=\"article.releaseDate\">\r\n <MKSvgIcon iconClass=\"Timer\"></MKSvgIcon>\r\n 新闻日期 : {{ article.releaseDate }}\r\n </div>\r\n </div>\r\n <div class=\"tools\">\r\n <el-button type=\"primary\" size=\"large\" @click=\"editArticleHandle(article)\" text>\r\n 编辑\r\n </el-button>\r\n <el-button type=\"danger\" size=\"large\" @click=\"deleteArticleHandle(article)\" text>\r\n 删除\r\n </el-button>\r\n <!-- <a v-if=\"CmsSettings.publish.mode == 'static' && article.url\" :href=\"article.url\" target=\"_blank\">\r\n <el-button type=\"primary\" size=\"large\" text>访问</el-button>\r\n </a> -->\r\n <a :href=\"'/api/cms/content/preview/content/' + article.cmsPartId + '/' + article.id\"\r\n v-if=\"CmsSettings.publish.mode == 'static'\" target=\"_blank\">\r\n <el-button type=\"primary\" size=\"large\" text>预览</el-button>\r\n </a>\r\n <el-dropdown>\r\n <el-button type=\"primary\" size=\"large\" text>\r\n 更多\r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item v-if=\"CmsSettings.publish.mode == 'static' && article.url\">\r\n <a style=\"text-decoration: none;color: #606266;\"\r\n v-if=\"CmsSettings.publish.mode == 'static' && article.url\" :href=\"article.url\"\r\n target=\"_blank\">\r\n 访问\r\n </a>\r\n </el-dropdown-item>\r\n <el-dropdown-item @click=\"publishArticleHandle(article)\">\r\n 发布\r\n </el-dropdown-item>\r\n <el-dropdown-item v-if=\"CmsSettings.content.useTop && article.isTop == 0\"\r\n @click=\"changeArticleStatus(article, 'isTop', 1)\">设为置顶</el-dropdown-item>\r\n <el-dropdown-item v-if=\"CmsSettings.content.useNew && article.isNew == 0\"\r\n @click=\"changeArticleStatus(article, 'isNew', 1)\">设为最新</el-dropdown-item>\r\n <el-dropdown-item v-if=\"CmsSettings.content.useHotRecommend && article.isHotRecommend == 0\"\r\n @click=\"changeArticleStatus(article, 'isHotRecommend', 1)\">设为热门推荐</el-dropdown-item>\r\n <el-dropdown-item v-if=\"CmsSettings.content.usePartRecommend && article.isPartRecommend == 0\"\r\n @click=\"changeArticleStatus(article, 'isPartRecommend', 1)\">设为栏目推荐</el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </el-card>\r\n </el-scrollbar>\r\n <el-empty v-if=\"articlesDv.getList().length <= 0\" description=\"暂无文章内容\" />\r\n </MKTableView>\r\n </MKDataTable>\r\n</template>\r\n<script setup lang='ts'>\r\nimport { MKTableView } from \"../../../../../components\"\r\nimport { CmsArticlesTable, CmsArticlesForm } from \"../../../dataviews\"\r\nimport { reactive, defineProps, watch, onMounted } from \"vue\";\r\nimport { Dialoger, isWhereFilter, Messager } from '@maketribe/dm'\r\nimport { useRouter } from \"vue-router\";\r\nimport { useCmsSettings } from \"../../../cms-settings\"\r\n// cms 配置\r\nconst CmsSettings = useCmsSettings();\r\n\r\n// 文章\r\nconst articlesDv = reactive(new CmsArticlesTable()) as CmsArticlesTable;\r\n// 发布文章表单\r\nconst articleForm = reactive(new CmsArticlesForm()) as CmsArticlesForm;\r\n// 草稿文章\r\nconst draftArticleForm = reactive(new CmsArticlesForm()) as CmsArticlesForm;\r\n\r\n// 参数\r\nconst props = defineProps({\r\n part: { type: Object, default: null }\r\n})\r\n\r\nconst router = useRouter();\r\n\r\n//改变文章指定,最新,推荐状态\r\nconst changeArticleStatus = async (article: any, item: string, status: number) => {\r\n const text: Record<string, string[]> = {\r\n \"isTop\": ['取消置顶', '设为置顶'],\r\n \"isNew\": ['取消最新', '设为最新'],\r\n \"isHotRecommend\": ['取消热门推荐', '设为热门推荐'],\r\n \"isPartRecommend\": ['取消栏目推荐', '设为栏目推荐'],\r\n }\r\n\r\n const isConfirm = await Dialoger.confirm({\r\n title: \"修改文章状态\",\r\n message: `是否${text[item][status]}?`,\r\n type: \"warning\"\r\n })\r\n if (!isConfirm) {\r\n return\r\n }\r\n try {\r\n\r\n articlesDv.getLoadingManager().startLoading();\r\n await articleForm.editRecord(article.id)\r\n const isSuccess = await articleForm.simpleSubmit({\r\n id: article.id,\r\n [item]: status\r\n })\r\n\r\n if (isSuccess) {\r\n articlesDv.load();\r\n }\r\n } finally {\r\n articlesDv.getLoadingManager().completeLoading();\r\n }\r\n\r\n\r\n}\r\n\r\n// 初始化\r\nonMounted(() => {\r\n articleForm.init();\r\n draftArticleForm.init();\r\n\r\n // 监听栏目数据变化\r\n watch(() => props.part, (item: any) => {\r\n if (item.cmsPartTypeId != 1) {\r\n \r\n const dataFilter = articlesDv.dataFilter;\r\n\r\n if (isWhereFilter(dataFilter)) {\r\n\r\n const defaultGroup = dataFilter.getDefaultGroup();\r\n\r\n defaultGroup.clear();\r\n defaultGroup.addCondition(\"cmsPartId\", \"=\", item.id);\r\n // 只查草稿\r\n defaultGroup.addCondition(\"isDraft\", \"=\", 1);\r\n }\r\n\r\n articlesDv.load()\r\n }\r\n }, { immediate: true })\r\n})\r\n\r\n/**\r\n * 删除文章\r\n */\r\nconst deleteArticleHandle = async (item: any) => {\r\n const isConfirm = await Dialoger.confirm({\r\n title: \"删除文章?\",\r\n message: \"是否删除文章?\",\r\n type: \"warning\"\r\n })\r\n\r\n if (!isConfirm) { return; }\r\n await articlesDv.deleteAfterRefresh(item.id);\r\n}\r\n\r\n/**\r\n * 编辑文章\r\n */\r\nconst editArticleHandle = (item: any, isEdit = false) => {\r\n router.push({ path: \"/cms/article\", query: { id: isEdit ? undefined : item.id, partId: isEdit ? item.id : undefined } })\r\n}\r\n\r\n// 添加记录\r\narticlesDv.addRecordEvent.on(() => editArticleHandle(props.part, true))\r\n\r\n/**\r\n * fault文章\r\n * @param article \r\n */\r\nconst publishArticleHandle = async (article: any) => {\r\n\r\n try {\r\n\r\n if (await Dialoger.confirm({ title: \"文章发布\", message: \"是否发布文章?\", type: \"warning\" })) {\r\n\r\n articlesDv.getLoadingManager().startLoading();\r\n\r\n // 调用发布接口\r\n const response: any = await CmsArticlesForm.publish(CmsSettings.publish.mode, article.cmsPartId, article.id);\r\n\r\n if (response.data.code !== 200) {\r\n Messager.error({ message: response.data.msg });\r\n return;\r\n }\r\n\r\n Messager.success({ message: \"发布成功\" });\r\n }\r\n\r\n } finally {\r\n articlesDv.getLoadingManager().completeLoading();\r\n }\r\n}\r\n\r\n\r\n</script>\r\n"],"names":["useCmsSettings","reactive","CmsArticlesTable","CmsArticlesForm","useRouter","Dialoger","onMounted","watch","isWhereFilter","Messager"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichElementNode.js","sources":["../../../../../../../src/components/basic/doc-editor/core/nodes/RichElementNode.ts"],"sourcesContent":["\r\n\r\n\r\n\r\n\r\nimport type { DOMConversionMap, SerializedElementNode, NodeKey, Spread, EditorConfig, DOMExportOutput, DOMConversion, LexicalNode } from 'lexical'\r\nimport { $isTextNode, ElementNode } from 'lexical'\r\n\r\n\r\n/**\r\n * 节点序列化 \r\n */\r\nexport type SerializedRichElementNode = Spread<{ tag: string, style?: string, class?: string | null }, SerializedElementNode>\r\n\r\n/**\r\n * 格子\r\n */\r\nexport class RichElementNode extends ElementNode {\r\n\r\n __tagName: string\r\n __class?: string | null | undefined\r\n __style: string\r\n\r\n static getType(): string { return \"rich-element\"; }\r\n\r\n static clone(node: RichElementNode): RichElementNode {\r\n return new RichElementNode(node.__tagName, node.__class, node.__style, node.__key)\r\n }\r\n\r\n static importJSON(serializedNode: SerializedRichElementNode): RichElementNode {\r\n return new RichElementNode(serializedNode.tag, serializedNode.class, serializedNode.style)\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n div: $covertRichElementDOM,\r\n section: $covertRichElementDOM,\r\n b: () => ({\r\n conversion: convertBringAttentionToElement,\r\n priority: 4\r\n }),\r\n code: () => ({\r\n conversion: convertTextFormatElement,\r\n priority: 4\r\n }),\r\n em: () => ({\r\n conversion: convertTextFormatElement,\r\n priority: 4\r\n }),\r\n i: () => ({\r\n conversion: convertTextFormatElement,\r\n priority: 4\r\n }),\r\n s: () => ({\r\n conversion: convertTextFormatElement,\r\n priority: 4\r\n }),\r\n span: () => ({\r\n conversion: convertSpanElement,\r\n priority: 4\r\n }),\r\n strong: () => ({\r\n conversion: convertTextFormatElement,\r\n priority: 4\r\n }),\r\n sub: () => ({\r\n conversion: convertTextFormatElement,\r\n priority: 4\r\n }),\r\n sup: () => ({\r\n conversion: convertTextFormatElement,\r\n priority: 4\r\n }),\r\n u: () => ({\r\n conversion: convertTextFormatElement,\r\n priority: 4\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * \r\n * @param tagName \r\n * @param className \r\n * @param style \r\n * @param key \r\n */\r\n constructor(tagName: string, className?: string | null, style?: string, key?: NodeKey) {\r\n super(key)\r\n this.__tagName = tagName,\r\n this.__class = className;\r\n this.__style = style || \"\";\r\n }\r\n\r\n\r\n /**\r\n * 导出JSON\r\n * @returns \r\n */\r\n exportJSON(): SerializedRichElementNode {\r\n return {\r\n ...super.exportJSON(),\r\n type: this.getType(),\r\n tag: this.__tagName,\r\n class: this.__class,\r\n style: this.__style,\r\n version: 1\r\n }\r\n }\r\n\r\n /**\r\n * 导出DOM\r\n * @returns \r\n */\r\n exportDOM(): DOMExportOutput {\r\n\r\n const element = document.createElement(this.__tagName)\r\n\r\n if (this.__class) {\r\n element.setAttribute(\"class\", this.__class)\r\n }\r\n\r\n if (this.__style) {\r\n element.setAttribute(\"style\", this.__style)\r\n }\r\n\r\n return { element }\r\n }\r\n\r\n /**\r\n * 创建渲染DOM\r\n * @param config \r\n * @returns \r\n */\r\n createDOM(config: EditorConfig): HTMLElement {\r\n return this.exportDOM().element as HTMLElement;\r\n }\r\n\r\n}\r\n\r\n\r\n/**\r\n * 转换DOM\r\n * @param node \r\n * @returns \r\n */\r\nconst $covertRichElementDOM = (domNode: HTMLElement): DOMConversion<HTMLElement> | null => {\r\n return {\r\n conversion: () => {\r\n return {\r\n node: new RichElementNode(domNode.tagName, domNode.getAttribute(\"class\"), domNode.getAttribute(\"style\") || \"\")\r\n };\r\n },\r\n priority: 3\r\n };\r\n}\r\n\r\n\r\n\r\nconst nodeNameToTextFormat: any = {\r\n code: \"code\",\r\n em: \"italic\",\r\n i: \"italic\",\r\n s: \"strikethrough\",\r\n strong: \"bold\",\r\n sub: \"subscript\",\r\n sup: \"superscript\",\r\n u: \"underline\"\r\n};\r\n\r\nfunction convertBringAttentionToElement(domNode: HTMLElement) {\r\n const b = domNode;\r\n const hasNormalFontWeight = b.style.fontWeight === \"normal\";\r\n return {\r\n forChild: applyTextFormatFromStyle(b.style, hasNormalFontWeight ? void 0 : \"bold\", domNode),\r\n node: null\r\n };\r\n}\r\n\r\nfunction convertTextFormatElement(domNode: HTMLElement) {\r\n const format = nodeNameToTextFormat[domNode.nodeName.toLowerCase()];\r\n if (format === void 0) {\r\n return {\r\n node: null\r\n };\r\n }\r\n return {\r\n forChild: applyTextFormatFromStyle(domNode.style, format, domNode),\r\n node: null\r\n };\r\n}\r\n\r\nfunction convertSpanElement(domNode: HTMLElement) {\r\n const span = domNode;\r\n const style = span.style;\r\n return {\r\n forChild: applyTextFormatFromStyle(style, null, domNode),\r\n node: null\r\n };\r\n}\r\n\r\nfunction applyTextFormatFromStyle(style: any, shouldApply: any, domNode: HTMLElement) {\r\n const fontWeight = style.fontWeight;\r\n const textDecoration = style.textDecoration.split(\" \");\r\n const hasBoldFontWeight = fontWeight === \"700\" || fontWeight === \"bold\";\r\n const hasLinethroughTextDecoration = textDecoration.includes(\"line-through\");\r\n const hasItalicFontStyle = style.fontStyle === \"italic\";\r\n const hasUnderlineTextDecoration = textDecoration.includes(\"underline\");\r\n const verticalAlign = style.verticalAlign;\r\n\r\n return (lexicalNode: LexicalNode) => {\r\n\r\n if (!$isTextNode(lexicalNode)) {\r\n return lexicalNode;\r\n }\r\n\r\n if (hasBoldFontWeight && !lexicalNode.hasFormat(\"bold\")) {\r\n lexicalNode.toggleFormat(\"bold\");\r\n }\r\n if (hasLinethroughTextDecoration && !lexicalNode.hasFormat(\"strikethrough\")) {\r\n lexicalNode.toggleFormat(\"strikethrough\");\r\n }\r\n if (hasItalicFontStyle && !lexicalNode.hasFormat(\"italic\")) {\r\n lexicalNode.toggleFormat(\"italic\");\r\n }\r\n if (hasUnderlineTextDecoration && !lexicalNode.hasFormat(\"underline\")) {\r\n lexicalNode.toggleFormat(\"underline\");\r\n }\r\n if (verticalAlign === \"sub\" && !lexicalNode.hasFormat(\"subscript\")) {\r\n lexicalNode.toggleFormat(\"subscript\");\r\n }\r\n if (verticalAlign === \"super\" && !lexicalNode.hasFormat(\"superscript\")) {\r\n lexicalNode.toggleFormat(\"superscript\");\r\n }\r\n if (shouldApply && !lexicalNode.hasFormat(shouldApply)) {\r\n lexicalNode.toggleFormat(shouldApply);\r\n }\r\n\r\n // let styleStr = \"\";\r\n\r\n // if(style.color){\r\n // styleStr += `color:${style.color};`\r\n // }\r\n // if(style.fontSize){\r\n // styleStr += `font-size:${style.fontSize};`\r\n // }\r\n // if(style.fontFamily){\r\n // styleStr += `font-family:${style.fontFamily};`\r\n // }\r\n // if(style.backgroundColor){\r\n // styleStr += `background-color:${style.backgroundColor};`\r\n // }\r\n\r\n // 行内样式\r\n const inlineStyle = domNode.getAttribute(\"style\")\r\n if (inlineStyle) {\r\n lexicalNode.setStyle(inlineStyle);\r\n }\r\n\r\n return lexicalNode;\r\n };\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RichElementNode.js","sources":["../../../../../../../src/components/basic/doc-editor/core/nodes/RichElementNode.ts"],"sourcesContent":["\r\n\r\n\r\n\r\n\r\nimport type { DOMConversionMap, SerializedElementNode, NodeKey, Spread, EditorConfig, DOMExportOutput, DOMConversion, LexicalNode } from 'lexical'\r\nimport { $isTextNode, ElementNode } from 'lexical'\r\n\r\n/**\r\n * 节点序列化 \r\n */\r\nexport type SerializedRichElementNode = Spread<{ tag: string, style?: string, class?: string | null }, SerializedElementNode>\r\n\r\n/**\r\n * 格子\r\n */\r\nexport class RichElementNode extends ElementNode {\r\n\r\n __tagName: string\r\n __class?: string | null | undefined\r\n __style: string\r\n\r\n static getType(): string { return \"rich-element\"; }\r\n\r\n static clone(node: RichElementNode): RichElementNode {\r\n return new RichElementNode(node.__tagName, node.__class, node.__style, node.__key)\r\n }\r\n\r\n static importJSON(serializedNode: SerializedRichElementNode): RichElementNode {\r\n return new RichElementNode(serializedNode.tag, serializedNode.class, serializedNode.style)\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n div: $covertRichElementDOM,\r\n section: $covertRichElementDOM,\r\n b: () => ({\r\n conversion: convertBringAttentionToElement,\r\n priority: 4\r\n }),\r\n code: () => ({\r\n conversion: convertTextFormatElement,\r\n priority: 4\r\n }),\r\n em: () => ({\r\n conversion: convertTextFormatElement,\r\n priority: 4\r\n }),\r\n i: () => ({\r\n conversion: convertTextFormatElement,\r\n priority: 4\r\n }),\r\n s: () => ({\r\n conversion: convertTextFormatElement,\r\n priority: 4\r\n }),\r\n span: () => ({\r\n conversion: convertSpanElement,\r\n priority: 4\r\n }),\r\n strong: () => ({\r\n conversion: convertTextFormatElement,\r\n priority: 4\r\n }),\r\n sub: () => ({\r\n conversion: convertTextFormatElement,\r\n priority: 4\r\n }),\r\n sup: () => ({\r\n conversion: convertTextFormatElement,\r\n priority: 4\r\n }),\r\n u: () => ({\r\n conversion: convertTextFormatElement,\r\n priority: 4\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * \r\n * @param tagName \r\n * @param className \r\n * @param style \r\n * @param key \r\n */\r\n constructor(tagName: string, className?: string | null, style?: string, key?: NodeKey) {\r\n super(key)\r\n this.__tagName = tagName,\r\n this.__class = className;\r\n this.__style = style || \"\";\r\n }\r\n\r\n\r\n /**\r\n * 导出JSON\r\n * @returns \r\n */\r\n exportJSON(): SerializedRichElementNode {\r\n return {\r\n ...super.exportJSON(),\r\n type: this.getType(),\r\n tag: this.__tagName,\r\n class: this.__class,\r\n style: this.__style,\r\n version: 1\r\n }\r\n }\r\n\r\n /**\r\n * 导出DOM\r\n * @returns \r\n */\r\n exportDOM(): DOMExportOutput {\r\n\r\n const element = document.createElement(this.__tagName)\r\n\r\n if (this.__class) {\r\n element.setAttribute(\"class\", this.__class)\r\n }\r\n\r\n if (this.__style) {\r\n element.setAttribute(\"style\", this.__style)\r\n }\r\n\r\n return { element }\r\n }\r\n\r\n /**\r\n * 创建渲染DOM\r\n * @param config \r\n * @returns \r\n */\r\n createDOM(config: EditorConfig): HTMLElement {\r\n return this.exportDOM().element as HTMLElement;\r\n }\r\n\r\n}\r\n\r\n\r\n/**\r\n * 转换DOM\r\n * @param node \r\n * @returns \r\n */\r\nconst $covertRichElementDOM = (domNode: HTMLElement): DOMConversion<HTMLElement> | null => {\r\n return {\r\n conversion: () => {\r\n return {\r\n node: new RichElementNode(domNode.tagName, domNode.getAttribute(\"class\"), domNode.getAttribute(\"style\") || \"\")\r\n };\r\n },\r\n priority: 3\r\n };\r\n}\r\n\r\nconst nodeNameToTextFormat: any = {\r\n code: \"code\",\r\n em: \"italic\",\r\n i: \"italic\",\r\n s: \"strikethrough\",\r\n strong: \"bold\",\r\n sub: \"subscript\",\r\n sup: \"superscript\",\r\n u: \"underline\"\r\n};\r\n\r\nfunction convertBringAttentionToElement(domNode: HTMLElement) {\r\n const b = domNode;\r\n const hasNormalFontWeight = b.style.fontWeight === \"normal\";\r\n return {\r\n forChild: applyTextFormatFromStyle(b.style, hasNormalFontWeight ? void 0 : \"bold\", domNode),\r\n node: null\r\n };\r\n}\r\n\r\nfunction convertTextFormatElement(domNode: HTMLElement) {\r\n const format = nodeNameToTextFormat[domNode.nodeName.toLowerCase()];\r\n if (format === void 0) {\r\n return {\r\n node: null\r\n };\r\n }\r\n return {\r\n forChild: applyTextFormatFromStyle(domNode.style, format, domNode),\r\n node: null\r\n };\r\n}\r\n\r\nfunction convertSpanElement(domNode: HTMLElement) {\r\n const span = domNode;\r\n const style = span.style;\r\n return {\r\n forChild: applyTextFormatFromStyle(style, null, domNode),\r\n node: null\r\n };\r\n}\r\n\r\nfunction applyTextFormatFromStyle(style: any, shouldApply: any, domNode: HTMLElement) {\r\n const fontWeight = style.fontWeight;\r\n const textDecoration = style.textDecoration.split(\" \");\r\n const hasBoldFontWeight = fontWeight === \"700\" || fontWeight === \"bold\";\r\n const hasLinethroughTextDecoration = textDecoration.includes(\"line-through\");\r\n const hasItalicFontStyle = style.fontStyle === \"italic\";\r\n const hasUnderlineTextDecoration = textDecoration.includes(\"underline\");\r\n const verticalAlign = style.verticalAlign;\r\n\r\n return (lexicalNode: LexicalNode) => {\r\n\r\n if (!$isTextNode(lexicalNode)) {\r\n return lexicalNode;\r\n }\r\n\r\n if (hasBoldFontWeight && !lexicalNode.hasFormat(\"bold\")) {\r\n lexicalNode.toggleFormat(\"bold\");\r\n }\r\n if (hasLinethroughTextDecoration && !lexicalNode.hasFormat(\"strikethrough\")) {\r\n lexicalNode.toggleFormat(\"strikethrough\");\r\n }\r\n if (hasItalicFontStyle && !lexicalNode.hasFormat(\"italic\")) {\r\n lexicalNode.toggleFormat(\"italic\");\r\n }\r\n if (hasUnderlineTextDecoration && !lexicalNode.hasFormat(\"underline\")) {\r\n lexicalNode.toggleFormat(\"underline\");\r\n }\r\n if (verticalAlign === \"sub\" && !lexicalNode.hasFormat(\"subscript\")) {\r\n lexicalNode.toggleFormat(\"subscript\");\r\n }\r\n if (verticalAlign === \"super\" && !lexicalNode.hasFormat(\"superscript\")) {\r\n lexicalNode.toggleFormat(\"superscript\");\r\n }\r\n if (shouldApply && !lexicalNode.hasFormat(shouldApply)) {\r\n lexicalNode.toggleFormat(shouldApply);\r\n }\r\n\r\n // let styleStr = \"\";\r\n\r\n // if(style.color){\r\n // styleStr += `color:${style.color};`\r\n // }\r\n // if(style.fontSize){\r\n // styleStr += `font-size:${style.fontSize};`\r\n // }\r\n // if(style.fontFamily){\r\n // styleStr += `font-family:${style.fontFamily};`\r\n // }\r\n // if(style.backgroundColor){\r\n // styleStr += `background-color:${style.backgroundColor};`\r\n // }\r\n\r\n // 行内样式\r\n const inlineStyle = domNode.getAttribute(\"style\")\r\n if (inlineStyle) {\r\n lexicalNode.setStyle(inlineStyle);\r\n }\r\n\r\n return lexicalNode;\r\n };\r\n}\r\n"],"names":[],"mappings":"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"}
|
package/dist/esm/components/basic/doc-editor/core/plugins/LexicalRichTextPlugin/index.vue.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent, ref, computed, watch, openBlock, createElementBlock,
|
|
1
|
+
import { defineComponent, ref, computed, watch, openBlock, createElementBlock, normalizeClass, unref, createVNode, toDisplayString, createCommentVNode } from "vue";
|
|
2
2
|
import { useCanShowPlaceholder } from "../../composables/useCanShowPlaceholder.js";
|
|
3
3
|
import "@lexical/overflow";
|
|
4
4
|
import "@lexical/text";
|
|
@@ -16,10 +16,10 @@ import "@lexical/rich-text";
|
|
|
16
16
|
import { $generateNodesFromDOM, $generateHtmlFromNodes } from "@lexical/html";
|
|
17
17
|
import _sfc_main$1 from "./ContentEditable.vue.js";
|
|
18
18
|
import DecoratedTeleports from "./DecoratedTeleports.js";
|
|
19
|
-
const _hoisted_1 = {
|
|
20
|
-
const _hoisted_2 = {
|
|
19
|
+
const _hoisted_1 = {
|
|
21
20
|
key: 0,
|
|
22
|
-
class: "mk-doc-editor__stage__placeholder mk-doc__paragraph"
|
|
21
|
+
class: "mk-doc-editor__stage__placeholder mk-doc__paragraph",
|
|
22
|
+
style: { "user-select": "text", "white-space": "pre-wrap", "word-break": "break-word" }
|
|
23
23
|
};
|
|
24
24
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
25
25
|
__name: "index",
|
|
@@ -64,11 +64,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
64
64
|
watch(htmlContent, (value) => emit("change", value));
|
|
65
65
|
useRichTextSetup(editor);
|
|
66
66
|
return (_ctx, _cache) => {
|
|
67
|
-
return openBlock(), createElementBlock("div",
|
|
67
|
+
return openBlock(), createElementBlock("div", {
|
|
68
|
+
class: normalizeClass(["mk-doc-editor__stage__editable", { placeholder: unref(canShowPlaceholder) && contentIsEmpty.value }])
|
|
69
|
+
}, [
|
|
68
70
|
createVNode(_sfc_main$1),
|
|
69
|
-
unref(canShowPlaceholder) && contentIsEmpty.value ? (openBlock(), createElementBlock("div",
|
|
71
|
+
unref(canShowPlaceholder) && contentIsEmpty.value ? (openBlock(), createElementBlock("div", _hoisted_1, toDisplayString(__props.placeholder), 1)) : createCommentVNode("", true),
|
|
70
72
|
createVNode(unref(DecoratedTeleports))
|
|
71
|
-
]);
|
|
73
|
+
], 2);
|
|
72
74
|
};
|
|
73
75
|
}
|
|
74
76
|
});
|
package/dist/esm/components/basic/doc-editor/core/plugins/LexicalRichTextPlugin/index.vue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.vue.js","sources":["../../../../../../../../src/components/basic/doc-editor/core/plugins/LexicalRichTextPlugin/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\n\r\nimport { ref,defineProps,computed,defineEmits,watch } from \"vue\"\r\nimport { useCanShowPlaceholder, useLexicalComposer, useRichTextSetup,useMounted } from '../../composables'\r\nimport { $getSelection ,$selectAll } from 'lexical'\r\nimport { $generateHtmlFromNodes,$generateNodesFromDOM } from '@lexical/html'\r\nimport ContentEditable from \"./ContentEditable.vue\"\r\nimport DecoratedTeleports from \"./DecoratedTeleports\"\r\n\r\n// 事件\r\nconst emit = defineEmits([\"change\"]);\r\n\r\n// 参数\r\nconst props = defineProps({\r\n content:{ type:String,default:`` },\r\n placeholder:{ type:String,default:`` }\r\n})\r\n\r\nconst editor = useLexicalComposer()\r\n\r\nconst canShowPlaceholder = useCanShowPlaceholder(editor)\r\n\r\nconst parser = new DOMParser();\r\n\r\n// html 内容\r\nconst htmlContent = ref(\"\");\r\n\r\n// 空内容\r\nconst contentIsEmpty = computed(()=>htmlContent.value == `<p class=\"mk-doc__paragraph\"><br></p>` || !htmlContent.value);\r\n\r\n// 设置 HTML\r\nconst setHtml = (html : any)=>{\r\n\r\n // 内容不同则重置 \r\n if(htmlContent.value != html){\r\n\r\n let nodes : Array<any> = [];\r\n\r\n htmlContent.value = html;\r\n\r\n editor.update(()=>{\r\n\r\n if(html.trim()){\r\n // Once you have the DOM instance it's easy to generate LexicalNodes.\r\n nodes = $generateNodesFromDOM(editor,parser.parseFromString(html.trim(),\"text/html\"));\r\n // console.log($generateNodesFromDOM,parser.parseFromString(html.trim(),\"text/html\"));\r\n }\r\n // 设置权限替换\r\n $selectAll();\r\n $getSelection()?.insertText(\"\")\r\n if(nodes.length > 0){\r\n $getSelection()?.insertNodes(nodes)
|
|
1
|
+
{"version":3,"file":"index.vue.js","sources":["../../../../../../../../src/components/basic/doc-editor/core/plugins/LexicalRichTextPlugin/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\n\r\nimport { ref,defineProps,computed,defineEmits,watch } from \"vue\"\r\nimport { useCanShowPlaceholder, useLexicalComposer, useRichTextSetup,useMounted } from '../../composables'\r\nimport { $getSelection ,$selectAll,$createParagraphNode } from 'lexical'\r\nimport { $insertNodeToNearestRoot } from '@lexical/utils'\r\nimport { $generateHtmlFromNodes,$generateNodesFromDOM } from '@lexical/html'\r\nimport ContentEditable from \"./ContentEditable.vue\"\r\nimport DecoratedTeleports from \"./DecoratedTeleports\"\r\n\r\n// 事件\r\nconst emit = defineEmits([\"change\"]);\r\n\r\n// 参数\r\nconst props = defineProps({\r\n content:{ type:String,default:`` },\r\n placeholder:{ type:String,default:`` }\r\n})\r\n\r\nconst editor = useLexicalComposer()\r\n\r\nconst canShowPlaceholder = useCanShowPlaceholder(editor)\r\n\r\nconst parser = new DOMParser();\r\n\r\n// html 内容\r\nconst htmlContent = ref(\"\");\r\n\r\n// 空内容\r\nconst contentIsEmpty = computed(()=>htmlContent.value == `<p class=\"mk-doc__paragraph\"><br></p>` || !htmlContent.value);\r\n\r\n// 设置 HTML\r\nconst setHtml = (html : any)=>{\r\n\r\n // 内容不同则重置 \r\n if(htmlContent.value != html){\r\n\r\n let nodes : Array<any> = [];\r\n\r\n htmlContent.value = html;\r\n\r\n editor.update(()=>{\r\n\r\n if(html.trim()){\r\n // Once you have the DOM instance it's easy to generate LexicalNodes.\r\n nodes = $generateNodesFromDOM(editor,parser.parseFromString(html.trim(),\"text/html\"));\r\n // console.log($generateNodesFromDOM,parser.parseFromString(html.trim(),\"text/html\"));\r\n }\r\n\r\n // 设置权限替换\r\n $selectAll();\r\n $getSelection()?.insertText(\"\")\r\n if(nodes.length > 0){\r\n $getSelection()?.insertNodes(nodes); \r\n }\r\n })\r\n }\r\n}\r\n\r\nuseMounted(()=>{\r\n return editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n htmlContent.value = $generateHtmlFromNodes(editor);\r\n })\r\n })\r\n})\r\n\r\n\r\n// 初始化\r\nwatch(()=>props.content,setHtml,{ immediate:true });\r\n\r\n// 监听内容变化\r\nwatch(htmlContent,(value:any)=>emit('change',value));\r\n\r\n// 使用富文本\r\nuseRichTextSetup(editor)\r\n\r\n</script>\r\n\r\n<template>\r\n <div class=\"mk-doc-editor__stage__editable\" :class=\"{placeholder:canShowPlaceholder && contentIsEmpty}\">\r\n <ContentEditable />\r\n <template v-if=\"canShowPlaceholder && contentIsEmpty\">\r\n <div class=\"mk-doc-editor__stage__placeholder mk-doc__paragraph\" style=\"user-select: text;white-space: pre-wrap;word-break: break-word;\">\r\n {{placeholder}}\r\n </div>\r\n </template>\r\n <DecoratedTeleports />\r\n </div>\r\n\r\n</template>\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,UAAM,OAAO;AAGb,UAAM,QAAQ;AAKd,UAAM,SAAS;AAET,UAAA,qBAAqB,sBAAsB,MAAM;AAEjD,UAAA,SAAS,IAAI;AAGb,UAAA,cAAc,IAAI,EAAE;AAGpB,UAAA,iBAAiB,SAAS,MAAI,YAAY,SAAS,2CAA2C,CAAC,YAAY,KAAK;AAGhH,UAAA,UAAU,CAAC,SAAa;AAGvB,UAAA,YAAY,SAAS,MAAK;AAE3B,YAAI,QAAqB,CAAA;AAEzB,oBAAY,QAAQ;AAEpB,eAAO,OAAO,MAAI;;AAEb,cAAA,KAAK,QAAO;AAEL,oBAAA,sBAAsB,QAAO,OAAO,gBAAgB,KAAK,KAAK,GAAE,WAAW,CAAC;AAAA,UAEtF;AAGW;AACG,8BAAA,MAAA,mBAAG,WAAW;AACzB,cAAA,MAAM,SAAS,GAAE;AACJ,gCAAA,MAAA,mBAAG,YAAY;AAAA,UAC/B;AAAA,QAAA,CACD;AAAA,MACH;AAAA,IAAA;AAGJ,eAAW,MAAI;AACb,aAAO,OAAO,uBAAuB,CAAC,EAAE,kBAAkB;AACxD,oBAAY,KAAK,MAAM;AACT,sBAAA,QAAQ,uBAAuB,MAAM;AAAA,QAAA,CAClD;AAAA,MAAA,CACF;AAAA,IAAA,CACF;AAID,UAAM,MAAI,MAAM,SAAQ,SAAQ,EAAE,WAAU,MAAM;AAGlD,UAAM,aAAY,CAAC,UAAY,KAAK,UAAS,KAAK,CAAC;AAGnD,qBAAiB,MAAM;;;;;;;;;;;;"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { createCommand } from "lexical";
|
|
2
2
|
const INSERT_TEMPLATE_COMMAND = createCommand("INSERT_TEMPLATE_COMMAND");
|
|
3
|
+
const INSERT_HTMLTEMPLATE_COMMAND = createCommand("INSERT_HTMLTEMPLATE_COMMAND");
|
|
3
4
|
export {
|
|
5
|
+
INSERT_HTMLTEMPLATE_COMMAND,
|
|
4
6
|
INSERT_TEMPLATE_COMMAND
|
|
5
7
|
};
|
|
6
8
|
//# sourceMappingURL=commands.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/TemplatePlugin/commands.ts"],"sourcesContent":["\r\n\r\nimport { type LexicalCommand, createCommand} from 'lexical'\r\n\r\n/**\r\n * 插入模版块指令\r\n */\r\nexport const INSERT_TEMPLATE_COMMAND: LexicalCommand<string> = createCommand('INSERT_TEMPLATE_COMMAND')\r\n"],"names":[],"mappings":";AAOa,MAAA,0BAAkD,cAAc,yBAAyB;"}
|
|
1
|
+
{"version":3,"file":"commands.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/TemplatePlugin/commands.ts"],"sourcesContent":["\r\n\r\nimport { type LexicalCommand, createCommand} from 'lexical'\r\n\r\n/**\r\n * 插入模版块指令\r\n */\r\nexport const INSERT_TEMPLATE_COMMAND: LexicalCommand<string> = createCommand('INSERT_TEMPLATE_COMMAND')\r\n\r\n/**\r\n * 插入HTML模版块指令\r\n */\r\nexport const INSERT_HTMLTEMPLATE_COMMAND: LexicalCommand<string> = createCommand('INSERT_HTMLTEMPLATE_COMMAND')\r\n"],"names":[],"mappings":";AAOa,MAAA,0BAAkD,cAAc,yBAAyB;AAKzF,MAAA,8BAAsD,cAAc,6BAA6B;"}
|
|
@@ -4,7 +4,7 @@ import { $generateNodesFromDOM } from "@lexical/html";
|
|
|
4
4
|
import { Dialoger } from "@maketribe/dm";
|
|
5
5
|
import { ElInput, ElButton } from "element-plus";
|
|
6
6
|
import { Search } from "@element-plus/icons-vue";
|
|
7
|
-
import { INSERT_TEMPLATE_COMMAND } from "./commands.js";
|
|
7
|
+
import { INSERT_TEMPLATE_COMMAND, INSERT_HTMLTEMPLATE_COMMAND } from "./commands.js";
|
|
8
8
|
import "@lexical/text";
|
|
9
9
|
import { mergeRegister, $insertNodeToNearestRoot } from "@lexical/utils";
|
|
10
10
|
import { useMounted } from "../../core/composables/useMounted.js";
|
|
@@ -25,12 +25,25 @@ const registerDocTemplate = (options) => {
|
|
|
25
25
|
}
|
|
26
26
|
};
|
|
27
27
|
const parser = new DOMParser();
|
|
28
|
+
const createTemplateNodes = (editor, html) => {
|
|
29
|
+
var dom = parser.parseFromString(html.trim(), "text/html");
|
|
30
|
+
for (let index = 0; index < dom.body.children.length; index++) {
|
|
31
|
+
const element = dom.body.children[index];
|
|
32
|
+
if (!element.classList.contains(`mk-doc__grid`)) {
|
|
33
|
+
element.classList.add(`mk-doc__grid`);
|
|
34
|
+
if (!element.classList.contains(`mk-doc__text-grid`)) {
|
|
35
|
+
element.classList.add(`mk-doc__text-grid`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return $generateNodesFromDOM(editor, dom);
|
|
40
|
+
};
|
|
28
41
|
const useTemplate = () => {
|
|
29
42
|
const editor = useLexicalComposer();
|
|
30
43
|
const findTemplateNodesByName = (name) => {
|
|
31
44
|
const template = Templates.find((item) => item.name == name);
|
|
32
45
|
if (template != null) {
|
|
33
|
-
return
|
|
46
|
+
return createTemplateNodes(editor, template.template);
|
|
34
47
|
}
|
|
35
48
|
throw new Error("未知的模版:【" + name + "】");
|
|
36
49
|
};
|
|
@@ -48,7 +61,18 @@ const useTemplate = () => {
|
|
|
48
61
|
}
|
|
49
62
|
return true;
|
|
50
63
|
}, COMMAND_PRIORITY_EDITOR)
|
|
51
|
-
)
|
|
64
|
+
), // 插入HTML模版
|
|
65
|
+
editor.registerCommand(INSERT_HTMLTEMPLATE_COMMAND, (html) => {
|
|
66
|
+
const selection = $getSelection();
|
|
67
|
+
const elementNode = $isNodeSelection(selection) ? selection == null ? void 0 : selection.getNodes()[0] : null;
|
|
68
|
+
const templateNodes = createTemplateNodes(editor, html);
|
|
69
|
+
if (elementNode) {
|
|
70
|
+
templateNodes.forEach((node) => elementNode.append(node));
|
|
71
|
+
} else {
|
|
72
|
+
templateNodes.forEach((node) => $insertNodeToNearestRoot(node));
|
|
73
|
+
}
|
|
74
|
+
return true;
|
|
75
|
+
}, COMMAND_PRIORITY_EDITOR);
|
|
52
76
|
});
|
|
53
77
|
};
|
|
54
78
|
const showTemplateSelectDialog = function() {
|
|
@@ -118,9 +142,54 @@ const showTemplateSelectDialog = function() {
|
|
|
118
142
|
});
|
|
119
143
|
});
|
|
120
144
|
};
|
|
145
|
+
const showHtmlTemplateDialog = function() {
|
|
146
|
+
return new Promise((resolve) => {
|
|
147
|
+
const contentInputValue = ref("");
|
|
148
|
+
const handleCancelClick = () => {
|
|
149
|
+
dialogInstance.destroy();
|
|
150
|
+
};
|
|
151
|
+
const handleConfirmClick = () => {
|
|
152
|
+
dialogInstance.destroy();
|
|
153
|
+
resolve(contentInputValue.value);
|
|
154
|
+
};
|
|
155
|
+
const dialogInstance = Dialoger.customRender({
|
|
156
|
+
title: "自定义HTML模版内容",
|
|
157
|
+
class: "mk-doc-editor__module-template_dialog",
|
|
158
|
+
width: "700px",
|
|
159
|
+
onClose: () => {
|
|
160
|
+
dialogInstance.destroy();
|
|
161
|
+
},
|
|
162
|
+
body: () => {
|
|
163
|
+
return createVNode(ElInput, {
|
|
164
|
+
"modelValue": contentInputValue.value,
|
|
165
|
+
"onUpdate:modelValue": ($event) => contentInputValue.value = $event,
|
|
166
|
+
"type": "textarea",
|
|
167
|
+
"autosize": {
|
|
168
|
+
minRows: 10,
|
|
169
|
+
maxRows: 20
|
|
170
|
+
}
|
|
171
|
+
}, null);
|
|
172
|
+
},
|
|
173
|
+
footer: () => {
|
|
174
|
+
return createVNode(Fragment, null, [createVNode(ElButton, {
|
|
175
|
+
"onClick": handleCancelClick
|
|
176
|
+
}, {
|
|
177
|
+
default: () => [createTextVNode("取消")]
|
|
178
|
+
}), createVNode(ElButton, {
|
|
179
|
+
"type": "primary",
|
|
180
|
+
"onClick": handleConfirmClick
|
|
181
|
+
}, {
|
|
182
|
+
default: () => [createTextVNode("确定")]
|
|
183
|
+
})]);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
};
|
|
121
188
|
export {
|
|
122
189
|
Templates,
|
|
190
|
+
createTemplateNodes,
|
|
123
191
|
registerDocTemplate,
|
|
192
|
+
showHtmlTemplateDialog,
|
|
124
193
|
showTemplateSelectDialog,
|
|
125
194
|
useTemplate
|
|
126
195
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composables.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/TemplatePlugin/composables.tsx"],"sourcesContent":["import { $getSelection, $isNodeSelection, COMMAND_PRIORITY_EDITOR, ElementNode, LexicalEditor, LexicalNode } from \"lexical\";\r\nimport { $generateNodesFromDOM } from \"@lexical/html\";\r\nimport { ref,Fragment } from \"vue\";\r\nimport { Dialoger } from \"@maketribe/dm\";\r\nimport { ElButton,ElInput } from \"element-plus\";\r\nimport { Search } from \"@element-plus/icons-vue\";\r\nimport { INSERT_TEMPLATE_COMMAND } from \"./commands\"\r\nimport { useMounted,useLexicalComposer } from \"../../core/composables\";\r\nimport { $insertNodeToNearestRoot, mergeRegister } from \"@lexical/utils\";\r\n\r\n/**\r\n * 模版类型\r\n */\r\nexport type TemplateType = {\r\n name:string,\r\n title:string,\r\n cover:string,\r\n template:string,\r\n editorCss?:string|null|undefined,\r\n}\r\n\r\n/**\r\n * 模版定义\r\n */\r\nexport const Templates:TemplateType[] = [];\r\n\r\n/**\r\n * 注册模版\r\n * @param options \r\n */\r\nexport const registerDocTemplate = (options:TemplateType) => {\r\n\r\n if(Templates.findIndex(item=>item.name == options.name) >= 0){\r\n console.warn(`模版【${options.title}】重复注册!`);\r\n }\r\n else{\r\n Templates.push(options);\r\n }\r\n}\r\n\r\n/**\r\n * 卸载模块\r\n * @param name \r\n */\r\nexport const unRegisterDocTemplate = (name:string) => {\r\n\r\n for(let i = 0;i < Templates.length; i++){\r\n if(Templates[i].name == name){\r\n Templates.splice(i,1);\r\n break;\r\n }\r\n }\r\n}\r\n\r\n// dom 解析器\r\nconst parser = new DOMParser();\r\n\r\n/**\r\n * \r\n * @param name \r\n * @returns \r\n */\r\nexport const useTemplate = () => {\r\n\r\n // 编辑器\r\n const editor = useLexicalComposer()\r\n\r\n const findTemplateNodesByName = (name:string):LexicalNode[] => {\r\n\r\n const template = Templates.find(item=>item.name == name);\r\n\r\n if(template != null){\r\n return $generateNodesFromDOM(editor,parser.parseFromString(template.template.trim(),\"text/html\"));\r\n }\r\n\r\n throw new Error(\"未知的模版:【\" + name + \"】\");\r\n }\r\n\r\n // 编辑器挂载\r\n useMounted(()=>{\r\n\r\n return mergeRegister(\r\n // 插入模版\r\n editor.registerCommand<string>(INSERT_TEMPLATE_COMMAND,(name) => {\r\n\r\n const selection = $getSelection()\r\n const elementNode = $isNodeSelection(selection) ? selection?.getNodes()[0] as ElementNode : null;\r\n const templateNodes = findTemplateNodesByName(name)\r\n\r\n if (elementNode) {\r\n templateNodes.forEach(node=> elementNode.append(node))\r\n }\r\n else{\r\n templateNodes.forEach(node=> $insertNodeToNearestRoot(node))\r\n }\r\n return true\r\n },COMMAND_PRIORITY_EDITOR)\r\n )\r\n })\r\n\r\n\r\n}\r\n\r\n\r\n/**\r\n * 显示模块模版选择\r\n * @returns \r\n */\r\nexport const showTemplateSelectDialog = function():Promise<string> {\r\n\r\n return new Promise<string>((resolve:any)=> {\r\n\r\n const selectOption = ref<TemplateType|null>(null);\r\n const searchInputValue = ref(\"\");\r\n\r\n // 取消编辑\r\n const handleCancelClick = () => {\r\n dialogInstance.destroy();\r\n };\r\n\r\n // 确认编辑\r\n const handleConfirmClick = () => {\r\n dialogInstance.destroy();\r\n resolve(selectOption.value?.name);\r\n };\r\n\r\n // 点击块\r\n const clickHandle = (item:any)=>{\r\n selectOption.value = item;\r\n }\r\n\r\n const dialogInstance = Dialoger.customRender({\r\n title: \"模版选择\",\r\n class: \"mk-doc-editor__module-template_dialog\",\r\n width: \"700px\",\r\n onClose: () => {\r\n dialogInstance.destroy();\r\n },\r\n body: () => {\r\n\r\n // 循环体\r\n const templateListComponent = Templates.filter(item=>{\r\n if(searchInputValue.value){\r\n return item.name.indexOf(searchInputValue.value) >= 0 || item.title.indexOf(searchInputValue.value) >= 0\r\n }\r\n else{\r\n return true;\r\n }\r\n }).map(item=>{\r\n\r\n return <div \r\n class={`mk-doc-editor__module-template_dialog_list-item ${(item.cover ? 'cover':'')} ${(selectOption.value?.name == item.name ? 'active':'')}`} \r\n onClick={()=>clickHandle(item)}>\r\n {item.cover ? <img src={item.cover} /> :null}\r\n <div class=\"mk-doc-editor__module-template_dialog_list-item_title\">{item.title}</div>\r\n </div>\r\n })\r\n\r\n return <div class=\"mk-doc-editor__module-template_dialog_warp\">\r\n <ElInput v-model={searchInputValue.value} prefix-icon={Search} clearable={true} />\r\n <div class=\"mk-doc-editor__module-template_dialog_list-body\">\r\n {templateListComponent}\r\n </div>\r\n </div>\r\n },\r\n footer: () => {\r\n return <Fragment>\r\n <ElButton onClick={handleCancelClick}>取消</ElButton>\r\n <ElButton type=\"primary\" onClick={handleConfirmClick} disabled={!selectOption.value}>\r\n 确定\r\n </ElButton>\r\n </Fragment>\r\n },\r\n });\r\n });\r\n}\r\n"],"names":["Templates","registerDocTemplate","options","findIndex","item","name","console","warn","title","push","parser","DOMParser","useTemplate","editor","useLexicalComposer","findTemplateNodesByName","template","find","$generateNodesFromDOM","parseFromString","trim","Error","useMounted","mergeRegister","registerCommand","INSERT_TEMPLATE_COMMAND","selection","$getSelection","elementNode","$isNodeSelection","getNodes","templateNodes","forEach","node","append","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","showTemplateSelectDialog","Promise","resolve","selectOption","ref","searchInputValue","handleCancelClick","dialogInstance","destroy","handleConfirmClick","value","clickHandle","Dialoger","customRender","class","width","onClose","body","templateListComponent","filter","indexOf","map","_createVNode","cover","onClick","ElInput","$event","Search","footer","_Fragment","ElButton","default","_createTextVNode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"composables.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/TemplatePlugin/composables.tsx"],"sourcesContent":["import { $getSelection, $isNodeSelection, COMMAND_PRIORITY_EDITOR, ElementNode, LexicalEditor, LexicalNode } from \"lexical\";\r\nimport { $generateNodesFromDOM } from \"@lexical/html\";\r\nimport { ref,Fragment } from \"vue\";\r\nimport { Dialoger } from \"@maketribe/dm\";\r\nimport { ElButton,ElInput } from \"element-plus\";\r\nimport { Search } from \"@element-plus/icons-vue\";\r\nimport { INSERT_TEMPLATE_COMMAND,INSERT_HTMLTEMPLATE_COMMAND } from \"./commands\"\r\nimport { useMounted,useLexicalComposer } from \"../../core/composables\";\r\nimport { $insertNodeToNearestRoot, mergeRegister } from \"@lexical/utils\";\r\n\r\n/**\r\n * 模版类型\r\n */\r\nexport type TemplateType = {\r\n name:string,\r\n title:string,\r\n cover:string,\r\n template:string,\r\n editorCss?:string|null|undefined,\r\n}\r\n\r\n/**\r\n * 模版定义\r\n */\r\nexport const Templates:TemplateType[] = [];\r\n\r\n/**\r\n * 注册模版\r\n * @param options \r\n */\r\nexport const registerDocTemplate = (options:TemplateType) => {\r\n\r\n if(Templates.findIndex(item=>item.name == options.name) >= 0){\r\n console.warn(`模版【${options.title}】重复注册!`);\r\n }\r\n else{\r\n Templates.push(options);\r\n }\r\n}\r\n\r\n/**\r\n * 卸载模块\r\n * @param name \r\n */\r\nexport const unRegisterDocTemplate = (name:string) => {\r\n\r\n for(let i = 0;i < Templates.length; i++){\r\n if(Templates[i].name == name){\r\n Templates.splice(i,1);\r\n break;\r\n }\r\n }\r\n}\r\n\r\n// dom 解析器\r\nconst parser = new DOMParser();\r\n\r\n// 创建节点\r\nexport const createTemplateNodes = (editor:LexicalEditor,html:string)=>{\r\n\r\n var dom = parser.parseFromString(html.trim(),\"text/html\");\r\n \r\n for (let index = 0; index < dom.body.children.length; index++) {\r\n const element = dom.body.children[index];\r\n if(!element.classList.contains(`mk-doc__grid`)){\r\n element.classList.add(`mk-doc__grid`);\r\n if(!element.classList.contains(`mk-doc__text-grid`)){\r\n element.classList.add(`mk-doc__text-grid`)\r\n }\r\n }\r\n \r\n }\r\n\r\n return $generateNodesFromDOM(editor,dom);\r\n}\r\n\r\n/**\r\n * \r\n * @param name \r\n * @returns \r\n */\r\nexport const useTemplate = () => {\r\n\r\n // 编辑器\r\n const editor = useLexicalComposer()\r\n\r\n const findTemplateNodesByName = (name:string):LexicalNode[] => {\r\n\r\n const template = Templates.find(item=>item.name == name);\r\n\r\n if(template != null){\r\n return createTemplateNodes(editor, template.template);\r\n }\r\n\r\n throw new Error(\"未知的模版:【\" + name + \"】\");\r\n }\r\n\r\n // 编辑器挂载\r\n useMounted(()=>{\r\n\r\n return mergeRegister(\r\n // 插入模版\r\n editor.registerCommand<string>(INSERT_TEMPLATE_COMMAND,(name) => {\r\n\r\n const selection = $getSelection()\r\n const elementNode = $isNodeSelection(selection) ? selection?.getNodes()[0] as ElementNode : null;\r\n const templateNodes = findTemplateNodesByName(name)\r\n\r\n if (elementNode) {\r\n templateNodes.forEach(node=> elementNode.append(node))\r\n }\r\n else{\r\n templateNodes.forEach(node=> $insertNodeToNearestRoot(node))\r\n }\r\n return true\r\n },COMMAND_PRIORITY_EDITOR)\r\n ),\r\n // 插入HTML模版\r\n editor.registerCommand<string>(INSERT_HTMLTEMPLATE_COMMAND,(html) => {\r\n\r\n const selection = $getSelection()\r\n const elementNode = $isNodeSelection(selection) ? selection?.getNodes()[0] as ElementNode : null;\r\n const templateNodes = createTemplateNodes(editor, html);\r\n if (elementNode) {\r\n templateNodes.forEach(node=> elementNode.append(node))\r\n }\r\n else{\r\n templateNodes.forEach(node=> $insertNodeToNearestRoot(node))\r\n }\r\n return true\r\n },COMMAND_PRIORITY_EDITOR)\r\n })\r\n\r\n\r\n}\r\n\r\n\r\n/**\r\n * 显示模块模版选择\r\n * @returns \r\n */\r\nexport const showTemplateSelectDialog = function():Promise<string> {\r\n\r\n return new Promise<string>((resolve:any)=> {\r\n\r\n const selectOption = ref<TemplateType|null>(null);\r\n const searchInputValue = ref(\"\");\r\n\r\n // 取消编辑\r\n const handleCancelClick = () => {\r\n dialogInstance.destroy();\r\n };\r\n\r\n // 确认编辑\r\n const handleConfirmClick = () => {\r\n dialogInstance.destroy();\r\n resolve(selectOption.value?.name);\r\n };\r\n\r\n // 点击块\r\n const clickHandle = (item:any)=>{\r\n selectOption.value = item;\r\n }\r\n\r\n const dialogInstance = Dialoger.customRender({\r\n title: \"模版选择\",\r\n class: \"mk-doc-editor__module-template_dialog\",\r\n width: \"700px\",\r\n onClose: () => {\r\n dialogInstance.destroy();\r\n },\r\n body: () => {\r\n\r\n // 循环体\r\n const templateListComponent = Templates.filter(item=>{\r\n if(searchInputValue.value){\r\n return item.name.indexOf(searchInputValue.value) >= 0 || item.title.indexOf(searchInputValue.value) >= 0\r\n }\r\n else{\r\n return true;\r\n }\r\n }).map(item=>{\r\n\r\n return <div \r\n class={`mk-doc-editor__module-template_dialog_list-item ${(item.cover ? 'cover':'')} ${(selectOption.value?.name == item.name ? 'active':'')}`} \r\n onClick={()=>clickHandle(item)}>\r\n {item.cover ? <img src={item.cover} /> :null}\r\n <div class=\"mk-doc-editor__module-template_dialog_list-item_title\">{item.title}</div>\r\n </div>\r\n })\r\n\r\n return <div class=\"mk-doc-editor__module-template_dialog_warp\">\r\n <ElInput v-model={searchInputValue.value} prefix-icon={Search} clearable={true} />\r\n <div class=\"mk-doc-editor__module-template_dialog_list-body\">\r\n {templateListComponent}\r\n </div>\r\n </div>\r\n },\r\n footer: () => {\r\n return <Fragment>\r\n <ElButton onClick={handleCancelClick}>取消</ElButton>\r\n <ElButton type=\"primary\" onClick={handleConfirmClick} disabled={!selectOption.value}>\r\n 确定\r\n </ElButton>\r\n </Fragment>\r\n },\r\n });\r\n });\r\n}\r\n\r\n\r\n/**\r\n * html模版弹窗\r\n * @returns \r\n */\r\nexport const showHtmlTemplateDialog = function():Promise<string> {\r\n\r\n return new Promise<string>((resolve:any)=> {\r\n\r\n const contentInputValue = ref(\"\");\r\n\r\n // 取消编辑\r\n const handleCancelClick = () => {\r\n dialogInstance.destroy();\r\n };\r\n\r\n // 确认编辑\r\n const handleConfirmClick = () => {\r\n dialogInstance.destroy();\r\n resolve(contentInputValue.value);\r\n };\r\n\r\n const dialogInstance = Dialoger.customRender({\r\n title: \"自定义HTML模版内容\",\r\n class: \"mk-doc-editor__module-template_dialog\",\r\n width: \"700px\",\r\n onClose: () => {\r\n dialogInstance.destroy();\r\n },\r\n body: () => {\r\n return <ElInput v-model={contentInputValue.value} type=\"textarea\" autosize={{minRows:10,maxRows:20}} />\r\n },\r\n footer: () => {\r\n return <Fragment>\r\n <ElButton onClick={handleCancelClick}>取消</ElButton>\r\n <ElButton type=\"primary\" onClick={handleConfirmClick}>\r\n 确定\r\n </ElButton>\r\n </Fragment>\r\n },\r\n });\r\n });\r\n}\r\n"],"names":["Templates","registerDocTemplate","options","findIndex","item","name","console","warn","title","push","parser","DOMParser","createTemplateNodes","editor","html","dom","parseFromString","trim","index","body","children","length","element","classList","contains","add","$generateNodesFromDOM","useTemplate","useLexicalComposer","findTemplateNodesByName","template","find","Error","useMounted","mergeRegister","registerCommand","INSERT_TEMPLATE_COMMAND","selection","$getSelection","elementNode","$isNodeSelection","getNodes","templateNodes","forEach","node","append","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","INSERT_HTMLTEMPLATE_COMMAND","showTemplateSelectDialog","Promise","resolve","selectOption","ref","searchInputValue","handleCancelClick","dialogInstance","destroy","handleConfirmClick","value","clickHandle","Dialoger","customRender","class","width","onClose","templateListComponent","filter","indexOf","map","_createVNode","cover","onClick","ElInput","$event","Search","footer","_Fragment","ElButton","default","_createTextVNode","showHtmlTemplateDialog","contentInputValue","minRows","maxRows"],"mappings":"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"}
|
|
@@ -11,8 +11,8 @@ import "@lexical/dragon";
|
|
|
11
11
|
import "@lexical/plain-text";
|
|
12
12
|
import "@lexical/rich-text";
|
|
13
13
|
import { registerDocEditorToolbarExtend } from "../../core/index.js";
|
|
14
|
-
import { useTemplate, showTemplateSelectDialog } from "./composables.js";
|
|
15
|
-
import { INSERT_TEMPLATE_COMMAND } from "./commands.js";
|
|
14
|
+
import { useTemplate, showTemplateSelectDialog, showHtmlTemplateDialog } from "./composables.js";
|
|
15
|
+
import { INSERT_TEMPLATE_COMMAND, INSERT_HTMLTEMPLATE_COMMAND } from "./commands.js";
|
|
16
16
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
17
17
|
__name: "index",
|
|
18
18
|
setup(__props) {
|
|
@@ -25,6 +25,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
25
25
|
},
|
|
26
26
|
sort: 90
|
|
27
27
|
});
|
|
28
|
+
registerDocEditorToolbarExtend({
|
|
29
|
+
icon: "html-code",
|
|
30
|
+
text: "HTML模版",
|
|
31
|
+
action: async () => {
|
|
32
|
+
editor.dispatchCommand(INSERT_HTMLTEMPLATE_COMMAND, await showHtmlTemplateDialog());
|
|
33
|
+
},
|
|
34
|
+
sort: 89
|
|
35
|
+
});
|
|
28
36
|
useTemplate();
|
|
29
37
|
return (_ctx, _cache) => {
|
|
30
38
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.vue.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/TemplatePlugin/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\n\r\nimport { useLexicalComposer } from '../../core/composables'\r\nimport { registerDocEditorToolbarExtend,type ToolbarExtendPlugin } from \"../../core\"\r\nimport { showTemplateSelectDialog,useTemplate } from \"./composables\"\r\nimport { INSERT_TEMPLATE_COMMAND } from \"./commands\"\r\n\r\n
|
|
1
|
+
{"version":3,"file":"index.vue.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/TemplatePlugin/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\n\r\nimport { useLexicalComposer } from '../../core/composables'\r\nimport { registerDocEditorToolbarExtend,type ToolbarExtendPlugin } from \"../../core\"\r\nimport { showTemplateSelectDialog,showHtmlTemplateDialog, useTemplate } from \"./composables\"\r\nimport { INSERT_TEMPLATE_COMMAND,INSERT_HTMLTEMPLATE_COMMAND } from \"./commands\"\r\n\r\n // 编辑器\r\n const editor = useLexicalComposer()\r\n\r\n // 注册到工具条\r\n registerDocEditorToolbarExtend({\r\n icon:\"richtext\",\r\n text:\"模版\",\r\n action:async ()=>{\r\n editor.dispatchCommand(INSERT_TEMPLATE_COMMAND,await showTemplateSelectDialog())\r\n },\r\n sort:90\r\n } as ToolbarExtendPlugin)\r\n // 注册到工具条\r\n registerDocEditorToolbarExtend({\r\n icon:\"html-code\",\r\n text:\"HTML模版\",\r\n action:async ()=>{\r\n editor.dispatchCommand(INSERT_HTMLTEMPLATE_COMMAND,await showHtmlTemplateDialog())\r\n },\r\n sort:89\r\n } as ToolbarExtendPlugin)\r\n\r\n useTemplate();\r\n</script>\r\n\r\n<template></template>\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAQE,UAAM,SAAS;AAGgB,mCAAA;AAAA,MAC7B,MAAK;AAAA,MACL,MAAK;AAAA,MACL,QAAO,YAAU;AACf,eAAO,gBAAgB,yBAAwB,MAAM,yBAA0B,CAAA;AAAA,MACjF;AAAA,MACA,MAAK;AAAA,IAAA,CACiB;AAEO,mCAAA;AAAA,MAC7B,MAAK;AAAA,MACL,MAAK;AAAA,MACL,QAAO,YAAU;AACf,eAAO,gBAAgB,6BAA4B,MAAM,uBAAwB,CAAA;AAAA,MACnF;AAAA,MACA,MAAK;AAAA,IAAA,CACiB;AAEZ;;;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const DocEditorEditCss = '\r\n.mk-doc__img {\r\n cursor: pointer;\r\n z-index: 1;\r\n position: relative;\r\n}\r\n\r\n.mk-doc__grid{\r\n outline: 2px solid #eff5ff;\r\n position: relative;\r\n cursor: pointer;\r\n white-space:initial;\r\n word-break:initial;\r\n min-height: 20px;\r\n}\r\n\r\n/* 文本框可编辑文字 */\r\n.mk-doc__grid.mk-doc__text-grid :not(.mk-doc__grid){\r\n cursor: text;\r\n}\r\n\r\n/* 图文环绕容器下的文本框不做选中 */\r\n.mk-doc__grid.mk-doc__image-text .mk-doc__text-grid{\r\n outline: 0;\r\n padding-top: 0;\r\n}\r\n.mk-doc__grid.mk-doc__image-text img{\r\n position: relative;\r\n z-index: 1;\r\n}\r\n\r\n\r\n\r\n/* 避免模块下的a标签点击 */\r\n.mk-doc__grid.mk-doc__module-grid a{\r\n pointer-events: none;\r\n}\r\n\r\n/* 给布局下的格子加内边距方便编辑 */\r\n/* .mk-doc__grid.mk-doc__layout-grid >.mk-doc__grid{\r\n margin: 10px;\r\n} */\r\n.mk-doc-active-grid-mark{\r\n text-align: center;\r\n background-color: #eff5ff;\r\n color: #4284ff;\r\n left: -20px;\r\n top: 0px;\r\n pointer-events: all;\r\n font-size: 14px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 999; \r\n width: 20px;\r\n cursor: pointer;\r\n font-size: 12px;\r\n padding: 5px 0;\r\n}\r\n\r\n/* 块选中 */\r\n.mk-doc__embedBlock {\r\n position: relative;\r\n z-index: 1;\r\n padding: 1px;\r\n cursor: pointer;\r\n}\r\n.mk-doc__embedBlockFocus {\r\n outline: 2px solid rgb(60, 132, 244);\r\n}\r\n\r\n.mk-doc__embedBlock >*{\r\n pointer-events: none;\r\n}\r\n\r\np{ margin: 0; }\r\n\r\n/* 段落的编辑样式 */\r\n.mk-doc__paragraph>br{ \r\n display: none;\r\n}\r\n.mk-doc__paragraph::after{ \r\n content: "↩︎";\r\n margin-left: 8px;\r\n color: #ccc;\r\n}\r\n';
|
|
1
|
+
const DocEditorEditCss = '\r\n.mk-doc__img {\r\n cursor: pointer;\r\n z-index: 1;\r\n position: relative;\r\n}\r\n\r\n.mk-doc__grid{\r\n outline: 2px solid #eff5ff;\r\n position: relative;\r\n cursor: pointer;\r\n white-space:initial;\r\n word-break:initial;\r\n min-height: 20px;\r\n}\r\n\r\n/* 文本框可编辑文字 */\r\n.mk-doc__grid.mk-doc__text-grid :not(.mk-doc__grid){\r\n cursor: text;\r\n}\r\n\r\n/* 图文环绕容器下的文本框不做选中 */\r\n.mk-doc__grid.mk-doc__image-text .mk-doc__text-grid{\r\n outline: 0;\r\n padding-top: 0;\r\n}\r\n.mk-doc__grid.mk-doc__image-text img{\r\n position: relative;\r\n z-index: 1;\r\n}\r\n\r\n\r\n\r\n/* 避免模块下的a标签点击 */\r\n.mk-doc__grid.mk-doc__module-grid a{\r\n pointer-events: none;\r\n}\r\n\r\n/* 给布局下的格子加内边距方便编辑 */\r\n/* .mk-doc__grid.mk-doc__layout-grid >.mk-doc__grid{\r\n margin: 10px;\r\n} */\r\n.mk-doc-active-grid-mark{\r\n text-align: center;\r\n background-color: #eff5ff;\r\n color: #4284ff;\r\n left: -20px;\r\n top: 0px;\r\n pointer-events: all;\r\n font-size: 14px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 999; \r\n width: 20px;\r\n cursor: pointer;\r\n font-size: 12px;\r\n padding: 5px 0;\r\n}\r\n\r\n/* 块选中 */\r\n.mk-doc__embedBlock {\r\n position: relative;\r\n z-index: 1;\r\n padding: 1px;\r\n cursor: pointer;\r\n}\r\n.mk-doc__embedBlockFocus {\r\n outline: 2px solid rgb(60, 132, 244);\r\n}\r\n\r\n.mk-doc__embedBlock >*{\r\n pointer-events: none;\r\n}\r\n\r\np{ margin: 0; }\r\n\r\n/* 段落的编辑样式 */\r\n.mk-doc__paragraph>br{ \r\n display: none;\r\n}\r\n.mk-doc__paragraph::after{ \r\n content: "↩︎";\r\n margin-left: 8px;\r\n color: #ccc;\r\n}\r\n.placeholder .mk-doc__paragraph::after{ \r\n display: none;\r\n}\r\n';
|
|
2
2
|
export {
|
|
3
3
|
DocEditorEditCss as default
|
|
4
4
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc-editor-edit.css.js","sources":["../../../../../../src/components/basic/doc-editor/themes/doc-editor-edit.css?raw"],"sourcesContent":["export default \"\\r\\n.mk-doc__img {\\r\\n cursor: pointer;\\r\\n z-index: 1;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.mk-doc__grid{\\r\\n outline: 2px solid #eff5ff;\\r\\n position: relative;\\r\\n cursor: pointer;\\r\\n white-space:initial;\\r\\n word-break:initial;\\r\\n min-height: 20px;\\r\\n}\\r\\n\\r\\n/* 文本框可编辑文字 */\\r\\n.mk-doc__grid.mk-doc__text-grid :not(.mk-doc__grid){\\r\\n cursor: text;\\r\\n}\\r\\n\\r\\n/* 图文环绕容器下的文本框不做选中 */\\r\\n.mk-doc__grid.mk-doc__image-text .mk-doc__text-grid{\\r\\n outline: 0;\\r\\n padding-top: 0;\\r\\n}\\r\\n.mk-doc__grid.mk-doc__image-text img{\\r\\n position: relative;\\r\\n z-index: 1;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/* 避免模块下的a标签点击 */\\r\\n.mk-doc__grid.mk-doc__module-grid a{\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n/* 给布局下的格子加内边距方便编辑 */\\r\\n/* .mk-doc__grid.mk-doc__layout-grid >.mk-doc__grid{\\r\\n margin: 10px;\\r\\n} */\\r\\n.mk-doc-active-grid-mark{\\r\\n text-align: center;\\r\\n background-color: #eff5ff;\\r\\n color: #4284ff;\\r\\n left: -20px;\\r\\n top: 0px;\\r\\n pointer-events: all;\\r\\n font-size: 14px;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n z-index: 999; \\r\\n width: 20px;\\r\\n cursor: pointer;\\r\\n font-size: 12px;\\r\\n padding: 5px 0;\\r\\n}\\r\\n\\r\\n/* 块选中 */\\r\\n.mk-doc__embedBlock {\\r\\n position: relative;\\r\\n z-index: 1;\\r\\n padding: 1px;\\r\\n cursor: pointer;\\r\\n}\\r\\n.mk-doc__embedBlockFocus {\\r\\n outline: 2px solid rgb(60, 132, 244);\\r\\n}\\r\\n\\r\\n.mk-doc__embedBlock >*{\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\np{ margin: 0; }\\r\\n\\r\\n/* 段落的编辑样式 */\\r\\n.mk-doc__paragraph>br{ \\r\\n display: none;\\r\\n}\\r\\n.mk-doc__paragraph::after{ \\r\\n content: \\\"↩︎\\\";\\r\\n margin-left: 8px;\\r\\n color: #ccc;\\r\\n}\\r\\n\""],"names":[],"mappings":"AAAA,MAAe,mBAAA;"}
|
|
1
|
+
{"version":3,"file":"doc-editor-edit.css.js","sources":["../../../../../../src/components/basic/doc-editor/themes/doc-editor-edit.css?raw"],"sourcesContent":["export default \"\\r\\n.mk-doc__img {\\r\\n cursor: pointer;\\r\\n z-index: 1;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.mk-doc__grid{\\r\\n outline: 2px solid #eff5ff;\\r\\n position: relative;\\r\\n cursor: pointer;\\r\\n white-space:initial;\\r\\n word-break:initial;\\r\\n min-height: 20px;\\r\\n}\\r\\n\\r\\n/* 文本框可编辑文字 */\\r\\n.mk-doc__grid.mk-doc__text-grid :not(.mk-doc__grid){\\r\\n cursor: text;\\r\\n}\\r\\n\\r\\n/* 图文环绕容器下的文本框不做选中 */\\r\\n.mk-doc__grid.mk-doc__image-text .mk-doc__text-grid{\\r\\n outline: 0;\\r\\n padding-top: 0;\\r\\n}\\r\\n.mk-doc__grid.mk-doc__image-text img{\\r\\n position: relative;\\r\\n z-index: 1;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/* 避免模块下的a标签点击 */\\r\\n.mk-doc__grid.mk-doc__module-grid a{\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n/* 给布局下的格子加内边距方便编辑 */\\r\\n/* .mk-doc__grid.mk-doc__layout-grid >.mk-doc__grid{\\r\\n margin: 10px;\\r\\n} */\\r\\n.mk-doc-active-grid-mark{\\r\\n text-align: center;\\r\\n background-color: #eff5ff;\\r\\n color: #4284ff;\\r\\n left: -20px;\\r\\n top: 0px;\\r\\n pointer-events: all;\\r\\n font-size: 14px;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n z-index: 999; \\r\\n width: 20px;\\r\\n cursor: pointer;\\r\\n font-size: 12px;\\r\\n padding: 5px 0;\\r\\n}\\r\\n\\r\\n/* 块选中 */\\r\\n.mk-doc__embedBlock {\\r\\n position: relative;\\r\\n z-index: 1;\\r\\n padding: 1px;\\r\\n cursor: pointer;\\r\\n}\\r\\n.mk-doc__embedBlockFocus {\\r\\n outline: 2px solid rgb(60, 132, 244);\\r\\n}\\r\\n\\r\\n.mk-doc__embedBlock >*{\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\np{ margin: 0; }\\r\\n\\r\\n/* 段落的编辑样式 */\\r\\n.mk-doc__paragraph>br{ \\r\\n display: none;\\r\\n}\\r\\n.mk-doc__paragraph::after{ \\r\\n content: \\\"↩︎\\\";\\r\\n margin-left: 8px;\\r\\n color: #ccc;\\r\\n}\\r\\n.placeholder .mk-doc__paragraph::after{ \\r\\n display: none;\\r\\n}\\r\\n\""],"names":[],"mappings":"AAAA,MAAe,mBAAA;"}
|
|
@@ -72,6 +72,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
72
72
|
const emit = __emit;
|
|
73
73
|
const i18n = useI18n();
|
|
74
74
|
const dataTree = reactive(new CmsPartTree());
|
|
75
|
+
const isDrag = ref(false);
|
|
75
76
|
const selectNodeId = ref(optionSettings.curSelectId);
|
|
76
77
|
watch(() => optionSettings.curSelectId, () => {
|
|
77
78
|
selectNodeId.value = optionSettings.curSelectId;
|
|
@@ -119,6 +120,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
119
120
|
__expose({ dataTree });
|
|
120
121
|
return (_ctx, _cache) => {
|
|
121
122
|
const _component_MKSvgIcon = resolveComponent("MKSvgIcon");
|
|
123
|
+
const _component_el_switch = resolveComponent("el-switch");
|
|
122
124
|
const _component_ElIcon = resolveComponent("ElIcon");
|
|
123
125
|
const _component_el_dropdown_item = resolveComponent("el-dropdown-item");
|
|
124
126
|
const _component_el_dropdown_menu = resolveComponent("el-dropdown-menu");
|
|
@@ -128,7 +130,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
128
130
|
createElementVNode("div", null, [
|
|
129
131
|
createVNode(_component_MKSvgIcon, { iconClass: "Notebook" }),
|
|
130
132
|
createTextVNode(" 栏目 ")
|
|
131
|
-
])
|
|
133
|
+
]),
|
|
134
|
+
createVNode(_component_el_switch, {
|
|
135
|
+
modelValue: isDrag.value,
|
|
136
|
+
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => isDrag.value = $event),
|
|
137
|
+
"inline-prompt": "",
|
|
138
|
+
"active-text": "开启排序",
|
|
139
|
+
"inactive-text": "关闭排序"
|
|
140
|
+
}, null, 8, ["modelValue"])
|
|
132
141
|
]),
|
|
133
142
|
createElementVNode("div", _hoisted_3, [
|
|
134
143
|
createVNode(unref(ElScrollbar), { style: { "height": "100%" } }, {
|
|
@@ -143,7 +152,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
143
152
|
"data-tree": dataTree,
|
|
144
153
|
onNodeClick: selectPart,
|
|
145
154
|
defaultExpandAll: "",
|
|
146
|
-
draggable:
|
|
155
|
+
draggable: isDrag.value,
|
|
147
156
|
ref_key: "treeRef",
|
|
148
157
|
ref: treeRef,
|
|
149
158
|
currentNodeKey: selectNodeId.value
|
|
@@ -200,7 +209,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
200
209
|
}, 1024)
|
|
201
210
|
]),
|
|
202
211
|
_: 1
|
|
203
|
-
}, 8, ["data-tree", "currentNodeKey"])
|
|
212
|
+
}, 8, ["data-tree", "draggable", "currentNodeKey"])
|
|
204
213
|
]),
|
|
205
214
|
_: 1
|
|
206
215
|
}, 8, ["data-table"])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.vue.js","sources":["../../../../../../src/modules/cms/components/part-tree/index.vue"],"sourcesContent":["<template>\r\n <div class=\"cms-part-tree\">\r\n <div class=\"cms-part-tree__header\">\r\n <div>\r\n <MKSvgIcon iconClass=\"Notebook\" />\r\n 栏目\r\n </div>\r\n </div>\r\n <div class=\"cms-part-tree__body\">\r\n <ElScrollbar style=\"height: 100%;\">\r\n <MKDataTable :auto-load=\"true\" :data-table=\"dataTree\" highlight-current>\r\n <MKTree :data-tree=\"dataTree\" @nodeClick=\"selectPart\" defaultExpandAll draggable ref=\"treeRef\" :currentNodeKey=\"selectNodeId\">\r\n <template #node-main=\"{ data }\">\r\n {{ data.data.title }}\r\n </template>\r\n <template #node-tools=\"{ data }\">\r\n <el-dropdown>\r\n <ElIcon>\r\n <MoreFilled />\r\n </ElIcon>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :icon=\"Edit\" @click=\"handleEditClick(data.data)\">编辑</el-dropdown-item>\r\n <el-dropdown-item :icon=\"Delete\" @click=\"handleDeleteClick(data.data)\">删除</el-dropdown-item>\r\n <el-dropdown-item v-if=\"data.data.cmsPartTypeId != 1\" :icon=\"Plus\"\r\n @click=\"handleAddClick(data.data)\">添加子菜单</el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n </template>\r\n </MKTree>\r\n </MKDataTable>\r\n </ElScrollbar>\r\n </div>\r\n </div>\r\n</template>\r\n<script setup lang='ts'>\r\nimport { ElMessageBox, ElScrollbar } from \"element-plus\"\r\nimport { Plus, Edit, Delete, MoreFilled } from \"@element-plus/icons-vue\";\r\nimport { reactive, defineProps, watch, defineEmits, ref } from \"vue\";\r\nimport { MKDataTable, MKTree } from \"../../../../components/data-model/data-table\"\r\nimport { CmsPartTree } from \"../../dataviews\";\r\nimport { useI18n } from \"../../../../composables\";\r\nimport { DataTreeNode } from \"@maketribe/dm\";\r\n\r\ndefineOptions({ name: \"MKPartTree\" });\r\nconst treeRef = ref(null);\r\n// 配置选项\r\nconst optionSettings = defineProps<{\r\n curSelectId?:string|undefined\r\n}>();\r\n\r\n// 事件定义\r\nconst emit = defineEmits([\"edit\", \"add\", \"deleteSuccessfully\", \"select\"]);\r\n\r\nconst i18n = useI18n()!;\r\nconst dataTree = reactive(new CmsPartTree()) as CmsPartTree;\r\nconst selectNodeId = ref(optionSettings.curSelectId);\r\n\r\nwatch(()=>optionSettings.curSelectId,()=>{\r\n selectNodeId.value = optionSettings.curSelectId\r\n})\r\n\r\n// 监听数据变化\r\ndataTree.listChangeEvent.on(() => {\r\n\r\n const list = dataTree.getList();\r\n\r\n if (list.length > 0) {\r\n //默认选择第一条\r\n if(!selectNodeId.value){ selectNodeId.value = list[0].id; }\r\n\r\n for(let i=0;i<list.length;i++){\r\n\r\n let item = list[i]\r\n \r\n if(item.id == selectNodeId.value){\r\n emit(\"select\", item);\r\n break;\r\n }\r\n item.children?.forEach((child:any)=>list.push(child))\r\n\r\n }\r\n }\r\n})\r\n\r\n/**\r\n * 点击添加栏目按钮\r\n * @param item \r\n */\r\nconst handleAddClick = (item: any) => {\r\n emit(\"add\", item);\r\n}\r\n\r\n/**\r\n * 编辑栏目\r\n * @param item \r\n */\r\nconst handleEditClick = (item: any) => {\r\n emit(\"edit\", item);\r\n}\r\n/**\r\n * 删除栏目\r\n * @param item \r\n */\r\nconst handleDeleteClick = async (item: any) => {\r\n // 删除提示\r\n const isConfirm = await ElMessageBox.confirm(\r\n i18n.translate(\"mk.dataTablePage.deleteMessage\"),\r\n i18n.translate(\"mk.dataTablePage.deleteTitle\"),\r\n { type: \"warning\" }\r\n )\r\n\r\n if (!isConfirm) {\r\n return;\r\n }\r\n const result = await dataTree.deleteAfterRefresh(item.id);\r\n if (result.data.code == 200) {\r\n emit('deleteSuccessfully', item)\r\n }\r\n}\r\n\r\n/**\r\n * 选择栏目\r\n * @param data \r\n */\r\nconst selectPart = (data: DataTreeNode) => {\r\n emit(\"select\", data.data);\r\n}\r\n\r\ndefineExpose({ dataTree });\r\n\r\n\r\n</script>\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.vue.js","sources":["../../../../../../src/modules/cms/components/part-tree/index.vue"],"sourcesContent":["<template>\r\n <div class=\"cms-part-tree\">\r\n <div class=\"cms-part-tree__header\">\r\n <div>\r\n <MKSvgIcon iconClass=\"Notebook\" />\r\n 栏目\r\n </div>\r\n <el-switch v-model=\"isDrag\" inline-prompt active-text=\"开启排序\"\r\n inactive-text=\"关闭排序\" />\r\n </div>\r\n <div class=\"cms-part-tree__body\">\r\n <ElScrollbar style=\"height: 100%;\">\r\n <MKDataTable :auto-load=\"true\" :data-table=\"dataTree\" highlight-current>\r\n <MKTree :data-tree=\"dataTree\" @nodeClick=\"selectPart\" defaultExpandAll :draggable=\"isDrag\" ref=\"treeRef\" :currentNodeKey=\"selectNodeId\">\r\n <template #node-main=\"{ data }\">\r\n {{ data.data.title }}\r\n </template>\r\n <template #node-tools=\"{ data }\">\r\n <el-dropdown>\r\n <ElIcon>\r\n <MoreFilled />\r\n </ElIcon>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :icon=\"Edit\" @click=\"handleEditClick(data.data)\">编辑</el-dropdown-item>\r\n <el-dropdown-item :icon=\"Delete\" @click=\"handleDeleteClick(data.data)\">删除</el-dropdown-item>\r\n <el-dropdown-item v-if=\"data.data.cmsPartTypeId != 1\" :icon=\"Plus\"\r\n @click=\"handleAddClick(data.data)\">添加子菜单</el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n </template>\r\n </MKTree>\r\n </MKDataTable>\r\n </ElScrollbar>\r\n </div>\r\n </div>\r\n</template>\r\n<script setup lang='ts'>\r\nimport { ElMessageBox, ElScrollbar } from \"element-plus\"\r\nimport { Plus, Edit, Delete, MoreFilled } from \"@element-plus/icons-vue\";\r\nimport { reactive, defineProps, watch, defineEmits, ref } from \"vue\";\r\nimport { MKDataTable, MKTree } from \"../../../../components/data-model/data-table\"\r\nimport { CmsPartTree } from \"../../dataviews\";\r\nimport { useI18n } from \"../../../../composables\";\r\nimport { DataTreeNode } from \"@maketribe/dm\";\r\n\r\ndefineOptions({ name: \"MKPartTree\" });\r\nconst treeRef = ref(null);\r\n// 配置选项\r\nconst optionSettings = defineProps<{\r\n curSelectId?:string|undefined\r\n}>();\r\n\r\n// 事件定义\r\nconst emit = defineEmits([\"edit\", \"add\", \"deleteSuccessfully\", \"select\"]);\r\n\r\nconst i18n = useI18n()!;\r\nconst dataTree = reactive(new CmsPartTree()) as CmsPartTree;\r\n\r\nconst isDrag = ref(false)\r\n\r\nconst selectNodeId = ref(optionSettings.curSelectId);\r\n\r\nwatch(()=>optionSettings.curSelectId,()=>{\r\n selectNodeId.value = optionSettings.curSelectId\r\n})\r\n\r\n// 监听数据变化\r\ndataTree.listChangeEvent.on(() => {\r\n\r\n const list = dataTree.getList();\r\n\r\n if (list.length > 0) {\r\n //默认选择第一条\r\n if(!selectNodeId.value){ selectNodeId.value = list[0].id; }\r\n\r\n for(let i=0;i<list.length;i++){\r\n\r\n let item = list[i]\r\n \r\n if(item.id == selectNodeId.value){\r\n emit(\"select\", item);\r\n break;\r\n }\r\n item.children?.forEach((child:any)=>list.push(child))\r\n\r\n }\r\n }\r\n})\r\n\r\n/**\r\n * 点击添加栏目按钮\r\n * @param item \r\n */\r\nconst handleAddClick = (item: any) => {\r\n emit(\"add\", item);\r\n}\r\n\r\n/**\r\n * 编辑栏目\r\n * @param item \r\n */\r\nconst handleEditClick = (item: any) => {\r\n emit(\"edit\", item);\r\n}\r\n/**\r\n * 删除栏目\r\n * @param item \r\n */\r\nconst handleDeleteClick = async (item: any) => {\r\n // 删除提示\r\n const isConfirm = await ElMessageBox.confirm(\r\n i18n.translate(\"mk.dataTablePage.deleteMessage\"),\r\n i18n.translate(\"mk.dataTablePage.deleteTitle\"),\r\n { type: \"warning\" }\r\n )\r\n\r\n if (!isConfirm) {\r\n return;\r\n }\r\n const result = await dataTree.deleteAfterRefresh(item.id);\r\n if (result.data.code == 200) {\r\n emit('deleteSuccessfully', item)\r\n }\r\n}\r\n\r\n/**\r\n * 选择栏目\r\n * @param data \r\n */\r\nconst selectPart = (data: DataTreeNode) => {\r\n emit(\"select\", data.data);\r\n}\r\n\r\ndefineExpose({ dataTree });\r\n\r\n\r\n</script>\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDM,UAAA,UAAU,IAAI,IAAI;AAExB,UAAM,iBAAiB;AAKvB,UAAM,OAAO;AAEb,UAAM,OAAO;AACb,UAAM,WAAW,SAAS,IAAI,YAAa,CAAA;AAErC,UAAA,SAAS,IAAI,KAAK;AAElB,UAAA,eAAe,IAAI,eAAe,WAAW;AAE7C,UAAA,MAAI,eAAe,aAAY,MAAI;AACvC,mBAAa,QAAQ,eAAe;AAAA,IAAA,CACrC;AAGQ,aAAA,gBAAgB,GAAG,MAAM;;AAE1B,YAAA,OAAO,SAAS;AAElB,UAAA,KAAK,SAAS,GAAG;AAEhB,YAAA,CAAC,aAAa,OAAM;AAAe,uBAAA,QAAQ,KAAK,CAAC,EAAE;AAAA,QAAI;AAE1D,iBAAQ,IAAE,GAAE,IAAE,KAAK,QAAO,KAAI;AAExB,cAAA,OAAO,KAAK,CAAC;AAEd,cAAA,KAAK,MAAM,aAAa,OAAM;AAC/B,iBAAK,UAAU,IAAI;AACnB;AAAA,UACF;AACA,qBAAK,aAAL,mBAAe,QAAQ,CAAC,UAAY,KAAK,KAAK,KAAK;AAAA,QAErD;AAAA,MACF;AAAA,IAAA,CACD;AAMK,UAAA,iBAAiB,CAAC,SAAc;AACpC,WAAK,OAAO,IAAI;AAAA,IAAA;AAOZ,UAAA,kBAAkB,CAAC,SAAc;AACrC,WAAK,QAAQ,IAAI;AAAA,IAAA;AAMb,UAAA,oBAAoB,OAAO,SAAc;AAEvC,YAAA,YAAY,MAAM,aAAa;AAAA,QACnC,KAAK,UAAU,gCAAgC;AAAA,QAC/C,KAAK,UAAU,8BAA8B;AAAA,QAC7C,EAAE,MAAM,UAAU;AAAA,MAAA;AAGpB,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AACA,YAAM,SAAS,MAAM,SAAS,mBAAmB,KAAK,EAAE;AACpD,UAAA,OAAO,KAAK,QAAQ,KAAK;AAC3B,aAAK,sBAAsB,IAAI;AAAA,MACjC;AAAA,IAAA;AAOI,UAAA,aAAa,CAAC,SAAuB;AACpC,WAAA,UAAU,KAAK,IAAI;AAAA,IAAA;AAGb,aAAA,EAAE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -229,7 +229,7 @@ const _CmsArticlesForm = class _CmsArticlesForm extends (_b = DataForm, _a = DAT
|
|
|
229
229
|
new FormColumn({
|
|
230
230
|
name: "isShowList",
|
|
231
231
|
label: "列表显示",
|
|
232
|
-
defaultValue:
|
|
232
|
+
defaultValue: 1,
|
|
233
233
|
componentInfo: "MKFormRadioBox",
|
|
234
234
|
componentProps: {
|
|
235
235
|
options: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CmsArticlesForm.js","sources":["../../../../../../src/modules/cms/dataviews/cms-articles/CmsArticlesForm.ts"],"sourcesContent":["import { DataForm, DataFormOptions, FormColumn, FormDetailColumn } from \"@maketribe/dm\";\r\nimport { CmsPartTree } from \"../cms-parts/CmsPartTree\";\r\nimport { CmsTagsForm, CmsTagsTable } from \"../cms-tags\";\r\nimport { CmsArticleAtlasForm, CmsArticleAtlasTable } from \"./cms-article-atlas\";\r\nimport { DATA_MODEL_NAME } from \"../../../../constants\";\r\nimport { MODULE_NAME } from \"../../constants\";\r\nimport { MaterialUploadContext } from \"../../../ms\";\r\nimport { html } from \"@codemirror/lang-html\";\r\nimport { ResponseConfig, R } from \"@maketribe/request\";\r\nimport { MSAppClient } from \"../../../../core\";\r\n\r\nexport class CmsArticlesForm extends DataForm {\r\n\tstatic [DATA_MODEL_NAME]: string = \"article\";\r\n\r\n\tconstructor(options: DataFormOptions = {}) {\r\n\t\tsuper({\r\n\t\t\tname: CmsArticlesForm[DATA_MODEL_NAME],\r\n\t\t\tmoduleName: MODULE_NAME,\r\n\t\t\t...options,\r\n\t\t});\r\n\t}\r\n\tprotected loadRequest(paramsOrID: Record<string, any>): Promise<ResponseConfig<R<any>, any>> {\r\n\t\treturn super.loadDetailRequest(paramsOrID);\r\n\t}\r\n\tprotected async initialize() {\r\n\t\tawait super.initialize();\r\n\t\tthis.setColumns([\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"cmsPartId\",\r\n\t\t\t\tlabel: \"所属栏目\",\r\n\t\t\t\t// componentInfo: \"MKFormDataTableSelect\",\r\n\t\t\t\tcomponentInfo: \"MKDataTreeSelect\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\tlabelFieldName: \"name\",\r\n\t\t\t\t\tdataTree: this.register(new CmsPartTree()),\r\n\t\t\t\t},\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"title\",\r\n\t\t\t\tlabel: \"标题\",\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"subTitle\",\r\n\t\t\t\tlabel: \"子标题\",\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"cover\",\r\n\t\t\t\tlabel: \"封面图\",\r\n\t\t\t\tcomponentInfo: \"MKFormImageUpload\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\tuploadContext: new MaterialUploadContext({\r\n\t\t\t\t\t\tallowMaterialTypeValues: [1],\r\n\t\t\t\t\t}),\r\n\t\t\t\t},\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"banner\",\r\n\t\t\t\tlabel: \"文字banner\",\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"desc\",\r\n\t\t\t\tlabel: \"文章描述\",\r\n\t\t\t\tcomponentInfo:\"MKFormInput\",\r\n\t\t\t\tcomponentProps:{\r\n\t\t\t\t\ttype:\"textarea\",\r\n\t\t\t\t\trow:3\r\n\t\t\t\t}\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"seoKeywords\",\r\n\t\t\t\tlabel: \"SEO 关键词\",\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"seoDesc\",\r\n\t\t\t\tlabel: \"SEO 页面描述\",\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"releaseDate\",\r\n\t\t\t\tlabel: \"发布日期\",\r\n\t\t\t\tcomponentInfo: \"MKFormDatePicker\",\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"author\",\r\n\t\t\t\tlabel: \"作者\",\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"locationDesc\",\r\n\t\t\t\tlabel: \"地址描述\",\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"tags\",\r\n\t\t\t\tlabel: \"标签\",\r\n\t\t\t\tcomponentInfo: \"MKFormDataTableSelect\",\r\n\t\t\t\tdefaultValue: [],\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\tobjectValue: true,\r\n\t\t\t\t\tdataTable: this.register(new CmsTagsTable()),\r\n\t\t\t\t\tdataForm: this.register(new CmsTagsForm()),\r\n\t\t\t\t\tlabelFieldName: \"tag\",\r\n\t\t\t\t\tmultiple: true,\r\n\t\t\t\t},\r\n\t\t\t}),\r\n\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"sortNo\",\r\n\t\t\t\tlabel: \"排序序号\",\r\n\t\t\t\tdefaultValue: 0,\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"isNew\",\r\n\t\t\t\tlabel: \"最新\",\r\n\t\t\t\tdefaultValue: 0,\r\n\t\t\t\tcomponentInfo: \"MKFormRadioBox\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\toptions: [\r\n\t\t\t\t\t\t{ label: \"是\", value: 1 },\r\n\t\t\t\t\t\t{ label: \"否\", value: 0 },\r\n\t\t\t\t\t],\r\n\t\t\t\t},\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"isTop\",\r\n\t\t\t\tlabel: \"置顶\",\r\n\t\t\t\tdefaultValue: 0,\r\n\t\t\t\tcomponentInfo: \"MKFormRadioBox\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\toptions: [\r\n\t\t\t\t\t\t{ label: \"是\", value: 1 },\r\n\t\t\t\t\t\t{ label: \"否\", value: 0 },\r\n\t\t\t\t\t],\r\n\t\t\t\t},\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"isHotRecommend\",\r\n\t\t\t\tlabel: \"热点推荐\",\r\n\t\t\t\tdefaultValue: 0,\r\n\t\t\t\tcomponentInfo: \"MKFormRadioBox\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\toptions: [\r\n\t\t\t\t\t\t{ label: \"是\", value: 1 },\r\n\t\t\t\t\t\t{ label: \"否\", value: 0 },\r\n\t\t\t\t\t],\r\n\t\t\t\t},\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"isPartRecommend\",\r\n\t\t\t\tlabel: \"栏目推荐\",\r\n\t\t\t\tdefaultValue: 0,\r\n\t\t\t\tcomponentInfo: \"MKFormRadioBox\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\toptions: [\r\n\t\t\t\t\t\t{ label: \"是\", value: 1 },\r\n\t\t\t\t\t\t{ label: \"否\", value: 0 },\r\n\t\t\t\t\t],\r\n\t\t\t\t},\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"isDraft\",\r\n\t\t\t\tlabel: \"草稿\",\r\n\t\t\t\tdefaultValue: 0,\r\n\t\t\t\tcomponentInfo: \"MKFormRadioBox\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\toptions: [\r\n\t\t\t\t\t\t{ label: \"是\", value: 1 },\r\n\t\t\t\t\t\t{ label: \"否\", value: 0 },\r\n\t\t\t\t\t],\r\n\t\t\t\t},\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"isShowList\",\r\n\t\t\t\tlabel: \"列表显示\",\r\n\t\t\t\tdefaultValue: 0,\r\n\t\t\t\tcomponentInfo: \"MKFormRadioBox\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\toptions: [\r\n\t\t\t\t\t\t{ label: \"是\", value: 1 },\r\n\t\t\t\t\t\t{ label: \"否\", value: 0 },\r\n\t\t\t\t\t],\r\n\t\t\t\t},\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"downloadPath\",\r\n\t\t\t\tlabel: \"附件链接\",\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"content\",\r\n\t\t\t\tlabel: \"内容\",\r\n\t\t\t\t// componentInfo: \"MKFormRichTextEditor\",\r\n\t\t\t\tcomponentInfo: \"MKCodeEditor\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\textensions: [html()],\r\n\t\t\t\t},\r\n\t\t\t}),\r\n\r\n\t\t\tnew FormDetailColumn({\r\n\t\t\t\tname: \"atlas\",\r\n\t\t\t\tlabel: \"文章图集\",\r\n\t\t\t\tassociationFieldName: \"cmsArticleId\",\r\n\t\t\t\tdefaultValue: [],\r\n\t\t\t\tdetailForm: this.register(new CmsArticleAtlasForm()),\r\n\t\t\t\tdetailTable: this.register(new CmsArticleAtlasTable()),\r\n\t\t\t}),\r\n\t\t]);\r\n\t}\r\n\r\n\tformatSubmitData(data: any) {\r\n\t\tObject.keys(data).forEach((key) => {\r\n\t\t\tif (data[key] === \"\") {\r\n\t\t\t\tdata[key] = null;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tdata.sortNo -= 0;\r\n\r\n\t\treturn data;\r\n\t}\r\n\tsetData(data: any): void {\r\n\t\tsuper.setData(data);\r\n\t}\r\n\r\n /**\r\n * 发布\r\n */\r\n static async publish(mode:string,partId:string,id:string){\r\n \r\n if(mode == \"dynamic\"){\r\n // 调用发布接口\r\n return await MSAppClient!.instance?.httpRequest.post(`${MODULE_NAME}/content/publish/content-dynamic`, {\r\n partId: partId, contentIds: [ id ]\r\n });\r\n }\r\n else{\r\n // 调用发布接口\r\n return await MSAppClient!.instance?.httpRequest.post(`${MODULE_NAME}/content/publish/content`, {\r\n partId: partId, contentIds: [ id ]\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 保存并发布发布\r\n */\r\n async saveAndPublish(mode:string){\r\n\r\n const partId = this.data.cmsPartId;\r\n const id = this.data.id;\r\n\r\n let result:any = await this.submit()\r\n\r\n if(result.data.code == 200){\r\n result = await CmsArticlesForm.publish(mode,partId,id)\r\n }\r\n \r\n return result\r\n }\r\n}\r\n"],"names":["_a","_b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CmsArticlesForm.js","sources":["../../../../../../src/modules/cms/dataviews/cms-articles/CmsArticlesForm.ts"],"sourcesContent":["import { DataForm, DataFormOptions, FormColumn, FormDetailColumn } from \"@maketribe/dm\";\r\nimport { CmsPartTree } from \"../cms-parts/CmsPartTree\";\r\nimport { CmsTagsForm, CmsTagsTable } from \"../cms-tags\";\r\nimport { CmsArticleAtlasForm, CmsArticleAtlasTable } from \"./cms-article-atlas\";\r\nimport { DATA_MODEL_NAME } from \"../../../../constants\";\r\nimport { MODULE_NAME } from \"../../constants\";\r\nimport { MaterialUploadContext } from \"../../../ms\";\r\nimport { html } from \"@codemirror/lang-html\";\r\nimport { ResponseConfig, R } from \"@maketribe/request\";\r\nimport { MSAppClient } from \"../../../../core\";\r\n\r\nexport class CmsArticlesForm extends DataForm {\r\n\tstatic [DATA_MODEL_NAME]: string = \"article\";\r\n\r\n\tconstructor(options: DataFormOptions = {}) {\r\n\t\tsuper({\r\n\t\t\tname: CmsArticlesForm[DATA_MODEL_NAME],\r\n\t\t\tmoduleName: MODULE_NAME,\r\n\t\t\t...options,\r\n\t\t});\r\n\t}\r\n\tprotected loadRequest(paramsOrID: Record<string, any>): Promise<ResponseConfig<R<any>, any>> {\r\n\t\treturn super.loadDetailRequest(paramsOrID);\r\n\t}\r\n\tprotected async initialize() {\r\n\t\tawait super.initialize();\r\n\t\tthis.setColumns([\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"cmsPartId\",\r\n\t\t\t\tlabel: \"所属栏目\",\r\n\t\t\t\t// componentInfo: \"MKFormDataTableSelect\",\r\n\t\t\t\tcomponentInfo: \"MKDataTreeSelect\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\tlabelFieldName: \"name\",\r\n\t\t\t\t\tdataTree: this.register(new CmsPartTree()),\r\n\t\t\t\t},\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"title\",\r\n\t\t\t\tlabel: \"标题\",\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"subTitle\",\r\n\t\t\t\tlabel: \"子标题\",\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"cover\",\r\n\t\t\t\tlabel: \"封面图\",\r\n\t\t\t\tcomponentInfo: \"MKFormImageUpload\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\tuploadContext: new MaterialUploadContext({\r\n\t\t\t\t\t\tallowMaterialTypeValues: [1],\r\n\t\t\t\t\t}),\r\n\t\t\t\t},\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"banner\",\r\n\t\t\t\tlabel: \"文字banner\",\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"desc\",\r\n\t\t\t\tlabel: \"文章描述\",\r\n\t\t\t\tcomponentInfo: \"MKFormInput\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\ttype: \"textarea\",\r\n\t\t\t\t\trow: 3\r\n\t\t\t\t}\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"seoKeywords\",\r\n\t\t\t\tlabel: \"SEO 关键词\",\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"seoDesc\",\r\n\t\t\t\tlabel: \"SEO 页面描述\",\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"releaseDate\",\r\n\t\t\t\tlabel: \"发布日期\",\r\n\t\t\t\tcomponentInfo: \"MKFormDatePicker\",\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"author\",\r\n\t\t\t\tlabel: \"作者\",\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"locationDesc\",\r\n\t\t\t\tlabel: \"地址描述\",\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"tags\",\r\n\t\t\t\tlabel: \"标签\",\r\n\t\t\t\tcomponentInfo: \"MKFormDataTableSelect\",\r\n\t\t\t\tdefaultValue: [],\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\tobjectValue: true,\r\n\t\t\t\t\tdataTable: this.register(new CmsTagsTable()),\r\n\t\t\t\t\tdataForm: this.register(new CmsTagsForm()),\r\n\t\t\t\t\tlabelFieldName: \"tag\",\r\n\t\t\t\t\tmultiple: true,\r\n\t\t\t\t},\r\n\t\t\t}),\r\n\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"sortNo\",\r\n\t\t\t\tlabel: \"排序序号\",\r\n\t\t\t\tdefaultValue: 0,\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"isNew\",\r\n\t\t\t\tlabel: \"最新\",\r\n\t\t\t\tdefaultValue: 0,\r\n\t\t\t\tcomponentInfo: \"MKFormRadioBox\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\toptions: [\r\n\t\t\t\t\t\t{ label: \"是\", value: 1 },\r\n\t\t\t\t\t\t{ label: \"否\", value: 0 },\r\n\t\t\t\t\t],\r\n\t\t\t\t},\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"isTop\",\r\n\t\t\t\tlabel: \"置顶\",\r\n\t\t\t\tdefaultValue: 0,\r\n\t\t\t\tcomponentInfo: \"MKFormRadioBox\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\toptions: [\r\n\t\t\t\t\t\t{ label: \"是\", value: 1 },\r\n\t\t\t\t\t\t{ label: \"否\", value: 0 },\r\n\t\t\t\t\t],\r\n\t\t\t\t},\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"isHotRecommend\",\r\n\t\t\t\tlabel: \"热点推荐\",\r\n\t\t\t\tdefaultValue: 0,\r\n\t\t\t\tcomponentInfo: \"MKFormRadioBox\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\toptions: [\r\n\t\t\t\t\t\t{ label: \"是\", value: 1 },\r\n\t\t\t\t\t\t{ label: \"否\", value: 0 },\r\n\t\t\t\t\t],\r\n\t\t\t\t},\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"isPartRecommend\",\r\n\t\t\t\tlabel: \"栏目推荐\",\r\n\t\t\t\tdefaultValue: 0,\r\n\t\t\t\tcomponentInfo: \"MKFormRadioBox\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\toptions: [\r\n\t\t\t\t\t\t{ label: \"是\", value: 1 },\r\n\t\t\t\t\t\t{ label: \"否\", value: 0 },\r\n\t\t\t\t\t],\r\n\t\t\t\t},\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"isDraft\",\r\n\t\t\t\tlabel: \"草稿\",\r\n\t\t\t\tdefaultValue: 0,\r\n\t\t\t\tcomponentInfo: \"MKFormRadioBox\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\toptions: [\r\n\t\t\t\t\t\t{ label: \"是\", value: 1 },\r\n\t\t\t\t\t\t{ label: \"否\", value: 0 },\r\n\t\t\t\t\t],\r\n\t\t\t\t},\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"isShowList\",\r\n\t\t\t\tlabel: \"列表显示\",\r\n\t\t\t\tdefaultValue: 1,\r\n\t\t\t\tcomponentInfo: \"MKFormRadioBox\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\toptions: [\r\n\t\t\t\t\t\t{ label: \"是\", value: 1 },\r\n\t\t\t\t\t\t{ label: \"否\", value: 0 },\r\n\t\t\t\t\t],\r\n\t\t\t\t},\r\n\t\t\t\trequired: true,\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"downloadPath\",\r\n\t\t\t\tlabel: \"附件链接\",\r\n\t\t\t}),\r\n\t\t\tnew FormColumn({\r\n\t\t\t\tname: \"content\",\r\n\t\t\t\tlabel: \"内容\",\r\n\t\t\t\t// componentInfo: \"MKFormRichTextEditor\",\r\n\t\t\t\tcomponentInfo: \"MKCodeEditor\",\r\n\t\t\t\tcomponentProps: {\r\n\t\t\t\t\textensions: [html()],\r\n\t\t\t\t},\r\n\t\t\t}),\r\n\r\n\t\t\tnew FormDetailColumn({\r\n\t\t\t\tname: \"atlas\",\r\n\t\t\t\tlabel: \"文章图集\",\r\n\t\t\t\tassociationFieldName: \"cmsArticleId\",\r\n\t\t\t\tdefaultValue: [],\r\n\t\t\t\tdetailForm: this.register(new CmsArticleAtlasForm()),\r\n\t\t\t\tdetailTable: this.register(new CmsArticleAtlasTable()),\r\n\t\t\t}),\r\n\t\t]);\r\n\t}\r\n\r\n\tformatSubmitData(data: any) {\r\n\t\tObject.keys(data).forEach((key) => {\r\n\t\t\tif (data[key] === \"\") {\r\n\t\t\t\tdata[key] = null;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tdata.sortNo -= 0;\r\n\r\n\t\treturn data;\r\n\t}\r\n\tsetData(data: any): void {\r\n\t\tsuper.setData(data);\r\n\t}\r\n\r\n\t/**\r\n\t * 发布\r\n\t */\r\n\tstatic async publish(mode: string, partId: string, id: string) {\r\n\r\n\t\tif (mode == \"dynamic\") {\r\n\t\t\t// 调用发布接口\r\n\t\t\treturn await MSAppClient!.instance?.httpRequest.post(`${MODULE_NAME}/content/publish/content-dynamic`, {\r\n\t\t\t\tpartId: partId, contentIds: [id]\r\n\t\t\t});\r\n\t\t}\r\n\t\telse {\r\n\t\t\t// 调用发布接口\r\n\t\t\treturn await MSAppClient!.instance?.httpRequest.post(`${MODULE_NAME}/content/publish/content`, {\r\n\t\t\t\tpartId: partId, contentIds: [id]\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 保存并发布发布\r\n\t */\r\n\tasync saveAndPublish(mode: string) {\r\n\r\n\t\tconst partId = this.data.cmsPartId;\r\n\t\tconst id = this.data.id;\r\n\r\n\t\tlet result: any = await this.submit()\r\n\r\n\t\tif (result.data.code == 200) {\r\n\t\t\tresult = await CmsArticlesForm.publish(mode, partId, id)\r\n\t\t}\r\n\r\n\t\treturn result\r\n\t}\r\n}\r\n"],"names":["_a","_b"],"mappings":"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"}
|