@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.
Files changed (40) hide show
  1. package/dist/cjs/client-vue.css +1 -1
  2. package/dist/cjs/components/core-table/index.js +2 -0
  3. package/dist/cjs/components/core-table/index.js.map +1 -0
  4. package/dist/cjs/components/editor-sender/index.js +1 -1
  5. package/dist/cjs/components/editor-sender/index.js.map +1 -1
  6. package/dist/cjs/components/editor-sender/source/index.vue.js +1 -1
  7. package/dist/cjs/components/editor-sender/source/index.vue2.js +1 -1
  8. package/dist/cjs/components/editor-sender/source/index.vue2.js.map +1 -1
  9. package/dist/cjs/components/index.js +1 -1
  10. package/dist/cjs/components/x-markdown/index.js +1 -1
  11. package/dist/cjs/components/x-markdown/index.js.map +1 -1
  12. package/dist/cjs/components/x-markdown/utils/parseCorePilotSchema.js +1 -1
  13. package/dist/cjs/components/x-markdown/utils/parseCorePilotSchema.js.map +1 -1
  14. package/dist/cjs/index.js +1 -1
  15. package/dist/cjs/index.js.map +1 -1
  16. 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
  17. 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
  18. 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
  19. 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
  20. package/dist/es/client-vue.css +1 -1
  21. package/dist/es/components/core-table/index.js +107 -0
  22. package/dist/es/components/core-table/index.js.map +1 -0
  23. package/dist/es/components/editor-sender/index.js +2 -3
  24. package/dist/es/components/editor-sender/index.js.map +1 -1
  25. package/dist/es/components/editor-sender/source/index.vue.js +1 -1
  26. package/dist/es/components/editor-sender/source/index.vue2.js +0 -1
  27. package/dist/es/components/editor-sender/source/index.vue2.js.map +1 -1
  28. package/dist/es/components/index.js +2 -0
  29. package/dist/es/components/index.js.map +1 -1
  30. package/dist/es/components/x-markdown/index.js +23 -14
  31. package/dist/es/components/x-markdown/index.js.map +1 -1
  32. package/dist/es/components/x-markdown/utils/parseCorePilotSchema.js +65 -54
  33. package/dist/es/components/x-markdown/utils/parseCorePilotSchema.js.map +1 -1
  34. package/dist/es/index.js +2 -0
  35. package/dist/es/index.js.map +1 -1
  36. 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
  37. 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
  38. 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
  39. 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
  40. 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, _c, _d;
