@core-pilot/client-vue 0.0.9 → 0.0.11
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/bubble-list/index.js +1 -1
- package/dist/cjs/components/bubble-list/index.js.map +1 -1
- package/dist/cjs/components/core-upload/index.js +1 -1
- package/dist/cjs/components/core-upload/index.js.map +1 -1
- 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/x-markdown/composables/useFormHandler.js +2 -0
- package/dist/cjs/components/x-markdown/composables/useFormHandler.js.map +1 -0
- package/dist/cjs/components/x-markdown/composables/useImageLoader.js +2 -0
- package/dist/cjs/components/x-markdown/composables/useImageLoader.js.map +1 -0
- package/dist/cjs/components/x-markdown/composables/useMarkdownProcessor.js +2 -0
- package/dist/cjs/components/x-markdown/composables/useMarkdownProcessor.js.map +1 -0
- package/dist/cjs/components/x-markdown/composables/useRefHandler.js +2 -0
- package/dist/cjs/components/x-markdown/composables/useRefHandler.js.map +1 -0
- package/dist/cjs/components/x-markdown/composables/useStreamHandler.js +2 -0
- package/dist/cjs/components/x-markdown/composables/useStreamHandler.js.map +1 -0
- 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/renderers/hastRenderer.js +2 -0
- package/dist/cjs/components/x-markdown/renderers/hastRenderer.js.map +1 -0
- package/dist/cjs/components/x-markdown/utils/disabledUtils.js +2 -0
- package/dist/cjs/components/x-markdown/utils/disabledUtils.js.map +1 -0
- package/dist/cjs/components/x-markdown/utils/formUtils.js +2 -0
- package/dist/cjs/components/x-markdown/utils/formUtils.js.map +1 -0
- package/dist/cjs/components/x-markdown/utils/jsonUtils.js +2 -0
- package/dist/cjs/components/x-markdown/utils/jsonUtils.js.map +1 -0
- 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/components/x-markdown/utils/refUtils.js +2 -0
- package/dist/cjs/components/x-markdown/utils/refUtils.js.map +1 -0
- package/dist/cjs/components/x-markdown/utils/textFormatUtils.js +2 -0
- package/dist/cjs/components/x-markdown/utils/textFormatUtils.js.map +1 -0
- package/dist/es/client-vue.css +1 -1
- package/dist/es/components/bubble-list/index.js +3 -0
- package/dist/es/components/bubble-list/index.js.map +1 -1
- package/dist/es/components/core-upload/index.js +33 -24
- package/dist/es/components/core-upload/index.js.map +1 -1
- package/dist/es/components/editor-sender/index.js +39 -16
- package/dist/es/components/editor-sender/index.js.map +1 -1
- package/dist/es/components/x-markdown/composables/useFormHandler.js +66 -0
- package/dist/es/components/x-markdown/composables/useFormHandler.js.map +1 -0
- package/dist/es/components/x-markdown/composables/useImageLoader.js +58 -0
- package/dist/es/components/x-markdown/composables/useImageLoader.js.map +1 -0
- package/dist/es/components/x-markdown/composables/useMarkdownProcessor.js +48 -0
- package/dist/es/components/x-markdown/composables/useMarkdownProcessor.js.map +1 -0
- package/dist/es/components/x-markdown/composables/useRefHandler.js +80 -0
- package/dist/es/components/x-markdown/composables/useRefHandler.js.map +1 -0
- package/dist/es/components/x-markdown/composables/useStreamHandler.js +45 -0
- package/dist/es/components/x-markdown/composables/useStreamHandler.js.map +1 -0
- package/dist/es/components/x-markdown/index.js +85 -646
- package/dist/es/components/x-markdown/index.js.map +1 -1
- package/dist/es/components/x-markdown/renderers/hastRenderer.js +427 -0
- package/dist/es/components/x-markdown/renderers/hastRenderer.js.map +1 -0
- package/dist/es/components/x-markdown/utils/disabledUtils.js +15 -0
- package/dist/es/components/x-markdown/utils/disabledUtils.js.map +1 -0
- package/dist/es/components/x-markdown/utils/formUtils.js +82 -0
- package/dist/es/components/x-markdown/utils/formUtils.js.map +1 -0
- package/dist/es/components/x-markdown/utils/jsonUtils.js +20 -0
- package/dist/es/components/x-markdown/utils/jsonUtils.js.map +1 -0
- package/dist/es/components/x-markdown/utils/parseCorePilotSchema.js +10 -0
- package/dist/es/components/x-markdown/utils/parseCorePilotSchema.js.map +1 -1
- package/dist/es/components/x-markdown/utils/refUtils.js +18 -0
- package/dist/es/components/x-markdown/utils/refUtils.js.map +1 -0
- package/dist/es/components/x-markdown/utils/textFormatUtils.js +46 -0
- package/dist/es/components/x-markdown/utils/textFormatUtils.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const e=require("vue"),t=require("vue-element-plus-x");;/* empty css */const i=require("./actionBar.js"),o=require("../x-markdown/index.js"),s=e.defineComponent({props:{list:{type:Array,default:()=>[]},btnLoading:{type:Boolean,default:!0},maxHeight:{type:String,default:"500px"},autoHideThinking:{type:Boolean,default:!0},speed:{type:Number,default:200},disLikeFeedbackList:{type:Array,default:()=>{}},likeFeedbackList:{type:Array,default:()=>{}}},expose:["showLastActionGroup","scrollToBottom","hideLastActionGroup"],emits:["hoverActiveRefTrigger","clickActiveRefTrigger","like","dislike","regenerate","copy","refConfigUpdate","questionClick","downloadFile","coreSubmit"],setup(t,{emit:o}){const s=e.useTemplateRef("bubbleList"),n=e.useTemplateRef("bubbleListContainer"),l=e.ref(!1),r=e.ref(null),a=e.ref(()=>{});e.watch(()=>r.value,(e,t)=>{var i;if(null===e)return;if(t===e)return;const s=null==(i=r.value)?void 0:i.querySelector("div[hidden]"),n=JSON.parse((null==s?void 0:s.textContent)||"[]");o("refConfigUpdate",n)}),e.watch(()=>t.list.length,()=>{console.log("props.list.length",t.list.length),e.nextTick(()=>{a.value(),a.value=g()})});const c=(e,t,i,s)=>{o(e,{content:t,message:s,cancel:i})},u=e=>{o("questionClick",e)},d=e=>t.list[t.list.length-1]===e,g=()=>{const e=n.value.querySelectorAll(".el-bubble-start"),t=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){const t=e.boundingClientRect.bottom,i=e.target.clientHeight,o=n.value.getBoundingClientRect().bottom;Math.abs(t-o)<i&&(r.value=e.target)}})},{root:n.value,threshold:[.1,.9]});return e.forEach(e=>{t.observe(e)}),()=>{t.disconnect()}};return e.onMounted(()=>{a.value=g()}),{hoverActiveRefTrigger:e=>{o("hoverActiveRefTrigger",e)},showLastActionGroup:()=>{l.value=!0},hideLastActionGroup:()=>{l.value=!1},showLastBubbleFooter:l,clickActiveRefTrigger:e=>{o("clickActiveRefTrigger",e)},clickAction:c,scrollToBottom:()=>{var e;null==(e=s.value)||e.scrollToBottom()},lastRefConfigUpdate:(e,i)=>{t.list[t.list.length-1]===i&&o("refConfigUpdate",e)},getQuestions:t=>t.questions&&t.questions.length>0?e.createVNode("div",{class:"question-list"},[t.questions.map((t,i)=>e.createVNode("span",{class:"question-item",key:i,onClick:()=>u(t)},[t,e.createVNode("span",{class:"icon"},null)]))]):null,questionClick:u,isLastItem:d,getActionBar:o=>{if("boolean"==typeof o.showActions&&!o.showActions)return null;const s=d(o);return s&&l.value?e.createVNode(i,{isLast:s,content:o.content,message:o,disLikeFeedbackList:t.disLikeFeedbackList,likeFeedbackList:t.likeFeedbackList,onClick:(e,t,i)=>c(e,t,i,o)},null):s?void 0:e.createVNode(i,{isLast:s,content:o.content,message:o,disLikeFeedbackList:t.disLikeFeedbackList,likeFeedbackList:t.likeFeedbackList,onClick:(e,t,i)=>c(e,t,i,o)},null)},onDownloadFile:e=>{o("downloadFile",e)},coreSubmit:(e,t)=>{o("coreSubmit",e,t)}}},render(){return e.createVNode("div",{ref:"bubbleListContainer",class:"bubble-list"},[e.createVNode(t.BubbleList,{ref:"bubbleList",list:this.list,btnLoading:this.btnLoading,maxHeight:this.maxHeight},{header:({item:i})=>{var o;return(null==(o=i.files)?void 0:o.length)?e.createVNode("div",{class:"bubble-item-header"},[i.files.map(i=>e.createVNode(t.FilesCard,{name:i.name,status:"done"},null))]):null},content:({item:t})=>e.createVNode(o,{key:t.id,typing:t.typing,speed:this.speed,text:t.content,historyInputs:t.historyInputs,isHistoryMessage:t.isHistoryMessage,autoHideThinking:this.autoHideThinking,onHoverActiveRefTrigger:this.hoverActiveRefTrigger,onClickActiveRefTrigger:this.clickActiveRefTrigger,onRefConfigUpdate:e=>this.lastRefConfigUpdate(e,t),onDownloadFile:this.onDownloadFile,onCoreSubmit:e=>this.coreSubmit(e,t)},null),footer:({item:t})=>"ai"===t.role?e.createVNode("div",null,[this.getActionBar(t),this.getQuestions(t)]):null})])}});module.exports=s;
|
|
1
|
+
"use strict";const e=require("vue"),t=require("vue-element-plus-x");;/* empty css */const i=require("./actionBar.js"),o=require("../x-markdown/index.js"),s=e.defineComponent({props:{list:{type:Array,default:()=>[]},btnLoading:{type:Boolean,default:!0},maxHeight:{type:String,default:"500px"},autoHideThinking:{type:Boolean,default:!0},speed:{type:Number,default:200},disLikeFeedbackList:{type:Array,default:()=>{}},likeFeedbackList:{type:Array,default:()=>{}}},expose:["showLastActionGroup","scrollToBottom","hideLastActionGroup"],emits:["hoverActiveRefTrigger","clickActiveRefTrigger","like","dislike","regenerate","copy","refConfigUpdate","questionClick","downloadFile","coreSubmit"],setup(t,{emit:o}){const s=e.useTemplateRef("bubbleList"),n=e.useTemplateRef("bubbleListContainer"),l=e.ref(!1),r=e.ref(null),a=e.ref(()=>{});e.watch(()=>r.value,(e,t)=>{var i;if(null===e)return;if(t===e)return;const s=null==(i=r.value)?void 0:i.querySelector("div[hidden]"),n=JSON.parse((null==s?void 0:s.textContent)||"[]");o("refConfigUpdate",n)}),e.watch(()=>t.list.length,()=>{console.log("props.list.length",t.list.length),e.nextTick(()=>{a.value(),a.value=g()})});const c=(e,t,i,s)=>{o(e,{content:t,message:s,cancel:i})},u=e=>{o("questionClick",e)},d=e=>t.list[t.list.length-1]===e,g=()=>{const e=n.value.querySelectorAll(".el-bubble-start"),t=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){const t=e.boundingClientRect.bottom,i=e.target.clientHeight,o=n.value.getBoundingClientRect().bottom;Math.abs(t-o)<i&&(r.value=e.target)}})},{root:n.value,threshold:[.1,.9]});return e.forEach(e=>{t.observe(e)}),()=>{t.disconnect()}};return e.onMounted(()=>{a.value=g()}),{hoverActiveRefTrigger:e=>{o("hoverActiveRefTrigger",e)},showLastActionGroup:()=>{l.value=!0},hideLastActionGroup:()=>{l.value=!1},showLastBubbleFooter:l,clickActiveRefTrigger:e=>{o("clickActiveRefTrigger",e)},clickAction:c,scrollToBottom:()=>{var e;null==(e=s.value)||e.scrollToBottom()},lastRefConfigUpdate:(e,i)=>{t.list[t.list.length-1]===i&&o("refConfigUpdate",e)},getQuestions:t=>t.questions&&t.questions.length>0?e.createVNode("div",{class:"question-list"},[t.questions.map((t,i)=>e.createVNode("span",{class:"question-item",key:i,onClick:()=>u(t)},[t,e.createVNode("span",{class:"icon"},null)]))]):null,questionClick:u,isLastItem:d,getActionBar:o=>{if("boolean"==typeof o.showActions&&!o.showActions)return null;const s=d(o);return s&&l.value?e.createVNode(i,{isLast:s,content:o.content,message:o,disLikeFeedbackList:t.disLikeFeedbackList,likeFeedbackList:t.likeFeedbackList,onClick:(e,t,i)=>c(e,t,i,o)},null):s?void 0:e.createVNode(i,{isLast:s,content:o.content,message:o,disLikeFeedbackList:t.disLikeFeedbackList,likeFeedbackList:t.likeFeedbackList,onClick:(e,t,i)=>c(e,t,i,o)},null)},onDownloadFile:e=>{o("downloadFile",e)},coreSubmit:(e,t)=>{o("coreSubmit",e,t)}}},render(){return e.createVNode("div",{ref:"bubbleListContainer",class:"bubble-list"},[e.createVNode(t.BubbleList,{ref:"bubbleList",list:this.list,btnLoading:this.btnLoading,maxHeight:this.maxHeight},{header:({item:i})=>{var o;return(null==(o=i.files)?void 0:o.length)?e.createVNode("div",{class:"bubble-item-header"},[i.files.map(i=>e.createVNode(t.FilesCard,{name:i.name,status:"done"},null))]):null},content:({item:t})=>e.createVNode(o,{key:t.id,typing:t.typing,speed:this.speed,text:t.content,historyInputs:t.historyInputs,isHistoryMessage:t.isHistoryMessage,autoHideThinking:this.autoHideThinking,user:this.user,authToken:this.authToken,appId:this.appId,onHoverActiveRefTrigger:this.hoverActiveRefTrigger,onClickActiveRefTrigger:this.clickActiveRefTrigger,onRefConfigUpdate:e=>this.lastRefConfigUpdate(e,t),onDownloadFile:this.onDownloadFile,onCoreSubmit:e=>this.coreSubmit(e,t)},null),footer:({item:t})=>"ai"===t.role?e.createVNode("div",null,[this.getActionBar(t),this.getQuestions(t)]):null})])}});module.exports=s;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/bubble-list/index.tsx"],"sourcesContent":["import { defineComponent, nextTick, onMounted, ref, useTemplateRef, watch } from 'vue';\nimport { BubbleList, FilesCard } from 'vue-element-plus-x';\nimport type { BubbleListItemProps } from 'vue-element-plus-x/types/BubbleList';\nimport './style/index.less';\nimport ActionBar, { BtnItemConfig } from './actionBar';\nimport XMarkdown from '../x-markdown';\n\nexport interface FeedbackItem {\n title: string;\n content: string;\n checked: boolean;\n // showInput?: boolean; // 是否显示输入框\n}\n\nexport interface MessageItem extends BubbleListItemProps {\n role: 'user' | 'ai';\n questions?: Array<string>;\n speed?: number;\n id: string;\n showActions?: boolean;\n feedback?: 'like' | 'dislike';\n files?: Array<{\n id: string,\n extension: string,\n name: string,\n }>;\n isHistoryMessage?: boolean;\n historyInputs?: Record<string, any>;\n}\n\nexport default defineComponent({\n props: {\n list: {\n type: Array as () => Array<MessageItem>,\n default: () => [],\n },\n btnLoading: {\n type: Boolean,\n default: true,\n },\n maxHeight: {\n type: String,\n default: '500px',\n },\n autoHideThinking: {\n type: Boolean,\n default: true,\n },\n speed: {\n type: Number,\n default: 200,\n },\n disLikeFeedbackList: {\n type: Array as () => Array<FeedbackItem>,\n default: () => undefined,\n },\n likeFeedbackList: {\n type: Array as () => Array<FeedbackItem>,\n default: () => undefined,\n },\n },\n expose: ['showLastActionGroup', 'scrollToBottom', 'hideLastActionGroup'],\n emits: [\n 'hoverActiveRefTrigger',\n 'clickActiveRefTrigger',\n 'like',\n 'dislike',\n 'regenerate',\n 'copy',\n 'refConfigUpdate',\n 'questionClick',\n 'downloadFile',\n 'coreSubmit',\n ],\n setup(props, { emit }) {\n const bubbleList = useTemplateRef<typeof BubbleList>('bubbleList');\n const bubbleListContainer = useTemplateRef<Element>('bubbleListContainer');\n const showLastBubbleFooter = ref(false);\n const curActiveItem = ref<Element | null>(null);\n const destoryObserver = ref<Function>(() => {});\n\n watch(() => curActiveItem.value, (newVal, oldVal) => {\n if (newVal === null) {\n return;\n }\n if (oldVal === newVal) {\n return;\n }\n const refContainer = (curActiveItem.value as HTMLElement)?.querySelector('div[hidden]');\n const curRefList = JSON.parse(refContainer?.textContent || '[]');\n emit('refConfigUpdate', curRefList);\n })\n\n watch(() => props.list.length, () => {\n console.log('props.list.length', props.list.length);\n nextTick(() => {\n destoryObserver.value();\n destoryObserver.value = scrollTrigger();\n })\n })\n\n const hoverActiveRefTrigger = (item) => {\n emit('hoverActiveRefTrigger', item);\n }\n\n const clickActiveRefTrigger = (item) => {\n emit('clickActiveRefTrigger', item);\n }\n\n const showLastActionGroup = () => {\n showLastBubbleFooter.value = true;\n }\n\n const hideLastActionGroup = () => {\n showLastBubbleFooter.value = false;\n }\n\n const clickAction = (type: BtnItemConfig['type'], content, cancel, item) => {\n emit(type, { content, message: item, cancel })\n }\n\n const scrollToBottom = () => {\n (bubbleList.value as any)?.scrollToBottom();\n }\n\n const lastRefConfigUpdate = (refList, item) => {\n // 更新最后一条消息的引用列表\n if (props.list[props.list.length - 1] === item) {\n emit('refConfigUpdate', refList);\n }\n }\n\n const getQuestions = (item) => {\n if (item.questions && item.questions.length > 0) {\n return (\n <div class='question-list'>\n {\n item.questions.map((question, index) => {\n return (\n <span\n class='question-item'\n key={index}\n onClick={() => questionClick(question)}\n >\n {question}\n <span class='icon'></span>\n </span>\n )\n })\n }\n </div>\n )\n }\n return null;\n }\n\n const questionClick = (q) => {\n emit('questionClick', q)\n }\n\n const isLastItem = (item: MessageItem) => {\n return props.list[props.list.length - 1] === item;\n }\n\n const getActionBar = (item: MessageItem) => {\n // 如果当前项中明确指定不显示actionbar,则不显示\n if (typeof item.showActions === 'boolean' && !item.showActions) {\n return null;\n }\n const isLast = isLastItem(item);\n if (isLast && showLastBubbleFooter.value) {\n return (\n <ActionBar\n isLast={isLast}\n content={item.content}\n message={item}\n disLikeFeedbackList={props.disLikeFeedbackList}\n likeFeedbackList={props.likeFeedbackList}\n onClick={(type, content, cancel) => clickAction(type, content, cancel, item)}\n />\n )\n }\n if (!isLast) {\n return (\n <ActionBar\n isLast={isLast}\n content={item.content}\n message={item}\n disLikeFeedbackList={props.disLikeFeedbackList}\n likeFeedbackList={props.likeFeedbackList}\n onClick={(type, content, cancel) => clickAction(type, content, cancel, item)}\n />\n );\n }\n }\n\n const onDownloadFile = (payload) => {\n emit('downloadFile', payload);\n }\n\n const scrollTrigger = () => {\n const messageItems = bubbleListContainer.value!.querySelectorAll('.el-bubble-start');\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n const itemBottom = entry.boundingClientRect.bottom;\n const height = entry.target.clientHeight;\n const listBottom = bubbleListContainer.value!.getBoundingClientRect().bottom;\n \n if (Math.abs(itemBottom - listBottom) < height) {\n curActiveItem.value = entry.target;\n }\n }\n });\n }, {\n root: bubbleListContainer.value!,\n threshold: [0.1, 0.9]\n });\n\n // 3. 为所有消息项添加监听\n messageItems.forEach(item => {\n observer.observe(item);\n });\n\n return () => {\n observer.disconnect();\n }\n }\n\n const coreSubmit = (payload, item) => {\n emit('coreSubmit', payload, item);\n }\n\n onMounted(() => {\n destoryObserver.value = scrollTrigger();\n })\n\n return {\n hoverActiveRefTrigger,\n showLastActionGroup,\n hideLastActionGroup,\n showLastBubbleFooter,\n clickActiveRefTrigger,\n clickAction,\n scrollToBottom,\n lastRefConfigUpdate,\n getQuestions,\n questionClick,\n isLastItem,\n getActionBar,\n onDownloadFile,\n coreSubmit,\n };\n },\n\n render() {\n return (\n <div\n ref=\"bubbleListContainer\"\n class=\"bubble-list\"\n >\n <BubbleList\n ref=\"bubbleList\"\n list={this.list}\n btnLoading={this.btnLoading}\n maxHeight={this.maxHeight}\n >\n {{\n header: ({ item }: { item: MessageItem }) => {\n if (!item.files?.length) {\n return null;\n }\n return (\n <div class=\"bubble-item-header\">\n {\n item.files.map((item) => (\n <FilesCard\n name={item.name}\n status=\"done\"\n />\n ))\n }\n </div>\n )\n },\n content: ({ item }: { item: MessageItem }) => (\n <XMarkdown\n key={item.id}\n typing={item.typing as boolean}\n speed={this.speed}\n text={item.content}\n historyInputs={item.historyInputs}\n isHistoryMessage={item.isHistoryMessage}\n autoHideThinking={this.autoHideThinking}\n onHoverActiveRefTrigger={this.hoverActiveRefTrigger}\n onClickActiveRefTrigger={this.clickActiveRefTrigger}\n onRefConfigUpdate={(refList) => this.lastRefConfigUpdate(refList, item)}\n onDownloadFile={this.onDownloadFile}\n onCoreSubmit={(payload) => this.coreSubmit(payload, item)}\n />\n ),\n footer: ({ item }: { item: MessageItem }) => {\n if (item.role === 'ai') {\n return (\n <div>\n {\n this.getActionBar(item)\n }\n {\n this.getQuestions(item)\n }\n </div>\n )\n }\n return null;\n }\n }}\n </BubbleList>\n </div>\n );\n }\n});"],"names":["index","props","list","type","Array","default","btnLoading","Boolean","maxHeight","String","autoHideThinking","speed","Number","disLikeFeedbackList","likeFeedbackList","expose","emits","setup","emit","bubbleList","useTemplateRef","bubbleListContainer","showLastBubbleFooter","ref","curActiveItem","destoryObserver","watch","value","newVal","oldVal","refContainer","querySelector","curRefList","JSON","parse","textContent","length","console","log","nextTick","scrollTrigger","clickAction","content","cancel","item","message","questionClick","q","isLastItem","messageItems","querySelectorAll","observer","IntersectionObserver","entries","forEach","entry","isIntersecting","itemBottom","boundingClientRect","bottom","height","target","clientHeight","listBottom","getBoundingClientRect","Math","abs","root","threshold","observe","disconnect","onMounted","hoverActiveRefTrigger","showLastActionGroup","hideLastActionGroup","clickActiveRefTrigger","scrollToBottom","lastRefConfigUpdate","refList","getQuestions","questions","_createVNode","class","map","question","key","onClick","getActionBar","showActions","isLast","ActionBar","onDownloadFile","payload","coreSubmit","render","BubbleList","this","header","files","FilesCard","name","status","XMarkdown","id","typing","text","historyInputs","isHistoryMessage","onHoverActiveRefTrigger","onClickActiveRefTrigger","onRefConfigUpdate","onCoreSubmit","footer","role"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/bubble-list/index.tsx"],"sourcesContent":["import { defineComponent, nextTick, onMounted, ref, useTemplateRef, watch } from 'vue';\nimport { BubbleList, FilesCard } from 'vue-element-plus-x';\nimport type { BubbleListItemProps } from 'vue-element-plus-x/types/BubbleList';\nimport './style/index.less';\nimport ActionBar, { BtnItemConfig } from './actionBar';\nimport XMarkdown from '../x-markdown';\n\nexport interface FeedbackItem {\n title: string;\n content: string;\n checked: boolean;\n // showInput?: boolean; // 是否显示输入框\n}\n\nexport interface MessageItem extends BubbleListItemProps {\n role: 'user' | 'ai';\n questions?: Array<string>;\n speed?: number;\n id: string;\n showActions?: boolean;\n feedback?: 'like' | 'dislike';\n files?: Array<{\n id: string,\n extension: string,\n name: string,\n }>;\n isHistoryMessage?: boolean;\n historyInputs?: Record<string, any>;\n user?: string;\n authToken?: string;\n appId?: string;\n}\n\nexport default defineComponent({\n props: {\n list: {\n type: Array as () => Array<MessageItem>,\n default: () => [],\n },\n btnLoading: {\n type: Boolean,\n default: true,\n },\n maxHeight: {\n type: String,\n default: '500px',\n },\n autoHideThinking: {\n type: Boolean,\n default: true,\n },\n speed: {\n type: Number,\n default: 200,\n },\n disLikeFeedbackList: {\n type: Array as () => Array<FeedbackItem>,\n default: () => undefined,\n },\n likeFeedbackList: {\n type: Array as () => Array<FeedbackItem>,\n default: () => undefined,\n },\n },\n expose: ['showLastActionGroup', 'scrollToBottom', 'hideLastActionGroup'],\n emits: [\n 'hoverActiveRefTrigger',\n 'clickActiveRefTrigger',\n 'like',\n 'dislike',\n 'regenerate',\n 'copy',\n 'refConfigUpdate',\n 'questionClick',\n 'downloadFile',\n 'coreSubmit',\n ],\n setup(props, { emit }) {\n const bubbleList = useTemplateRef<typeof BubbleList>('bubbleList');\n const bubbleListContainer = useTemplateRef<Element>('bubbleListContainer');\n const showLastBubbleFooter = ref(false);\n const curActiveItem = ref<Element | null>(null);\n const destoryObserver = ref<Function>(() => {});\n\n watch(() => curActiveItem.value, (newVal, oldVal) => {\n if (newVal === null) {\n return;\n }\n if (oldVal === newVal) {\n return;\n }\n const refContainer = (curActiveItem.value as HTMLElement)?.querySelector('div[hidden]');\n const curRefList = JSON.parse(refContainer?.textContent || '[]');\n emit('refConfigUpdate', curRefList);\n })\n\n watch(() => props.list.length, () => {\n console.log('props.list.length', props.list.length);\n nextTick(() => {\n destoryObserver.value();\n destoryObserver.value = scrollTrigger();\n })\n })\n\n const hoverActiveRefTrigger = (item) => {\n emit('hoverActiveRefTrigger', item);\n }\n\n const clickActiveRefTrigger = (item) => {\n emit('clickActiveRefTrigger', item);\n }\n\n const showLastActionGroup = () => {\n showLastBubbleFooter.value = true;\n }\n\n const hideLastActionGroup = () => {\n showLastBubbleFooter.value = false;\n }\n\n const clickAction = (type: BtnItemConfig['type'], content, cancel, item) => {\n emit(type, { content, message: item, cancel })\n }\n\n const scrollToBottom = () => {\n (bubbleList.value as any)?.scrollToBottom();\n }\n\n const lastRefConfigUpdate = (refList, item) => {\n // 更新最后一条消息的引用列表\n if (props.list[props.list.length - 1] === item) {\n emit('refConfigUpdate', refList);\n }\n }\n\n const getQuestions = (item) => {\n if (item.questions && item.questions.length > 0) {\n return (\n <div class='question-list'>\n {\n item.questions.map((question, index) => {\n return (\n <span\n class='question-item'\n key={index}\n onClick={() => questionClick(question)}\n >\n {question}\n <span class='icon'></span>\n </span>\n )\n })\n }\n </div>\n )\n }\n return null;\n }\n\n const questionClick = (q) => {\n emit('questionClick', q)\n }\n\n const isLastItem = (item: MessageItem) => {\n return props.list[props.list.length - 1] === item;\n }\n\n const getActionBar = (item: MessageItem) => {\n // 如果当前项中明确指定不显示actionbar,则不显示\n if (typeof item.showActions === 'boolean' && !item.showActions) {\n return null;\n }\n const isLast = isLastItem(item);\n if (isLast && showLastBubbleFooter.value) {\n return (\n <ActionBar\n isLast={isLast}\n content={item.content}\n message={item}\n disLikeFeedbackList={props.disLikeFeedbackList}\n likeFeedbackList={props.likeFeedbackList}\n onClick={(type, content, cancel) => clickAction(type, content, cancel, item)}\n />\n )\n }\n if (!isLast) {\n return (\n <ActionBar\n isLast={isLast}\n content={item.content}\n message={item}\n disLikeFeedbackList={props.disLikeFeedbackList}\n likeFeedbackList={props.likeFeedbackList}\n onClick={(type, content, cancel) => clickAction(type, content, cancel, item)}\n />\n );\n }\n }\n\n const onDownloadFile = (payload) => {\n emit('downloadFile', payload);\n }\n\n const scrollTrigger = () => {\n const messageItems = bubbleListContainer.value!.querySelectorAll('.el-bubble-start');\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n const itemBottom = entry.boundingClientRect.bottom;\n const height = entry.target.clientHeight;\n const listBottom = bubbleListContainer.value!.getBoundingClientRect().bottom;\n \n if (Math.abs(itemBottom - listBottom) < height) {\n curActiveItem.value = entry.target;\n }\n }\n });\n }, {\n root: bubbleListContainer.value!,\n threshold: [0.1, 0.9]\n });\n\n // 3. 为所有消息项添加监听\n messageItems.forEach(item => {\n observer.observe(item);\n });\n\n return () => {\n observer.disconnect();\n }\n }\n\n const coreSubmit = (payload, item) => {\n emit('coreSubmit', payload, item);\n }\n\n onMounted(() => {\n destoryObserver.value = scrollTrigger();\n })\n\n return {\n hoverActiveRefTrigger,\n showLastActionGroup,\n hideLastActionGroup,\n showLastBubbleFooter,\n clickActiveRefTrigger,\n clickAction,\n scrollToBottom,\n lastRefConfigUpdate,\n getQuestions,\n questionClick,\n isLastItem,\n getActionBar,\n onDownloadFile,\n coreSubmit,\n };\n },\n\n render() {\n return (\n <div\n ref=\"bubbleListContainer\"\n class=\"bubble-list\"\n >\n <BubbleList\n ref=\"bubbleList\"\n list={this.list}\n btnLoading={this.btnLoading}\n maxHeight={this.maxHeight}\n >\n {{\n header: ({ item }: { item: MessageItem }) => {\n if (!item.files?.length) {\n return null;\n }\n return (\n <div class=\"bubble-item-header\">\n {\n item.files.map((item) => (\n <FilesCard\n name={item.name}\n status=\"done\"\n />\n ))\n }\n </div>\n )\n },\n content: ({ item }: { item: MessageItem }) => (\n <XMarkdown\n key={item.id}\n typing={item.typing as boolean}\n speed={this.speed}\n text={item.content}\n historyInputs={item.historyInputs}\n isHistoryMessage={item.isHistoryMessage}\n autoHideThinking={this.autoHideThinking}\n user={this.user}\n authToken={this.authToken}\n appId={this.appId}\n onHoverActiveRefTrigger={this.hoverActiveRefTrigger}\n onClickActiveRefTrigger={this.clickActiveRefTrigger}\n onRefConfigUpdate={(refList) => this.lastRefConfigUpdate(refList, item)}\n onDownloadFile={this.onDownloadFile}\n onCoreSubmit={(payload) => this.coreSubmit(payload, item)}\n />\n ),\n footer: ({ item }: { item: MessageItem }) => {\n if (item.role === 'ai') {\n return (\n <div>\n {\n this.getActionBar(item)\n }\n {\n this.getQuestions(item)\n }\n </div>\n )\n }\n return null;\n }\n }}\n </BubbleList>\n </div>\n );\n }\n});"],"names":["index","props","list","type","Array","default","btnLoading","Boolean","maxHeight","String","autoHideThinking","speed","Number","disLikeFeedbackList","likeFeedbackList","expose","emits","setup","emit","bubbleList","useTemplateRef","bubbleListContainer","showLastBubbleFooter","ref","curActiveItem","destoryObserver","watch","value","newVal","oldVal","refContainer","querySelector","curRefList","JSON","parse","textContent","length","console","log","nextTick","scrollTrigger","clickAction","content","cancel","item","message","questionClick","q","isLastItem","messageItems","querySelectorAll","observer","IntersectionObserver","entries","forEach","entry","isIntersecting","itemBottom","boundingClientRect","bottom","height","target","clientHeight","listBottom","getBoundingClientRect","Math","abs","root","threshold","observe","disconnect","onMounted","hoverActiveRefTrigger","showLastActionGroup","hideLastActionGroup","clickActiveRefTrigger","scrollToBottom","lastRefConfigUpdate","refList","getQuestions","questions","_createVNode","class","map","question","key","onClick","getActionBar","showActions","isLast","ActionBar","onDownloadFile","payload","coreSubmit","render","BubbleList","this","header","files","FilesCard","name","status","XMarkdown","id","typing","text","historyInputs","isHistoryMessage","user","authToken","appId","onHoverActiveRefTrigger","onClickActiveRefTrigger","onRefConfigUpdate","onCoreSubmit","footer","role"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const e=require("vue"),t=require("element-plus");/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */;/* empty css */const s=require("./assets/upload.svg.js"),l=require("./assets/temp.svg.js"),a=require("./assets/delete.svg.js");;/* empty css */const i=e.defineComponent({name:"CoreUpload",props:{action:{type:String,default:""},accept:{type:String,default:".xlsx,.xls,.csv"},maxSize:{type:Number,default:10},multiple:{type:Boolean,default:!0},fileList:{type:Array,default:()=>[]},templateUrl:{type:String,default:""},templateFileName:{type:String,default:"模板文件"},tips:{type:String,default:""},disabled:{type:Boolean,default:!1},httpRequest:{type:Function,default:void 0}},emits:["update:fileList","
|
|
1
|
+
"use strict";const e=require("vue"),t=require("element-plus");/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */;/* empty css */const s=require("./assets/upload.svg.js"),l=require("./assets/temp.svg.js"),a=require("./assets/delete.svg.js");;/* empty css */const i=e.defineComponent({name:"CoreUpload",props:{action:{type:String,default:"/openapi/v1/app/files/upload"},accept:{type:String,default:".xlsx,.xls,.csv"},maxSize:{type:Number,default:10},multiple:{type:Boolean,default:!0},fileList:{type:Array,default:()=>[]},templateUrl:{type:String,default:""},templateFileName:{type:String,default:"模板文件"},tips:{type:String,default:""},disabled:{type:Boolean,default:!1},httpRequest:{type:Function,default:void 0},headers:{type:Object,default:()=>({Authorization:"Bearer ApiSecretKey_mEKsrCMvxNLzzUUKeQmpzaUZqwZxFyJf",appId:"9a673565-d4f6-4382-bc67-f1beb07df435"})},extendData:{type:Object,default:()=>({user:"abc-123"})}},emits:["update:fileList","success","remove","download-template","error"],setup(s,{emit:l}){const a=e.ref(),i=e.ref(s.fileList||[]);e.watch(()=>s.fileList,e=>{e&&JSON.stringify(e)!==JSON.stringify(i.value)&&(i.value=[...e||[]])},{deep:!0,immediate:!0});const r=e.computed(()=>{if(s.tips)return s.tips;return`支持 ${s.accept.split(",").map(e=>e.replace(".","").toUpperCase()).join(" 或 ")} 格式。文件大小不超过 ${s.maxSize}MB。`});return{uploadRef:a,fileList:i,tipsText:r,formatFileSize:e=>e<1024?e+" B":e<1048576?(e/1024).toFixed(2)+" KB":(e/1048576).toFixed(2)+" MB",beforeUpload:e=>!!(e=>{const l=s.accept.split(",").map(e=>e.trim().toLowerCase()),a=(e=>{const t=e.lastIndexOf(".");return-1!==t?e.substring(t).toLowerCase():""})(e.name);if(!l.some(t=>t.startsWith(".")?t===a:e.type&&e.type.includes(t.replace(".","")))){const e=s.accept.split(",").map(e=>e.replace(".","").toUpperCase()).join(" 或 ");return t.ElMessage.error(`只能上传 ${e} 格式的文件!`),!1}return!0})(e)&&!!(e=>{const l=1024*s.maxSize*1024;return!(e.size>l&&(t.ElMessage.error(`文件大小不能超过 ${s.maxSize}MB!`),1))})(e),handleRemove:(e,t)=>{i.value=t.map(e=>({name:e.name,...e.response||{}})),l("update:fileList",i.value),l("remove",e,t)},handleError:(e,s)=>{t.ElMessage.error(`文件 ${s.name} 上传失败:${e.message}`),l("error",e,s)},handleSuccess:(e,t,s)=>{i.value=s.map(t=>({name:t.name,...e||{}})),l("update:fileList",i.value),l("success",e,t,i)},handleDownloadTemplate:()=>{if(!s.templateUrl)return void t.ElMessage.warning("模板文件地址未配置");l("download-template",s.templateUrl);const e=document.createElement("a");e.href=s.templateUrl,e.download=s.templateFileName,document.body.appendChild(e),e.click(),document.body.removeChild(e)},handleDelete:e=>{const t=i.value.findIndex(t=>t.uid===e.uid);-1!==t&&(i.value.splice(t,1),l("update:fileList",i.value),l("remove",e,i.value))}}},render(){return e.createVNode("div",{class:"core-upload"},[e.createVNode("div",{class:"core-upload__actions"},[e.createVNode(t.ElUpload,{ref:"uploadRef",class:"core-upload__upload",action:this.action,accept:this.accept,headers:this.headers,data:this.extendData,multiple:this.multiple,fileList:this.fileList,beforeUpload:this.beforeUpload,onRemove:this.handleRemove,onError:this.handleError,onSuccess:this.handleSuccess,httpRequest:this.httpRequest,disabled:this.disabled,showFileList:!1},{trigger:()=>e.createVNode(t.ElButton,{type:"primary",icon:e.createVNode("img",{src:s,alt:"upload"},null),disabled:this.disabled},{default:()=>[e.createTextVNode("上传文件")]})}),e.createVNode(t.ElButton,{icon:e.createVNode("img",{src:l,alt:"download"},null),onClick:this.handleDownloadTemplate,disabled:this.disabled},{default:()=>[e.createTextVNode("下载模板")]})]),this.tipsText&&e.createVNode("div",{class:"core-upload__tips"},[this.tipsText]),this.fileList&&this.fileList.length>0&&e.createVNode("div",{class:"core-upload__file-list"},[this.fileList.map(t=>e.createVNode("div",{key:t.uid,class:"core-upload__file-item"},[e.createVNode("div",{class:"core-upload__file-info"},[e.createVNode("span",{class:"core-upload__file-icon"},[e.createTextVNode("📄")]),e.createVNode("span",{class:"core-upload__file-name",title:t.name},[t.name])]),e.createVNode("img",{onClick:()=>this.handleDelete(t),src:a,alt:"delete",class:"core-upload__file-delete"},null)]))])])}});module.exports=i;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/core-upload/index.tsx"],"sourcesContent":["import { defineComponent, ref, PropType, computed, watch } from 'vue';\nimport { ElUpload, ElButton, ElMessage, ElIcon } from 'element-plus';\nimport type { UploadFile, UploadFiles, UploadRequestOptions } from 'element-plus';\n// @ts-ignore\nimport uploadIcon from './assets/upload.svg';\n// @ts-ignore\nimport tempIcon from './assets/temp.svg';\n// @ts-ignore\nimport deleteIcon from './assets/delete.svg';\nimport './style.less';\n\nexport interface UploadFileItem {\n name: string;\n url?: string;\n uid?: number;\n status?: 'ready' | 'uploading' | 'success' | 'fail';\n response?: any;\n [key: string]: any;\n}\n\nexport default defineComponent({\n name: 'CoreUpload',\n props: {\n // 上传地址\n action: {\n type: String,\n default: '',\n },\n // 允许上传的文件类型\n accept: {\n type: String,\n default: '.xlsx,.xls,.csv',\n },\n // 文件大小限制(单位:MB)\n maxSize: {\n type: Number,\n default: 10,\n },\n // 是否支持多文件上传\n multiple: {\n type: Boolean,\n default: true,\n },\n // 文件列表\n fileList: {\n type: Array as PropType<UploadFileItem[]>,\n default: () => [],\n },\n // 下载模板的URL\n templateUrl: {\n type: String,\n default: '',\n },\n // 下载模板的文件名\n templateFileName: {\n type: String,\n default: '模板文件',\n },\n // 提示文本\n tips: {\n type: String,\n default: '',\n },\n // 是否禁用\n disabled: {\n type: Boolean,\n default: false,\n },\n // 自定义上传请求\n httpRequest: {\n type: Function as PropType<(options: UploadRequestOptions) => void>,\n default: undefined,\n },\n },\n emits: ['update:fileList', 'change', 'remove', 'download-template', 'error'],\n setup(props, { emit }) {\n const uploadRef = ref<InstanceType<typeof ElUpload>>();\n const fileList = ref<UploadFileItem[]>(props.fileList || []);\n\n // 监听外部 fileList 变化\n watch(\n () => props.fileList,\n (newFileList) => {\n if (newFileList && JSON.stringify(newFileList) !== JSON.stringify(fileList.value)) {\n fileList.value = [...(newFileList || [])];\n }\n },\n { deep: true, immediate: true }\n );\n\n // 生成提示文本\n const tipsText = computed(() => {\n if (props.tips) {\n return props.tips;\n }\n const acceptTypes = props.accept\n .split(',')\n .map((type) => type.replace('.', '').toUpperCase())\n .join(' 或 ');\n return `支持 ${acceptTypes} 格式。文件大小不超过 ${props.maxSize}MB。`;\n });\n\n // 格式化文件大小\n const formatFileSize = (size: number): string => {\n if (size < 1024) {\n return size + ' B';\n } else if (size < 1024 * 1024) {\n return (size / 1024).toFixed(2) + ' KB';\n } else {\n return (size / (1024 * 1024)).toFixed(2) + ' MB';\n }\n };\n\n // 获取文件扩展名\n const getFileExtension = (filename: string): string => {\n const lastDot = filename.lastIndexOf('.');\n return lastDot !== -1 ? filename.substring(lastDot).toLowerCase() : '';\n };\n\n // 验证文件类型\n const validateFileType = (file: File): boolean => {\n const acceptTypes = props.accept.split(',').map((type) => type.trim().toLowerCase());\n const fileExt = getFileExtension(file.name);\n const isValid = acceptTypes.some((type) => {\n if (type.startsWith('.')) {\n return type === fileExt;\n }\n // 支持 MIME 类型\n return file.type && file.type.includes(type.replace('.', ''));\n });\n\n if (!isValid) {\n const acceptTypesText = props.accept\n .split(',')\n .map((type) => type.replace('.', '').toUpperCase())\n .join(' 或 ');\n ElMessage.error(`只能上传 ${acceptTypesText} 格式的文件!`);\n return false;\n }\n return true;\n };\n\n // 验证文件大小\n const validateFileSize = (file: File): boolean => {\n const maxSizeBytes = props.maxSize * 1024 * 1024;\n if (file.size > maxSizeBytes) {\n ElMessage.error(`文件大小不能超过 ${props.maxSize}MB!`);\n return false;\n }\n return true;\n };\n\n // 上传前的校验\n const beforeUpload = (file: File): boolean => {\n // 类型校验\n if (!validateFileType(file)) {\n return false;\n }\n // 大小校验\n if (!validateFileSize(file)) {\n return false;\n }\n return true;\n };\n\n // 文件状态改变时的钩子\n const handleChange = (uploadFile: UploadFile, uploadFiles: UploadFiles) => {\n fileList.value = uploadFiles.map((file) => ({\n name: file.name,\n url: file.url,\n uid: file.uid,\n status: file.status,\n response: file.response,\n }));\n emit('update:fileList', fileList.value);\n emit('change', uploadFile, uploadFiles);\n };\n\n // 文件移除时的钩子\n const handleRemove = (uploadFile: UploadFile, uploadFiles: UploadFiles) => {\n fileList.value = uploadFiles.map((file) => ({\n name: file.name,\n url: file.url,\n uid: file.uid,\n status: file.status,\n response: file.response,\n }));\n emit('update:fileList', fileList.value);\n emit('remove', uploadFile, uploadFiles);\n };\n\n // 上传失败时的钩子\n const handleError = (error: Error, uploadFile: UploadFile) => {\n ElMessage.error(`文件 ${uploadFile.name} 上传失败:${error.message}`);\n emit('error', error, uploadFile);\n };\n\n // 下载模板\n const handleDownloadTemplate = () => {\n if (!props.templateUrl) {\n ElMessage.warning('模板文件地址未配置');\n return;\n }\n emit('download-template', props.templateUrl);\n \n // 如果没有自定义下载处理,则使用默认下载方式\n const link = document.createElement('a');\n link.href = props.templateUrl;\n link.download = props.templateFileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n };\n\n // 删除文件\n const handleDelete = (file: UploadFileItem) => {\n const index = fileList.value.findIndex((item) => item.uid === file.uid);\n if (index !== -1) {\n fileList.value.splice(index, 1);\n emit('update:fileList', fileList.value);\n emit('remove', file, fileList.value);\n }\n };\n\n return {\n uploadRef,\n fileList,\n tipsText,\n formatFileSize,\n beforeUpload,\n handleChange,\n handleRemove,\n handleError,\n handleDownloadTemplate,\n handleDelete,\n };\n },\n render() {\n return (\n <div class=\"core-upload\">\n {/* 第一层:上传文件、下载模板按钮 */}\n <div class=\"core-upload__actions\">\n <ElUpload\n ref=\"uploadRef\"\n class=\"core-upload__upload\"\n action={this.action}\n accept={this.accept}\n multiple={this.multiple}\n fileList={this.fileList}\n beforeUpload={this.beforeUpload}\n onChange={this.handleChange}\n onRemove={this.handleRemove}\n onError={this.handleError}\n httpRequest={this.httpRequest}\n disabled={this.disabled}\n showFileList={false}\n >\n {{\n trigger: () => (\n <ElButton\n type=\"primary\"\n icon={<img src={uploadIcon} alt=\"upload\" />}\n disabled={this.disabled}\n >\n 上传文件\n </ElButton>\n ),\n }}\n </ElUpload>\n <ElButton\n icon={<img src={tempIcon} alt=\"download\" />}\n onClick={this.handleDownloadTemplate}\n disabled={this.disabled}\n >\n 下载模板\n </ElButton>\n </div>\n\n {/* 第二层:tips 简要描述当前上传限制 */}\n {this.tipsText && (\n <div class=\"core-upload__tips\">\n {this.tipsText}\n </div>\n )}\n\n {/* 第三层:已经上传的列表,支持删除 */}\n {this.fileList && this.fileList.length > 0 && (\n <div class=\"core-upload__file-list\">\n {this.fileList.map((file) => (\n <div key={file.uid} class=\"core-upload__file-item\">\n <div class=\"core-upload__file-info\">\n <span class=\"core-upload__file-icon\">📄</span>\n <span\n class=\"core-upload__file-name\"\n title={file.name}\n >\n {file.name}\n </span>\n </div>\n <img onClick={() => this.handleDelete(file)} src={deleteIcon} alt=\"delete\" class=\"core-upload__file-delete\" />\n </div>\n ))}\n </div>\n )}\n </div>\n );\n },\n});\n\n"],"names":["index","name","props","action","type","String","default","accept","maxSize","Number","multiple","Boolean","fileList","Array","templateUrl","templateFileName","tips","disabled","httpRequest","Function","undefined","emits","setup","emit","uploadRef","ref","watch","newFileList","JSON","stringify","value","deep","immediate","tipsText","computed","split","map","replace","toUpperCase","join","formatFileSize","size","toFixed","beforeUpload","file","acceptTypes","trim","toLowerCase","fileExt","filename","lastDot","lastIndexOf","substring","getFileExtension","some","startsWith","includes","acceptTypesText","ElMessage","error","validateFileType","maxSizeBytes","validateFileSize","handleChange","uploadFile","uploadFiles","url","uid","status","response","handleRemove","handleError","message","handleDownloadTemplate","warning","link","document","createElement","href","download","body","appendChild","click","removeChild","handleDelete","findIndex","item","splice","render","_createVNode","class","ElUpload","this","onChange","onRemove","onError","showFileList","trigger","ElButton","icon","src","uploadIcon","alt","_createTextVNode","tempIcon","onClick","length","key","title","deleteIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/core-upload/index.tsx"],"sourcesContent":["import { defineComponent, ref, PropType, computed, watch } from 'vue';\nimport { ElUpload, ElButton, ElMessage, ElIcon } from 'element-plus';\nimport type { UploadFile, UploadFiles, UploadRequestOptions } from 'element-plus';\n// @ts-ignore\nimport uploadIcon from './assets/upload.svg';\n// @ts-ignore\nimport tempIcon from './assets/temp.svg';\n// @ts-ignore\nimport deleteIcon from './assets/delete.svg';\nimport './style.less';\n\nexport interface UploadFileItem {\n name: string;\n url?: string;\n response?: any;\n [key: string]: any;\n}\n\nexport default defineComponent({\n name: 'CoreUpload',\n props: {\n // 上传地址\n action: {\n type: String,\n default: '/openapi/v1/app/files/upload',\n },\n // 允许上传的文件类型\n accept: {\n type: String,\n default: '.xlsx,.xls,.csv',\n },\n // 文件大小限制(单位:MB)\n maxSize: {\n type: Number,\n default: 10,\n },\n // 是否支持多文件上传\n multiple: {\n type: Boolean,\n default: true,\n },\n // 文件列表\n fileList: {\n type: Array as PropType<UploadFileItem[]>,\n default: () => [],\n },\n // 下载模板的URL\n templateUrl: {\n type: String,\n default: '',\n },\n // 下载模板的文件名\n templateFileName: {\n type: String,\n default: '模板文件',\n },\n // 提示文本\n tips: {\n type: String,\n default: '',\n },\n // 是否禁用\n disabled: {\n type: Boolean,\n default: false,\n },\n // 自定义上传请求\n httpRequest: {\n type: Function as PropType<(options: UploadRequestOptions) => void>,\n default: undefined,\n },\n headers: {\n type: Object,\n default: () => ({\n Authorization: 'Bearer ApiSecretKey_mEKsrCMvxNLzzUUKeQmpzaUZqwZxFyJf',\n appId: '9a673565-d4f6-4382-bc67-f1beb07df435'\n }),\n },\n extendData: {\n type: Object,\n default: () => ({\n \"user\": \"abc-123\",\n }),\n },\n },\n emits: ['update:fileList', 'success', 'remove', 'download-template', 'error'],\n setup(props, { emit }) {\n const uploadRef = ref<InstanceType<typeof ElUpload>>();\n const fileList = ref<UploadFileItem[]>(props.fileList || []);\n\n // 监听外部 fileList 变化\n watch(\n () => props.fileList,\n (newFileList) => {\n if (newFileList && JSON.stringify(newFileList) !== JSON.stringify(fileList.value)) {\n fileList.value = [...(newFileList || [])];\n }\n },\n { deep: true, immediate: true }\n );\n\n // 生成提示文本\n const tipsText = computed(() => {\n if (props.tips) {\n return props.tips;\n }\n const acceptTypes = props.accept\n .split(',')\n .map((type) => type.replace('.', '').toUpperCase())\n .join(' 或 ');\n return `支持 ${acceptTypes} 格式。文件大小不超过 ${props.maxSize}MB。`;\n });\n\n // 格式化文件大小\n const formatFileSize = (size: number): string => {\n if (size < 1024) {\n return size + ' B';\n } else if (size < 1024 * 1024) {\n return (size / 1024).toFixed(2) + ' KB';\n } else {\n return (size / (1024 * 1024)).toFixed(2) + ' MB';\n }\n };\n\n // 获取文件扩展名\n const getFileExtension = (filename: string): string => {\n const lastDot = filename.lastIndexOf('.');\n return lastDot !== -1 ? filename.substring(lastDot).toLowerCase() : '';\n };\n\n // 验证文件类型\n const validateFileType = (file: File): boolean => {\n const acceptTypes = props.accept.split(',').map((type) => type.trim().toLowerCase());\n const fileExt = getFileExtension(file.name);\n const isValid = acceptTypes.some((type) => {\n if (type.startsWith('.')) {\n return type === fileExt;\n }\n // 支持 MIME 类型\n return file.type && file.type.includes(type.replace('.', ''));\n });\n\n if (!isValid) {\n const acceptTypesText = props.accept\n .split(',')\n .map((type) => type.replace('.', '').toUpperCase())\n .join(' 或 ');\n ElMessage.error(`只能上传 ${acceptTypesText} 格式的文件!`);\n return false;\n }\n return true;\n };\n\n // 验证文件大小\n const validateFileSize = (file: File): boolean => {\n const maxSizeBytes = props.maxSize * 1024 * 1024;\n if (file.size > maxSizeBytes) {\n ElMessage.error(`文件大小不能超过 ${props.maxSize}MB!`);\n return false;\n }\n return true;\n };\n\n // 上传前的校验\n const beforeUpload = (file: File): boolean => {\n // 类型校验\n if (!validateFileType(file)) {\n return false;\n }\n // 大小校验\n if (!validateFileSize(file)) {\n return false;\n }\n return true;\n };\n\n // 文件移除时的钩子\n const handleRemove = (uploadFile: UploadFile, uploadFiles: UploadFiles) => {\n fileList.value = uploadFiles.map((file) => ({\n name: file.name,\n ...(file.response || {} as any),\n }));\n emit('update:fileList', fileList.value);\n emit('remove', uploadFile, uploadFiles);\n };\n\n // 上传失败时的钩子\n const handleError = (error: Error, uploadFile: UploadFile) => {\n ElMessage.error(`文件 ${uploadFile.name} 上传失败:${error.message}`);\n emit('error', error, uploadFile);\n };\n\n // 下载模板\n const handleDownloadTemplate = () => {\n if (!props.templateUrl) {\n ElMessage.warning('模板文件地址未配置');\n return;\n }\n emit('download-template', props.templateUrl);\n \n // 如果没有自定义下载处理,则使用默认下载方式\n const link = document.createElement('a');\n link.href = props.templateUrl;\n link.download = props.templateFileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n };\n\n // 删除文件\n const handleDelete = (file: UploadFileItem) => {\n const index = fileList.value.findIndex((item) => item.uid === file.uid);\n if (index !== -1) {\n fileList.value.splice(index, 1);\n emit('update:fileList', fileList.value);\n emit('remove', file, fileList.value);\n }\n };\n\n // 上传成功时的钩子\n const handleSuccess = (response: any, file: UploadFile, fileLists: UploadFiles) => {\n fileList.value = fileLists.map((file) => ({\n name: file.name,\n ...(response || {} as any),\n }));\n emit('update:fileList', fileList.value);\n emit('success', response, file, fileList);\n };\n\n return {\n uploadRef,\n fileList,\n tipsText,\n formatFileSize,\n beforeUpload,\n handleRemove,\n handleError,\n handleSuccess,\n handleDownloadTemplate,\n handleDelete,\n };\n },\n render() {\n return (\n <div class=\"core-upload\">\n {/* 第一层:上传文件、下载模板按钮 */}\n <div class=\"core-upload__actions\">\n <ElUpload\n ref=\"uploadRef\"\n class=\"core-upload__upload\"\n action={this.action}\n accept={this.accept}\n headers={this.headers}\n data={this.extendData}\n multiple={this.multiple}\n fileList={this.fileList}\n beforeUpload={this.beforeUpload}\n onRemove={this.handleRemove}\n onError={this.handleError}\n onSuccess={this.handleSuccess}\n httpRequest={this.httpRequest}\n disabled={this.disabled}\n showFileList={false}\n >\n {{\n trigger: () => (\n <ElButton\n type=\"primary\"\n icon={<img src={uploadIcon} alt=\"upload\" />}\n disabled={this.disabled}\n >\n 上传文件\n </ElButton>\n ),\n }}\n </ElUpload>\n <ElButton\n icon={<img src={tempIcon} alt=\"download\" />}\n onClick={this.handleDownloadTemplate}\n disabled={this.disabled}\n >\n 下载模板\n </ElButton>\n </div>\n\n {/* 第二层:tips 简要描述当前上传限制 */}\n {this.tipsText && (\n <div class=\"core-upload__tips\">\n {this.tipsText}\n </div>\n )}\n\n {/* 第三层:已经上传的列表,支持删除 */}\n {this.fileList && this.fileList.length > 0 && (\n <div class=\"core-upload__file-list\">\n {this.fileList.map((file) => (\n <div key={file.uid} class=\"core-upload__file-item\">\n <div class=\"core-upload__file-info\">\n <span class=\"core-upload__file-icon\">📄</span>\n <span\n class=\"core-upload__file-name\"\n title={file.name}\n >\n {file.name}\n </span>\n </div>\n <img onClick={() => this.handleDelete(file)} src={deleteIcon} alt=\"delete\" class=\"core-upload__file-delete\" />\n </div>\n ))}\n </div>\n )}\n </div>\n );\n },\n});\n\n"],"names":["CoreUpload","name","props","action","type","String","default","accept","maxSize","Number","multiple","Boolean","fileList","Array","templateUrl","templateFileName","tips","disabled","httpRequest","Function","undefined","headers","Object","Authorization","appId","extendData","user","emits","setup","emit","uploadRef","ref","watch","newFileList","JSON","stringify","value","deep","immediate","tipsText","computed","split","map","replace","toUpperCase","join","formatFileSize","size","toFixed","beforeUpload","file","acceptTypes","trim","toLowerCase","fileExt","filename","lastDot","lastIndexOf","substring","getFileExtension","some","startsWith","includes","acceptTypesText","ElMessage","error","validateFileType","maxSizeBytes","validateFileSize","handleRemove","uploadFile","uploadFiles","response","handleError","message","handleSuccess","fileLists","handleDownloadTemplate","warning","link","document","createElement","href","download","body","appendChild","click","removeChild","handleDelete","index","findIndex","item","uid","splice","render","_createVNode","class","ElUpload","this","data","onRemove","onError","onSuccess","showFileList","trigger","ElButton","icon","src","uploadIcon","alt","_createTextVNode","tempIcon","onClick","length","key","title","deleteIcon"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const e=require("vue"),t=require("vue-element-plus-x"),a=require("./source/index.vue.js"),l=require("../../node_modules/.pnpm/@element-plus_icons-vue@2.3.2_vue@3.5.24_typescript@5.6.3_/node_modules/@element-plus/icons-vue/dist/index.js"),n=require("element-plus");/* empty css *//* empty css *//* empty css */;/* empty css */const i=require("./LoadingButton/index.vue.js");;/* empty css */const s=e.defineComponent({props:{loading:{type:Boolean,default:!1},actionUrl:{type:String,default:"/openapi/v1/app/files/upload"},
|
|
1
|
+
"use strict";const e=require("vue"),t=require("vue-element-plus-x"),a=require("./source/index.vue.js"),l=require("../../node_modules/.pnpm/@element-plus_icons-vue@2.3.2_vue@3.5.24_typescript@5.6.3_/node_modules/@element-plus/icons-vue/dist/index.js"),n=require("element-plus");/* empty css *//* empty css *//* empty css */;/* empty css */const i=require("./LoadingButton/index.vue.js");;/* empty css */const s=e.defineComponent({props:{loading:{type:Boolean,default:!1},actionUrl:{type:String,default:"/openapi/v1/app/files/upload"},acceptFileType:{type:String,default:".txt,.md,.mdx,.markdown,.pdf,.html,.xlsx,.xls,.doc,.docx,.csv,.eml,.msg,.pptx,.ppt,.xml,.epub,.jpg,.jpeg,.png,.gif,.webp,.svg"},agentName:{type:String,default:"知识问答智能体"},limit:{type:Number,default:5},customStyle:{type:Object,default:()=>({maxHeight:"75px"})},inputData:{type:String,default:""},placeholder:{type:String,default:"请尝试输入任务、问题或想法,我会帮你搞定"},tagList:{type:Array,default:()=>[{id:"1",name:"问产品"},{id:"2",name:"问品类"},{id:"3",name:"问品牌"},{id:"4",name:"找物料"},{id:"5",name:"问知识"},{id:"6",name:"遇客诉"}]},sceneList:{type:Array,default:()=>[{id:"ANC",name:"ANC"},{id:"BNC",name:"BNC"}]},scene:{type:String,default:void 0},user:{type:String,default:""},authToken:{type:String,default:""},appId:{type:String,default:""}},emits:["cancel","submit","sceneChange","update:scene"],setup(a,{emit:s}){const o=e.useTemplateRef("editorSender"),r=e.useTemplateRef("editorSenderWrapper"),d=e.useTemplateRef("fileUpload"),c=e.computed(()=>({Authorization:`Bearer ${a.authToken}`,appId:a.appId})),p=e.computed(()=>({user:a.user})),u=e.ref((()=>{if(a.scene){const e=a.sceneList.find(e=>e.id===a.scene);if(e)return e}return a.sceneList[0]})()),m=e.ref(!0),v=e.ref([]),f=e.ref(a.tagList[0]);e.watch(()=>a.agentName,t=>{e.nextTick(()=>{var e;const a=null==(e=r.value)?void 0:e.querySelector(".el-editor-sender-chat-room");null==a||a.setAttribute("datatype",t)})},{immediate:!0}),e.watch(()=>a.inputData,t=>{e.nextTick(()=>{var e,a;null==(e=o.value)||e.clear(),null==(a=o.value)||a.setText(t)})}),e.watch(()=>a.scene,e=>{if(e){const t=a.sceneList.find(t=>t.id===e);t&&(u.value=t)}}),e.watch(()=>a.sceneList,e=>{if(e.length>0){if(a.scene){const t=e.find(e=>e.id===a.scene);if(t)return void(u.value=t)}u.value=e[0]}},{immediate:!0});const g=()=>{s("cancel")},h=e=>{if(m.value||a.loading)return;const t={text:e.text,file:v.value.map(e=>e.response)};var l,n;s("submit",t),null==(l=o.value)||l.clear(),v.value=[],null==(n=d.value)||n.clearFiles()},y=()=>{n.ElNotification({title:"",message:"上传文件失败",type:"error"})},x=(e,t,a)=>{v.value=a},N=e=>{if(t=e.type,!new Set(["text/plain","text/markdown","application/pdf","text/html","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.ms-excel","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","text/csv","message/rfc822","application/vnd.ms-outlook","application/vnd.openxmlformats-officedocument.presentationml.presentation","application/vnd.ms-powerpoint","application/xml","text/xml","application/epub+zip","image/jpeg","image/png","image/gif","image/webp","image/svg+xml"]).has(null==t?void 0:t.trim().toLowerCase()))return n.ElNotification({title:"",message:"无法解析上传",type:"warning"}),!1;var t;const a=e.type.includes("image"),l=!a,i=e.size/1024/1024<15,s=e.size/1024/1024<10;return l&&!i?(n.ElNotification({title:"",message:"上传文档大小不能超过 15MB!",type:"warning"}),!1):!(a&&!s)||(n.ElNotification({title:"",message:"上传图片大小不能超过 10MB!",type:"warning"}),!1)},_=()=>{n.ElNotification({title:"",message:"最多上传5个文件",type:"warning"})},w=({name:e})=>{var t;const a=v.value.find(t=>t.name===e);a&&(null==(t=d.value)||t.handleRemove(a))},S=(e,t)=>{v.value=t},b=()=>{var e;const t=null==(e=o.value)?void 0:e.getCurrentValue();h(t)};return{isEmpty:m,fileList:v,activeTag:f,cancelHandler:g,submitHandler:h,changeHandler:()=>{var e,t;m.value=null==(t=null==(e=o.value)?void 0:e.chatState)?void 0:t.isEmpty},handleUploadError:y,handleUploadSuccess:x,handleUploadBefore:N,handleUploadExceed:_,removeFile:w,handleUploadRemove:S,submitBtnClick:b,getSlots:()=>{const o={"action-list":()=>e.createVNode("div",{class:"sender-action-wrapper"},[e.createVNode("div",{class:"sender-action-left"},[e.createVNode(n.ElUpload,{ref:"fileUpload",disabled:v.value.length>5,action:a.actionUrl,"show-file-list":!1,multiple:!0,limit:a.limit-v.value.length,data:p.value,beforeUpload:N,headers:c.value,onError:y,onSuccess:x,onExceed:_,onRemove:S,accept:a.acceptFileType},{default:()=>[e.createVNode(n.ElIcon,{class:"sender-file-icon"},{default:()=>[e.createVNode(l.Paperclip,null,null)]})]}),a.sceneList.length>0?e.createVNode(e.Fragment,null,[e.createVNode("div",{class:"split-line"},null),e.createVNode("div",{class:"scene-list"},[a.sceneList.map(t=>e.createVNode("span",{class:u.value.id===t.id?"scene-item active":"scene-item",onClick:()=>{return e=t,u.value=e,s("sceneChange",e),void s("update:scene",e.id);var e}},[t.name]))])]):null]),a.loading?e.createVNode(i,{class:"sender-cancel",onCancel:g},null):e.createVNode("div",{class:{"sender-btn":!0,active:!m.value},onClick:b},null)])};return(v.value.length>0||a.tagList.length>0)&&(o.header=()=>e.createVNode("div",{class:"sender-header-wrapper"},[e.createVNode("div",{class:"sender-file-list"},[v.value.map(a=>e.createVNode(t.FilesCard,{name:a.name,"show-del-icon":!0,status:"done",onDelete:w},null))]),e.createVNode("div",{class:"tag-list-wrapper"},[a.tagList.map(t=>e.createVNode("span",{class:f.value.id===t.id?"tag-item active":"tag-item",onClick:()=>{f.value=t}},[t.name]))])])),o}}},render(){let t;return e.createVNode("div",{class:"editor-sender-wrapper",ref:"editorSenderWrapper"},[e.createVNode(a,{ref:"editorSender",variant:"updown",loading:this.loading,placeholder:this.placeholder,activeTag:this.activeTag,onSubmit:this.submitHandler,onCancel:this.cancelHandler,onChange:this.changeHandler,"custom-style":this.customStyle},(l=t=this.getSlots(),"function"==typeof l||"[object Object]"===Object.prototype.toString.call(l)&&!e.isVNode(l)?t:{default:()=>[t]}))]);var l}});module.exports=s;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -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 scene: {\n type: String,\n default: undefined,\n },\n },\n emits: ['cancel', 'submit', 'sceneChange', 'update:scene'],\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 \n // 初始化 activeScene:优先使用传入的 scene prop,否则使用 sceneList 的第一个\n const getInitialScene = () => {\n if (props.scene) {\n const found = props.sceneList.find(item => item.id === props.scene);\n if (found) return found;\n }\n return props.sceneList[0];\n };\n const activeScene = ref(getInitialScene());\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 // 监听外部传入的 scene prop 变化\n watch(() => props.scene, (val) => {\n if (val) {\n const found = props.sceneList.find(item => item.id === val);\n if (found) {\n activeScene.value = found;\n }\n }\n });\n\n watch(() => props.sceneList, (val) => {\n if (val.length > 0) {\n // 如果当前 scene prop 存在,优先使用它;否则使用第一个\n if (props.scene) {\n const found = val.find(item => item.id === props.scene);\n if (found) {\n activeScene.value = found;\n return;\n }\n }\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 emit('update:scene', scene.id);\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":["index","props","loading","type","Boolean","default","actionUrl","String","extendData","Object","user","acceptFileType","headers","Authorization","appId","agentName","limit","Number","customStyle","maxHeight","inputData","placeholder","tagList","Array","id","name","sceneList","scene","undefined","emits","setup","emit","editorSender","useTemplateRef","editorSenderWrapper","fileUpload","activeScene","ref","getInitialScene","found","find","item","isEmpty","fileList","activeTag","watch","val","nextTick","target","value","querySelector","setAttribute","immediate","clear","setText","length","cancelHandler","submitHandler","res","text","file","map","response","initSender","clearFiles","handleUploadError","ElNotification","title","message","handleUploadSuccess","list","handleUploadBefore","mimeType","Set","has","trim","toLowerCase","isImg","includes","isDoc","isLt15M","size","isLt10M","handleUploadExceed","removeFile","handleRemove","handleUploadRemove","files","submitBtnClick","context","getCurrentValue","changeHandler","chatState","getSlots","slots","action-list","_createVNode","class","ElUpload","disabled","action","multiple","data","beforeUpload","onError","onSuccess","onExceed","onRemove","accept","ElIcon","Paperclip","_Fragment","onClick","triggerSceneChange","LoadingBtn","onCancel","active","FilesCard","status","onDelete","render","_slot","EditorSender","variant","this","onSubmit","onChange","s","prototype","toString","call","_isVNode"],"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 scene: {\n type: String,\n default: undefined,\n },\n user: {\n type: String,\n default: '',\n },\n authToken: {\n type: String,\n default: '',\n },\n appId: {\n type: String,\n default: '',\n },\n },\n emits: ['cancel', 'submit', 'sceneChange', 'update:scene'],\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 headers = computed(() => {\n return {\n Authorization: `Bearer ${props.authToken}`,\n appId: props.appId,\n }\n })\n const extendData = computed(() => {\n return {\n user: props.user,\n }\n })\n \n // 初始化 activeScene:优先使用传入的 scene prop,否则使用 sceneList 的第一个\n const getInitialScene = () => {\n if (props.scene) {\n const found = props.sceneList.find(item => item.id === props.scene);\n if (found) return found;\n }\n return props.sceneList[0];\n };\n const activeScene = ref(getInitialScene());\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 // 监听外部传入的 scene prop 变化\n watch(() => props.scene, (val) => {\n if (val) {\n const found = props.sceneList.find(item => item.id === val);\n if (found) {\n activeScene.value = found;\n }\n }\n });\n\n watch(() => props.sceneList, (val) => {\n if (val.length > 0) {\n // 如果当前 scene prop 存在,优先使用它;否则使用第一个\n if (props.scene) {\n const found = val.find(item => item.id === props.scene);\n if (found) {\n activeScene.value = found;\n return;\n }\n }\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 emit('update:scene', scene.id);\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={extendData.value}\n beforeUpload={handleUploadBefore}\n headers={headers.value}\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":["index","props","loading","type","Boolean","default","actionUrl","String","acceptFileType","agentName","limit","Number","customStyle","Object","maxHeight","inputData","placeholder","tagList","Array","id","name","sceneList","scene","undefined","user","authToken","appId","emits","setup","emit","editorSender","useTemplateRef","editorSenderWrapper","fileUpload","headers","computed","Authorization","extendData","activeScene","ref","getInitialScene","found","find","item","isEmpty","fileList","activeTag","watch","val","nextTick","target","value","querySelector","setAttribute","immediate","clear","setText","length","cancelHandler","submitHandler","res","text","file","map","response","initSender","clearFiles","handleUploadError","ElNotification","title","message","handleUploadSuccess","list","handleUploadBefore","mimeType","Set","has","trim","toLowerCase","isImg","includes","isDoc","isLt15M","size","isLt10M","handleUploadExceed","removeFile","handleRemove","handleUploadRemove","files","submitBtnClick","context","getCurrentValue","changeHandler","chatState","getSlots","slots","action-list","_createVNode","class","ElUpload","disabled","action","multiple","data","beforeUpload","onError","onSuccess","onExceed","onRemove","accept","ElIcon","Paperclip","_Fragment","onClick","triggerSceneChange","LoadingBtn","onCancel","active","FilesCard","status","onDelete","render","_slot","EditorSender","variant","this","onSubmit","onChange","s","prototype","toString","call","_isVNode"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),r=require("../../../node_modules/.pnpm/@vueuse_core@14.0.0_vue@3.5.24_typescript@5.6.3_/node_modules/@vueuse/core/dist/index.js");exports.useFormHandler=(t,i)=>{const u=r.useTemplateRefsList(),n=e.ref(0),o=e.ref(!1);let a=0;return{formRefs:u,curIndex:n,isRewrite:o,btnClick:async(e,r,a,s)=>{var l;if("inner_next"===r)return void(n.value+=1);if("inner_prev"===r)return void(n.value-=1);if("inner_rewrite"===r)return void(o.value=!0);let v={action:r,payload:{}};a&&"form"!==s?v={action:r,payload:a}:(await(null==(l=u.value[e])?void 0:l.validate()),v={action:r,payload:{...t.value[e],...a}}),o.value&&r.startsWith("core_")&&(o.value=!1),i("coreSubmit",v)},resetCurInit:()=>{a=0},getCurInit:()=>{const e=a;return a++,e}}};
|
|
2
|
+
//# sourceMappingURL=useFormHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFormHandler.js","sources":["../../../../../src/components/x-markdown/composables/useFormHandler.ts"],"sourcesContent":["/**\n * 表单处理 Composable\n * 处理表单验证、按钮点击等交互\n */\n\nimport { ref, Ref } from 'vue';\nimport { useTemplateRefsList } from '@vueuse/core';\nimport { ElForm } from 'element-plus';\n\nexport const useFormHandler = (\n hitlData: Ref<Array<Record<string, any>>>,\n emit: (event: 'coreSubmit', ...args: any[]) => void\n) => {\n const formRefs = useTemplateRefsList<typeof ElForm>();\n const curIndex = ref(0);\n const isRewrite = ref(false);\n // 用于表单渲染的索引\n let curInit = 0;\n\n /**\n * 按钮点击处理\n */\n const btnClick = async (\n index: number,\n action: string,\n payload: any,\n parentScope?: 'form' | 'table'\n ) => {\n if (action === 'inner_next') {\n curIndex.value += 1;\n return;\n }\n if (action === 'inner_prev') {\n curIndex.value -= 1;\n return;\n }\n if (action === 'inner_rewrite') {\n isRewrite.value = true;\n return;\n }\n\n let res = {\n action,\n payload: {},\n };\n \n // 区分是否为form组件的按钮,如果带有payload 则约定为非form组件的按钮\n if (payload && parentScope !== 'form') {\n res = {\n action,\n payload,\n };\n } else {\n await formRefs.value[index]?.validate();\n res = {\n action,\n payload: {\n ...hitlData.value[index],\n ...payload,\n }\n };\n }\n \n if (isRewrite.value && action.startsWith('core_')) {\n isRewrite.value = false;\n }\n \n emit('coreSubmit', res);\n };\n\n /**\n * 重置 curInit(在组件更新时调用)\n */\n const resetCurInit = () => {\n curInit = 0;\n };\n\n /**\n * 获取当前表单索引(用于表单渲染)\n */\n const getCurInit = () => {\n const current = curInit;\n curInit++;\n return current;\n };\n\n return {\n formRefs,\n curIndex,\n isRewrite,\n btnClick,\n resetCurInit,\n getCurInit,\n };\n};\n\n"],"names":["hitlData","emit","formRefs","useTemplateRefsList","curIndex","ref","isRewrite","curInit","btnClick","async","index","action","payload","parentScope","value","res","_a","validate","startsWith","resetCurInit","getCurInit","current"],"mappings":"gQAS8B,CAC5BA,EACAC,KAEA,MAAMC,EAAWC,EAAAA,sBACXC,EAAWC,EAAAA,IAAI,GACfC,EAAYD,EAAAA,KAAI,GAEtB,IAAIE,EAAU,EAqEd,MAAO,CACLL,WACAE,WACAE,YACAE,SApEeC,MACfC,EACAC,EACAC,EACAC,WAEA,GAAe,eAAXF,EAEF,YADAP,EAASU,OAAS,GAGpB,GAAe,eAAXH,EAEF,YADAP,EAASU,OAAS,GAGpB,GAAe,kBAAXH,EAEF,YADAL,EAAUQ,OAAQ,GAIpB,IAAIC,EAAM,CACRJ,SACAC,QAAS,CAAA,GAIPA,GAA2B,SAAhBC,EACbE,EAAM,CACJJ,SACAC,kBAGI,OAAAI,EAAAd,EAASY,MAAMJ,SAAf,EAAAM,EAAuBC,YAC7BF,EAAM,CACJJ,SACAC,QAAS,IACJZ,EAASc,MAAMJ,MACfE,KAKLN,EAAUQ,OAASH,EAAOO,WAAW,WACvCZ,EAAUQ,OAAQ,GAGpBb,EAAK,aAAcc,IAwBnBI,aAlBmB,KACnBZ,EAAU,GAkBVa,WAZiB,KACjB,MAAMC,EAAUd,EAEhB,OADAA,IACOc"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});exports.useImageLoader=e=>{const t=new Set,r=e=>{const s=e.currentTarget;s&&(t.delete(s),s.setAttribute("data-processed","true"),s.classList.add("loaded"),s.style.opacity="1",s.removeEventListener("load",r),s.removeEventListener("error",a))},a=e=>{const s=e.currentTarget;s&&(t.delete(s),s.setAttribute("data-processed","true"),s.classList.add("load-error"),s.style.maxHeight="200px",s.removeEventListener("load",r),s.removeEventListener("error",a))};return{processNewImages:()=>{if(!e.value)return;e.value.querySelectorAll("img:not([data-processed='true'])").forEach(e=>{t.has(e)||(t.add(e),(e=>{var t;const r=(null==(t=e.parentElement)?void 0:t.offsetWidth)||0;if(e.naturalWidth>r&&(e.style.maxWidth="100%"),e.naturalWidth&&e.naturalHeight){const t=e.naturalHeight/e.naturalWidth;e.style.maxHeight=`${Math.min(500,r*t)}px`}})(e),e.complete?r(new Event("load")):(e.addEventListener("load",r),e.addEventListener("error",a)))})}}};
|
|
2
|
+
//# sourceMappingURL=useImageLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useImageLoader.js","sources":["../../../../../src/components/x-markdown/composables/useImageLoader.ts"],"sourcesContent":["/**\n * 图片加载处理 Composable\n * 处理图片的渐进式加载和错误处理\n */\n\nimport { ref, Ref, nextTick } from 'vue';\n\nexport const useImageLoader = (container: Ref<HTMLElement | undefined>) => {\n const pendingImages = new Set<HTMLImageElement>();\n\n /**\n * 设置图片占位尺寸\n */\n const setPlaceholderDimensions = (img: HTMLImageElement) => {\n const containerWidth = img.parentElement?.offsetWidth || 0;\n if (img.naturalWidth > containerWidth) {\n img.style.maxWidth = \"100%\";\n }\n \n if (img.naturalWidth && img.naturalHeight) {\n const ratio = img.naturalHeight / img.naturalWidth;\n img.style.maxHeight = `${Math.min(500, containerWidth * ratio)}px`;\n }\n };\n\n /**\n * 图片加载成功处理\n */\n const handleImageLoad = (event: Event) => {\n const img = event.currentTarget as HTMLImageElement | null;\n if (!img) return;\n\n pendingImages.delete(img);\n img.setAttribute(\"data-processed\", \"true\");\n img.classList.add(\"loaded\");\n img.style.opacity = \"1\";\n img.removeEventListener(\"load\", handleImageLoad as EventListener);\n img.removeEventListener(\"error\", handleImageError as EventListener);\n };\n\n /**\n * 图片加载失败处理\n */\n const handleImageError = (event: Event) => {\n const img = event.currentTarget as HTMLImageElement | null;\n if (!img) return;\n\n pendingImages.delete(img);\n img.setAttribute(\"data-processed\", \"true\");\n img.classList.add(\"load-error\");\n img.style.maxHeight = \"200px\";\n img.removeEventListener(\"load\", handleImageLoad as EventListener);\n img.removeEventListener(\"error\", handleImageError as EventListener);\n };\n\n /**\n * 处理新加载的图片\n * 核心逻辑:设置占位尺寸,渐进式加载\n */\n const processNewImages = () => {\n if (!container.value) return;\n \n const newImages = container.value.querySelectorAll(\n \"img:not([data-processed='true'])\"\n ) as NodeListOf<HTMLImageElement>;\n \n newImages.forEach((img) => {\n if (pendingImages.has(img)) return;\n pendingImages.add(img);\n \n // 设置占位尺寸,避免布局重排\n setPlaceholderDimensions(img);\n \n // 处理已加载的图片\n if (img.complete) {\n // 手动构造一个事件对象以复用处理逻辑\n handleImageLoad(new Event(\"load\"));\n } else {\n img.addEventListener(\"load\", handleImageLoad as EventListener);\n img.addEventListener(\"error\", handleImageError as EventListener);\n }\n });\n };\n\n return {\n processNewImages,\n };\n};\n\n"],"names":["container","pendingImages","Set","handleImageLoad","event","img","currentTarget","delete","setAttribute","classList","add","style","opacity","removeEventListener","handleImageError","maxHeight","processNewImages","value","querySelectorAll","forEach","has","containerWidth","_a","parentElement","offsetWidth","naturalWidth","maxWidth","naturalHeight","ratio","Math","min","setPlaceholderDimensions","complete","Event","addEventListener"],"mappings":"uGAO+BA,IAC7B,MAAMC,MAAoBC,IAoBpBC,EAAmBC,IACvB,MAAMC,EAAMD,EAAME,cACbD,IAELJ,EAAcM,OAAOF,GACrBA,EAAIG,aAAa,iBAAkB,QACnCH,EAAII,UAAUC,IAAI,UAClBL,EAAIM,MAAMC,QAAU,IACpBP,EAAIQ,oBAAoB,OAAQV,GAChCE,EAAIQ,oBAAoB,QAASC,KAM7BA,EAAoBV,IACxB,MAAMC,EAAMD,EAAME,cACbD,IAELJ,EAAcM,OAAOF,GACrBA,EAAIG,aAAa,iBAAkB,QACnCH,EAAII,UAAUC,IAAI,cAClBL,EAAIM,MAAMI,UAAY,QACtBV,EAAIQ,oBAAoB,OAAQV,GAChCE,EAAIQ,oBAAoB,QAASC,KAgCnC,MAAO,CACLE,iBA1BuB,KACvB,IAAKhB,EAAUiB,MAAO,OAEJjB,EAAUiB,MAAMC,iBAChC,oCAGQC,QAASd,IACbJ,EAAcmB,IAAIf,KACtBJ,EAAcS,IAAIL,GAvDW,CAACA,UAChC,MAAMgB,GAAiB,OAAAC,EAAAjB,EAAIkB,oBAAJ,EAAAD,EAAmBE,cAAe,EAKzD,GAJInB,EAAIoB,aAAeJ,IACrBhB,EAAIM,MAAMe,SAAW,QAGnBrB,EAAIoB,cAAgBpB,EAAIsB,cAAe,CACzC,MAAMC,EAAQvB,EAAIsB,cAAgBtB,EAAIoB,aACtCpB,EAAIM,MAAMI,UAAY,GAAGc,KAAKC,IAAI,IAAKT,EAAiBO,MAC1D,GAiDEG,CAAyB1B,GAGrBA,EAAI2B,SAEN7B,EAAgB,IAAI8B,MAAM,UAE1B5B,EAAI6B,iBAAiB,OAAQ/B,GAC7BE,EAAI6B,iBAAiB,QAASpB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),r=require("../utils/formUtils.js"),o=require("../../../node_modules/.pnpm/unified@11.0.5/node_modules/unified/lib/index.js"),s=require("../../../node_modules/.pnpm/remark-parse@11.0.0/node_modules/remark-parse/lib/index.js"),u=require("../../../node_modules/.pnpm/remark-breaks@4.0.0/node_modules/remark-breaks/lib/index.js"),n=require("../../../node_modules/.pnpm/remark-gfm@4.0.1/node_modules/remark-gfm/lib/index.js"),d=require("../../../node_modules/.pnpm/remark-math@6.0.0/node_modules/remark-math/lib/index.js"),i=require("../../../node_modules/.pnpm/remark-gemoji@8.0.0/node_modules/remark-gemoji/lib/index.js"),l=require("../../../node_modules/.pnpm/remark-rehype@11.1.2/node_modules/remark-rehype/lib/index.js"),m=require("../../../node_modules/.pnpm/rehype-raw@7.0.0/node_modules/rehype-raw/lib/index.js"),a=require("../../../node_modules/.pnpm/rehype-katex@7.0.1/node_modules/rehype-katex/lib/index.js"),p=require("../../../node_modules/.pnpm/rehype-stringify@10.0.1/node_modules/rehype-stringify/lib/index.js");exports.useMarkdownProcessor=(t,_)=>{const k=e.ref(null),x=e.ref([]),y=o.unified().use(s).use(u).use(n,{singleTilde:!1}).use(d).use(i).use(l,{allowDangerousHtml:!0}).use(m).use(a).use(p);return e.watch(t,async o=>{if(!o)return k.value=null,void(x.value=[]);try{const s=await y.run(y.parse(o)),u=(null==_?void 0:_.value)?r.normalizeHistoryInputs(_.value):void 0,n=r.computedForm(s,u);x.value=n,await e.nextTick(),k.value=s}catch(s){console.error("Failed to process markdown:",s),k.value=null,x.value=[]}},{immediate:!0}),{ast:k,hitlData:x}};
|
|
2
|
+
//# sourceMappingURL=useMarkdownProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMarkdownProcessor.js","sources":["../../../../../src/components/x-markdown/composables/useMarkdownProcessor.ts"],"sourcesContent":["/**\n * Markdown 处理 Composable\n * 处理 Markdown 到 AST 的转换和表单数据提取\n */\n\nimport { ref, Ref, computed, watch, nextTick } from 'vue';\nimport { unified } from \"unified\";\nimport remarkParse from \"remark-parse\";\nimport remarkBreaks from \"remark-breaks\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\nimport remarkGemoji from \"remark-gemoji\";\nimport remarkRehype from \"remark-rehype\";\nimport rehypeRaw from \"rehype-raw\";\nimport rehypeKatex from \"rehype-katex\";\nimport rehypeStringify from \"rehype-stringify\";\nimport { computedForm, normalizeHistoryInputs, FormDataMap } from '../utils/formUtils';\n\nexport const useMarkdownProcessor = (\n formatText: Ref<string>,\n historyInputs?: Ref<Record<string, any> | FormDataMap | undefined>\n) => {\n const ast = ref<any>(null);\n const hitlData = ref<Array<Record<string, any>>>([]);\n\n // 初始化 unified 处理链\n const md = unified()\n .use(remarkParse) // 解析Markdown为AST\n .use(remarkBreaks) // 处理换行符\n .use(remarkGfm, { singleTilde: false }) // GitHub Flavored Markdown支持\n .use(remarkMath) // 数学公式支持\n .use(remarkGemoji) // Emoji支持\n .use(remarkRehype, { allowDangerousHtml: true }) // 转换为HTML AST\n .use(rehypeRaw)\n .use(rehypeKatex)\n .use(rehypeStringify);\n\n // 处理 Markdown 文本变化\n watch(\n formatText,\n async (text) => {\n if (!text) {\n ast.value = null;\n hitlData.value = [];\n return;\n }\n\n try {\n // 处理Markdown到hast再到VNode的转换\n const mdAst = await md.run(md.parse(text));\n \n // 递归遍历所有 CorePilot schema,收集 form 表单及其预定义数据\n const historyInputsMap = historyInputs?.value \n ? normalizeHistoryInputs(historyInputs.value)\n : undefined;\n const formDataList = computedForm(mdAst, historyInputsMap);\n hitlData.value = formDataList;\n\n await nextTick();\n ast.value = mdAst;\n } catch (error) {\n console.error('Failed to process markdown:', error);\n ast.value = null;\n hitlData.value = [];\n }\n },\n { immediate: true }\n );\n\n return {\n ast,\n hitlData,\n };\n};\n\n"],"names":["formatText","historyInputs","ast","ref","hitlData","md","unified","use","remarkParse","remarkBreaks","remarkGfm","singleTilde","remarkMath","remarkGemoji","remarkRehype","allowDangerousHtml","rehypeRaw","rehypeKatex","rehypeStringify","watch","async","text","value","mdAst","run","parse","historyInputsMap","normalizeHistoryInputs","formDataList","computedForm","nextTick","error","console","immediate"],"mappings":"moCAkBoC,CAClCA,EACAC,KAEA,MAAMC,EAAMC,EAAAA,IAAS,MACfC,EAAWD,EAAAA,IAAgC,IAG3CE,EAAKC,EAAAA,UACRC,IAAIC,GACJD,IAAIE,GACJF,IAAIG,EAAW,CAAEC,aAAa,IAC9BJ,IAAIK,GACJL,IAAIM,GACJN,IAAIO,EAAc,CAAEC,oBAAoB,IACxCR,IAAIS,GACJT,IAAIU,GACJV,IAAIW,GAkCP,OA/BAC,EAAAA,MACEnB,EACAoB,MAAOC,IACL,IAAKA,EAGH,OAFAnB,EAAIoB,MAAQ,UACZlB,EAASkB,MAAQ,IAInB,IAEE,MAAMC,QAAclB,EAAGmB,IAAInB,EAAGoB,MAAMJ,IAG9BK,GAAmB,MAAAzB,OAAA,EAAAA,EAAeqB,OACpCK,EAAAA,uBAAuB1B,EAAcqB,YACrC,EACEM,EAAeC,EAAAA,aAAaN,EAAOG,GACzCtB,EAASkB,MAAQM,QAEXE,aACN5B,EAAIoB,MAAQC,CACd,OAASQ,GACPC,QAAQD,MAAM,8BAA+BA,GAC7C7B,EAAIoB,MAAQ,KACZlB,EAASkB,MAAQ,EACnB,GAEF,CAAEW,WAAW,IAGR,CACL/B,MACAE"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue");exports.useRefHandler=(t,r)=>{const i=e.ref([]),n=e.ref(null),a=e=>{const t=e.target;if("SPAN"===t.tagName){const e=t.classList.contains("x-markdown-split"),r=t.classList.contains("x-markdown-sub");if(e||r)return r?t:t.parentElement}return null};return e.watch(n,(e,t)=>{if(e!==t)if(e){const t=e.getAttribute("dataherf"),n=i.value.find(e=>e.link===t);r("hoverActiveRefTrigger",n)}else r("hoverActiveRefTrigger","")}),{refConfig:i,activeRef:n,getRefConfig:()=>{var e;const n=null==(e=t.value)?void 0:e.querySelector("div[hidden]");try{i.value=JSON.parse((null==n?void 0:n.textContent)||"[]"),r("refConfigUpdate",i.value)}catch(a){i.value=[]}},handleMouseOver:e=>{const t=a(e);n.value=t||null},handleClick:e=>{const t=a(e);if(t){const e=t.getAttribute("dataherf"),n=JSON.parse(t.getAttribute("datahighlight")||"[]"),a=Number(t.getAttribute("datanumber")),l=t.getAttribute("id"),u={...i.value.find(t=>t.link===e),highlight:n,page:a,id:l};r("clickActiveRefTrigger",u)}}}};
|
|
2
|
+
//# sourceMappingURL=useRefHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRefHandler.js","sources":["../../../../../src/components/x-markdown/composables/useRefHandler.ts"],"sourcesContent":["/**\n * 引用处理 Composable\n * 处理文档引用的悬停、点击等交互\n */\n\nimport { ref, Ref, watch } from 'vue';\nimport { RefConfig } from '../utils/refUtils';\n\nexport const useRefHandler = (\n container: Ref<HTMLElement | undefined>,\n emit: (event: 'hoverActiveRefTrigger' | 'clickActiveRefTrigger' | 'refConfigUpdate', ...args: any[]) => void\n) => {\n const refConfig = ref<Array<RefConfig>>([]);\n const activeRef = ref<HTMLElement | null>(null);\n\n /**\n * 获取所有的ref配置\n */\n const getRefConfig = () => {\n const refContainer = (container.value as HTMLElement)?.querySelector('div[hidden]');\n try {\n refConfig.value = JSON.parse(refContainer?.textContent || '[]');\n emit('refConfigUpdate', refConfig.value);\n } catch (error) {\n refConfig.value = [];\n }\n };\n\n /**\n * 获取目标元素\n */\n const getTargeElement = (e: MouseEvent): HTMLElement | null => {\n const target = e.target as HTMLElement;\n if (target.tagName === 'SPAN') {\n const isInRefContainer = target.classList.contains('x-markdown-split');\n const isRefContainer = target.classList.contains('x-markdown-sub');\n if (isInRefContainer || isRefContainer) {\n if (!isRefContainer) {\n return target.parentElement as HTMLElement;\n }\n return target;\n }\n }\n return null;\n };\n\n /**\n * 处理鼠标悬停\n */\n const handleMouseOver = (e: MouseEvent) => {\n const target = getTargeElement(e);\n if (target) {\n activeRef.value = target;\n return;\n }\n activeRef.value = null;\n };\n\n /**\n * 处理点击事件\n */\n const handleClick = (e: MouseEvent) => {\n const target = getTargeElement(e);\n if (target) {\n const text = target.getAttribute('dataherf');\n const highlight = JSON.parse(target.getAttribute('datahighlight') || '[]') as Array<string>;\n const page = Number(target.getAttribute('datanumber'));\n const id = target.getAttribute('id');\n const source = refConfig.value.find((item) => {\n return item.link === text;\n });\n const data = {\n ...source,\n highlight,\n page,\n id,\n };\n emit('clickActiveRefTrigger', data);\n }\n };\n\n // 监听 activeRef 变化\n watch(activeRef, (newVal, oldVal) => {\n if (newVal !== oldVal) {\n if (newVal) {\n const text = newVal.getAttribute('dataherf');\n const target = refConfig.value.find((item) => {\n return item.link === text;\n });\n emit('hoverActiveRefTrigger', target);\n } else {\n emit('hoverActiveRefTrigger', '');\n }\n }\n });\n\n return {\n refConfig,\n activeRef,\n getRefConfig,\n handleMouseOver,\n handleClick,\n };\n};\n\n"],"names":["container","emit","refConfig","ref","activeRef","getTargeElement","e","target","tagName","isInRefContainer","classList","contains","isRefContainer","parentElement","watch","newVal","oldVal","text","getAttribute","value","find","item","link","getRefConfig","refContainer","_a","querySelector","JSON","parse","textContent","error","handleMouseOver","handleClick","highlight","page","Number","id","data"],"mappings":"6HAQ6B,CAC3BA,EACAC,KAEA,MAAMC,EAAYC,EAAAA,IAAsB,IAClCC,EAAYD,EAAAA,IAAwB,MAkBpCE,EAAmBC,IACvB,MAAMC,EAASD,EAAEC,OACjB,GAAuB,SAAnBA,EAAOC,QAAoB,CAC7B,MAAMC,EAAmBF,EAAOG,UAAUC,SAAS,oBAC7CC,EAAiBL,EAAOG,UAAUC,SAAS,kBACjD,GAAIF,GAAoBG,EACtB,OAAKA,EAGEL,EAFEA,EAAOM,aAIpB,CACA,OAAO,MAqDT,OAdAC,EAAAA,MAAMV,EAAW,CAACW,EAAQC,KACxB,GAAID,IAAWC,EACb,GAAID,EAAQ,CACV,MAAME,EAAOF,EAAOG,aAAa,YAC3BX,EAASL,EAAUiB,MAAMC,KAAMC,GAC5BA,EAAKC,OAASL,GAEvBhB,EAAK,wBAAyBM,EAChC,MACEN,EAAK,wBAAyB,MAK7B,CACLC,YACAE,YACAmB,aAjFmB,WACnB,MAAMC,EAAgB,OAAAC,EAAAzB,EAAUmB,YAAV,EAAAM,EAAiCC,cAAc,eACrE,IACExB,EAAUiB,MAAQQ,KAAKC,OAAM,MAAAJ,OAAA,EAAAA,EAAcK,cAAe,MAC1D5B,EAAK,kBAAmBC,EAAUiB,MACpC,OAASW,GACP5B,EAAUiB,MAAQ,EACpB,GA2EAY,gBAnDuBzB,IACvB,MAAMC,EAASF,EAAgBC,GAE7BF,EAAUe,MADRZ,GAIc,MA8ClByB,YAxCmB1B,IACnB,MAAMC,EAASF,EAAgBC,GAC/B,GAAIC,EAAQ,CACV,MAAMU,EAAOV,EAAOW,aAAa,YAC3Be,EAAYN,KAAKC,MAAMrB,EAAOW,aAAa,kBAAoB,MAC/DgB,EAAOC,OAAO5B,EAAOW,aAAa,eAClCkB,EAAK7B,EAAOW,aAAa,MAIzBmB,EAAO,IAHEnC,EAAUiB,MAAMC,KAAMC,GAC5BA,EAAKC,OAASL,GAIrBgB,YACAC,OACAE,MAEFnC,EAAK,wBAAyBoC,EAChC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),t=require("../utils/mockStream.js");exports.useStreamHandler=(r,u,a)=>{const l=e.ref(""),s=e.ref(!1),v=e.ref(t.createStreamGenerator(e=>{l.value=l.value+e},a.value));return e.watch(()=>[r.value,u.value],(e,t)=>{var r,u,a,n;const[o,i]=e,[m]=t||[];if(o.startsWith(m)||(null==(r=v.value)||r.reset(),l.value="",s.value=!1),o){if(null==(u=v.value)||u.update(o),!i)return void(null==(a=v.value)||a.stop());const e=/<summary>资料整合<\/summary>\r?\n(.|\s)+?/;if(!s.value&&e.test(o))return s.value=!0,void(null==(n=v.value)||n.setSpeed(500))}},{immediate:!0}),{context:l,tagComplete:s}};
|
|
2
|
+
//# sourceMappingURL=useStreamHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStreamHandler.js","sources":["../../../../../src/components/x-markdown/composables/useStreamHandler.ts"],"sourcesContent":["/**\n * 流式渲染处理 Composable\n * 处理流式文本渲染和速度控制\n */\n\nimport { ref, Ref, watch } from 'vue';\nimport { createStreamGenerator } from '../utils/mockStream';\n\nexport const useStreamHandler = (\n text: Ref<string>,\n typing: Ref<boolean>,\n speed: Ref<number>\n) => {\n const context = ref('');\n const tagComplete = ref(false);\n\n const streamCall = (stream: string) => {\n context.value = context.value + stream;\n };\n\n const streamGener = ref<ReturnType<typeof createStreamGenerator>>(\n createStreamGenerator(streamCall, speed.value)\n );\n\n // 监听 text 和 typing 变化\n watch(() => [text.value, typing.value], (v, o) => {\n const [newText, newTyping] = v;\n const [oldText] = o || [];\n \n if (!(newText as string).startsWith(oldText as string)) {\n streamGener.value?.reset();\n context.value = '';\n tagComplete.value = false;\n }\n \n if (newText) {\n streamGener.value?.update(newText as string);\n if (!newTyping) {\n streamGener.value?.stop();\n return;\n }\n \n // 资料整合 标签之后,采用服务端流式速度\n const checkReg = /<summary>资料整合<\\/summary>\\r?\\n(.|\\s)+?/;\n if (!tagComplete.value && checkReg.test(newText as string)) {\n tagComplete.value = true;\n streamGener.value?.setSpeed(500);\n return;\n }\n }\n }, {\n immediate: true,\n });\n\n return {\n context,\n tagComplete,\n };\n};\n\n"],"names":["text","typing","speed","context","ref","tagComplete","streamGener","createStreamGenerator","stream","value","watch","v","o","newText","newTyping","oldText","startsWith","_a","reset","_b","update","_c","stop","checkReg","test","_d","setSpeed","immediate"],"mappings":"oKAQgC,CAC9BA,EACAC,EACAC,KAEA,MAAMC,EAAUC,EAAAA,IAAI,IACdC,EAAcD,EAAAA,KAAI,GAMlBE,EAAcF,EAAAA,IAClBG,wBALkBC,IAClBL,EAAQM,MAAQN,EAAQM,MAAQD,GAIEN,EAAMO,QAiC1C,OA7BAC,QAAM,IAAM,CAACV,EAAKS,MAAOR,EAAOQ,OAAQ,CAACE,EAAGC,iBAC1C,MAAOC,EAASC,GAAaH,GACtBI,GAAWH,GAAK,GAQvB,GANMC,EAAmBG,WAAWD,KAClC,OAAAE,EAAAX,EAAYG,QAAZQ,EAAmBC,QACnBf,EAAQM,MAAQ,GAChBJ,EAAYI,OAAQ,GAGlBI,EAAS,CAEX,GADA,OAAAM,EAAAb,EAAYG,UAAOW,OAAOP,IACrBC,EAEH,YADA,OAAAO,EAAAf,EAAYG,QAAZY,EAAmBC,QAKrB,MAAMC,EAAW,wCACjB,IAAKlB,EAAYI,OAASc,EAASC,KAAKX,GAGtC,OAFAR,EAAYI,OAAQ,OACpB,OAAAgB,EAAAnB,EAAYG,UAAOiB,SAAS,KAGhC,GACC,CACDC,WAAW,IAGN,CACLxB,UACAE"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const e=require("vue"),r=require("../../_virtual/debounce.js"),t=require("../../node_modules/.pnpm/@vueuse_core@14.0.0_vue@3.5.24_typescript@5.6.3_/node_modules/@vueuse/core/dist/index.js"),s=require("element-plus");/* empty css *//* empty css *//* empty css *//* empty css */require("../../node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/theme-chalk/src/form-item.scss.js"),/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */require("../../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"),/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */require("../../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"),/* empty css */;/* empty css */const l=require("./utils/mockStream.js"),n=require("./utils/parseCorePilotSchema.js"),o=require("./utils/animation.js"),i=require("../core-text/index.js"),a=require("../core-tips/index.js"),u=require("../core-result/index.js"),d=require("../core-table/index.js"),p=require("../core-chart/index.js"),m=require("../core-card/index.js");;/* empty css */const c=require("../../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"),v=require("../../node_modules/.pnpm/unified@11.0.5/node_modules/unified/lib/index.js"),h=require("../../node_modules/.pnpm/remark-parse@11.0.0/node_modules/remark-parse/lib/index.js"),_=require("../../node_modules/.pnpm/remark-breaks@4.0.0/node_modules/remark-breaks/lib/index.js"),f=require("../../node_modules/.pnpm/remark-gfm@4.0.1/node_modules/remark-gfm/lib/index.js"),g=require("../../node_modules/.pnpm/remark-math@6.0.0/node_modules/remark-math/lib/index.js"),y=require("../../node_modules/.pnpm/remark-gemoji@8.0.0/node_modules/remark-gemoji/lib/index.js"),k=require("../../node_modules/.pnpm/remark-rehype@11.1.2/node_modules/remark-rehype/lib/index.js"),b=require("../../node_modules/.pnpm/rehype-raw@7.0.0/node_modules/rehype-raw/lib/index.js"),x=require("../../node_modules/.pnpm/rehype-katex@7.0.1/node_modules/rehype-katex/lib/index.js"),q=require("../../node_modules/.pnpm/rehype-stringify@10.0.1/node_modules/rehype-stringify/lib/index.js"),j=e.defineComponent({name:"XMarkdown",props:{text:{type:String,default:""},autoHideThinking:{type:Boolean,default:!0},typing:{type:Boolean,default:!1},speed:{type:Number,default:200},isHistoryMessage:{type:Boolean,default:!1},historyInputs:{type:Object,default:()=>({})}},expose:["getContentText"],emits:["hoverActiveRefTrigger","clickActiveRefTrigger","refConfigUpdate","downloadFile","coreSubmit"],setup(j,{emit:N}){const E=e.useTemplateRef("x-markdown-container"),w=e.ref(Date.now()),A=e.ref(-1/0),C=e.ref(""),S=new Set,T=e.ref(!1),P=e.ref(!1),R=e.ref([]),L=t.useTemplateRefsList(),F=e.ref(0);let V=0;const $=e.ref(null),D=e.ref(!1),H=e.ref(l.createStreamGenerator(e=>{C.value=C.value+e},j.speed)),U=e.computed(()=>{if(!j.autoHideThinking)return C.value;let e=C.value;if(e=(e=>{let r=!0;return e.replace(/(<summary[^>]*>[\s\S]*?<\/summary>)\s*(<div>[\s\S]*?)(<\/div>|$)/g,(e,t,s,l)=>{const n="</div>"===l;return`${t.replace(/(<summary)/g,e=>r?(r=!1,e):`<summary class="${n?"loaded":"loading"}"`)}\n${s}${l}`})})(e),e=e.replace(/[\u00A0\u1680\u2000-\u200A\u202F\u205F\u3000]/g," "),e.includes("</details>")){A.value===-1/0&&(A.value=Date.now());const r=(e=>{const r=/<div hidden>([\s\S]*?)<\/div>/g.exec(e);if(!r)return[];const t=r[1];try{return JSON.parse(t)}catch(s){return[]}})(e);return e.replace(/<details open>([\s\S]*?)<\/details>/g,(e,t)=>`<details>${t=(t=t.replace(/<summary>([\s\S]*?)<\/summary>/,(e,t)=>{const s=((A.value-w.value)/1e3).toFixed(0);return`<summary style="color: #8D90A0;font-weight: 300; font-size: 16px;">\n 已完成思考 ${s>"0"?s+"s":""} ${r.length?`<span style="display: inline-block;margin: 0 8px;border-left: 1px solid #CDCFD7;width: 1px;height: 16px;"></span> 引用文档:${null==r?void 0:r.length} 个`:""}\n </summary>`})).replace(/<summary>完成<\/summary>/,'<summary class="loaded">完成</summary>')}</details>`)}return e}),I=e=>{const{properties:r={},parentScope:t}=e,{disabled:s}=r;return!!s||"form"===t&&(j.isHistoryMessage&&!D.value)};e.watch(()=>[j.text,j.typing],(e,r)=>{var t,s,l,n;const[o,i]=e,[a]=r||[];if(o.startsWith(a)||(null==(t=H.value)||t.reset(),C.value=""),o){if(null==(s=H.value)||s.update(o),!i)return void(null==(l=H.value)||l.stop());const e=/<summary>资料整合<\/summary>\r?\n(.|\s)+?/;if(!P.value&&e.test(o))return P.value=!0,void(null==(n=H.value)||n.setSpeed(500))}},{immediate:!0});const O=e.ref([]),W=r(()=>{(()=>{var e;const r=null==(e=E.value)?void 0:e.querySelector("div[hidden]");O.value=JSON.parse((null==r?void 0:r.textContent)||"[]"),N("refConfigUpdate",O.value)})()},100),B=e.ref(null);e.watch(()=>C.value,W,{immediate:!0}),e.watch(B,(e,r)=>{if(e!==r)if(e){const r=e.getAttribute("dataherf"),t=O.value.find(e=>e.link===r);N("hoverActiveRefTrigger",t)}else N("hoverActiveRefTrigger","")});const J=e=>{const r=e.target;if("SPAN"===r.tagName){const e=r.classList.contains("x-markdown-split"),t=r.classList.contains("x-markdown-sub");if(e||t)return t?r:r.parentElement}},M=e=>{const r=J(e);B.value=r||null},G=e=>{if("A"===e.target.tagName)return void(async e=>{e.stopPropagation(),e.preventDefault();const r=e.target,t=r.getAttribute("href"),l=r.getAttribute("data-id")||r.getAttribute("dataid"),n=r.getAttribute("data-name")||r.getAttribute("dataname");if(!t)return;const o=t.split(".").pop();l?(s.ElMessage("文件下载中..."),N("downloadFile",{title:n,id:l,ext:o,href:t})):window.open(t,"_blank")})(e);const r=J(e);if(r){const e=r.getAttribute("dataherf"),t=JSON.parse(r.getAttribute("datahighlight")||"[]"),s=Number(r.getAttribute("datanumber")),l=r.getAttribute("id"),n={...O.value.find(r=>r.link===e),highlight:t,page:s,id:l};N("clickActiveRefTrigger",n)}};e.onMounted(()=>{E.value.addEventListener("mouseover",M),E.value.addEventListener("click",G)}),e.onBeforeUnmount(()=>{E.value.removeEventListener("mouseover",M),E.value.addEventListener("click",G)});const z=()=>{if(!E.value)return;E.value.querySelectorAll("img:not([data-processed='true'])").forEach(e=>{S.has(e)||(S.add(e),X(e),e.complete?K(e):(e.addEventListener("load",()=>K(e)),e.addEventListener("error",()=>Q(e))))})},X=e=>{const r=e.parentElement.offsetWidth;if(e.naturalWidth>r&&(e.style.maxWidth="100%"),e.naturalWidth&&e.naturalHeight){const t=e.naturalHeight/e.naturalWidth;e.style.maxHeight=`${Math.min(500,r*t)}px`}},K=e=>{S.delete(e),e.setAttribute("data-processed","true"),e.classList.add("loaded"),e.style.opacity="1",e.removeEventListener("load",K),e.removeEventListener("error",Q)},Q=e=>{S.delete(e),e.setAttribute("data-processed","true"),e.classList.add("load-error"),e.style.maxHeight="200px",e.removeEventListener("load",K),e.removeEventListener("error",Q)},Y=v.unified().use(h).use(_).use(f,{singleTilde:!1}).use(g).use(y).use(k,{allowDangerousHtml:!0}).use(b).use(x).use(q),Z=(e,r)=>{var t;if(e&&"object"==typeof e){if("form"===e.type){const s={...(null==(t=e.properties)?void 0:t.data)||{},...j.historyInputs||{}};return void r.push(s)}Array.isArray(e.children)&&e.children.forEach(e=>{Z(e,r)})}};e.watch(()=>U.value,async r=>{V=0;const t=await Y.run(Y.parse(r)),s=(e=>{const r=[],t=[],s=e=>{e&&("pre"===e.tagName&&t.push(e),Array.isArray(e.children)&&e.children.forEach(s))};return Array.isArray(e.children)&&e.children.forEach(s),t.forEach(e=>{var t,s,l,n,o;const i=null==(t=e.children)?void 0:t.find(e=>"code"===e.tagName);if(null==(l=null==(s=null==i?void 0:i.properties)?void 0:s.className)?void 0:l.includes("language-CorePilot"))try{const e=(null==(o=null==(n=i.children)?void 0:n[0])?void 0:o.value)||"";if(e){const t=JSON.parse(e);Z(t,r)}}catch(a){console.error("Failed to parse CorePilot schema:",a)}}),r})(t);R.value=s,await e.nextTick(),$.value=t,e.nextTick(z),e.nextTick(()=>{var e;const r=null==(e=E.value)?void 0:e.querySelector("details");(null==r?void 0:r.querySelector("summary"))&&!T.value&&(T.value=!0,new o.Accordion(r))})},{immediate:!0});const ee=()=>e.h("div",{class:"hitl-skeleton"},[e.h("div",{class:"skeleton-header"},[e.h("div",{class:"skeleton-avatar"}),e.h("div",{class:"skeleton-title"})]),e.h("div",{class:"skeleton-item skeleton-item-long"}),e.h("div",{class:"skeleton-item skeleton-item-medium"}),e.h("div",{class:"skeleton-item skeleton-item-short"}),e.h("div",{class:"skeleton-item skeleton-item-long"}),e.h("div",{class:"skeleton-item skeleton-item-medium"})]),re=(r,t,l)=>{var o,v,h,_,f,g,y,k,b,x,q,j,E,w,A;if(!r)return null;let C=[];switch(["sub","pre","text","ElForm"].includes(r.tagName)||(C=(null==(v=null==(o=r.children)?void 0:o.map)?void 0:v.call(o,e=>re(e,t)))||[]),r.type){case"root":return e.h("div",{class:"markdown-body"},e.h(s.ElConfigProvider,{locale:c},C));case"element":if("sub"===r.tagName){const s=[{type:"element",tagName:"span",properties:{class:"x-markdown-split"}},...r.children],l=null==s?void 0:s.map(e=>re(e,t));return e.h("span",{...r.properties,class:"x-markdown-sub"},l)}if("span"===r.tagName)return e.h("span",{...r.properties},C);if("img"===r.tagName)return e.h("img",{...r.properties,class:"markdown-image","data-processed":"false"});if("a"===r.tagName){const t=(null==(h=r.properties)?void 0:h.href)||"",s=t?t.split(".").pop():null;return e.h("a",{...r.properties,class:"file-link","data-file-type":s},C)}if("ElTimeline"===r.tagName)return e.h(s.ElTimeline,{...r.properties},C);if("table"===r.tagName)return e.h("div",{class:"custom-table-container"},[e.h("table",C)]);if("view"===r.tagName)return e.h("div",{class:"custom-view-container"},[C[F.value]]);if("ElRow"===r.tagName)return e.h(s.ElRow,{...r.properties},C);if("ElCol"===r.tagName)return e.h(s.ElCol,{...r.properties},C);if("ElCard"===r.tagName)return e.h(s.ElCard,{...r.properties},C);if("CoreCard"===r.tagName){const s={};return(null==(_=r.slots)?void 0:_.header)&&(s.header=()=>r.slots.header.map(e=>re(e,t))),C&&C.length>0&&(s.default=()=>C),e.h(m,{...r.properties},s)}if("ElForm"===r.tagName){const l=null==(f=r.children)?void 0:f.map(e=>re(e,V));return V++,e.h(s.ElForm,{ref:L.value.set,model:R.value[t],...r.properties,disabled:I(r)},l)}if("ElFormItem"===r.tagName)return e.h(s.ElFormItem,{...r.properties},C);if("ElButton"===r.tagName){let n=null==(g=r.properties)?void 0:g.payload;return"table"===r.parentScope&&(n=l),e.h(s.ElButton,{...r.properties,disabled:I(r),onClick:()=>{var e;(async(e,r,t,s)=>{var l;if("inner_next"===r)return void(F.value+=1);if("inner_prev"===r)return void(F.value-=1);if("inner_rewrite"===r)return D.value=!0,void console.log("isRewrite",D.value);let n={action:r,payload:{}};t&&"form"!==s?n={action:r,payload:t}:(await(null==(l=L.value[e])?void 0:l.validate()),n={action:r,payload:{...R.value[e],...t}}),D.value&&r.startsWith("core_")&&(D.value=!1),N("coreSubmit",n)})(t,null==(e=r.properties)?void 0:e.action,n,r.parentScope)}},C)}if("ElSelect"===r.tagName)return e.h(s.ElSelect,{...r.properties,disabled:I(r),modelValue:R.value[t][null==(y=r.properties)?void 0:y.formProp],"onUpdate:modelValue":e=>{var s;R.value[t][null==(s=r.properties)?void 0:s.formProp]=e}},C);if("ElDatePicker"===r.tagName)return e.h(s.ElDatePicker,{...r.properties,disabled:I(r),modelValue:R.value[t][null==(k=r.properties)?void 0:k.formProp],"onUpdate:modelValue":e=>{var s;R.value[t][null==(s=r.properties)?void 0:s.formProp]=e}},C);if("ElInput"===r.tagName)return e.h(s.ElInput,{...r.properties,disabled:I(r),modelValue:R.value[t][null==(b=r.properties)?void 0:b.formProp],"onUpdate:modelValue":e=>{var s;R.value[t][null==(s=r.properties)?void 0:s.formProp]=e}},C);if("ElRadioGroup"===r.tagName)return e.h(s.ElRadioGroup,{...r.properties,disabled:I(r),modelValue:R.value[t][null==(x=r.properties)?void 0:x.formProp],"onUpdate:modelValue":e=>{var s;R.value[t][null==(s=r.properties)?void 0:s.formProp]=e}},C);if("ElRadio"===r.tagName)return e.h(s.ElRadio,{...r.properties,disabled:I(r)},C);if("ElTable"===r.tagName)return e.h(d,{...r.properties},C);if("ElTableColumn"===r.tagName)return e.h(s.ElTableColumn,{...r.properties},{default:e=>{var t,s;const l=null==(t=r.children)?void 0:t.map(r=>re(r,V,e.row)),n=null==(s=r.children)?void 0:s.findIndex(t=>{var s;return t.value===e.row[null==(s=r.properties)?void 0:s.prop]});return-1===n?l:null==l?void 0:l[n]}});if("CoreText"===r.tagName)return e.h(i,{...r.properties});if("CoreTips"===r.tagName)return e.h(a,{...r.properties});if("CoreResult"===r.tagName)return e.h(u,{...r.properties});if("CoreChart"===r.tagName)return e.h(p,{...r.properties});if("pre"===r.tagName){const t=null==(q=r.children)?void 0:q.find(e=>"code"===e.tagName);if(t&&(null==(E=null==(j=t.properties)?void 0:j.className)?void 0:E.includes("language-CorePilot"))){const r=(null==(A=null==(w=t.children)?void 0:w[0])?void 0:A.value)||"";if(!(e=>{if(!e||0===e.trim().length)return!1;const r=e.trim(),t=r[0];if("{"!==t&&"["!==t)return!1;try{return JSON.parse(r),!0}catch(s){return!1}})(r))return ee();try{const t=JSON.parse(r),s=n.parseCorePilot(t),l=re(s,V);return e.h("div",{class:"hitl-wrapper"},[l])}catch(S){return ee()}}}return e.h(r.tagName,r.properties,C);case"text":return r.value.trim();default:return null}};return e.onUpdated(()=>{V=0}),{hastToVNode:re,ast:$,container:E,renderComplete:W,isRewrite:D,getContentText:()=>{var e;return null==(e=E.value)?void 0:e.innerText}}},render(){return e.createVNode("div",{ref:"x-markdown-container",class:"x-markdown"},[this.hastToVNode(this.ast)])}});module.exports=j;
|
|
1
|
+
"use strict";const e=require("vue"),t=require("../../_virtual/debounce.js"),r=require("element-plus");/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */;/* empty css */const s=require("./utils/animation.js"),a=require("./utils/textFormatUtils.js"),o=require("./composables/useImageLoader.js"),n=require("./composables/useRefHandler.js"),u=require("./composables/useStreamHandler.js"),i=require("./composables/useMarkdownProcessor.js"),l=require("./composables/useFormHandler.js"),d=require("./renderers/hastRenderer.js"),m=e.defineComponent({name:"XMarkdown",props:{text:{type:String,default:""},autoHideThinking:{type:Boolean,default:!0},typing:{type:Boolean,default:!1},speed:{type:Number,default:200},isHistoryMessage:{type:Boolean,default:!1},historyInputs:{type:Object,default:()=>({})},user:{type:String,default:"default"},authToken:{type:String,default:"ApiSecretKey_mEKsrCMvxNLzzUUKeQmpzaUZqwZxFyJf"},appId:{type:String,default:"9a673565-d4f6-4382-bc67-f1beb07df435"}},expose:["getContentText"],emits:["hoverActiveRefTrigger","clickActiveRefTrigger","refConfigUpdate","downloadFile","coreSubmit"],setup(m,{emit:p}){const c=e.useTemplateRef("x-markdown-container"),v=e.ref(Date.now()),f=e.ref(-1/0),g=e.ref(!1),{context:h}=u.useStreamHandler(e.computed(()=>m.text),e.computed(()=>m.typing),e.computed(()=>m.speed)),x=e.computed(()=>(h.value.includes("</details>")&&f.value===-1/0&&(f.value=Date.now()),a.formatMarkdownText(h.value,m.autoHideThinking,v.value,f.value===-1/0?Date.now():f.value))),k=e.computed(()=>m.historyInputs),{ast:y,hitlData:b}=i.useMarkdownProcessor(x,k),{formRefs:w,curIndex:q,isRewrite:_,btnClick:T,resetCurInit:j,getCurInit:C}=l.useFormHandler(b,p),{processNewImages:I}=o.useImageLoader(c),{getRefConfig:H,handleMouseOver:R,handleClick:A}=n.useRefHandler(c,p),M=t(()=>{H()},100);e.watch(()=>h.value,M,{immediate:!0});const S=e=>{"A"!==e.target.tagName?A(e):(async e=>{e.stopPropagation(),e.preventDefault();const t=e.target,s=t.getAttribute("href"),a=t.getAttribute("data-id")||t.getAttribute("dataid"),o=t.getAttribute("data-name")||t.getAttribute("dataname");if(!s)return;const n=s.split(".").pop();a?(r.ElMessage("文件下载中..."),p("downloadFile",{title:o,id:a,ext:n,href:s})):window.open(s,"_blank")})(e)},N=e.computed(()=>({Authorization:`Bearer ${m.authToken}`,appId:m.appId})),D=e.computed(()=>({user:m.user}));return e.watch(()=>y.value,async()=>{y.value&&(await e.nextTick(),e.nextTick(I),e.nextTick(()=>{var e;const t=null==(e=c.value)?void 0:e.querySelector("details");(null==t?void 0:t.querySelector("summary"))&&!g.value&&(g.value=!0,new s.Accordion(t))}))},{immediate:!0}),e.onMounted(()=>{c.value&&(c.value.addEventListener("mouseover",R),c.value.addEventListener("click",S))}),e.onBeforeUnmount(()=>{c.value&&(c.value.removeEventListener("mouseover",R),c.value.removeEventListener("click",S))}),e.onUpdated(()=>{j()}),{hastToVNode:e=>d.hastToVNode(e,{hitlData:b.value,formRefs:w.value,curIndex:q.value,getCurInit:C,btnClick:T,uploadHeaders:N.value,uploadExtendData:D.value,disabledContext:{isHistoryMessage:m.isHistoryMessage,isRewrite:_.value}}),ast:y,container:c,renderComplete:M,isRewrite:_,getContentText:()=>{var e;return null==(e=c.value)?void 0:e.innerText}}},render(){return e.createVNode("div",{ref:"x-markdown-container",class:"x-markdown"},[this.hastToVNode(this.ast)])}});module.exports=m;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|