@core-pilot/client-vue 0.0.3 → 0.0.4
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/client-vue.css +1 -1
- package/dist/cjs/components/core-table/index.js +2 -0
- package/dist/cjs/components/core-table/index.js.map +1 -0
- package/dist/cjs/components/editor-sender/index.js +1 -1
- package/dist/cjs/components/editor-sender/index.js.map +1 -1
- package/dist/cjs/components/editor-sender/source/index.vue.js +1 -1
- package/dist/cjs/components/editor-sender/source/index.vue2.js +1 -1
- package/dist/cjs/components/editor-sender/source/index.vue2.js.map +1 -1
- package/dist/cjs/components/index.js +1 -1
- package/dist/cjs/components/x-markdown/index.js +1 -1
- package/dist/cjs/components/x-markdown/index.js.map +1 -1
- package/dist/cjs/components/x-markdown/utils/parseCorePilotSchema.js +1 -1
- package/dist/cjs/components/x-markdown/utils/parseCorePilotSchema.js.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/es/locale/lang/zh-cn.js +2 -0
- package/dist/cjs/node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/es/locale/lang/zh-cn.js.map +1 -0
- package/dist/cjs/node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/theme-chalk/src/config-provider.scss.js +2 -0
- package/dist/cjs/node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/theme-chalk/src/config-provider.scss.js.map +1 -0
- package/dist/es/client-vue.css +1 -1
- package/dist/es/components/core-table/index.js +107 -0
- package/dist/es/components/core-table/index.js.map +1 -0
- package/dist/es/components/editor-sender/index.js +2 -3
- package/dist/es/components/editor-sender/index.js.map +1 -1
- package/dist/es/components/editor-sender/source/index.vue.js +1 -1
- package/dist/es/components/editor-sender/source/index.vue2.js +0 -1
- package/dist/es/components/editor-sender/source/index.vue2.js.map +1 -1
- package/dist/es/components/index.js +2 -0
- package/dist/es/components/index.js.map +1 -1
- package/dist/es/components/x-markdown/index.js +23 -14
- package/dist/es/components/x-markdown/index.js.map +1 -1
- package/dist/es/components/x-markdown/utils/parseCorePilotSchema.js +65 -54
- package/dist/es/components/x-markdown/utils/parseCorePilotSchema.js.map +1 -1
- package/dist/es/index.js +2 -0
- package/dist/es/index.js.map +1 -1
- package/dist/es/node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/es/locale/lang/zh-cn.js +189 -0
- package/dist/es/node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/es/locale/lang/zh-cn.js.map +1 -0
- package/dist/es/node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/theme-chalk/src/config-provider.scss.js +2 -0
- package/dist/es/node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/theme-chalk/src/config-provider.scss.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { defineComponent, createVNode, ref, computed, watch } from "vue";
|
|
2
|
+
import { ElTable, ElPagination } from "element-plus";
|
|
3
|
+
/* empty css */
|
|
4
|
+
/* empty css */
|
|
5
|
+
/* empty css */
|
|
6
|
+
import "../../node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/theme-chalk/src/tooltip.scss.js";
|
|
7
|
+
/* empty css */
|
|
8
|
+
/* empty css */
|
|
9
|
+
/* empty css */
|
|
10
|
+
/* empty css */
|
|
11
|
+
/* empty css */
|
|
12
|
+
/* empty css */
|
|
13
|
+
/* empty css */
|
|
14
|
+
/* empty css */
|
|
15
|
+
/* empty css */
|
|
16
|
+
const CoreTable = /* @__PURE__ */ defineComponent({
|
|
17
|
+
// 取ElTable 对应的定义
|
|
18
|
+
props: {
|
|
19
|
+
tableProps: {
|
|
20
|
+
type: Object,
|
|
21
|
+
default: () => ({})
|
|
22
|
+
},
|
|
23
|
+
showPagination: {
|
|
24
|
+
type: Boolean,
|
|
25
|
+
default: true
|
|
26
|
+
},
|
|
27
|
+
paginationProps: {
|
|
28
|
+
type: Object,
|
|
29
|
+
default: () => ({})
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
setup(props) {
|
|
33
|
+
var _a, _b;
|
|
34
|
+
const data = ref([]);
|
|
35
|
+
const dataSource = computed(() => {
|
|
36
|
+
var _a2;
|
|
37
|
+
return ((_a2 = props.tableProps) == null ? void 0 : _a2.data) || [];
|
|
38
|
+
});
|
|
39
|
+
const curPage = ref(((_a = props.paginationProps) == null ? void 0 : _a.currentPage) || 1);
|
|
40
|
+
const pageSize = ref(((_b = props.paginationProps) == null ? void 0 : _b.pageSize) || 10);
|
|
41
|
+
watch(() => [dataSource.value, props.showPagination], ([newVal, showPagination]) => {
|
|
42
|
+
var _a2;
|
|
43
|
+
if (!showPagination) {
|
|
44
|
+
data.value = dataSource.value;
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
data.value = (_a2 = dataSource.value) == null ? void 0 : _a2.slice((curPage.value - 1) * pageSize.value, curPage.value * pageSize.value);
|
|
48
|
+
}, {
|
|
49
|
+
immediate: true
|
|
50
|
+
});
|
|
51
|
+
watch(() => curPage.value, (newVal) => {
|
|
52
|
+
var _a2;
|
|
53
|
+
data.value = (_a2 = dataSource.value) == null ? void 0 : _a2.slice((newVal - 1) * pageSize.value, newVal * pageSize.value);
|
|
54
|
+
}, {
|
|
55
|
+
immediate: true
|
|
56
|
+
});
|
|
57
|
+
watch(() => pageSize.value, (newVal) => {
|
|
58
|
+
var _a2;
|
|
59
|
+
data.value = (_a2 = dataSource.value) == null ? void 0 : _a2.slice((curPage.value - 1) * newVal, curPage.value * newVal);
|
|
60
|
+
}, {
|
|
61
|
+
immediate: true
|
|
62
|
+
});
|
|
63
|
+
const onSizeChange = (size) => {
|
|
64
|
+
pageSize.value = size;
|
|
65
|
+
curPage.value = 1;
|
|
66
|
+
};
|
|
67
|
+
const onCurrentChange = (current) => {
|
|
68
|
+
curPage.value = current;
|
|
69
|
+
};
|
|
70
|
+
return {
|
|
71
|
+
data,
|
|
72
|
+
onSizeChange,
|
|
73
|
+
onCurrentChange,
|
|
74
|
+
curPage,
|
|
75
|
+
pageSize
|
|
76
|
+
};
|
|
77
|
+
},
|
|
78
|
+
render() {
|
|
79
|
+
var _a, _b, _c, _d;
|
|
80
|
+
return createVNode("div", {
|
|
81
|
+
"class": "core-table"
|
|
82
|
+
}, [createVNode(ElTable, {
|
|
83
|
+
...this.tableProps,
|
|
84
|
+
data: this.data
|
|
85
|
+
}, {
|
|
86
|
+
default: () => {
|
|
87
|
+
var _a2, _b2;
|
|
88
|
+
return [(_b2 = (_a2 = this.$slots).default) == null ? void 0 : _b2.call(_a2)];
|
|
89
|
+
}
|
|
90
|
+
}), this.showPagination ? createVNode(ElPagination, {
|
|
91
|
+
"class": "core-table-pagination",
|
|
92
|
+
"current-page": this.curPage,
|
|
93
|
+
"onUpdate:current-page": ($event) => this.curPage = $event,
|
|
94
|
+
"page-size": this.pageSize,
|
|
95
|
+
"onUpdate:page-size": ($event) => this.pageSize = $event,
|
|
96
|
+
"page-sizes": ((_a = this.paginationProps) == null ? void 0 : _a.pageSizes) || [10, 20, 30, 40],
|
|
97
|
+
"layout": ((_b = this.paginationProps) == null ? void 0 : _b.layout) || "total, sizes, prev, pager, next, jumper",
|
|
98
|
+
"total": (_d = (_c = this.tableProps) == null ? void 0 : _c.data) == null ? void 0 : _d.length,
|
|
99
|
+
"onSize-change": this.onSizeChange,
|
|
100
|
+
"onCurrent-change": this.onCurrentChange
|
|
101
|
+
}, null) : null]);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
export {
|
|
105
|
+
CoreTable as default
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/core-table/index.tsx"],"sourcesContent":["import { computed, defineComponent, PropType, ref, watch } from 'vue';\nimport { ElTable, ElPagination, PaginationProps, TableProps } from 'element-plus';\nimport './style.less';\n\nexport default defineComponent({\n // 取ElTable 对应的定义\n props: {\n tableProps: {\n type: Object as PropType<TableProps<any>>,\n default: () => ({}),\n },\n showPagination: {\n type: Boolean,\n default: true,\n },\n paginationProps: {\n type: Object as PropType<PaginationProps>,\n default: () => ({}),\n },\n },\n setup(props) {\n const data = ref<any[]>([]);\n const dataSource = computed(() => {\n return props.tableProps?.data || [];\n });\n const curPage = ref(props.paginationProps?.currentPage || 1);\n const pageSize = ref(props.paginationProps?.pageSize || 10);\n\n watch(() => [dataSource.value, props.showPagination], ([newVal, showPagination]) => {\n if (!showPagination) {\n data.value = dataSource.value;\n return;\n }\n data.value = dataSource.value?.slice((curPage.value - 1) * pageSize.value, curPage.value * pageSize.value);\n }, {\n immediate: true,\n });\n\n watch(() => curPage.value, (newVal) => {\n data.value = dataSource.value?.slice((newVal - 1) * pageSize.value, newVal * pageSize.value);\n }, {\n immediate: true,\n });\n\n watch(() => pageSize.value, (newVal) => {\n data.value = dataSource.value?.slice((curPage.value - 1) * newVal, curPage.value * newVal);\n }, {\n immediate: true,\n });\n\n const onSizeChange = (size: number) => {\n pageSize.value = size;\n curPage.value = 1;\n };\n\n const onCurrentChange = (current: number) => {\n curPage.value = current;\n };\n\n return {\n data,\n onSizeChange,\n onCurrentChange,\n curPage,\n pageSize,\n }\n },\n render() {\n return (\n <div\n class=\"core-table\"\n >\n <ElTable \n {...{\n ...this.tableProps,\n data: this.data,\n }}\n >\n {this.$slots.default?.()}\n </ElTable>\n {\n this.showPagination ? (\n <ElPagination\n class=\"core-table-pagination\"\n v-model:current-page={this.curPage}\n v-model:page-size={this.pageSize}\n page-sizes={this.paginationProps?.pageSizes || [10, 20, 30, 40]}\n layout={this.paginationProps?.layout || 'total, sizes, prev, pager, next, jumper' }\n total={this.tableProps?.data?.length}\n onSize-change={this.onSizeChange}\n onCurrent-change={this.onCurrentChange}\n />\n ) : null\n }\n </div>\n );\n }\n});\n"],"names":["props","tableProps","type","Object","default","showPagination","Boolean","paginationProps","setup","data","ref","dataSource","computed","curPage","currentPage","pageSize","watch","value","newVal","slice","immediate","onSizeChange","size","onCurrentChange","current","render","_createVNode","ElTable","_b","_a","$slots","ElPagination","$event","pageSizes","layout","length"],"mappings":"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"}
|
|
@@ -147,9 +147,8 @@ const index = /* @__PURE__ */ defineComponent({
|
|
|
147
147
|
initSender();
|
|
148
148
|
};
|
|
149
149
|
const changeHandler = () => {
|
|
150
|
-
var _a, _b
|
|
151
|
-
|
|
152
|
-
isEmpty.value = (_d = (_c = editorSender.value) == null ? void 0 : _c.chatState) == null ? void 0 : _d.isEmpty;
|
|
150
|
+
var _a, _b;
|
|
151
|
+
isEmpty.value = (_b = (_a = editorSender.value) == null ? void 0 : _a.chatState) == null ? void 0 : _b.isEmpty;
|
|
153
152
|
};
|
|
154
153
|
const handleUploadError = () => {
|
|
155
154
|
ElNotification({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/editor-sender/index.tsx"],"sourcesContent":["import { defineComponent, ref, computed, useTemplateRef, watch, nextTick } from 'vue';\nimport { FilesCard } from 'vue-element-plus-x';\nimport EditorSender from './source/index.vue';\nimport { Paperclip } from '@element-plus/icons-vue'\nimport { ElIcon, ElUpload, ElNotification, UploadFiles, ElButton, ElTag } from 'element-plus'\nimport LoadingBtn from './LoadingButton/index.vue'\n\nimport './style/index.less'\nimport { SubmitResult, TagInfo } from 'vue-element-plus-x/types/EditorSender';\nimport { FilesCardProps } from 'vue-element-plus-x/types/FilesCard';\n\nexport default defineComponent({\n props: {\n loading: {\n type: Boolean,\n default: false,\n },\n actionUrl: {\n type: String,\n default: '/openapi/v1/app/files/upload',\n },\n extendData: {\n type: Object,\n default: () => ({\n \"user\": \"abc-123\",\n }),\n },\n acceptFileType: {\n type: String,\n default: '.txt,.md,.mdx,.markdown,.pdf,.html,.xlsx,.xls,.doc,.docx,.csv,.eml,.msg,.pptx,.ppt,.xml,.epub,.jpg,.jpeg,.png,.gif,.webp,.svg'\n },\n headers: {\n type: Object,\n default: () => ({\n Authorization: 'Bearer ApiSecretKey_mEKsrCMvxNLzzUUKeQmpzaUZqwZxFyJf',\n appId: '9a673565-d4f6-4382-bc67-f1beb07df435'\n }),\n },\n agentName: {\n type: String,\n default: '知识问答智能体',\n },\n limit: {\n type: Number,\n default: 5,\n },\n customStyle: {\n type: Object,\n default: () => ({\n maxHeight: '75px'\n }),\n },\n inputData: {\n type: String,\n default: '',\n },\n placeholder: {\n type: String,\n default: '请尝试输入任务、问题或想法,我会帮你搞定',\n },\n tagList: {\n type: Array<TagInfo>,\n default: () => ([\n {\n id: '1',\n name: '问产品',\n },\n {\n id: '2',\n name: '问品类',\n },\n {\n id: '3',\n name: '问品牌',\n },\n {\n id: '4',\n name: '找物料',\n },\n {\n id: '5',\n name: '问知识',\n },\n {\n id: '6',\n name: '遇客诉',\n }\n ])\n },\n sceneList: {\n type: Array<{\n id: string,\n name: string,\n }>,\n default: () => ([\n {\n id: 'ANC',\n name: 'ANC',\n },\n {\n id: 'BNC',\n name: 'BNC',\n },\n ])\n },\n },\n emits: ['cancel', 'submit', 'sceneChange'],\n setup(props, { emit }) {\n const editorSender = useTemplateRef<typeof EditorSender>('editorSender');\n const editorSenderWrapper = useTemplateRef<HTMLElement>('editorSenderWrapper');\n const fileUpload = useTemplateRef<typeof ElUpload>('fileUpload');\n const activeScene = ref(props.sceneList[0]);\n\n const isEmpty = ref(true);\n const fileList = ref<UploadFiles>([]);\n const activeTag = ref(props.tagList[0]);\n\n watch(() => props.agentName, (val) => {\n nextTick(() => {\n const target = editorSenderWrapper.value?.querySelector('.el-editor-sender-chat-room');\n target?.setAttribute('datatype', val)\n })\n }, {\n immediate: true\n });\n\n watch(() => props.inputData, (val) => {\n nextTick(() => {\n editorSender.value?.clear() as SubmitResult;\n editorSender.value?.setText(val)\n })\n })\n\n watch(() => props.sceneList, (val) => {\n if (val.length > 0) {\n activeScene.value = val[0];\n }\n }, {\n immediate: true\n });\n\n const cancelHandler = () => {\n emit('cancel')\n }\n\n const initSender = () => {\n editorSender.value?.clear() as SubmitResult;\n fileList.value = [];\n fileUpload.value?.clearFiles();\n }\n\n const submitHandler = (val: SubmitResult) => {\n if (isEmpty.value || props.loading) return;\n const res = {\n text: val.text,\n file: fileList.value.map((item) => item.response)\n }\n emit('submit', res)\n initSender()\n }\n\n const changeHandler = () => {\n console.log('changeHandler', editorSender.value?.chatState?.isEmpty);\n isEmpty.value = editorSender.value?.chatState?.isEmpty;\n }\n\n const handleUploadError = () => {\n ElNotification({\n title: '',\n message: '上传文件失败',\n type: 'error',\n })\n }\n\n const handleUploadSuccess = (response, file, list: UploadFiles) => {\n fileList.value = list;\n }\n\n const isValidMimeType = (mimeType: string) => {\n // 包含所有有效MIME类型的集合\n const validTypes = new Set([\n 'text/plain',\n 'text/markdown', // 非标准但常见的markdown类型\n 'application/pdf',\n 'text/html',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-excel',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'text/csv',\n 'message/rfc822',\n 'application/vnd.ms-outlook',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/vnd.ms-powerpoint',\n 'application/xml',\n 'text/xml',\n 'application/epub+zip',\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml'\n ]);\n\n // 去除可能的空格并转为小写后检查\n return validTypes.has(mimeType?.trim().toLowerCase());\n }\n\n const handleUploadBefore = (file: File) => {\n if (!isValidMimeType(file.type)) {\n ElNotification({\n title: '',\n message: '无法解析上传',\n type: 'warning',\n })\n return false;\n }\n const isImg = file.type.includes('image');\n const isDoc = !isImg;\n const isLt15M = file.size / 1024 / 1024 < 15;\n const isLt10M = file.size / 1024 / 1024 < 10;\n if (isDoc && !isLt15M) {\n ElNotification({\n title: '',\n message: '上传文档大小不能超过 15MB!',\n type: 'warning',\n })\n return false;\n }\n if (isImg && !isLt10M) {\n ElNotification({\n title: '',\n message: '上传图片大小不能超过 10MB!',\n type: 'warning',\n })\n return false;\n }\n return true;\n }\n\n const handleUploadExceed = () => {\n ElNotification({\n title: '',\n message: `最多上传5个文件`,\n type: 'warning',\n })\n }\n\n // 删除文件\n const removeFile = ({ name }: FilesCardProps) => {\n const target = fileList.value.find((item) => item.name === name);\n if (target) {\n fileUpload.value?.handleRemove(target);\n }\n }\n\n const handleUploadRemove = (file, files) => {\n fileList.value = files;\n }\n\n const submitBtnClick = () => {\n const context = editorSender.value?.getCurrentValue() as SubmitResult;\n submitHandler(context);\n }\n\n const triggerSceneChange = (scene: {\n id: string,\n name: string,\n }) => {\n activeScene.value = scene;\n emit('sceneChange', scene);\n }\n\n const getSlots = () => {\n const slots = {\n 'action-list': () => (\n <div class=\"sender-action-wrapper\">\n <div class=\"sender-action-left\">\n <ElUpload\n ref=\"fileUpload\"\n disabled={fileList.value.length > 5}\n action={props.actionUrl}\n show-file-list={false}\n multiple\n limit={props.limit - fileList.value.length}\n data={props.extendData}\n beforeUpload={handleUploadBefore}\n headers={props.headers}\n onError={handleUploadError}\n onSuccess={handleUploadSuccess}\n onExceed={handleUploadExceed}\n onRemove={handleUploadRemove}\n accept={props.acceptFileType}\n >\n <ElIcon\n class=\"sender-file-icon\"\n >\n <Paperclip />\n </ElIcon>\n </ElUpload>\n {\n props.sceneList.length > 0 ? (\n <>\n <div class=\"split-line\"></div>\n <div class=\"scene-list\">\n {\n props.sceneList.map((item) => (\n <span \n class={activeScene.value.id === item.id ? 'scene-item active' : 'scene-item'}\n onClick={() => triggerSceneChange(item)}\n >\n {item.name}\n </span>\n ))\n }\n </div>\n </>\n ) : null\n }\n </div>\n {\n props.loading ?\n <LoadingBtn\n class='sender-cancel'\n onCancel={cancelHandler}\n /> :\n <div\n class={{ 'sender-btn': true, 'active': !isEmpty.value }}\n onClick={submitBtnClick}\n >\n </div>\n }\n </div>\n ),\n }\n if (fileList.value.length > 0 || props.tagList.length > 0) {\n slots['header'] = () => {\n return (\n <div class=\"sender-header-wrapper\">\n <div\n class=\"sender-file-list\"\n >\n {\n fileList.value.map((item) => (\n <FilesCard\n name={item.name}\n show-del-icon\n status=\"done\"\n onDelete={removeFile}\n />\n ))\n }\n </div>\n <div class=\"tag-list-wrapper\">\n {\n props.tagList.map((item) => (\n <span\n class={activeTag.value.id === item.id ? 'tag-item active' : 'tag-item'}\n onClick={() => {\n activeTag.value = item;\n }}\n >\n {item.name}\n </span>\n ))\n }\n </div>\n </div>\n )\n }\n }\n\n return slots;\n }\n\n return {\n isEmpty,\n fileList,\n activeTag,\n cancelHandler,\n submitHandler,\n changeHandler,\n handleUploadError,\n handleUploadSuccess,\n handleUploadBefore,\n handleUploadExceed,\n removeFile,\n handleUploadRemove,\n submitBtnClick,\n getSlots,\n };\n },\n\n render() {\n return (\n <div\n class=\"editor-sender-wrapper\"\n ref=\"editorSenderWrapper\"\n >\n <EditorSender\n ref=\"editorSender\"\n variant=\"updown\"\n loading={this.loading}\n placeholder={this.placeholder}\n activeTag={this.activeTag}\n onSubmit={this.submitHandler}\n onCancel={this.cancelHandler}\n onChange={this.changeHandler}\n custom-style={this.customStyle}\n >\n {\n this.getSlots()\n }\n\n </EditorSender>\n </div>\n );\n }\n});\n"],"names":["_isSlot","s","Object","prototype","toString","call","_isVNode","props","loading","type","Boolean","default","actionUrl","String","extendData","acceptFileType","headers","Authorization","appId","agentName","limit","Number","customStyle","maxHeight","inputData","placeholder","tagList","Array","id","name","sceneList","emits","setup","emit","editorSender","useTemplateRef","editorSenderWrapper","fileUpload","activeScene","ref","isEmpty","fileList","activeTag","watch","val","nextTick","target","value","querySelector","setAttribute","immediate","clear","setText","length","cancelHandler","initSender","clearFiles","submitHandler","res","text","file","map","item","response","changeHandler","console","log","chatState","handleUploadError","ElNotification","title","message","handleUploadSuccess","list","isValidMimeType","mimeType","validTypes","Set","has","trim","toLowerCase","handleUploadBefore","isImg","includes","isDoc","isLt15M","size","isLt10M","handleUploadExceed","removeFile","find","handleRemove","handleUploadRemove","files","submitBtnClick","context","getCurrentValue","triggerSceneChange","scene","getSlots","slots","action-list","_createVNode","ElUpload","ElIcon","Paperclip","_Fragment","onClick","LoadingBtn","FilesCard","render","_slot","EditorSender"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/editor-sender/index.tsx"],"sourcesContent":["import { defineComponent, ref, computed, useTemplateRef, watch, nextTick } from 'vue';\nimport { FilesCard } from 'vue-element-plus-x';\nimport EditorSender from './source/index.vue';\nimport { Paperclip } from '@element-plus/icons-vue'\nimport { ElIcon, ElUpload, ElNotification, UploadFiles, ElButton, ElTag } from 'element-plus'\nimport LoadingBtn from './LoadingButton/index.vue'\n\nimport './style/index.less'\nimport { SubmitResult, TagInfo } from 'vue-element-plus-x/types/EditorSender';\nimport { FilesCardProps } from 'vue-element-plus-x/types/FilesCard';\n\nexport default defineComponent({\n props: {\n loading: {\n type: Boolean,\n default: false,\n },\n actionUrl: {\n type: String,\n default: '/openapi/v1/app/files/upload',\n },\n extendData: {\n type: Object,\n default: () => ({\n \"user\": \"abc-123\",\n }),\n },\n acceptFileType: {\n type: String,\n default: '.txt,.md,.mdx,.markdown,.pdf,.html,.xlsx,.xls,.doc,.docx,.csv,.eml,.msg,.pptx,.ppt,.xml,.epub,.jpg,.jpeg,.png,.gif,.webp,.svg'\n },\n headers: {\n type: Object,\n default: () => ({\n Authorization: 'Bearer ApiSecretKey_mEKsrCMvxNLzzUUKeQmpzaUZqwZxFyJf',\n appId: '9a673565-d4f6-4382-bc67-f1beb07df435'\n }),\n },\n agentName: {\n type: String,\n default: '知识问答智能体',\n },\n limit: {\n type: Number,\n default: 5,\n },\n customStyle: {\n type: Object,\n default: () => ({\n maxHeight: '75px'\n }),\n },\n inputData: {\n type: String,\n default: '',\n },\n placeholder: {\n type: String,\n default: '请尝试输入任务、问题或想法,我会帮你搞定',\n },\n tagList: {\n type: Array<TagInfo>,\n default: () => ([\n {\n id: '1',\n name: '问产品',\n },\n {\n id: '2',\n name: '问品类',\n },\n {\n id: '3',\n name: '问品牌',\n },\n {\n id: '4',\n name: '找物料',\n },\n {\n id: '5',\n name: '问知识',\n },\n {\n id: '6',\n name: '遇客诉',\n }\n ])\n },\n sceneList: {\n type: Array<{\n id: string,\n name: string,\n }>,\n default: () => ([\n {\n id: 'ANC',\n name: 'ANC',\n },\n {\n id: 'BNC',\n name: 'BNC',\n },\n ])\n },\n },\n emits: ['cancel', 'submit', 'sceneChange'],\n setup(props, { emit }) {\n const editorSender = useTemplateRef<typeof EditorSender>('editorSender');\n const editorSenderWrapper = useTemplateRef<HTMLElement>('editorSenderWrapper');\n const fileUpload = useTemplateRef<typeof ElUpload>('fileUpload');\n const activeScene = ref(props.sceneList[0]);\n\n const isEmpty = ref(true);\n const fileList = ref<UploadFiles>([]);\n const activeTag = ref(props.tagList[0]);\n\n watch(() => props.agentName, (val) => {\n nextTick(() => {\n const target = editorSenderWrapper.value?.querySelector('.el-editor-sender-chat-room');\n target?.setAttribute('datatype', val)\n })\n }, {\n immediate: true\n });\n\n watch(() => props.inputData, (val) => {\n nextTick(() => {\n editorSender.value?.clear() as SubmitResult;\n editorSender.value?.setText(val)\n })\n })\n\n watch(() => props.sceneList, (val) => {\n if (val.length > 0) {\n activeScene.value = val[0];\n }\n }, {\n immediate: true\n });\n\n const cancelHandler = () => {\n emit('cancel')\n }\n\n const initSender = () => {\n editorSender.value?.clear() as SubmitResult;\n fileList.value = [];\n fileUpload.value?.clearFiles();\n }\n\n const submitHandler = (val: SubmitResult) => {\n if (isEmpty.value || props.loading) return;\n const res = {\n text: val.text,\n file: fileList.value.map((item) => item.response)\n }\n emit('submit', res)\n initSender()\n }\n\n const changeHandler = () => {\n isEmpty.value = editorSender.value?.chatState?.isEmpty;\n }\n\n const handleUploadError = () => {\n ElNotification({\n title: '',\n message: '上传文件失败',\n type: 'error',\n })\n }\n\n const handleUploadSuccess = (response, file, list: UploadFiles) => {\n fileList.value = list;\n }\n\n const isValidMimeType = (mimeType: string) => {\n // 包含所有有效MIME类型的集合\n const validTypes = new Set([\n 'text/plain',\n 'text/markdown', // 非标准但常见的markdown类型\n 'application/pdf',\n 'text/html',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-excel',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'text/csv',\n 'message/rfc822',\n 'application/vnd.ms-outlook',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/vnd.ms-powerpoint',\n 'application/xml',\n 'text/xml',\n 'application/epub+zip',\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml'\n ]);\n\n // 去除可能的空格并转为小写后检查\n return validTypes.has(mimeType?.trim().toLowerCase());\n }\n\n const handleUploadBefore = (file: File) => {\n if (!isValidMimeType(file.type)) {\n ElNotification({\n title: '',\n message: '无法解析上传',\n type: 'warning',\n })\n return false;\n }\n const isImg = file.type.includes('image');\n const isDoc = !isImg;\n const isLt15M = file.size / 1024 / 1024 < 15;\n const isLt10M = file.size / 1024 / 1024 < 10;\n if (isDoc && !isLt15M) {\n ElNotification({\n title: '',\n message: '上传文档大小不能超过 15MB!',\n type: 'warning',\n })\n return false;\n }\n if (isImg && !isLt10M) {\n ElNotification({\n title: '',\n message: '上传图片大小不能超过 10MB!',\n type: 'warning',\n })\n return false;\n }\n return true;\n }\n\n const handleUploadExceed = () => {\n ElNotification({\n title: '',\n message: `最多上传5个文件`,\n type: 'warning',\n })\n }\n\n // 删除文件\n const removeFile = ({ name }: FilesCardProps) => {\n const target = fileList.value.find((item) => item.name === name);\n if (target) {\n fileUpload.value?.handleRemove(target);\n }\n }\n\n const handleUploadRemove = (file, files) => {\n fileList.value = files;\n }\n\n const submitBtnClick = () => {\n const context = editorSender.value?.getCurrentValue() as SubmitResult;\n submitHandler(context);\n }\n\n const triggerSceneChange = (scene: {\n id: string,\n name: string,\n }) => {\n activeScene.value = scene;\n emit('sceneChange', scene);\n }\n\n const getSlots = () => {\n const slots = {\n 'action-list': () => (\n <div class=\"sender-action-wrapper\">\n <div class=\"sender-action-left\">\n <ElUpload\n ref=\"fileUpload\"\n disabled={fileList.value.length > 5}\n action={props.actionUrl}\n show-file-list={false}\n multiple\n limit={props.limit - fileList.value.length}\n data={props.extendData}\n beforeUpload={handleUploadBefore}\n headers={props.headers}\n onError={handleUploadError}\n onSuccess={handleUploadSuccess}\n onExceed={handleUploadExceed}\n onRemove={handleUploadRemove}\n accept={props.acceptFileType}\n >\n <ElIcon\n class=\"sender-file-icon\"\n >\n <Paperclip />\n </ElIcon>\n </ElUpload>\n {\n props.sceneList.length > 0 ? (\n <>\n <div class=\"split-line\"></div>\n <div class=\"scene-list\">\n {\n props.sceneList.map((item) => (\n <span \n class={activeScene.value.id === item.id ? 'scene-item active' : 'scene-item'}\n onClick={() => triggerSceneChange(item)}\n >\n {item.name}\n </span>\n ))\n }\n </div>\n </>\n ) : null\n }\n </div>\n {\n props.loading ?\n <LoadingBtn\n class='sender-cancel'\n onCancel={cancelHandler}\n /> :\n <div\n class={{ 'sender-btn': true, 'active': !isEmpty.value }}\n onClick={submitBtnClick}\n >\n </div>\n }\n </div>\n ),\n }\n if (fileList.value.length > 0 || props.tagList.length > 0) {\n slots['header'] = () => {\n return (\n <div class=\"sender-header-wrapper\">\n <div\n class=\"sender-file-list\"\n >\n {\n fileList.value.map((item) => (\n <FilesCard\n name={item.name}\n show-del-icon\n status=\"done\"\n onDelete={removeFile}\n />\n ))\n }\n </div>\n <div class=\"tag-list-wrapper\">\n {\n props.tagList.map((item) => (\n <span\n class={activeTag.value.id === item.id ? 'tag-item active' : 'tag-item'}\n onClick={() => {\n activeTag.value = item;\n }}\n >\n {item.name}\n </span>\n ))\n }\n </div>\n </div>\n )\n }\n }\n\n return slots;\n }\n\n return {\n isEmpty,\n fileList,\n activeTag,\n cancelHandler,\n submitHandler,\n changeHandler,\n handleUploadError,\n handleUploadSuccess,\n handleUploadBefore,\n handleUploadExceed,\n removeFile,\n handleUploadRemove,\n submitBtnClick,\n getSlots,\n };\n },\n\n render() {\n return (\n <div\n class=\"editor-sender-wrapper\"\n ref=\"editorSenderWrapper\"\n >\n <EditorSender\n ref=\"editorSender\"\n variant=\"updown\"\n loading={this.loading}\n placeholder={this.placeholder}\n activeTag={this.activeTag}\n onSubmit={this.submitHandler}\n onCancel={this.cancelHandler}\n onChange={this.changeHandler}\n custom-style={this.customStyle}\n >\n {\n this.getSlots()\n }\n\n </EditorSender>\n </div>\n );\n }\n});\n"],"names":["_isSlot","s","Object","prototype","toString","call","_isVNode","props","loading","type","Boolean","default","actionUrl","String","extendData","acceptFileType","headers","Authorization","appId","agentName","limit","Number","customStyle","maxHeight","inputData","placeholder","tagList","Array","id","name","sceneList","emits","setup","emit","editorSender","useTemplateRef","editorSenderWrapper","fileUpload","activeScene","ref","isEmpty","fileList","activeTag","watch","val","nextTick","target","value","querySelector","setAttribute","immediate","clear","setText","length","cancelHandler","initSender","clearFiles","submitHandler","res","text","file","map","item","response","changeHandler","chatState","handleUploadError","ElNotification","title","message","handleUploadSuccess","list","isValidMimeType","mimeType","validTypes","Set","has","trim","toLowerCase","handleUploadBefore","isImg","includes","isDoc","isLt15M","size","isLt10M","handleUploadExceed","removeFile","find","handleRemove","handleUploadRemove","files","submitBtnClick","context","getCurrentValue","triggerSceneChange","scene","getSlots","slots","action-list","_createVNode","ElUpload","ElIcon","Paperclip","_Fragment","onClick","LoadingBtn","FilesCard","render","_slot","EditorSender"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import _sfc_main from "./index.vue2.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import _export_sfc from "../../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
-
const EditorSender = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-
|
|
4
|
+
const EditorSender = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-5619e038"]]);
|
|
5
5
|
export {
|
|
6
6
|
EditorSender as default
|
|
7
7
|
};
|
|
@@ -92,7 +92,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
92
92
|
opNode.value = chat.value.createOperateNode();
|
|
93
93
|
chat.value.addEventListener("enterSend", onSubmit);
|
|
94
94
|
chat.value.addEventListener("operate", () => {
|
|
95
|
-
console.log("operate");
|
|
96
95
|
chatState.isEmpty = chat.value.isEmpty(true);
|
|
97
96
|
chatState.textLength = chat.value.textLength;
|
|
98
97
|
emits("change");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.vue2.js","sources":["../../../../../src/components/editor-sender/source/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n ChatNode,\n ChatNodeType,\n ChatOperateNode,\n DatasetByType,\n TagInfo,\n TipOptions,\n UserInfo\n} from 'chatarea';\nimport {\n ChatState,\n EditorProps,\n EditorSenderEmits,\n MixTag,\n SelectDialogOption,\n SubmitResult\n} from 'vue-element-plus-x/types/EditorSender';\nimport ChatArea from 'chatarea';\nimport { \n onBeforeUnmount, \n onMounted, \n reactive, \n ref,\n watch,\n getCurrentInstance,\n computed\n} from 'vue';\nimport ClearButton from './components/ClearButton/index.vue';\nimport LoadingButton from './components/LoadingButton/index.vue';\nimport SendButton from './components/SendButton/index.vue';\nimport 'chatarea/lib/ChatArea.css';\n\n/**\n * 支持的配置属性\n */\nconst props = withDefaults(defineProps<EditorProps&{\n activeTag: TagInfo | null\n}>(), {\n placeholder: '请输入内容', // 输入框提示占位语\n device: 'pc', // 使用编辑器设备类型 pc内置了很多丰富的弹出选择功能,如果用户传入了h5,弹出交互需要参考自定义弹出去支持\n autoFocus: false, // 是否在聊天框生成后自动聚焦\n variant: 'default', // 输入框的变体类型\n selectList: () => [], // 配置标签下拉选择的选项\n userList: () => [], // @研讨群成员列表\n customTrigger: () => [], // 扩展自定义弹窗列表\n maxLength: undefined, // 限制输入框最大字数 *注 该配置项性能开销较大 非必要情况请别设置(像豆包和文心一言都不对这块做限制,不应因小失大)\n submitType: 'enter', // 控制换行与提交模式\n customStyle: () => ({}), // 修改输入样式\n loading: false, // 发送按钮加载状态\n disabled: false, // 是否禁用输入框\n clearable: false, // 是否显示清空按钮\n headerAnimationTimer: 300, // 展开动画\n asyncMatchFun: undefined, // 异步加载群成员方法\n customDialog: false, // 是否需要自定义弹窗 开启后内部弹窗将不会再创建了\n activeTag: null\n});\n/**\n * 暴露的事件\n */\nconst emits = defineEmits<EditorSenderEmits & {\n(event: 'pasteFile', firstFile: File, fileList: FileList): void;\n}>();\n\nconst instance = getCurrentInstance();\n\n// 判断是否存在 pasteFile 监听器\nconst hasOnPasteFileListener = computed(() => {\n return !!instance?.vnode.props?.onPasteFile;\n});\n\n/**\n * 输入框相关\n */\nconst chat = ref<ChatArea>();\nconst opNode = ref<ChatOperateNode>();\nconst container = ref<HTMLElement>();\nconst chatState = reactive<ChatState>({\n isEmpty: true,\n textLength: 0, // 该属性值只会在配置了maxLength情况下才拥有赋值\n lastFocusNode: null,\n lastOffset: 0,\n wrapCallSelectDialog: false, // 记录是否是外部调用了选择弹窗进行插值行为操作\n beforeText: '',\n afterText: ''\n});\n// 创建输入框\nfunction createChat() {\n chat.value = new ChatArea({\n elm: container.value!,\n ...props,\n userList: JSON.parse(JSON.stringify(props.userList)),\n needDialog: !props.customDialog && props.device === 'pc',\n copyType: ['text'],\n asyncMatch: Boolean(props.asyncMatchFun),\n needDebounce: true,\n needCallSpace: false,\n sendKeyFun:\n props.submitType === 'enter'\n ? event => !event.shiftKey && event.key === 'Enter'\n : event => event.shiftKey && event.key === 'Enter',\n wrapKeyFun:\n props.submitType === 'shiftEnter'\n ? event => !event.shiftKey && event.key === 'Enter'\n : event => event.shiftKey && event.key === 'Enter'\n });\n opNode.value = chat.value.createOperateNode();\n // 订阅发送事件\n chat.value.addEventListener('enterSend', onSubmit);\n // 对输入框进行操作事件\n chat.value.addEventListener('operate', () => {\n console.log('operate');\n chatState.isEmpty = chat.value!.isEmpty(true);\n chatState.textLength = chat.value!.textLength;\n emits('change');\n });\n // 失去焦点记录最后一次光标Node节点\n chat.value.richText.addEventListener(\n 'blur',\n () => {\n const sel = getSelection()!;\n chatState.lastFocusNode = sel.focusNode;\n chatState.lastOffset = sel.focusOffset;\n },\n true\n );\n // 订阅标签选择事件\n chat.value.addEventListener('selectCheck', () => {\n if (chatState.wrapCallSelectDialog && chatState.beforeText) {\n chat.value?.insertText(chatState.beforeText);\n chatState.beforeText = '';\n }\n });\n chat.value.addEventListener('afterSelectCheck', () => {\n if (chatState.wrapCallSelectDialog && chatState.afterText) {\n chat.value?.insertText(chatState.afterText);\n chatState.afterText = '';\n chatState.wrapCallSelectDialog = false;\n }\n });\n // 接管异步匹配\n if (props.asyncMatchFun) {\n chat.value.addEventListener('atMatch', props.asyncMatchFun);\n }\n // 检测多种弹窗唤起事件\n chat.value.addEventListener('showAtDialog', () => {\n emits('showAtDialog');\n });\n chat.value.addEventListener(\n 'showSelectDialog',\n (key: string, elm: HTMLElement) => {\n emits('showSelectDialog', key, elm);\n }\n );\n chat.value.addEventListener('showTagDialog', (prefix: string) => {\n emits('showTagDialog', prefix);\n });\n // 禁用编辑器\n if (props.disabled) {\n chat.value.disabled();\n }\n // 绑定ESC按键关闭提示标签\n window.addEventListener('keydown', keydownESC);\n}\n// 获取输入框当前内容\nfunction getCurrentValue(): SubmitResult {\n const text = chat.value!.getText();\n const html = chat.value!.getHtml();\n const inputTags = chat.value!.getInputTagList();\n const userTags =\n props.userList.length > 0 ? chat.value!.getCallUserTagList() : undefined;\n const selectTags =\n props.selectList.length > 0 ? chat.value!.getSelectTagList() : undefined;\n const customTags =\n props.customTrigger.length > 0 ? chat.value!.getCustomTagList() : undefined;\n return {\n text,\n html,\n inputTags,\n userTags,\n selectTags,\n customTags\n };\n}\n// 提交发送方法\nfunction onSubmit() {\n // 内容纯空 拦截发送\n if (chatState.isEmpty) {\n return;\n }\n emits('submit', getCurrentValue());\n}\n// 取消发送方法\nfunction onCancel() {\n emits('cancel');\n}\n// 清空输入框方法\nfunction onClear(txt?: string) {\n chat.value!.clear(txt);\n // 将光标移动到末尾\n focusToEnd();\n}\n// 点击内容区域聚焦输入框\nfunction onContentMouseDown() {\n requestAnimationFrame(() => {\n const focusElm = chatState.lastFocusNode?.parentElement;\n // chatInput不是暴露给用户操作的对象 因此没有写入ts类型\n const chatInput = (chat.value as any).chatInput;\n if (focusElm && focusElm.classList.contains('input-write')) {\n chatInput.setInputTagRange(chatState.lastFocusNode, chatState.lastOffset);\n } else {\n chatInput.restCursorPos(chatInput.vnode, chatInput.cursorIndex);\n }\n });\n}\n// 聚焦到文本最前方\nfunction focusToStart() {\n if (chat.value && opNode.value) {\n opNode.value.setCursorNode(\n opNode.value.getNodeByRank(\n opNode.value.getRank(0) + opNode.value.getRank(0)\n )!,\n 0\n );\n }\n}\n// 聚焦到文本最后方\nfunction focusToEnd() {\n if (chat.value && opNode.value) {\n opNode.value.setCursorNode(\n opNode.value.getNodeByRank(\n opNode.value.getRank(-1) + opNode.value.getRank(-1)\n )!\n );\n }\n}\n// 失去焦点\nfunction blur() {\n if (chat.value) {\n const selection = getSelection()!;\n selection.removeAllRanges();\n chat.value.richText.blur();\n }\n}\n// 内容全选\nfunction selectAll() {\n if (chat.value && opNode.value) {\n const firstNode = opNode.value.getNodeByRank(\n opNode.value.getRank(0) + opNode.value.getRank(0)\n );\n const lastNode = opNode.value.getNodeByRank(\n opNode.value.getRank(-1) + opNode.value.getRank(-1)\n );\n opNode.value.setSelectNodes(firstNode!, lastNode!);\n }\n}\n// 插入一个选择标签\nfunction setSelectTag(key: string, tagId: string) {\n chatState.wrapCallSelectDialog = false;\n const tag = props.selectList\n ?.find(option => option.key === key)\n ?.options.find(tag => tag.id === tagId);\n if (tag) {\n chat.value?.setSelectTag(tag, key);\n }\n}\n// 插入一个输入标签\nfunction setInputTag(key: string, placeholder: string, defaultValue?: string) {\n chat.value?.setInputTag(key, placeholder, defaultValue);\n}\n// 插入一个@提及标签\nfunction setUserTag(userId: string) {\n const user = props.userList?.find(user => user.id === userId);\n if (user) {\n chat.value?.setUserTag(user);\n }\n}\n// 插入一个自定义触发符标签\nfunction setCustomTag(prefix: string, id: string) {\n const custom = props.customTrigger\n ?.find(option => option.prefix === prefix)\n ?.tagList.find(tag => tag.id === id);\n if (custom) {\n chat.value?.setCustomTag(custom, prefix);\n }\n}\n// 混合式插入\nfunction setMixTags(tags: MixTag[][]) {\n // 整合ChatNode\n const chatNodes = tags.map((row: MixTag[], index) => {\n return {\n type: 'gridBox',\n rank: opNode.value?.getRank(index),\n children: row.map((cRow: MixTag) => {\n return {\n type: cRow.type,\n text: cRow.value,\n html: cRow.value,\n dataset: {\n id: cRow.value,\n name: getNameByTypeId(cRow),\n prefix: cRow.key,\n key: cRow.key,\n placeholder: cRow.placeholder,\n value: cRow.value\n }\n };\n })\n };\n });\n opNode.value?.coverNodes(chatNodes as ChatNode<ChatNodeType>[]);\n}\n// 根据id和类型捕获目标name\nfunction getNameByTypeId(mixTag: MixTag): string {\n const { type, value, key } = mixTag;\n switch (type) {\n case 'userTag':\n return props.userList?.find(user => user.id === value)?.name || '';\n case 'selectTag':\n return (\n props.selectList\n ?.find(row => row.key === key)\n ?.options.find(select => select.id === value)?.name || ''\n );\n case 'customTag':\n return (\n props.customTrigger\n ?.find(row => row.prefix === key)\n ?.tagList.find(custom => custom.id === value)?.name || ''\n );\n default:\n return '';\n }\n}\n// 在当前光标处插入html片段\nfunction setHtml(html: string) {\n // 注* 插入的html标签必须是 行内 或 行内块元素,如果需要块级元素标签 请自行插入行内元素然后修改其css属性为块级元素\n chat.value?.insertHtml(html);\n}\n// 在当前光标处插入text内容\nfunction setText(txt: string) {\n chat.value?.insertText(txt);\n}\n// 外部调用唤起标签选择弹窗\nfunction openSelectDialog(option: SelectDialogOption) {\n chatState.beforeText = option.beforeText || '';\n chatState.afterText = option.afterText || '';\n chatState.wrapCallSelectDialog = true;\n chat.value?.showPCSelectDialog(option.key, option.elm);\n}\n// 打开前置提示标签\nfunction openTipTag(options: TipOptions) {\n chat.value?.openTipTag({\n ...options,\n codeLabel: 'ESC'\n });\n}\n// 关闭前置提示标签\nfunction closeTipTag() {\n chat.value?.closeTipTag();\n}\n// 绑定ESC按键关闭提示标签\nfunction keydownESC(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n closeTipTag();\n }\n}\n// 用户自定义弹窗写入@提及标签\nfunction customSetUser(user: UserInfo) {\n // 该方法并未写入ts 因为是一个私有api没暴露给用户 其区别 setUserTag 相比会去向前截取掉触发符\n (chat.value as any).onceSetTag(user);\n}\n// 用户自定义弹窗写入自定义触发符号标签\nfunction customSetTag(prefix: string, tag: TagInfo) {\n // 该方法并未写入ts 因为是一个私有api没暴露给用户 其区别 setCustomTag 相比会去向前截取掉触发符\n (chat.value as any).onceSetCustomTag(tag, prefix);\n}\n// 用户自定义弹窗更新选择标签\nfunction updateSelectTag(elm: HTMLElement, tag: TagInfo) {\n const rank = opNode.value?.getRankByElm(elm.parentElement!);\n if (!rank) {\n return;\n }\n const chatNode = opNode.value?.getNodeByRank(rank);\n if (!chatNode) {\n return;\n }\n const dataset = chatNode.dataset as Pick<\n DatasetByType,\n 'selectTag'\n >['selectTag'];\n dataset.id = tag.id;\n dataset.name = tag.name;\n opNode.value?.updateNode(chatNode);\n}\n\nfunction handleInternalPaste(e: ClipboardEvent) {\n const files = e.clipboardData?.files;\n if (files?.length && hasOnPasteFileListener.value) {\n emits('pasteFile', files[0], files);\n e.preventDefault();\n }\n}\n\n/**\n * 监听响应props的响应式修改 去更新chat示例对象对应的配置\n */\nwatch(\n () => props.disabled,\n () => {\n props.disabled ? chat.value?.disabled() : chat.value?.enable();\n }\n);\nwatch(\n () => props.placeholder,\n () => {\n chat.value?.updateConfig({\n placeholder: props.placeholder\n });\n }\n);\nwatch(\n () => props.maxLength,\n () => {\n chat.value?.updateConfig({\n maxLength: props.maxLength\n });\n }\n);\nwatch(\n () => props.submitType,\n () => {\n chat.value?.updateConfig({\n sendKeyFun:\n props.submitType === 'enter'\n ? event => !event.shiftKey && event.key === 'Enter'\n : event => event.shiftKey && event.key === 'Enter',\n wrapKeyFun:\n props.submitType === 'shiftEnter'\n ? event => !event.shiftKey && event.key === 'Enter'\n : event => event.shiftKey && event.key === 'Enter'\n });\n }\n);\nwatch(\n () => props.userList,\n () => {\n chat.value?.updateConfig({\n userList: props.userList\n });\n },\n { deep: true }\n);\nwatch(\n () => props.selectList,\n () => {\n chat.value?.updateConfig({\n selectList: props.selectList\n });\n },\n { deep: true }\n);\nwatch(\n () => props.customTrigger,\n () => {\n chat.value?.updateConfig({\n customTrigger: props.customTrigger\n });\n },\n { deep: true }\n);\n\nonMounted(() => {\n createChat();\n});\n\nonBeforeUnmount(() => {\n if (chat.value) {\n chat.value.dispose();\n chat.value = undefined;\n opNode.value = undefined;\n window.removeEventListener('keydown', keydownESC);\n }\n});\n\n/** 暴露方法 */\ndefineExpose({\n getCurrentValue,\n focusToStart,\n focusToEnd,\n blur,\n selectAll,\n clear: onClear,\n setSelectTag,\n setInputTag,\n setUserTag,\n setCustomTag,\n setMixTags,\n setHtml,\n setText,\n openSelectDialog,\n customSetUser,\n customSetTag,\n updateSelectTag,\n openTipTag,\n closeTipTag,\n chat, // 暴露chat实例对象\n opNode, // 暴露ChatNode操作对象\n chatState\n});\n</script>\n\n<template>\n <div\n class=\"el-editor-sender-wrap\"\n :style=\"{\n '--el-editor-sender-header-duration': `${headerAnimationTimer}ms`\n }\"\n >\n <!-- 头部容器 -->\n <Transition name=\"slide\">\n <div v-if=\"$slots.header\" class=\"el-editor-sender-header\">\n <div class=\"el-editor-sender-header-container\">\n <slot name=\"header\" />\n </div>\n </div>\n </Transition>\n <!-- 内容容器 -->\n <div\n class=\"el-editor-sender-content\"\n :class=\"{ 'content-variant-updown': props.variant === 'updown' }\"\n @mousedown=\"onContentMouseDown\"\n >\n <!-- 输入区域 -->\n <div class=\"el-editor-sender-chat-room\" @mousedown.stop=\"() => {}\">\n <!-- 变体 updown: Prefix 前缀 -->\n <div v-if=\"$slots.prefix\" class=\"el-editor-sender-prefix\">\n <slot name=\"prefix\" />\n </div>\n <span\n v-if=\"props.activeTag\"\n class=\"el-editor-sender-active-tag\"\n >\n {{ props.activeTag.name }}\n </span>\n <!-- 输入框载体 这里多嵌套一层是为了存放渲染后的弹窗元素 -->\n <div\n ref=\"container\"\n :style=\"{ ...customStyle }\"\n class=\"el-editor-sender-chat\"\n @paste=\"handleInternalPaste\"\n />\n </div>\n <!-- 默认操作列表 -->\n <div\n v-if=\"props.variant === 'default'\"\n class=\"el-editor-sender-action-list\"\n >\n <slot name=\"action-list\">\n <div class=\"el-editor-sender-action-list-presets\">\n <SendButton\n v-if=\"!props.loading\"\n :disabled=\"chatState.isEmpty || props.disabled\"\n @submit=\"onSubmit\"\n />\n\n <LoadingButton v-if=\"props.loading\" @cancel=\"onCancel\" />\n\n <ClearButton\n v-if=\"props.clearable\"\n :disabled=\"chatState.isEmpty || props.disabled\"\n @clear=\"onClear\"\n />\n </div>\n </slot>\n </div>\n <!-- 变体操作列表 -->\n <div\n v-else-if=\"props.variant === 'updown'\"\n class=\"el-editor-sender-updown-action-list\"\n >\n <!-- 变体 updown:操作列表 -->\n <div class=\"el-editor-sender-action-list\">\n <slot name=\"action-list\">\n <div class=\"el-editor-sender-action-list-presets\">\n <SendButton\n v-if=\"!props.loading\"\n :disabled=\"chatState.isEmpty || props.disabled\"\n @submit=\"onSubmit\"\n />\n\n <LoadingButton v-if=\"props.loading\" @cancel=\"onCancel\" />\n\n <ClearButton\n v-if=\"props.clearable\"\n :disabled=\"chatState.isEmpty || props.disabled\"\n @clear=\"onClear\"\n />\n </div>\n </slot>\n </div>\n </div>\n </div>\n <!-- 底部容器 -->\n <Transition name=\"slide\">\n <div v-if=\"$slots.footer\" class=\"el-editor-sender-footer\">\n <slot name=\"footer\" />\n </div>\n </Transition>\n </div>\n</template>\n\n<style scoped lang=\"scss\" src=\"./style.scss\"></style>\n"],"names":["tag","user","_a","_createElementBlock","_normalizeStyle","_createVNode","_Transition","$slots","_openBlock","_createElementVNode","_renderSlot","_normalizeClass","_toDisplayString","_createBlock","SendButton"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.vue2.js","sources":["../../../../../src/components/editor-sender/source/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n ChatNode,\n ChatNodeType,\n ChatOperateNode,\n DatasetByType,\n TagInfo,\n TipOptions,\n UserInfo\n} from 'chatarea';\nimport {\n ChatState,\n EditorProps,\n EditorSenderEmits,\n MixTag,\n SelectDialogOption,\n SubmitResult\n} from 'vue-element-plus-x/types/EditorSender';\nimport ChatArea from 'chatarea';\nimport { \n onBeforeUnmount, \n onMounted, \n reactive, \n ref,\n watch,\n getCurrentInstance,\n computed\n} from 'vue';\nimport ClearButton from './components/ClearButton/index.vue';\nimport LoadingButton from './components/LoadingButton/index.vue';\nimport SendButton from './components/SendButton/index.vue';\nimport 'chatarea/lib/ChatArea.css';\n\n/**\n * 支持的配置属性\n */\nconst props = withDefaults(defineProps<EditorProps&{\n activeTag: TagInfo | null\n}>(), {\n placeholder: '请输入内容', // 输入框提示占位语\n device: 'pc', // 使用编辑器设备类型 pc内置了很多丰富的弹出选择功能,如果用户传入了h5,弹出交互需要参考自定义弹出去支持\n autoFocus: false, // 是否在聊天框生成后自动聚焦\n variant: 'default', // 输入框的变体类型\n selectList: () => [], // 配置标签下拉选择的选项\n userList: () => [], // @研讨群成员列表\n customTrigger: () => [], // 扩展自定义弹窗列表\n maxLength: undefined, // 限制输入框最大字数 *注 该配置项性能开销较大 非必要情况请别设置(像豆包和文心一言都不对这块做限制,不应因小失大)\n submitType: 'enter', // 控制换行与提交模式\n customStyle: () => ({}), // 修改输入样式\n loading: false, // 发送按钮加载状态\n disabled: false, // 是否禁用输入框\n clearable: false, // 是否显示清空按钮\n headerAnimationTimer: 300, // 展开动画\n asyncMatchFun: undefined, // 异步加载群成员方法\n customDialog: false, // 是否需要自定义弹窗 开启后内部弹窗将不会再创建了\n activeTag: null\n});\n/**\n * 暴露的事件\n */\nconst emits = defineEmits<EditorSenderEmits & {\n(event: 'pasteFile', firstFile: File, fileList: FileList): void;\n}>();\n\nconst instance = getCurrentInstance();\n\n// 判断是否存在 pasteFile 监听器\nconst hasOnPasteFileListener = computed(() => {\n return !!instance?.vnode.props?.onPasteFile;\n});\n\n/**\n * 输入框相关\n */\nconst chat = ref<ChatArea>();\nconst opNode = ref<ChatOperateNode>();\nconst container = ref<HTMLElement>();\nconst chatState = reactive<ChatState>({\n isEmpty: true,\n textLength: 0, // 该属性值只会在配置了maxLength情况下才拥有赋值\n lastFocusNode: null,\n lastOffset: 0,\n wrapCallSelectDialog: false, // 记录是否是外部调用了选择弹窗进行插值行为操作\n beforeText: '',\n afterText: ''\n});\n// 创建输入框\nfunction createChat() {\n chat.value = new ChatArea({\n elm: container.value!,\n ...props,\n userList: JSON.parse(JSON.stringify(props.userList)),\n needDialog: !props.customDialog && props.device === 'pc',\n copyType: ['text'],\n asyncMatch: Boolean(props.asyncMatchFun),\n needDebounce: true,\n needCallSpace: false,\n sendKeyFun:\n props.submitType === 'enter'\n ? event => !event.shiftKey && event.key === 'Enter'\n : event => event.shiftKey && event.key === 'Enter',\n wrapKeyFun:\n props.submitType === 'shiftEnter'\n ? event => !event.shiftKey && event.key === 'Enter'\n : event => event.shiftKey && event.key === 'Enter'\n });\n opNode.value = chat.value.createOperateNode();\n // 订阅发送事件\n chat.value.addEventListener('enterSend', onSubmit);\n // 对输入框进行操作事件\n chat.value.addEventListener('operate', () => {\n chatState.isEmpty = chat.value!.isEmpty(true);\n chatState.textLength = chat.value!.textLength;\n emits('change');\n });\n // 失去焦点记录最后一次光标Node节点\n chat.value.richText.addEventListener(\n 'blur',\n () => {\n const sel = getSelection()!;\n chatState.lastFocusNode = sel.focusNode;\n chatState.lastOffset = sel.focusOffset;\n },\n true\n );\n // 订阅标签选择事件\n chat.value.addEventListener('selectCheck', () => {\n if (chatState.wrapCallSelectDialog && chatState.beforeText) {\n chat.value?.insertText(chatState.beforeText);\n chatState.beforeText = '';\n }\n });\n chat.value.addEventListener('afterSelectCheck', () => {\n if (chatState.wrapCallSelectDialog && chatState.afterText) {\n chat.value?.insertText(chatState.afterText);\n chatState.afterText = '';\n chatState.wrapCallSelectDialog = false;\n }\n });\n // 接管异步匹配\n if (props.asyncMatchFun) {\n chat.value.addEventListener('atMatch', props.asyncMatchFun);\n }\n // 检测多种弹窗唤起事件\n chat.value.addEventListener('showAtDialog', () => {\n emits('showAtDialog');\n });\n chat.value.addEventListener(\n 'showSelectDialog',\n (key: string, elm: HTMLElement) => {\n emits('showSelectDialog', key, elm);\n }\n );\n chat.value.addEventListener('showTagDialog', (prefix: string) => {\n emits('showTagDialog', prefix);\n });\n // 禁用编辑器\n if (props.disabled) {\n chat.value.disabled();\n }\n // 绑定ESC按键关闭提示标签\n window.addEventListener('keydown', keydownESC);\n}\n// 获取输入框当前内容\nfunction getCurrentValue(): SubmitResult {\n const text = chat.value!.getText();\n const html = chat.value!.getHtml();\n const inputTags = chat.value!.getInputTagList();\n const userTags =\n props.userList.length > 0 ? chat.value!.getCallUserTagList() : undefined;\n const selectTags =\n props.selectList.length > 0 ? chat.value!.getSelectTagList() : undefined;\n const customTags =\n props.customTrigger.length > 0 ? chat.value!.getCustomTagList() : undefined;\n return {\n text,\n html,\n inputTags,\n userTags,\n selectTags,\n customTags\n };\n}\n// 提交发送方法\nfunction onSubmit() {\n // 内容纯空 拦截发送\n if (chatState.isEmpty) {\n return;\n }\n emits('submit', getCurrentValue());\n}\n// 取消发送方法\nfunction onCancel() {\n emits('cancel');\n}\n// 清空输入框方法\nfunction onClear(txt?: string) {\n chat.value!.clear(txt);\n // 将光标移动到末尾\n focusToEnd();\n}\n// 点击内容区域聚焦输入框\nfunction onContentMouseDown() {\n requestAnimationFrame(() => {\n const focusElm = chatState.lastFocusNode?.parentElement;\n // chatInput不是暴露给用户操作的对象 因此没有写入ts类型\n const chatInput = (chat.value as any).chatInput;\n if (focusElm && focusElm.classList.contains('input-write')) {\n chatInput.setInputTagRange(chatState.lastFocusNode, chatState.lastOffset);\n } else {\n chatInput.restCursorPos(chatInput.vnode, chatInput.cursorIndex);\n }\n });\n}\n// 聚焦到文本最前方\nfunction focusToStart() {\n if (chat.value && opNode.value) {\n opNode.value.setCursorNode(\n opNode.value.getNodeByRank(\n opNode.value.getRank(0) + opNode.value.getRank(0)\n )!,\n 0\n );\n }\n}\n// 聚焦到文本最后方\nfunction focusToEnd() {\n if (chat.value && opNode.value) {\n opNode.value.setCursorNode(\n opNode.value.getNodeByRank(\n opNode.value.getRank(-1) + opNode.value.getRank(-1)\n )!\n );\n }\n}\n// 失去焦点\nfunction blur() {\n if (chat.value) {\n const selection = getSelection()!;\n selection.removeAllRanges();\n chat.value.richText.blur();\n }\n}\n// 内容全选\nfunction selectAll() {\n if (chat.value && opNode.value) {\n const firstNode = opNode.value.getNodeByRank(\n opNode.value.getRank(0) + opNode.value.getRank(0)\n );\n const lastNode = opNode.value.getNodeByRank(\n opNode.value.getRank(-1) + opNode.value.getRank(-1)\n );\n opNode.value.setSelectNodes(firstNode!, lastNode!);\n }\n}\n// 插入一个选择标签\nfunction setSelectTag(key: string, tagId: string) {\n chatState.wrapCallSelectDialog = false;\n const tag = props.selectList\n ?.find(option => option.key === key)\n ?.options.find(tag => tag.id === tagId);\n if (tag) {\n chat.value?.setSelectTag(tag, key);\n }\n}\n// 插入一个输入标签\nfunction setInputTag(key: string, placeholder: string, defaultValue?: string) {\n chat.value?.setInputTag(key, placeholder, defaultValue);\n}\n// 插入一个@提及标签\nfunction setUserTag(userId: string) {\n const user = props.userList?.find(user => user.id === userId);\n if (user) {\n chat.value?.setUserTag(user);\n }\n}\n// 插入一个自定义触发符标签\nfunction setCustomTag(prefix: string, id: string) {\n const custom = props.customTrigger\n ?.find(option => option.prefix === prefix)\n ?.tagList.find(tag => tag.id === id);\n if (custom) {\n chat.value?.setCustomTag(custom, prefix);\n }\n}\n// 混合式插入\nfunction setMixTags(tags: MixTag[][]) {\n // 整合ChatNode\n const chatNodes = tags.map((row: MixTag[], index) => {\n return {\n type: 'gridBox',\n rank: opNode.value?.getRank(index),\n children: row.map((cRow: MixTag) => {\n return {\n type: cRow.type,\n text: cRow.value,\n html: cRow.value,\n dataset: {\n id: cRow.value,\n name: getNameByTypeId(cRow),\n prefix: cRow.key,\n key: cRow.key,\n placeholder: cRow.placeholder,\n value: cRow.value\n }\n };\n })\n };\n });\n opNode.value?.coverNodes(chatNodes as ChatNode<ChatNodeType>[]);\n}\n// 根据id和类型捕获目标name\nfunction getNameByTypeId(mixTag: MixTag): string {\n const { type, value, key } = mixTag;\n switch (type) {\n case 'userTag':\n return props.userList?.find(user => user.id === value)?.name || '';\n case 'selectTag':\n return (\n props.selectList\n ?.find(row => row.key === key)\n ?.options.find(select => select.id === value)?.name || ''\n );\n case 'customTag':\n return (\n props.customTrigger\n ?.find(row => row.prefix === key)\n ?.tagList.find(custom => custom.id === value)?.name || ''\n );\n default:\n return '';\n }\n}\n// 在当前光标处插入html片段\nfunction setHtml(html: string) {\n // 注* 插入的html标签必须是 行内 或 行内块元素,如果需要块级元素标签 请自行插入行内元素然后修改其css属性为块级元素\n chat.value?.insertHtml(html);\n}\n// 在当前光标处插入text内容\nfunction setText(txt: string) {\n chat.value?.insertText(txt);\n}\n// 外部调用唤起标签选择弹窗\nfunction openSelectDialog(option: SelectDialogOption) {\n chatState.beforeText = option.beforeText || '';\n chatState.afterText = option.afterText || '';\n chatState.wrapCallSelectDialog = true;\n chat.value?.showPCSelectDialog(option.key, option.elm);\n}\n// 打开前置提示标签\nfunction openTipTag(options: TipOptions) {\n chat.value?.openTipTag({\n ...options,\n codeLabel: 'ESC'\n });\n}\n// 关闭前置提示标签\nfunction closeTipTag() {\n chat.value?.closeTipTag();\n}\n// 绑定ESC按键关闭提示标签\nfunction keydownESC(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n closeTipTag();\n }\n}\n// 用户自定义弹窗写入@提及标签\nfunction customSetUser(user: UserInfo) {\n // 该方法并未写入ts 因为是一个私有api没暴露给用户 其区别 setUserTag 相比会去向前截取掉触发符\n (chat.value as any).onceSetTag(user);\n}\n// 用户自定义弹窗写入自定义触发符号标签\nfunction customSetTag(prefix: string, tag: TagInfo) {\n // 该方法并未写入ts 因为是一个私有api没暴露给用户 其区别 setCustomTag 相比会去向前截取掉触发符\n (chat.value as any).onceSetCustomTag(tag, prefix);\n}\n// 用户自定义弹窗更新选择标签\nfunction updateSelectTag(elm: HTMLElement, tag: TagInfo) {\n const rank = opNode.value?.getRankByElm(elm.parentElement!);\n if (!rank) {\n return;\n }\n const chatNode = opNode.value?.getNodeByRank(rank);\n if (!chatNode) {\n return;\n }\n const dataset = chatNode.dataset as Pick<\n DatasetByType,\n 'selectTag'\n >['selectTag'];\n dataset.id = tag.id;\n dataset.name = tag.name;\n opNode.value?.updateNode(chatNode);\n}\n\nfunction handleInternalPaste(e: ClipboardEvent) {\n const files = e.clipboardData?.files;\n if (files?.length && hasOnPasteFileListener.value) {\n emits('pasteFile', files[0], files);\n e.preventDefault();\n }\n}\n\n/**\n * 监听响应props的响应式修改 去更新chat示例对象对应的配置\n */\nwatch(\n () => props.disabled,\n () => {\n props.disabled ? chat.value?.disabled() : chat.value?.enable();\n }\n);\nwatch(\n () => props.placeholder,\n () => {\n chat.value?.updateConfig({\n placeholder: props.placeholder\n });\n }\n);\nwatch(\n () => props.maxLength,\n () => {\n chat.value?.updateConfig({\n maxLength: props.maxLength\n });\n }\n);\nwatch(\n () => props.submitType,\n () => {\n chat.value?.updateConfig({\n sendKeyFun:\n props.submitType === 'enter'\n ? event => !event.shiftKey && event.key === 'Enter'\n : event => event.shiftKey && event.key === 'Enter',\n wrapKeyFun:\n props.submitType === 'shiftEnter'\n ? event => !event.shiftKey && event.key === 'Enter'\n : event => event.shiftKey && event.key === 'Enter'\n });\n }\n);\nwatch(\n () => props.userList,\n () => {\n chat.value?.updateConfig({\n userList: props.userList\n });\n },\n { deep: true }\n);\nwatch(\n () => props.selectList,\n () => {\n chat.value?.updateConfig({\n selectList: props.selectList\n });\n },\n { deep: true }\n);\nwatch(\n () => props.customTrigger,\n () => {\n chat.value?.updateConfig({\n customTrigger: props.customTrigger\n });\n },\n { deep: true }\n);\n\nonMounted(() => {\n createChat();\n});\n\nonBeforeUnmount(() => {\n if (chat.value) {\n chat.value.dispose();\n chat.value = undefined;\n opNode.value = undefined;\n window.removeEventListener('keydown', keydownESC);\n }\n});\n\n/** 暴露方法 */\ndefineExpose({\n getCurrentValue,\n focusToStart,\n focusToEnd,\n blur,\n selectAll,\n clear: onClear,\n setSelectTag,\n setInputTag,\n setUserTag,\n setCustomTag,\n setMixTags,\n setHtml,\n setText,\n openSelectDialog,\n customSetUser,\n customSetTag,\n updateSelectTag,\n openTipTag,\n closeTipTag,\n chat, // 暴露chat实例对象\n opNode, // 暴露ChatNode操作对象\n chatState\n});\n</script>\n\n<template>\n <div\n class=\"el-editor-sender-wrap\"\n :style=\"{\n '--el-editor-sender-header-duration': `${headerAnimationTimer}ms`\n }\"\n >\n <!-- 头部容器 -->\n <Transition name=\"slide\">\n <div v-if=\"$slots.header\" class=\"el-editor-sender-header\">\n <div class=\"el-editor-sender-header-container\">\n <slot name=\"header\" />\n </div>\n </div>\n </Transition>\n <!-- 内容容器 -->\n <div\n class=\"el-editor-sender-content\"\n :class=\"{ 'content-variant-updown': props.variant === 'updown' }\"\n @mousedown=\"onContentMouseDown\"\n >\n <!-- 输入区域 -->\n <div class=\"el-editor-sender-chat-room\" @mousedown.stop=\"() => {}\">\n <!-- 变体 updown: Prefix 前缀 -->\n <div v-if=\"$slots.prefix\" class=\"el-editor-sender-prefix\">\n <slot name=\"prefix\" />\n </div>\n <span\n v-if=\"props.activeTag\"\n class=\"el-editor-sender-active-tag\"\n >\n {{ props.activeTag.name }}\n </span>\n <!-- 输入框载体 这里多嵌套一层是为了存放渲染后的弹窗元素 -->\n <div\n ref=\"container\"\n :style=\"{ ...customStyle }\"\n class=\"el-editor-sender-chat\"\n @paste=\"handleInternalPaste\"\n />\n </div>\n <!-- 默认操作列表 -->\n <div\n v-if=\"props.variant === 'default'\"\n class=\"el-editor-sender-action-list\"\n >\n <slot name=\"action-list\">\n <div class=\"el-editor-sender-action-list-presets\">\n <SendButton\n v-if=\"!props.loading\"\n :disabled=\"chatState.isEmpty || props.disabled\"\n @submit=\"onSubmit\"\n />\n\n <LoadingButton v-if=\"props.loading\" @cancel=\"onCancel\" />\n\n <ClearButton\n v-if=\"props.clearable\"\n :disabled=\"chatState.isEmpty || props.disabled\"\n @clear=\"onClear\"\n />\n </div>\n </slot>\n </div>\n <!-- 变体操作列表 -->\n <div\n v-else-if=\"props.variant === 'updown'\"\n class=\"el-editor-sender-updown-action-list\"\n >\n <!-- 变体 updown:操作列表 -->\n <div class=\"el-editor-sender-action-list\">\n <slot name=\"action-list\">\n <div class=\"el-editor-sender-action-list-presets\">\n <SendButton\n v-if=\"!props.loading\"\n :disabled=\"chatState.isEmpty || props.disabled\"\n @submit=\"onSubmit\"\n />\n\n <LoadingButton v-if=\"props.loading\" @cancel=\"onCancel\" />\n\n <ClearButton\n v-if=\"props.clearable\"\n :disabled=\"chatState.isEmpty || props.disabled\"\n @clear=\"onClear\"\n />\n </div>\n </slot>\n </div>\n </div>\n </div>\n <!-- 底部容器 -->\n <Transition name=\"slide\">\n <div v-if=\"$slots.footer\" class=\"el-editor-sender-footer\">\n <slot name=\"footer\" />\n </div>\n </Transition>\n </div>\n</template>\n\n<style scoped lang=\"scss\" src=\"./style.scss\"></style>\n"],"names":["tag","user","_a","_createElementBlock","_normalizeStyle","_createVNode","_Transition","$slots","_openBlock","_createElementVNode","_renderSlot","_normalizeClass","_toDisplayString","_createBlock","SendButton"],"mappings":"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"}
|
|
@@ -6,9 +6,11 @@ import { default as default6 } from "./file-card/index.js";
|
|
|
6
6
|
import { default as default7 } from "./core-text/index.js";
|
|
7
7
|
import { default as default8 } from "./core-tips/index.js";
|
|
8
8
|
import { default as default9 } from "./core-result/index.js";
|
|
9
|
+
import { default as default10 } from "./core-table/index.js";
|
|
9
10
|
export {
|
|
10
11
|
default2 as BubbleList,
|
|
11
12
|
default9 as CoreResult,
|
|
13
|
+
default10 as CoreTable,
|
|
12
14
|
default7 as CoreText,
|
|
13
15
|
default8 as CoreTips,
|
|
14
16
|
default5 as EditorSender,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineComponent, createVNode, useTemplateRef, ref, computed, watch, onMounted, onBeforeUnmount, nextTick, onUpdated, h } from "vue";
|
|
2
2
|
import debounce from "../../_virtual/debounce.js";
|
|
3
3
|
import { useTemplateRefsList } from "../../node_modules/.pnpm/@vueuse_core@14.0.0_vue@3.5.24_typescript@5.6.3_/node_modules/@vueuse/core/dist/index.js";
|
|
4
|
-
import { ElTimeline, ElRow, ElCol, ElCard, ElForm, ElFormItem, ElButton, ElSelect, ElDatePicker, ElInput, ElRadioGroup, ElRadio,
|
|
4
|
+
import { ElTimeline, ElRow, ElCol, ElCard, ElForm, ElFormItem, ElButton, ElSelect, ElDatePicker, ElInput, ElRadioGroup, ElRadio, ElTableColumn, ElConfigProvider, ElMessage } from "element-plus";
|
|
5
5
|
/* empty css */
|
|
6
6
|
/* empty css */
|
|
7
7
|
/* empty css */
|
|
@@ -18,15 +18,14 @@ import "../../node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3
|
|
|
18
18
|
/* empty css */
|
|
19
19
|
import "../../node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/theme-chalk/src/date-picker.scss.js";
|
|
20
20
|
/* empty css */
|
|
21
|
-
/* empty css */
|
|
22
|
-
/* empty css */
|
|
23
|
-
import "../../node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/theme-chalk/src/tooltip.scss.js";
|
|
24
21
|
/* empty css */
|
|
25
22
|
/* empty css */
|
|
23
|
+
/* empty css */
|
|
26
24
|
/* empty css */
|
|
27
25
|
/* empty css */
|
|
28
26
|
/* empty css */
|
|
29
27
|
/* empty css */
|
|
28
|
+
import "../../node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/theme-chalk/src/config-provider.scss.js";
|
|
30
29
|
/* empty css */
|
|
31
30
|
/* empty css */
|
|
32
31
|
import { createStreamGenerator } from "./utils/mockStream.js";
|
|
@@ -35,7 +34,9 @@ import { Accordion } from "./utils/animation.js";
|
|
|
35
34
|
import CoreText from "../core-text/index.js";
|
|
36
35
|
import CoreTips from "../core-tips/index.js";
|
|
37
36
|
import CoreResult from "../core-result/index.js";
|
|
37
|
+
import CoreTable from "../core-table/index.js";
|
|
38
38
|
/* empty css */
|
|
39
|
+
import zhCn from "../../node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/es/locale/lang/zh-cn.js";
|
|
39
40
|
import { unified } from "../../node_modules/.pnpm/unified@11.0.5/node_modules/unified/lib/index.js";
|
|
40
41
|
import remarkParse from "../../node_modules/.pnpm/remark-parse@11.0.0/node_modules/remark-parse/lib/index.js";
|
|
41
42
|
import remarkBreaks from "../../node_modules/.pnpm/remark-breaks@4.0.0/node_modules/remark-breaks/lib/index.js";
|
|
@@ -148,18 +149,24 @@ ${divContent}${divEnd}`;
|
|
|
148
149
|
const disabled = computed(() => {
|
|
149
150
|
return props.isHistoryMessage;
|
|
150
151
|
});
|
|
151
|
-
watch(() => [props.text, props.typing], (
|
|
152
|
-
var _a, _b, _c;
|
|
152
|
+
watch(() => [props.text, props.typing], (v, o) => {
|
|
153
|
+
var _a, _b, _c, _d;
|
|
154
|
+
const [text, typing] = v;
|
|
155
|
+
const [oldText] = o || [];
|
|
156
|
+
if (!text.startsWith(oldText)) {
|
|
157
|
+
(_a = streamGener.value) == null ? void 0 : _a.reset();
|
|
158
|
+
context.value = "";
|
|
159
|
+
}
|
|
153
160
|
if (text) {
|
|
154
|
-
(
|
|
161
|
+
(_b = streamGener.value) == null ? void 0 : _b.update(text);
|
|
155
162
|
if (!typing) {
|
|
156
|
-
(
|
|
163
|
+
(_c = streamGener.value) == null ? void 0 : _c.stop();
|
|
157
164
|
return;
|
|
158
165
|
}
|
|
159
166
|
const checkReg = /<summary>资料整合<\/summary>\r?\n(.|\s)+?/;
|
|
160
167
|
if (!tagComplete.value && checkReg.test(text)) {
|
|
161
168
|
tagComplete.value = true;
|
|
162
|
-
(
|
|
169
|
+
(_d = streamGener.value) == null ? void 0 : _d.setSpeed(500);
|
|
163
170
|
return;
|
|
164
171
|
}
|
|
165
172
|
}
|
|
@@ -238,7 +245,7 @@ ${divContent}${divEnd}`;
|
|
|
238
245
|
});
|
|
239
246
|
return;
|
|
240
247
|
};
|
|
241
|
-
const btnClick = async (index, action, payload) => {
|
|
248
|
+
const btnClick = async (index, action, payload, parentScope) => {
|
|
242
249
|
var _a;
|
|
243
250
|
if (action === "inner_next") {
|
|
244
251
|
curIndex.value += 1;
|
|
@@ -252,7 +259,7 @@ ${divContent}${divEnd}`;
|
|
|
252
259
|
action,
|
|
253
260
|
payload: {}
|
|
254
261
|
};
|
|
255
|
-
if (payload) {
|
|
262
|
+
if (payload && parentScope !== "form") {
|
|
256
263
|
res = {
|
|
257
264
|
action,
|
|
258
265
|
payload
|
|
@@ -428,7 +435,9 @@ ${divContent}${divEnd}`;
|
|
|
428
435
|
case "root":
|
|
429
436
|
return h("div", {
|
|
430
437
|
class: "markdown-body"
|
|
431
|
-
},
|
|
438
|
+
}, h(ElConfigProvider, {
|
|
439
|
+
locale: zhCn
|
|
440
|
+
}, children));
|
|
432
441
|
case "element":
|
|
433
442
|
if (node.tagName === "sub") {
|
|
434
443
|
const formatChildren = [{
|
|
@@ -521,7 +530,7 @@ ${divContent}${divEnd}`;
|
|
|
521
530
|
disabled: ((_g = node.properties) == null ? void 0 : _g.disabled) || disabled.value,
|
|
522
531
|
onClick: () => {
|
|
523
532
|
var _a2;
|
|
524
|
-
btnClick(index, (_a2 = node.properties) == null ? void 0 : _a2.action, payload);
|
|
533
|
+
btnClick(index, (_a2 = node.properties) == null ? void 0 : _a2.action, payload, node.parentScope);
|
|
525
534
|
}
|
|
526
535
|
}, children);
|
|
527
536
|
}
|
|
@@ -576,7 +585,7 @@ ${divContent}${divEnd}`;
|
|
|
576
585
|
}, children);
|
|
577
586
|
}
|
|
578
587
|
if (node.tagName === "ElTable") {
|
|
579
|
-
return h(
|
|
588
|
+
return h(CoreTable, {
|
|
580
589
|
...node.properties
|
|
581
590
|
}, children);
|
|
582
591
|
}
|