151
- console.log("changeHandler", (_b = (_a = editorSender.value) == null ? void 0 : _a.chatState) == null ? void 0 : _b.isEmpty);
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-701f12aa"]]);
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,UAAM,QAAQ;AAwBd,UAAM,QAAQ;AAId,UAAM,WAAW,mBAAA;AAGjB,UAAM,yBAAyB,SAAS,MAAM;;AAC5C,aAAO,CAAC,GAAC,0CAAU,MAAM,UAAhB,mBAAuB;AAAA,IAClC,CAAC;AAKD,UAAM,OAAO,IAAA;AACb,UAAM,SAAS,IAAA;AACf,UAAM,YAAY,IAAA;AAClB,UAAM,YAAY,SAAoB;AAAA,MACpC,SAAS;AAAA,MACT,YAAY;AAAA;AAAA,MACZ,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,sBAAsB;AAAA;AAAA,MACtB,YAAY;AAAA,MACZ,WAAW;AAAA,IAAA,CACZ;AAED,aAAS,aAAa;AACpB,WAAK,QAAQ,IAAI,SAAS;AAAA,QACxB,KAAK,UAAU;AAAA,QACf,GAAG;AAAA,QACH,UAAU,KAAK,MAAM,KAAK,UAAU,MAAM,QAAQ,CAAC;AAAA,QACnD,YAAY,CAAC,MAAM,gBAAgB,MAAM,WAAW;AAAA,QACpD,UAAU,CAAC,MAAM;AAAA,QACjB,YAAY,QAAQ,MAAM,aAAa;AAAA,QACvC,cAAc;AAAA,QACd,eAAe;AAAA,QACf,YACE,MAAM,eAAe,UACjB,WAAS,CAAC,MAAM,YAAY,MAAM,QAAQ,UAC1C,CAAA,UAAS,MAAM,YAAY,MAAM,QAAQ;AAAA,QAC/C,YACE,MAAM,eAAe,eACjB,WAAS,CAAC,MAAM,YAAY,MAAM,QAAQ,UAC1C,CAAA,UAAS,MAAM,YAAY,MAAM,QAAQ;AAAA,MAAA,CAChD;AACD,aAAO,QAAQ,KAAK,MAAM,kBAAA;AAE1B,WAAK,MAAM,iBAAiB,aAAa,QAAQ;AAEjD,WAAK,MAAM,iBAAiB,WAAW,MAAM;AAC3C,gBAAQ,IAAI,SAAS;AACrB,kBAAU,UAAU,KAAK,MAAO,QAAQ,IAAI;AAC5C,kBAAU,aAAa,KAAK,MAAO;AACnC,cAAM,QAAQ;AAAA,MAChB,CAAC;AAED,WAAK,MAAM,SAAS;AAAA,QAClB;AAAA,QACA,MAAM;AACJ,gBAAM,MAAM,aAAA;AACZ,oBAAU,gBAAgB,IAAI;AAC9B,oBAAU,aAAa,IAAI;AAAA,QAC7B;AAAA,QACA;AAAA,MAAA;AAGF,WAAK,MAAM,iBAAiB,eAAe,MAAM;;AAC/C,YAAI,UAAU,wBAAwB,UAAU,YAAY;AAC1D,qBAAK,UAAL,mBAAY,WAAW,UAAU;AACjC,oBAAU,aAAa;AAAA,QACzB;AAAA,MACF,CAAC;AACD,WAAK,MAAM,iBAAiB,oBAAoB,MAAM;;AACpD,YAAI,UAAU,wBAAwB,UAAU,WAAW;AACzD,qBAAK,UAAL,mBAAY,WAAW,UAAU;AACjC,oBAAU,YAAY;AACtB,oBAAU,uBAAuB;AAAA,QACnC;AAAA,MACF,CAAC;AAED,UAAI,MAAM,eAAe;AACvB,aAAK,MAAM,iBAAiB,WAAW,MAAM,aAAa;AAAA,MAC5D;AAEA,WAAK,MAAM,iBAAiB,gBAAgB,MAAM;AAChD,cAAM,cAAc;AAAA,MACtB,CAAC;AACD,WAAK,MAAM;AAAA,QACT;AAAA,QACA,CAAC,KAAa,QAAqB;AACjC,gBAAM,oBAAoB,KAAK,GAAG;AAAA,QACpC;AAAA,MAAA;AAEF,WAAK,MAAM,iBAAiB,iBAAiB,CAAC,WAAmB;AAC/D,cAAM,iBAAiB,MAAM;AAAA,MAC/B,CAAC;AAED,UAAI,MAAM,UAAU;AAClB,aAAK,MAAM,SAAA;AAAA,MACb;AAEA,aAAO,iBAAiB,WAAW,UAAU;AAAA,IAC/C;AAEA,aAAS,kBAAgC;AACvC,YAAM,OAAO,KAAK,MAAO,QAAA;AACzB,YAAM,OAAO,KAAK,MAAO,QAAA;AACzB,YAAM,YAAY,KAAK,MAAO,gBAAA;AAC9B,YAAM,WACJ,MAAM,SAAS,SAAS,IAAI,KAAK,MAAO,uBAAuB;AACjE,YAAM,aACJ,MAAM,WAAW,SAAS,IAAI,KAAK,MAAO,qBAAqB;AACjE,YAAM,aACJ,MAAM,cAAc,SAAS,IAAI,KAAK,MAAO,qBAAqB;AACpE,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,aAAS,WAAW;AAElB,UAAI,UAAU,SAAS;AACrB;AAAA,MACF;AACA,YAAM,UAAU,iBAAiB;AAAA,IACnC;AAEA,aAAS,WAAW;AAClB,YAAM,QAAQ;AAAA,IAChB;AAEA,aAAS,QAAQ,KAAc;AAC7B,WAAK,MAAO,MAAM,GAAG;AAErB,iBAAA;AAAA,IACF;AAEA,aAAS,qBAAqB;AAC5B,4BAAsB,MAAM;;AAC1B,cAAM,YAAW,eAAU,kBAAV,mBAAyB;AAE1C,cAAM,YAAa,KAAK,MAAc;AACtC,YAAI,YAAY,SAAS,UAAU,SAAS,aAAa,GAAG;AAC1D,oBAAU,iBAAiB,UAAU,eAAe,UAAU,UAAU;AAAA,QAC1E,OAAO;AACL,oBAAU,cAAc,UAAU,OAAO,UAAU,WAAW;AAAA,QAChE;AAAA,MACF,CAAC;AAAA,IACH;AAEA,aAAS,eAAe;AACtB,UAAI,KAAK,SAAS,OAAO,OAAO;AAC9B,eAAO,MAAM;AAAA,UACX,OAAO,MAAM;AAAA,YACX,OAAO,MAAM,QAAQ,CAAC,IAAI,OAAO,MAAM,QAAQ,CAAC;AAAA,UAAA;AAAA,UAElD;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF;AAEA,aAAS,aAAa;AACpB,UAAI,KAAK,SAAS,OAAO,OAAO;AAC9B,eAAO,MAAM;AAAA,UACX,OAAO,MAAM;AAAA,YACX,OAAO,MAAM,QAAQ,EAAE,IAAI,OAAO,MAAM,QAAQ,EAAE;AAAA,UAAA;AAAA,QACpD;AAAA,MAEJ;AAAA,IACF;AAEA,aAAS,OAAO;AACd,UAAI,KAAK,OAAO;AACd,cAAM,YAAY,aAAA;AAClB,kBAAU,gBAAA;AACV,aAAK,MAAM,SAAS,KAAA;AAAA,MACtB;AAAA,IACF;AAEA,aAAS,YAAY;AACnB,UAAI,KAAK,SAAS,OAAO,OAAO;AAC9B,cAAM,YAAY,OAAO,MAAM;AAAA,UAC7B,OAAO,MAAM,QAAQ,CAAC,IAAI,OAAO,MAAM,QAAQ,CAAC;AAAA,QAAA;AAElD,cAAM,WAAW,OAAO,MAAM;AAAA,UAC5B,OAAO,MAAM,QAAQ,EAAE,IAAI,OAAO,MAAM,QAAQ,EAAE;AAAA,QAAA;AAEpD,eAAO,MAAM,eAAe,WAAY,QAAS;AAAA,MACnD;AAAA,IACF;AAEA,aAAS,aAAa,KAAa,OAAe;;AAChD,gBAAU,uBAAuB;AACjC,YAAM,OAAM,iBAAM,eAAN,mBACR,KAAK,YAAU,OAAO,QAAQ,SADtB,mBAER,QAAQ,KAAK,CAAAA,SAAOA,KAAI,OAAO;AACnC,UAAI,KAAK;AACP,mBAAK,UAAL,mBAAY,aAAa,KAAK;AAAA,MAChC;AAAA,IACF;AAEA,aAAS,YAAY,KAAa,aAAqB,cAAuB;;AAC5E,iBAAK,UAAL,mBAAY,YAAY,KAAK,aAAa;AAAA,IAC5C;AAEA,aAAS,WAAW,QAAgB;;AAClC,YAAM,QAAO,WAAM,aAAN,mBAAgB,KAAK,CAAAC,UAAQA,MAAK,OAAO;AACtD,UAAI,MAAM;AACR,mBAAK,UAAL,mBAAY,WAAW;AAAA,MACzB;AAAA,IACF;AAEA,aAAS,aAAa,QAAgB,IAAY;;AAChD,YAAM,UAAS,iBAAM,kBAAN,mBACX,KAAK,YAAU,OAAO,WAAW,YADtB,mBAEX,QAAQ,KAAK,CAAA,QAAO,IAAI,OAAO;AACnC,UAAI,QAAQ;AACV,mBAAK,UAAL,mBAAY,aAAa,QAAQ;AAAA,MACnC;AAAA,IACF;AAEA,aAAS,WAAW,MAAkB;;AAEpC,YAAM,YAAY,KAAK,IAAI,CAAC,KAAe,UAAU;;AACnD,eAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAMC,MAAA,OAAO,UAAP,gBAAAA,IAAc,QAAQ;AAAA,UAC5B,UAAU,IAAI,IAAI,CAAC,SAAiB;AAClC,mBAAO;AAAA,cACL,MAAM,KAAK;AAAA,cACX,MAAM,KAAK;AAAA,cACX,MAAM,KAAK;AAAA,cACX,SAAS;AAAA,gBACP,IAAI,KAAK;AAAA,gBACT,MAAM,gBAAgB,IAAI;AAAA,gBAC1B,QAAQ,KAAK;AAAA,gBACb,KAAK,KAAK;AAAA,gBACV,aAAa,KAAK;AAAA,gBAClB,OAAO,KAAK;AAAA,cAAA;AAAA,YACd;AAAA,UAEJ,CAAC;AAAA,QAAA;AAAA,MAEL,CAAC;AACD,mBAAO,UAAP,mBAAc,WAAW;AAAA,IAC3B;AAEA,aAAS,gBAAgB,QAAwB;;AAC/C,YAAM,EAAE,MAAM,OAAO,IAAA,IAAQ;AAC7B,cAAQ,MAAA;AAAA,QACN,KAAK;AACH,mBAAO,iBAAM,aAAN,mBAAgB,KAAK,CAAA,SAAQ,KAAK,OAAO,WAAzC,mBAAiD,SAAQ;AAAA,QAClE,KAAK;AACH,mBACE,uBAAM,eAAN,mBACI,KAAK,CAAA,QAAO,IAAI,QAAQ,SAD5B,mBAEI,QAAQ,KAAK,CAAA,WAAU,OAAO,OAAO,WAFzC,mBAEiD,SAAQ;AAAA,QAE7D,KAAK;AACH,mBACE,uBAAM,kBAAN,mBACI,KAAK,CAAA,QAAO,IAAI,WAAW,SAD/B,mBAEI,QAAQ,KAAK,CAAA,WAAU,OAAO,OAAO,WAFzC,mBAEiD,SAAQ;AAAA,QAE7D;AACE,iBAAO;AAAA,MAAA;AAAA,IAEb;AAEA,aAAS,QAAQ,MAAc;;AAE7B,iBAAK,UAAL,mBAAY,WAAW;AAAA,IACzB;AAEA,aAAS,QAAQ,KAAa;;AAC5B,iBAAK,UAAL,mBAAY,WAAW;AAAA,IACzB;AAEA,aAAS,iBAAiB,QAA4B;;AACpD,gBAAU,aAAa,OAAO,cAAc;AAC5C,gBAAU,YAAY,OAAO,aAAa;AAC1C,gBAAU,uBAAuB;AACjC,iBAAK,UAAL,mBAAY,mBAAmB,OAAO,KAAK,OAAO;AAAA,IACpD;AAEA,aAAS,WAAW,SAAqB;;AACvC,iBAAK,UAAL,mBAAY,WAAW;AAAA,QACrB,GAAG;AAAA,QACH,WAAW;AAAA,MAAA;AAAA,IAEf;AAEA,aAAS,cAAc;;AACrB,iBAAK,UAAL,mBAAY;AAAA,IACd;AAEA,aAAS,WAAW,OAAsB;AACxC,UAAI,MAAM,QAAQ,UAAU;AAC1B,oBAAA;AAAA,MACF;AAAA,IACF;AAEA,aAAS,cAAc,MAAgB;AAEpC,WAAK,MAAc,WAAW,IAAI;AAAA,IACrC;AAEA,aAAS,aAAa,QAAgB,KAAc;AAEjD,WAAK,MAAc,iBAAiB,KAAK,MAAM;AAAA,IAClD;AAEA,aAAS,gBAAgB,KAAkB,KAAc;;AACvD,YAAM,QAAO,YAAO,UAAP,mBAAc,aAAa,IAAI;AAC5C,UAAI,CAAC,MAAM;AACT;AAAA,MACF;AACA,YAAM,YAAW,YAAO,UAAP,mBAAc,cAAc;AAC7C,UAAI,CAAC,UAAU;AACb;AAAA,MACF;AACA,YAAM,UAAU,SAAS;AAIzB,cAAQ,KAAK,IAAI;AACjB,cAAQ,OAAO,IAAI;AACnB,mBAAO,UAAP,mBAAc,WAAW;AAAA,IAC3B;AAEA,aAAS,oBAAoB,GAAmB;;AAC9C,YAAM,SAAQ,OAAE,kBAAF,mBAAiB;AAC/B,WAAI,+BAAO,WAAU,uBAAuB,OAAO;AACjD,cAAM,aAAa,MAAM,CAAC,GAAG,KAAK;AAClC,UAAE,eAAA;AAAA,MACJ;AAAA,IACF;AAKA;AAAA,MACE,MAAM,MAAM;AAAA,MACZ,MAAM;;AACJ,cAAM,YAAW,UAAK,UAAL,mBAAY,cAAa,UAAK,UAAL,mBAAY;AAAA,MACxD;AAAA,IAAA;AAEF;AAAA,MACE,MAAM,MAAM;AAAA,MACZ,MAAM;;AACJ,mBAAK,UAAL,mBAAY,aAAa;AAAA,UACvB,aAAa,MAAM;AAAA,QAAA;AAAA,MAEvB;AAAA,IAAA;AAEF;AAAA,MACE,MAAM,MAAM;AAAA,MACZ,MAAM;;AACJ,mBAAK,UAAL,mBAAY,aAAa;AAAA,UACvB,WAAW,MAAM;AAAA,QAAA;AAAA,MAErB;AAAA,IAAA;AAEF;AAAA,MACE,MAAM,MAAM;AAAA,MACZ,MAAM;;AACJ,mBAAK,UAAL,mBAAY,aAAa;AAAA,UACvB,YACE,MAAM,eAAe,UACjB,WAAS,CAAC,MAAM,YAAY,MAAM,QAAQ,UAC1C,CAAA,UAAS,MAAM,YAAY,MAAM,QAAQ;AAAA,UAC/C,YACE,MAAM,eAAe,eACjB,WAAS,CAAC,MAAM,YAAY,MAAM,QAAQ,UAC1C,CAAA,UAAS,MAAM,YAAY,MAAM,QAAQ;AAAA,QAAA;AAAA,MAEnD;AAAA,IAAA;AAEF;AAAA,MACE,MAAM,MAAM;AAAA,MACZ,MAAM;;AACJ,mBAAK,UAAL,mBAAY,aAAa;AAAA,UACvB,UAAU,MAAM;AAAA,QAAA;AAAA,MAEpB;AAAA,MACA,EAAE,MAAM,KAAA;AAAA,IAAK;AAEf;AAAA,MACE,MAAM,MAAM;AAAA,MACZ,MAAM;;AACJ,mBAAK,UAAL,mBAAY,aAAa;AAAA,UACvB,YAAY,MAAM;AAAA,QAAA;AAAA,MAEtB;AAAA,MACA,EAAE,MAAM,KAAA;AAAA,IAAK;AAEf;AAAA,MACE,MAAM,MAAM;AAAA,MACZ,MAAM;;AACJ,mBAAK,UAAL,mBAAY,aAAa;AAAA,UACvB,eAAe,MAAM;AAAA,QAAA;AAAA,MAEzB;AAAA,MACA,EAAE,MAAM,KAAA;AAAA,IAAK;AAGf,cAAU,MAAM;AACd,iBAAA;AAAA,IACF,CAAC;AAED,oBAAgB,MAAM;AACpB,UAAI,KAAK,OAAO;AACd,aAAK,MAAM,QAAA;AACX,aAAK,QAAQ;AACb,eAAO,QAAQ;AACf,eAAO,oBAAoB,WAAW,UAAU;AAAA,MAClD;AAAA,IACF,CAAC;AAGD,aAAa;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA,IAAA,CACD;;0BAICC,mBAgGM,OAAA;AAAA,QA/FJ,OAAM;AAAA,QACL,OAAKC,eAAA;AAAA,mDAAmD,QAAA,oBAAoB;AAAA,QAAA;;QAK7EC,YAMaC,YAAA,EAND,MAAK,WAAO;AAAA,2BACtB,MAIM;AAAA,YAJKC,KAAAA,OAAO,UAAlBC,aAAAL,mBAIM,OAJN,YAIM;AAAA,cAHJM,mBAEM,OAFN,YAEM;AAAA,gBADJC,WAAsB,KAAA,QAAA,UAAA,CAAA,GAAA,QAAA,IAAA;AAAA,cAAA;;;;;QAK5BD,mBA0EM,OAAA;AAAA,UAzEJ,OAAKE,eAAA,CAAC,4BAA0B,EAAA,0BACI,MAAM,YAAO,SAAA,CAAA,CAAA;AAAA,UAChD,aAAW;AAAA,QAAA;UAGZF,mBAkBM,OAAA;AAAA,YAlBD,OAAM;AAAA,YAA8B,2BAAgB,MAAA;AAAA,YAAA,GAAQ,CAAA,MAAA,CAAA;AAAA,UAAA;YAEpDF,KAAAA,OAAO,UAAlBC,aAAAL,mBAEM,OAFN,YAEM;AAAA,cADJO,WAAsB,KAAA,QAAA,UAAA,CAAA,GAAA,QAAA,IAAA;AAAA,YAAA;YAGhB,MAAM,aADdF,UAAA,GAAAL,mBAKO,QALP,YAKOS,gBADF,MAAM,UAAU,IAAI,GAAA,CAAA;YAGzBH,mBAKE,OAAA;AAAA,uBAJI;AAAA,cAAJ,KAAI;AAAA,cACH,2BAAY,QAAA,aAAW;AAAA,cACxB,OAAM;AAAA,cACL,SAAO;AAAA,YAAA;;UAKJ,MAAM,YAAO,aADrBD,aAAAL,mBAqBM,OArBN,YAqBM;AAAA,YAjBJO,WAgBO,gCAhBP,MAgBO;AAAA,cAfLD,mBAcM,OAdN,YAcM;AAAA,gBAZK,CAAA,MAAM,wBADfI,YAIEC,aAAA;AAAA;kBAFC,UAAU,UAAU,WAAW,MAAM;AAAA,kBACrC;AAAA,gBAAA;gBAGkB,MAAM,wBAA3BD,YAAyD,eAAA;AAAA;kBAApB;AAAA,gBAAA;gBAG7B,MAAM,0BADdA,YAIE,aAAA;AAAA;kBAFC,UAAU,UAAU,WAAW,MAAM;AAAA,kBACrC;AAAA,gBAAA;;;gBAOI,MAAM,YAAO,YAD1BL,UAAA,GAAAL,mBAwBM,OAxBN,YAwBM;AAAA,YAnBJM,mBAkBM,OAlBN,YAkBM;AAAA,cAjBJC,WAgBO,gCAhBP,MAgBO;AAAA,gBAfLD,mBAcM,OAdN,YAcM;AAAA,kBAZK,CAAA,MAAM,wBADfI,YAIEC,aAAA;AAAA;oBAFC,UAAU,UAAU,WAAW,MAAM;AAAA,oBACrC;AAAA,kBAAA;kBAGkB,MAAM,wBAA3BD,YAAyD,eAAA;AAAA;oBAApB;AAAA,kBAAA;kBAG7B,MAAM,0BADdA,YAIE,aAAA;AAAA;oBAFC,UAAU,UAAU,WAAW,MAAM;AAAA,oBACrC;AAAA,kBAAA;;;;;;QAQbR,YAIaC,YAAA,EAJD,MAAK,WAAO;AAAA,2BACtB,MAEM;AAAA,YAFKC,KAAAA,OAAO,UAAlBC,aAAAL,mBAEM,OAFN,aAEM;AAAA,cADJO,WAAsB,KAAA,QAAA,UAAA,CAAA,GAAA,QAAA,IAAA;AAAA,YAAA;;;;;;;;"}
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, ElTable, ElTableColumn, ElMessage } from "element-plus";
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], ([text, 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
- (_a = streamGener.value) == null ? void 0 : _a.update(text);
161
+ (_b = streamGener.value) == null ? void 0 : _b.update(text);
155
162
  if (!typing) {
156
- (_b = streamGener.value) == null ? void 0 : _b.stop();
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
- (_c = streamGener.value) == null ? void 0 : _c.setSpeed(500);
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
- }, children);
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(ElTable, {
588
+ return h(CoreTable, {
580
589
  ...node.properties
581
590
  }, children);
582
591
  }