@core-pilot/client-vue 0.0.2 → 0.0.3

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.
@@ -221,6 +221,7 @@ const index = /* @__PURE__ */ defineComponent({
221
221
  "typing": item.typing,
222
222
  "speed": this.speed,
223
223
  "text": item.content,
224
+ "isHistoryMessage": item.isHistoryMessage,
224
225
  "autoHideThinking": this.autoHideThinking,
225
226
  "onHoverActiveRefTrigger": this.hoverActiveRefTrigger,
226
227
  "onClickActiveRefTrigger": this.clickActiveRefTrigger,
@@ -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}\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 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":["props","list","type","Array","default","btnLoading","Boolean","maxHeight","String","autoHideThinking","speed","Number","disLikeFeedbackList","undefined","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","hoverActiveRefTrigger","item","clickActiveRefTrigger","showLastActionGroup","hideLastActionGroup","clickAction","content","cancel","message","scrollToBottom","lastRefConfigUpdate","refList","getQuestions","questions","_createVNode","map","question","index","onClick","questionClick","q","isLastItem","getActionBar","showActions","isLast","ActionBar","onDownloadFile","payload","messageItems","querySelectorAll","observer","IntersectionObserver","entries","forEach","entry","isIntersecting","itemBottom","boundingClientRect","bottom","height","target","clientHeight","listBottom","getBoundingClientRect","Math","abs","root","threshold","observe","disconnect","coreSubmit","onMounted","render","BubbleList","header","files","FilesCard","name","XMarkdown","id","typing","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}\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 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":["props","list","type","Array","default","btnLoading","Boolean","maxHeight","String","autoHideThinking","speed","Number","disLikeFeedbackList","undefined","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","hoverActiveRefTrigger","item","clickActiveRefTrigger","showLastActionGroup","hideLastActionGroup","clickAction","content","cancel","message","scrollToBottom","lastRefConfigUpdate","refList","getQuestions","questions","_createVNode","map","question","index","onClick","questionClick","q","isLastItem","getActionBar","showActions","isLast","ActionBar","onDownloadFile","payload","messageItems","querySelectorAll","observer","IntersectionObserver","entries","forEach","entry","isIntersecting","itemBottom","boundingClientRect","bottom","height","target","clientHeight","listBottom","getBoundingClientRect","Math","abs","root","threshold","observe","disconnect","coreSubmit","onMounted","render","BubbleList","header","files","FilesCard","name","XMarkdown","id","typing","isHistoryMessage","footer","role"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/core-tips/index.tsx"],"sourcesContent":["import { computed, defineComponent, ref, watch, PropType } from 'vue';\nimport './style.less'\n\nexport default defineComponent({\n props: {\n type: {\n type: String as PropType<'success' | 'warning' | 'info' | 'error' | 'primary'>,\n required: false\n },\n title: {\n type: String,\n required: false\n },\n content: {\n type: String,\n required: false\n },\n styleProps: {\n type: Object as PropType<{\n [key: string]: any,\n }>,\n required: false\n }\n },\n render() {\n return (\n <div class=\"core-tips\" style={this.styleProps}>\n {\n this.title ? \n <div class=\"core-tips__title\">\n <div class={`core-tips__icon icon-${this.type}`}>\n </div>\n <span>\n {this.title}\n </span>\n </div>\n : null\n }\n {\n this.content ?\n <div class=\"core-tips__content\">\n <div class=\"core-tips__desc\">{this.content}</div>\n </div>\n : null\n }\n </div>\n );\n }\n});\n"],"names":["props","type","String","required","title","content","styleProps","Object","render","_createVNode"],"mappings":";;AAGA,MAAA,2CAA+B;AAAA,EAC7BA,OAAO;AAAA,IACLC,MAAM;AAAA,MACJA,MAAMC;AAAAA,MACNC,UAAU;AAAA;IAEZC,OAAO;AAAA,MACLH,MAAMC;AAAAA,MACNC,UAAU;AAAA;IAEZE,SAAS;AAAA,MACPJ,MAAMC;AAAAA,MACNC,UAAU;AAAA;IAEZG,YAAY;AAAA,MACVL,MAAMM;AAAAA,MAGNJ,UAAU;AAAA,IACZ;AAAA;EAEFK,SAAS;AACP,WAAAC,YAAA,OAAA;AAAA,MAAA,SAAA;AAAA,MAAA,SACgC,KAAKH;AAAAA,IAAU,GAAA,CAEzC,KAAKF,QAAKK,YAAA,OAAA;AAAA,MAAA,SAAA;AAAA,IAAA,GAAA,CAAAA,YAAA,OAAA;AAAA,MAAA,SAEI,wBAAwB,KAAKR,IAAI;AAAA,IAAE,GAAA,IAAA,GAAAQ,YAAA,QAAA,MAAA,CAG5C,KAAKL,KAAK,CAAA,CAAA,CAAA,IAGb,MAGF,KAAKC,UAAOI,YAAA,OAAA;AAAA,MAAA,SAAA;AAAA,IAAA,GAAA,CAAAA,YAAA,OAAA;AAAA,MAAA,SAAA;AAAA,IAAA,GAAA,CAEoB,KAAKJ,OAAO,CAAA,CAAA,CAAA,IAE1C,IAAI,CAAA;AAAA,EAId;AACF,CAAC;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/core-tips/index.tsx"],"sourcesContent":["import { computed, defineComponent, ref, watch, PropType } from 'vue';\nimport './style.less'\n\nexport default defineComponent({\n props: {\n type: {\n type: String as PropType<'success' | 'warning' | 'info' | 'danger' | 'primary'>,\n required: false\n },\n title: {\n type: String,\n required: false\n },\n content: {\n type: String,\n required: false\n },\n styleProps: {\n type: Object as PropType<{\n [key: string]: any,\n }>,\n required: false\n }\n },\n render() {\n return (\n <div class=\"core-tips\" style={this.styleProps}>\n {\n this.title ? \n <div class=\"core-tips__title\">\n <div class={`core-tips__icon icon-${this.type}`}>\n </div>\n <span>\n {this.title}\n </span>\n </div>\n : null\n }\n {\n this.content ?\n <div class=\"core-tips__content\">\n <div class=\"core-tips__desc\">{this.content}</div>\n </div>\n : null\n }\n </div>\n );\n }\n});\n"],"names":["props","type","String","required","title","content","styleProps","Object","render","_createVNode"],"mappings":";;AAGA,MAAA,2CAA+B;AAAA,EAC7BA,OAAO;AAAA,IACLC,MAAM;AAAA,MACJA,MAAMC;AAAAA,MACNC,UAAU;AAAA;IAEZC,OAAO;AAAA,MACLH,MAAMC;AAAAA,MACNC,UAAU;AAAA;IAEZE,SAAS;AAAA,MACPJ,MAAMC;AAAAA,MACNC,UAAU;AAAA;IAEZG,YAAY;AAAA,MACVL,MAAMM;AAAAA,MAGNJ,UAAU;AAAA,IACZ;AAAA;EAEFK,SAAS;AACP,WAAAC,YAAA,OAAA;AAAA,MAAA,SAAA;AAAA,MAAA,SACgC,KAAKH;AAAAA,IAAU,GAAA,CAEzC,KAAKF,QAAKK,YAAA,OAAA;AAAA,MAAA,SAAA;AAAA,IAAA,GAAA,CAAAA,YAAA,OAAA;AAAA,MAAA,SAEI,wBAAwB,KAAKR,IAAI;AAAA,IAAE,GAAA,IAAA,GAAAQ,YAAA,QAAA,MAAA,CAG5C,KAAKL,KAAK,CAAA,CAAA,CAAA,IAGb,MAGF,KAAKC,UAAOI,YAAA,OAAA;AAAA,MAAA,SAAA;AAAA,IAAA,GAAA,CAAAA,YAAA,OAAA;AAAA,MAAA,SAAA;AAAA,IAAA,GAAA,CAEoB,KAAKJ,OAAO,CAAA,CAAA,CAAA,IAE1C,IAAI,CAAA;AAAA,EAId;AACF,CAAC;"}
@@ -1,4 +1,4 @@
1
- import { defineComponent, createVNode, useTemplateRef, ref, watch, nextTick, isVNode } from "vue";
1
+ import { defineComponent, createVNode, useTemplateRef, ref, watch, nextTick, isVNode, Fragment } from "vue";
2
2
  import { FilesCard } from "vue-element-plus-x";
3
3
  import EditorSender from "./source/index.vue.js";
4
4
  import { Paperclip as paperclip_default } from "../../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";
@@ -82,15 +82,26 @@ const index = /* @__PURE__ */ defineComponent({
82
82
  id: "6",
83
83
  name: "遇客诉"
84
84
  }]
85
+ },
86
+ sceneList: {
87
+ type: Array,
88
+ default: () => [{
89
+ id: "ANC",
90
+ name: "ANC"
91
+ }, {
92
+ id: "BNC",
93
+ name: "BNC"
94
+ }]
85
95
  }
86
96
  },
87
- emits: ["cancel", "submit"],
97
+ emits: ["cancel", "submit", "sceneChange"],
88
98
  setup(props, {
89
99
  emit
90
100
  }) {
91
101
  const editorSender = useTemplateRef("editorSender");
92
102
  const editorSenderWrapper = useTemplateRef("editorSenderWrapper");
93
103
  const fileUpload = useTemplateRef("fileUpload");
104
+ const activeScene = ref(props.sceneList[0]);
94
105
  const isEmpty = ref(true);
95
106
  const fileList = ref([]);
96
107
  const activeTag = ref(props.tagList[0]);
@@ -110,6 +121,13 @@ const index = /* @__PURE__ */ defineComponent({
110
121
  (_b = editorSender.value) == null ? void 0 : _b.setText(val);
111
122
  });
112
123
  });
124
+ watch(() => props.sceneList, (val) => {
125
+ if (val.length > 0) {
126
+ activeScene.value = val[0];
127
+ }
128
+ }, {
129
+ immediate: true
130
+ });
113
131
  const cancelHandler = () => {
114
132
  emit("cancel");
115
133
  };
@@ -129,8 +147,9 @@ const index = /* @__PURE__ */ defineComponent({
129
147
  initSender();
130
148
  };
131
149
  const changeHandler = () => {
132
- var _a, _b;
133
- isEmpty.value = (_b = (_a = editorSender.value) == null ? void 0 : _a.chatState) == null ? void 0 : _b.isEmpty;
150
+ var _a, _b, _c, _d;
151
+ console.log("changeHandler", (_b = (_a = editorSender.value) == null ? void 0 : _a.chatState) == null ? void 0 : _b.isEmpty);
152
+ isEmpty.value = (_d = (_c = editorSender.value) == null ? void 0 : _c.chatState) == null ? void 0 : _d.isEmpty;
134
153
  };
135
154
  const handleUploadError = () => {
136
155
  ElNotification({
@@ -224,10 +243,16 @@ const index = /* @__PURE__ */ defineComponent({
224
243
  const context = (_a = editorSender.value) == null ? void 0 : _a.getCurrentValue();
225
244
  submitHandler(context);
226
245
  };
246
+ const triggerSceneChange = (scene) => {
247
+ activeScene.value = scene;
248
+ emit("sceneChange", scene);
249
+ };
227
250
  const getSlots = () => {
228
251
  const slots = {
229
252
  "action-list": () => createVNode("div", {
230
253
  "class": "sender-action-wrapper"
254
+ }, [createVNode("div", {
255
+ "class": "sender-action-left"
231
256
  }, [createVNode(ElUpload, {
232
257
  "ref": "fileUpload",
233
258
  "disabled": fileList.value.length > 5,
@@ -249,7 +274,14 @@ const index = /* @__PURE__ */ defineComponent({
249
274
  }, {
250
275
  default: () => [createVNode(paperclip_default, null, null)]
251
276
  })]
252
- }), props.loading ? createVNode(LoadingBtn, {
277
+ }), props.sceneList.length > 0 ? createVNode(Fragment, null, [createVNode("div", {
278
+ "class": "split-line"
279
+ }, null), createVNode("div", {
280
+ "class": "scene-list"
281
+ }, [props.sceneList.map((item) => createVNode("span", {
282
+ "class": activeScene.value.id === item.id ? "scene-item active" : "scene-item",
283
+ "onClick": () => triggerSceneChange(item)
284
+ }, [item.name]))])]) : null]), props.loading ? createVNode(LoadingBtn, {
253
285
  "class": "sender-cancel",
254
286
  "onCancel": cancelHandler
255
287
  }, null) : createVNode("div", {
@@ -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 },\n emits: ['cancel', 'submit'],\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 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 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 getSlots = () => {\n const slots = {\n 'action-list': () => (\n <div class=\"sender-action-wrapper\">\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.loading ?\n <LoadingBtn\n class='sender-cancel'\n onCancel={cancelHandler}\n /> :\n <div\n class={{ 'sender-btn': true, 'active': !isEmpty.value }}\n onClick={submitBtnClick}\n >\n </div>\n }\n </div>\n ),\n }\n if (fileList.value.length > 0 || props.tagList.length > 0) {\n slots['header'] = () => {\n return (\n <div class=\"sender-header-wrapper\">\n <div\n class=\"sender-file-list\"\n >\n {\n fileList.value.map((item) => (\n <FilesCard\n name={item.name}\n show-del-icon\n status=\"done\"\n onDelete={removeFile}\n />\n ))\n }\n </div>\n <div class=\"tag-list-wrapper\">\n {\n props.tagList.map((item) => (\n <span\n class={activeTag.value.id === item.id ? 'tag-item active' : 'tag-item'}\n onClick={() => {\n activeTag.value = item;\n }}\n >\n {item.name}\n </span>\n ))\n }\n </div>\n </div>\n )\n }\n }\n\n return slots;\n }\n\n return {\n isEmpty,\n fileList,\n activeTag,\n cancelHandler,\n submitHandler,\n changeHandler,\n handleUploadError,\n handleUploadSuccess,\n handleUploadBefore,\n handleUploadExceed,\n removeFile,\n handleUploadRemove,\n submitBtnClick,\n getSlots,\n };\n },\n\n render() {\n return (\n <div\n class=\"editor-sender-wrapper\"\n ref=\"editorSenderWrapper\"\n >\n <EditorSender\n ref=\"editorSender\"\n variant=\"updown\"\n loading={this.loading}\n placeholder={this.placeholder}\n activeTag={this.activeTag}\n onSubmit={this.submitHandler}\n onCancel={this.cancelHandler}\n onChange={this.changeHandler}\n custom-style={this.customStyle}\n >\n {\n this.getSlots()\n }\n\n </EditorSender>\n </div>\n );\n }\n});\n"],"names":["_isSlot","s","Object","prototype","toString","call","_isVNode","props","loading","type","Boolean","default","actionUrl","String","extendData","acceptFileType","headers","Authorization","appId","agentName","limit","Number","customStyle","maxHeight","inputData","placeholder","tagList","Array","id","name","emits","setup","emit","editorSender","useTemplateRef","editorSenderWrapper","fileUpload","isEmpty","ref","fileList","activeTag","watch","val","nextTick","target","value","querySelector","setAttribute","immediate","clear","setText","cancelHandler","initSender","clearFiles","submitHandler","res","text","file","map","item","response","changeHandler","chatState","handleUploadError","ElNotification","title","message","handleUploadSuccess","list","isValidMimeType","mimeType","validTypes","Set","has","trim","toLowerCase","handleUploadBefore","isImg","includes","isDoc","isLt15M","size","isLt10M","handleUploadExceed","removeFile","find","handleRemove","handleUploadRemove","files","submitBtnClick","context","getCurrentValue","getSlots","slots","action-list","_createVNode","ElUpload","length","ElIcon","Paperclip","LoadingBtn","FilesCard","onClick","render","_slot","EditorSender"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/editor-sender/index.tsx"],"sourcesContent":["import { defineComponent, ref, computed, useTemplateRef, watch, nextTick } from 'vue';\nimport { FilesCard } from 'vue-element-plus-x';\nimport EditorSender from './source/index.vue';\nimport { Paperclip } from '@element-plus/icons-vue'\nimport { ElIcon, ElUpload, ElNotification, UploadFiles, ElButton, ElTag } from 'element-plus'\nimport LoadingBtn from './LoadingButton/index.vue'\n\nimport './style/index.less'\nimport { SubmitResult, TagInfo } from 'vue-element-plus-x/types/EditorSender';\nimport { FilesCardProps } from 'vue-element-plus-x/types/FilesCard';\n\nexport default defineComponent({\n props: {\n loading: {\n type: Boolean,\n default: false,\n },\n actionUrl: {\n type: String,\n default: '/openapi/v1/app/files/upload',\n },\n extendData: {\n type: Object,\n default: () => ({\n \"user\": \"abc-123\",\n }),\n },\n acceptFileType: {\n type: String,\n default: '.txt,.md,.mdx,.markdown,.pdf,.html,.xlsx,.xls,.doc,.docx,.csv,.eml,.msg,.pptx,.ppt,.xml,.epub,.jpg,.jpeg,.png,.gif,.webp,.svg'\n },\n headers: {\n type: Object,\n default: () => ({\n Authorization: 'Bearer ApiSecretKey_mEKsrCMvxNLzzUUKeQmpzaUZqwZxFyJf',\n appId: '9a673565-d4f6-4382-bc67-f1beb07df435'\n }),\n },\n agentName: {\n type: String,\n default: '知识问答智能体',\n },\n limit: {\n type: Number,\n default: 5,\n },\n customStyle: {\n type: Object,\n default: () => ({\n maxHeight: '75px'\n }),\n },\n inputData: {\n type: String,\n default: '',\n },\n placeholder: {\n type: String,\n default: '请尝试输入任务、问题或想法,我会帮你搞定',\n },\n tagList: {\n type: Array<TagInfo>,\n default: () => ([\n {\n id: '1',\n name: '问产品',\n },\n {\n id: '2',\n name: '问品类',\n },\n {\n id: '3',\n name: '问品牌',\n },\n {\n id: '4',\n name: '找物料',\n },\n {\n id: '5',\n name: '问知识',\n },\n {\n id: '6',\n name: '遇客诉',\n }\n ])\n },\n sceneList: {\n type: Array<{\n id: string,\n name: string,\n }>,\n default: () => ([\n {\n id: 'ANC',\n name: 'ANC',\n },\n {\n id: 'BNC',\n name: 'BNC',\n },\n ])\n },\n },\n emits: ['cancel', 'submit', 'sceneChange'],\n setup(props, { emit }) {\n const editorSender = useTemplateRef<typeof EditorSender>('editorSender');\n const editorSenderWrapper = useTemplateRef<HTMLElement>('editorSenderWrapper');\n const fileUpload = useTemplateRef<typeof ElUpload>('fileUpload');\n const activeScene = ref(props.sceneList[0]);\n\n const isEmpty = ref(true);\n const fileList = ref<UploadFiles>([]);\n const activeTag = ref(props.tagList[0]);\n\n watch(() => props.agentName, (val) => {\n nextTick(() => {\n const target = editorSenderWrapper.value?.querySelector('.el-editor-sender-chat-room');\n target?.setAttribute('datatype', val)\n })\n }, {\n immediate: true\n });\n\n watch(() => props.inputData, (val) => {\n nextTick(() => {\n editorSender.value?.clear() as SubmitResult;\n editorSender.value?.setText(val)\n })\n })\n\n watch(() => props.sceneList, (val) => {\n if (val.length > 0) {\n activeScene.value = val[0];\n }\n }, {\n immediate: true\n });\n\n const cancelHandler = () => {\n emit('cancel')\n }\n\n const initSender = () => {\n editorSender.value?.clear() as SubmitResult;\n fileList.value = [];\n fileUpload.value?.clearFiles();\n }\n\n const submitHandler = (val: SubmitResult) => {\n if (isEmpty.value || props.loading) return;\n const res = {\n text: val.text,\n file: fileList.value.map((item) => item.response)\n }\n emit('submit', res)\n initSender()\n }\n\n const changeHandler = () => {\n console.log('changeHandler', editorSender.value?.chatState?.isEmpty);\n isEmpty.value = editorSender.value?.chatState?.isEmpty;\n }\n\n const handleUploadError = () => {\n ElNotification({\n title: '',\n message: '上传文件失败',\n type: 'error',\n })\n }\n\n const handleUploadSuccess = (response, file, list: UploadFiles) => {\n fileList.value = list;\n }\n\n const isValidMimeType = (mimeType: string) => {\n // 包含所有有效MIME类型的集合\n const validTypes = new Set([\n 'text/plain',\n 'text/markdown', // 非标准但常见的markdown类型\n 'application/pdf',\n 'text/html',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-excel',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'text/csv',\n 'message/rfc822',\n 'application/vnd.ms-outlook',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/vnd.ms-powerpoint',\n 'application/xml',\n 'text/xml',\n 'application/epub+zip',\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml'\n ]);\n\n // 去除可能的空格并转为小写后检查\n return validTypes.has(mimeType?.trim().toLowerCase());\n }\n\n const handleUploadBefore = (file: File) => {\n if (!isValidMimeType(file.type)) {\n ElNotification({\n title: '',\n message: '无法解析上传',\n type: 'warning',\n })\n return false;\n }\n const isImg = file.type.includes('image');\n const isDoc = !isImg;\n const isLt15M = file.size / 1024 / 1024 < 15;\n const isLt10M = file.size / 1024 / 1024 < 10;\n if (isDoc && !isLt15M) {\n ElNotification({\n title: '',\n message: '上传文档大小不能超过 15MB!',\n type: 'warning',\n })\n return false;\n }\n if (isImg && !isLt10M) {\n ElNotification({\n title: '',\n message: '上传图片大小不能超过 10MB!',\n type: 'warning',\n })\n return false;\n }\n return true;\n }\n\n const handleUploadExceed = () => {\n ElNotification({\n title: '',\n message: `最多上传5个文件`,\n type: 'warning',\n })\n }\n\n // 删除文件\n const removeFile = ({ name }: FilesCardProps) => {\n const target = fileList.value.find((item) => item.name === name);\n if (target) {\n fileUpload.value?.handleRemove(target);\n }\n }\n\n const handleUploadRemove = (file, files) => {\n fileList.value = files;\n }\n\n const submitBtnClick = () => {\n const context = editorSender.value?.getCurrentValue() as SubmitResult;\n submitHandler(context);\n }\n\n const triggerSceneChange = (scene: {\n id: string,\n name: string,\n }) => {\n activeScene.value = scene;\n emit('sceneChange', scene);\n }\n\n const getSlots = () => {\n const slots = {\n 'action-list': () => (\n <div class=\"sender-action-wrapper\">\n <div class=\"sender-action-left\">\n <ElUpload\n ref=\"fileUpload\"\n disabled={fileList.value.length > 5}\n action={props.actionUrl}\n show-file-list={false}\n multiple\n limit={props.limit - fileList.value.length}\n data={props.extendData}\n beforeUpload={handleUploadBefore}\n headers={props.headers}\n onError={handleUploadError}\n onSuccess={handleUploadSuccess}\n onExceed={handleUploadExceed}\n onRemove={handleUploadRemove}\n accept={props.acceptFileType}\n >\n <ElIcon\n class=\"sender-file-icon\"\n >\n <Paperclip />\n </ElIcon>\n </ElUpload>\n {\n props.sceneList.length > 0 ? (\n <>\n <div class=\"split-line\"></div>\n <div class=\"scene-list\">\n {\n props.sceneList.map((item) => (\n <span \n class={activeScene.value.id === item.id ? 'scene-item active' : 'scene-item'}\n onClick={() => triggerSceneChange(item)}\n >\n {item.name}\n </span>\n ))\n }\n </div>\n </>\n ) : null\n }\n </div>\n {\n props.loading ?\n <LoadingBtn\n class='sender-cancel'\n onCancel={cancelHandler}\n /> :\n <div\n class={{ 'sender-btn': true, 'active': !isEmpty.value }}\n onClick={submitBtnClick}\n >\n </div>\n }\n </div>\n ),\n }\n if (fileList.value.length > 0 || props.tagList.length > 0) {\n slots['header'] = () => {\n return (\n <div class=\"sender-header-wrapper\">\n <div\n class=\"sender-file-list\"\n >\n {\n fileList.value.map((item) => (\n <FilesCard\n name={item.name}\n show-del-icon\n status=\"done\"\n onDelete={removeFile}\n />\n ))\n }\n </div>\n <div class=\"tag-list-wrapper\">\n {\n props.tagList.map((item) => (\n <span\n class={activeTag.value.id === item.id ? 'tag-item active' : 'tag-item'}\n onClick={() => {\n activeTag.value = item;\n }}\n >\n {item.name}\n </span>\n ))\n }\n </div>\n </div>\n )\n }\n }\n\n return slots;\n }\n\n return {\n isEmpty,\n fileList,\n activeTag,\n cancelHandler,\n submitHandler,\n changeHandler,\n handleUploadError,\n handleUploadSuccess,\n handleUploadBefore,\n handleUploadExceed,\n removeFile,\n handleUploadRemove,\n submitBtnClick,\n getSlots,\n };\n },\n\n render() {\n return (\n <div\n class=\"editor-sender-wrapper\"\n ref=\"editorSenderWrapper\"\n >\n <EditorSender\n ref=\"editorSender\"\n variant=\"updown\"\n loading={this.loading}\n placeholder={this.placeholder}\n activeTag={this.activeTag}\n onSubmit={this.submitHandler}\n onCancel={this.cancelHandler}\n onChange={this.changeHandler}\n custom-style={this.customStyle}\n >\n {\n this.getSlots()\n }\n\n </EditorSender>\n </div>\n );\n }\n});\n"],"names":["_isSlot","s","Object","prototype","toString","call","_isVNode","props","loading","type","Boolean","default","actionUrl","String","extendData","acceptFileType","headers","Authorization","appId","agentName","limit","Number","customStyle","maxHeight","inputData","placeholder","tagList","Array","id","name","sceneList","emits","setup","emit","editorSender","useTemplateRef","editorSenderWrapper","fileUpload","activeScene","ref","isEmpty","fileList","activeTag","watch","val","nextTick","target","value","querySelector","setAttribute","immediate","clear","setText","length","cancelHandler","initSender","clearFiles","submitHandler","res","text","file","map","item","response","changeHandler","console","log","chatState","handleUploadError","ElNotification","title","message","handleUploadSuccess","list","isValidMimeType","mimeType","validTypes","Set","has","trim","toLowerCase","handleUploadBefore","isImg","includes","isDoc","isLt15M","size","isLt10M","handleUploadExceed","removeFile","find","handleRemove","handleUploadRemove","files","submitBtnClick","context","getCurrentValue","triggerSceneChange","scene","getSlots","slots","action-list","_createVNode","ElUpload","ElIcon","Paperclip","_Fragment","onClick","LoadingBtn","FilesCard","render","_slot","EditorSender"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import _sfc_main from "./index.vue2.js";
2
2
  /* empty css */
3
3
  import _export_sfc from "../../../_virtual/_plugin-vue_export-helper.js";
4
- const EditorSender = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-5619e038"]]);
4
+ const EditorSender = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-701f12aa"]]);
5
5
  export {
6
6
  EditorSender as default
7
7
  };
@@ -92,6 +92,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
92
92
  opNode.value = chat.value.createOperateNode();
93
93
  chat.value.addEventListener("enterSend", onSubmit);
94
94
  chat.value.addEventListener("operate", () => {
95
+ console.log("operate");
95
96
  chatState.isEmpty = chat.value.isEmpty(true);
96
97
  chatState.textLength = chat.value.textLength;
97
98
  emits("change");
@@ -1 +1 @@
1
- {"version":3,"file":"index.vue2.js","sources":["../../../../../src/components/editor-sender/source/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n ChatNode,\n ChatNodeType,\n ChatOperateNode,\n DatasetByType,\n TagInfo,\n TipOptions,\n UserInfo\n} from 'chatarea';\nimport {\n ChatState,\n EditorProps,\n EditorSenderEmits,\n MixTag,\n SelectDialogOption,\n SubmitResult\n} from 'vue-element-plus-x/types/EditorSender';\nimport ChatArea from 'chatarea';\nimport { \n onBeforeUnmount, \n onMounted, \n reactive, \n ref,\n watch,\n getCurrentInstance,\n computed\n} from 'vue';\nimport ClearButton from './components/ClearButton/index.vue';\nimport LoadingButton from './components/LoadingButton/index.vue';\nimport SendButton from './components/SendButton/index.vue';\nimport 'chatarea/lib/ChatArea.css';\n\n/**\n * 支持的配置属性\n */\nconst props = withDefaults(defineProps<EditorProps&{\n activeTag: TagInfo | null\n}>(), {\n placeholder: '请输入内容', // 输入框提示占位语\n device: 'pc', // 使用编辑器设备类型 pc内置了很多丰富的弹出选择功能,如果用户传入了h5,弹出交互需要参考自定义弹出去支持\n autoFocus: false, // 是否在聊天框生成后自动聚焦\n variant: 'default', // 输入框的变体类型\n selectList: () => [], // 配置标签下拉选择的选项\n userList: () => [], // @研讨群成员列表\n customTrigger: () => [], // 扩展自定义弹窗列表\n maxLength: undefined, // 限制输入框最大字数 *注 该配置项性能开销较大 非必要情况请别设置(像豆包和文心一言都不对这块做限制,不应因小失大)\n submitType: 'enter', // 控制换行与提交模式\n customStyle: () => ({}), // 修改输入样式\n loading: false, // 发送按钮加载状态\n disabled: false, // 是否禁用输入框\n clearable: false, // 是否显示清空按钮\n headerAnimationTimer: 300, // 展开动画\n asyncMatchFun: undefined, // 异步加载群成员方法\n customDialog: false, // 是否需要自定义弹窗 开启后内部弹窗将不会再创建了\n activeTag: null\n});\n/**\n * 暴露的事件\n */\nconst emits = defineEmits<EditorSenderEmits & {\n(event: 'pasteFile', firstFile: File, fileList: FileList): void;\n}>();\n\nconst instance = getCurrentInstance();\n\n// 判断是否存在 pasteFile 监听器\nconst hasOnPasteFileListener = computed(() => {\n return !!instance?.vnode.props?.onPasteFile;\n});\n\n/**\n * 输入框相关\n */\nconst chat = ref<ChatArea>();\nconst opNode = ref<ChatOperateNode>();\nconst container = ref<HTMLElement>();\nconst chatState = reactive<ChatState>({\n isEmpty: true,\n textLength: 0, // 该属性值只会在配置了maxLength情况下才拥有赋值\n lastFocusNode: null,\n lastOffset: 0,\n wrapCallSelectDialog: false, // 记录是否是外部调用了选择弹窗进行插值行为操作\n beforeText: '',\n afterText: ''\n});\n// 创建输入框\nfunction createChat() {\n chat.value = new ChatArea({\n elm: container.value!,\n ...props,\n userList: JSON.parse(JSON.stringify(props.userList)),\n needDialog: !props.customDialog && props.device === 'pc',\n copyType: ['text'],\n asyncMatch: Boolean(props.asyncMatchFun),\n needDebounce: true,\n needCallSpace: false,\n sendKeyFun:\n props.submitType === 'enter'\n ? event => !event.shiftKey && event.key === 'Enter'\n : event => event.shiftKey && event.key === 'Enter',\n wrapKeyFun:\n props.submitType === 'shiftEnter'\n ? event => !event.shiftKey && event.key === 'Enter'\n : event => event.shiftKey && event.key === 'Enter'\n });\n opNode.value = chat.value.createOperateNode();\n // 订阅发送事件\n chat.value.addEventListener('enterSend', onSubmit);\n // 对输入框进行操作事件\n chat.value.addEventListener('operate', () => {\n chatState.isEmpty = chat.value!.isEmpty(true);\n chatState.textLength = chat.value!.textLength;\n emits('change');\n });\n // 失去焦点记录最后一次光标Node节点\n chat.value.richText.addEventListener(\n 'blur',\n () => {\n const sel = getSelection()!;\n chatState.lastFocusNode = sel.focusNode;\n chatState.lastOffset = sel.focusOffset;\n },\n true\n );\n // 订阅标签选择事件\n chat.value.addEventListener('selectCheck', () => {\n if (chatState.wrapCallSelectDialog && chatState.beforeText) {\n chat.value?.insertText(chatState.beforeText);\n chatState.beforeText = '';\n }\n });\n chat.value.addEventListener('afterSelectCheck', () => {\n if (chatState.wrapCallSelectDialog && chatState.afterText) {\n chat.value?.insertText(chatState.afterText);\n chatState.afterText = '';\n chatState.wrapCallSelectDialog = false;\n }\n });\n // 接管异步匹配\n if (props.asyncMatchFun) {\n chat.value.addEventListener('atMatch', props.asyncMatchFun);\n }\n // 检测多种弹窗唤起事件\n chat.value.addEventListener('showAtDialog', () => {\n emits('showAtDialog');\n });\n chat.value.addEventListener(\n 'showSelectDialog',\n (key: string, elm: HTMLElement) => {\n emits('showSelectDialog', key, elm);\n }\n );\n chat.value.addEventListener('showTagDialog', (prefix: string) => {\n emits('showTagDialog', prefix);\n });\n // 禁用编辑器\n if (props.disabled) {\n chat.value.disabled();\n }\n // 绑定ESC按键关闭提示标签\n window.addEventListener('keydown', keydownESC);\n}\n// 获取输入框当前内容\nfunction getCurrentValue(): SubmitResult {\n const text = chat.value!.getText();\n const html = chat.value!.getHtml();\n const inputTags = chat.value!.getInputTagList();\n const userTags =\n props.userList.length > 0 ? chat.value!.getCallUserTagList() : undefined;\n const selectTags =\n props.selectList.length > 0 ? chat.value!.getSelectTagList() : undefined;\n const customTags =\n props.customTrigger.length > 0 ? chat.value!.getCustomTagList() : undefined;\n return {\n text,\n html,\n inputTags,\n userTags,\n selectTags,\n customTags\n };\n}\n// 提交发送方法\nfunction onSubmit() {\n // 内容纯空 拦截发送\n if (chatState.isEmpty) {\n return;\n }\n emits('submit', getCurrentValue());\n}\n// 取消发送方法\nfunction onCancel() {\n emits('cancel');\n}\n// 清空输入框方法\nfunction onClear(txt?: string) {\n chat.value!.clear(txt);\n // 将光标移动到末尾\n focusToEnd();\n}\n// 点击内容区域聚焦输入框\nfunction onContentMouseDown() {\n requestAnimationFrame(() => {\n const focusElm = chatState.lastFocusNode?.parentElement;\n // chatInput不是暴露给用户操作的对象 因此没有写入ts类型\n const chatInput = (chat.value as any).chatInput;\n if (focusElm && focusElm.classList.contains('input-write')) {\n chatInput.setInputTagRange(chatState.lastFocusNode, chatState.lastOffset);\n } else {\n chatInput.restCursorPos(chatInput.vnode, chatInput.cursorIndex);\n }\n });\n}\n// 聚焦到文本最前方\nfunction focusToStart() {\n if (chat.value && opNode.value) {\n opNode.value.setCursorNode(\n opNode.value.getNodeByRank(\n opNode.value.getRank(0) + opNode.value.getRank(0)\n )!,\n 0\n );\n }\n}\n// 聚焦到文本最后方\nfunction focusToEnd() {\n if (chat.value && opNode.value) {\n opNode.value.setCursorNode(\n opNode.value.getNodeByRank(\n opNode.value.getRank(-1) + opNode.value.getRank(-1)\n )!\n );\n }\n}\n// 失去焦点\nfunction blur() {\n if (chat.value) {\n const selection = getSelection()!;\n selection.removeAllRanges();\n chat.value.richText.blur();\n }\n}\n// 内容全选\nfunction selectAll() {\n if (chat.value && opNode.value) {\n const firstNode = opNode.value.getNodeByRank(\n opNode.value.getRank(0) + opNode.value.getRank(0)\n );\n const lastNode = opNode.value.getNodeByRank(\n opNode.value.getRank(-1) + opNode.value.getRank(-1)\n );\n opNode.value.setSelectNodes(firstNode!, lastNode!);\n }\n}\n// 插入一个选择标签\nfunction setSelectTag(key: string, tagId: string) {\n chatState.wrapCallSelectDialog = false;\n const tag = props.selectList\n ?.find(option => option.key === key)\n ?.options.find(tag => tag.id === tagId);\n if (tag) {\n chat.value?.setSelectTag(tag, key);\n }\n}\n// 插入一个输入标签\nfunction setInputTag(key: string, placeholder: string, defaultValue?: string) {\n chat.value?.setInputTag(key, placeholder, defaultValue);\n}\n// 插入一个@提及标签\nfunction setUserTag(userId: string) {\n const user = props.userList?.find(user => user.id === userId);\n if (user) {\n chat.value?.setUserTag(user);\n }\n}\n// 插入一个自定义触发符标签\nfunction setCustomTag(prefix: string, id: string) {\n const custom = props.customTrigger\n ?.find(option => option.prefix === prefix)\n ?.tagList.find(tag => tag.id === id);\n if (custom) {\n chat.value?.setCustomTag(custom, prefix);\n }\n}\n// 混合式插入\nfunction setMixTags(tags: MixTag[][]) {\n // 整合ChatNode\n const chatNodes = tags.map((row: MixTag[], index) => {\n return {\n type: 'gridBox',\n rank: opNode.value?.getRank(index),\n children: row.map((cRow: MixTag) => {\n return {\n type: cRow.type,\n text: cRow.value,\n html: cRow.value,\n dataset: {\n id: cRow.value,\n name: getNameByTypeId(cRow),\n prefix: cRow.key,\n key: cRow.key,\n placeholder: cRow.placeholder,\n value: cRow.value\n }\n };\n })\n };\n });\n opNode.value?.coverNodes(chatNodes as ChatNode<ChatNodeType>[]);\n}\n// 根据id和类型捕获目标name\nfunction getNameByTypeId(mixTag: MixTag): string {\n const { type, value, key } = mixTag;\n switch (type) {\n case 'userTag':\n return props.userList?.find(user => user.id === value)?.name || '';\n case 'selectTag':\n return (\n props.selectList\n ?.find(row => row.key === key)\n ?.options.find(select => select.id === value)?.name || ''\n );\n case 'customTag':\n return (\n props.customTrigger\n ?.find(row => row.prefix === key)\n ?.tagList.find(custom => custom.id === value)?.name || ''\n );\n default:\n return '';\n }\n}\n// 在当前光标处插入html片段\nfunction setHtml(html: string) {\n // 注* 插入的html标签必须是 行内 或 行内块元素,如果需要块级元素标签 请自行插入行内元素然后修改其css属性为块级元素\n chat.value?.insertHtml(html);\n}\n// 在当前光标处插入text内容\nfunction setText(txt: string) {\n chat.value?.insertText(txt);\n}\n// 外部调用唤起标签选择弹窗\nfunction openSelectDialog(option: SelectDialogOption) {\n chatState.beforeText = option.beforeText || '';\n chatState.afterText = option.afterText || '';\n chatState.wrapCallSelectDialog = true;\n chat.value?.showPCSelectDialog(option.key, option.elm);\n}\n// 打开前置提示标签\nfunction openTipTag(options: TipOptions) {\n chat.value?.openTipTag({\n ...options,\n codeLabel: 'ESC'\n });\n}\n// 关闭前置提示标签\nfunction closeTipTag() {\n chat.value?.closeTipTag();\n}\n// 绑定ESC按键关闭提示标签\nfunction keydownESC(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n closeTipTag();\n }\n}\n// 用户自定义弹窗写入@提及标签\nfunction customSetUser(user: UserInfo) {\n // 该方法并未写入ts 因为是一个私有api没暴露给用户 其区别 setUserTag 相比会去向前截取掉触发符\n (chat.value as any).onceSetTag(user);\n}\n// 用户自定义弹窗写入自定义触发符号标签\nfunction customSetTag(prefix: string, tag: TagInfo) {\n // 该方法并未写入ts 因为是一个私有api没暴露给用户 其区别 setCustomTag 相比会去向前截取掉触发符\n (chat.value as any).onceSetCustomTag(tag, prefix);\n}\n// 用户自定义弹窗更新选择标签\nfunction updateSelectTag(elm: HTMLElement, tag: TagInfo) {\n const rank = opNode.value?.getRankByElm(elm.parentElement!);\n if (!rank) {\n return;\n }\n const chatNode = opNode.value?.getNodeByRank(rank);\n if (!chatNode) {\n return;\n }\n const dataset = chatNode.dataset as Pick<\n DatasetByType,\n 'selectTag'\n >['selectTag'];\n dataset.id = tag.id;\n dataset.name = tag.name;\n opNode.value?.updateNode(chatNode);\n}\n\nfunction handleInternalPaste(e: ClipboardEvent) {\n const files = e.clipboardData?.files;\n if (files?.length && hasOnPasteFileListener.value) {\n emits('pasteFile', files[0], files);\n e.preventDefault();\n }\n}\n\n/**\n * 监听响应props的响应式修改 去更新chat示例对象对应的配置\n */\nwatch(\n () => props.disabled,\n () => {\n props.disabled ? chat.value?.disabled() : chat.value?.enable();\n }\n);\nwatch(\n () => props.placeholder,\n () => {\n chat.value?.updateConfig({\n placeholder: props.placeholder\n });\n }\n);\nwatch(\n () => props.maxLength,\n () => {\n chat.value?.updateConfig({\n maxLength: props.maxLength\n });\n }\n);\nwatch(\n () => props.submitType,\n () => {\n chat.value?.updateConfig({\n sendKeyFun:\n props.submitType === 'enter'\n ? event => !event.shiftKey && event.key === 'Enter'\n : event => event.shiftKey && event.key === 'Enter',\n wrapKeyFun:\n props.submitType === 'shiftEnter'\n ? event => !event.shiftKey && event.key === 'Enter'\n : event => event.shiftKey && event.key === 'Enter'\n });\n }\n);\nwatch(\n () => props.userList,\n () => {\n chat.value?.updateConfig({\n userList: props.userList\n });\n },\n { deep: true }\n);\nwatch(\n () => props.selectList,\n () => {\n chat.value?.updateConfig({\n selectList: props.selectList\n });\n },\n { deep: true }\n);\nwatch(\n () => props.customTrigger,\n () => {\n chat.value?.updateConfig({\n customTrigger: props.customTrigger\n });\n },\n { deep: true }\n);\n\nonMounted(() => {\n createChat();\n});\n\nonBeforeUnmount(() => {\n if (chat.value) {\n chat.value.dispose();\n chat.value = undefined;\n opNode.value = undefined;\n window.removeEventListener('keydown', keydownESC);\n }\n});\n\n/** 暴露方法 */\ndefineExpose({\n getCurrentValue,\n focusToStart,\n focusToEnd,\n blur,\n selectAll,\n clear: onClear,\n setSelectTag,\n setInputTag,\n setUserTag,\n setCustomTag,\n setMixTags,\n setHtml,\n setText,\n openSelectDialog,\n customSetUser,\n customSetTag,\n updateSelectTag,\n openTipTag,\n closeTipTag,\n chat, // 暴露chat实例对象\n opNode, // 暴露ChatNode操作对象\n chatState\n});\n</script>\n\n<template>\n <div\n class=\"el-editor-sender-wrap\"\n :style=\"{\n '--el-editor-sender-header-duration': `${headerAnimationTimer}ms`\n }\"\n >\n <!-- 头部容器 -->\n <Transition name=\"slide\">\n <div v-if=\"$slots.header\" class=\"el-editor-sender-header\">\n <div class=\"el-editor-sender-header-container\">\n <slot name=\"header\" />\n </div>\n </div>\n </Transition>\n <!-- 内容容器 -->\n <div\n class=\"el-editor-sender-content\"\n :class=\"{ 'content-variant-updown': props.variant === 'updown' }\"\n @mousedown=\"onContentMouseDown\"\n >\n <!-- 输入区域 -->\n <div class=\"el-editor-sender-chat-room\" @mousedown.stop=\"() => {}\">\n <!-- 变体 updown: Prefix 前缀 -->\n <div v-if=\"$slots.prefix\" class=\"el-editor-sender-prefix\">\n <slot name=\"prefix\" />\n </div>\n <span\n v-if=\"props.activeTag\"\n class=\"el-editor-sender-active-tag\"\n >\n {{ props.activeTag.name }}\n </span>\n <!-- 输入框载体 这里多嵌套一层是为了存放渲染后的弹窗元素 -->\n <div\n ref=\"container\"\n :style=\"{ ...customStyle }\"\n class=\"el-editor-sender-chat\"\n @paste=\"handleInternalPaste\"\n />\n </div>\n <!-- 默认操作列表 -->\n <div\n v-if=\"props.variant === 'default'\"\n class=\"el-editor-sender-action-list\"\n >\n <slot name=\"action-list\">\n <div class=\"el-editor-sender-action-list-presets\">\n <SendButton\n v-if=\"!props.loading\"\n :disabled=\"chatState.isEmpty || props.disabled\"\n @submit=\"onSubmit\"\n />\n\n <LoadingButton v-if=\"props.loading\" @cancel=\"onCancel\" />\n\n <ClearButton\n v-if=\"props.clearable\"\n :disabled=\"chatState.isEmpty || props.disabled\"\n @clear=\"onClear\"\n />\n </div>\n </slot>\n </div>\n <!-- 变体操作列表 -->\n <div\n v-else-if=\"props.variant === 'updown'\"\n class=\"el-editor-sender-updown-action-list\"\n >\n <!-- 变体 updown:操作列表 -->\n <div class=\"el-editor-sender-action-list\">\n <slot name=\"action-list\">\n <div class=\"el-editor-sender-action-list-presets\">\n <SendButton\n v-if=\"!props.loading\"\n :disabled=\"chatState.isEmpty || props.disabled\"\n @submit=\"onSubmit\"\n />\n\n <LoadingButton v-if=\"props.loading\" @cancel=\"onCancel\" />\n\n <ClearButton\n v-if=\"props.clearable\"\n :disabled=\"chatState.isEmpty || props.disabled\"\n @clear=\"onClear\"\n />\n </div>\n </slot>\n </div>\n </div>\n </div>\n <!-- 底部容器 -->\n <Transition name=\"slide\">\n <div v-if=\"$slots.footer\" class=\"el-editor-sender-footer\">\n <slot name=\"footer\" />\n </div>\n </Transition>\n </div>\n</template>\n\n<style scoped lang=\"scss\" src=\"./style.scss\"></style>\n"],"names":["tag","user","_a","_createElementBlock","_normalizeStyle","_createVNode","_Transition","$slots","_openBlock","_createElementVNode","_renderSlot","_normalizeClass","_toDisplayString","_createBlock","SendButton"],"mappings":"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"}
1
+ {"version":3,"file":"index.vue2.js","sources":["../../../../../src/components/editor-sender/source/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n ChatNode,\n ChatNodeType,\n ChatOperateNode,\n DatasetByType,\n TagInfo,\n TipOptions,\n UserInfo\n} from 'chatarea';\nimport {\n ChatState,\n EditorProps,\n EditorSenderEmits,\n MixTag,\n SelectDialogOption,\n SubmitResult\n} from 'vue-element-plus-x/types/EditorSender';\nimport ChatArea from 'chatarea';\nimport { \n onBeforeUnmount, \n onMounted, \n reactive, \n ref,\n watch,\n getCurrentInstance,\n computed\n} from 'vue';\nimport ClearButton from './components/ClearButton/index.vue';\nimport LoadingButton from './components/LoadingButton/index.vue';\nimport SendButton from './components/SendButton/index.vue';\nimport 'chatarea/lib/ChatArea.css';\n\n/**\n * 支持的配置属性\n */\nconst props = withDefaults(defineProps<EditorProps&{\n activeTag: TagInfo | null\n}>(), {\n placeholder: '请输入内容', // 输入框提示占位语\n device: 'pc', // 使用编辑器设备类型 pc内置了很多丰富的弹出选择功能,如果用户传入了h5,弹出交互需要参考自定义弹出去支持\n autoFocus: false, // 是否在聊天框生成后自动聚焦\n variant: 'default', // 输入框的变体类型\n selectList: () => [], // 配置标签下拉选择的选项\n userList: () => [], // @研讨群成员列表\n customTrigger: () => [], // 扩展自定义弹窗列表\n maxLength: undefined, // 限制输入框最大字数 *注 该配置项性能开销较大 非必要情况请别设置(像豆包和文心一言都不对这块做限制,不应因小失大)\n submitType: 'enter', // 控制换行与提交模式\n customStyle: () => ({}), // 修改输入样式\n loading: false, // 发送按钮加载状态\n disabled: false, // 是否禁用输入框\n clearable: false, // 是否显示清空按钮\n headerAnimationTimer: 300, // 展开动画\n asyncMatchFun: undefined, // 异步加载群成员方法\n customDialog: false, // 是否需要自定义弹窗 开启后内部弹窗将不会再创建了\n activeTag: null\n});\n/**\n * 暴露的事件\n */\nconst emits = defineEmits<EditorSenderEmits & {\n(event: 'pasteFile', firstFile: File, fileList: FileList): void;\n}>();\n\nconst instance = getCurrentInstance();\n\n// 判断是否存在 pasteFile 监听器\nconst hasOnPasteFileListener = computed(() => {\n return !!instance?.vnode.props?.onPasteFile;\n});\n\n/**\n * 输入框相关\n */\nconst chat = ref<ChatArea>();\nconst opNode = ref<ChatOperateNode>();\nconst container = ref<HTMLElement>();\nconst chatState = reactive<ChatState>({\n isEmpty: true,\n textLength: 0, // 该属性值只会在配置了maxLength情况下才拥有赋值\n lastFocusNode: null,\n lastOffset: 0,\n wrapCallSelectDialog: false, // 记录是否是外部调用了选择弹窗进行插值行为操作\n beforeText: '',\n afterText: ''\n});\n// 创建输入框\nfunction createChat() {\n chat.value = new ChatArea({\n elm: container.value!,\n ...props,\n userList: JSON.parse(JSON.stringify(props.userList)),\n needDialog: !props.customDialog && props.device === 'pc',\n copyType: ['text'],\n asyncMatch: Boolean(props.asyncMatchFun),\n needDebounce: true,\n needCallSpace: false,\n sendKeyFun:\n props.submitType === 'enter'\n ? event => !event.shiftKey && event.key === 'Enter'\n : event => event.shiftKey && event.key === 'Enter',\n wrapKeyFun:\n props.submitType === 'shiftEnter'\n ? event => !event.shiftKey && event.key === 'Enter'\n : event => event.shiftKey && event.key === 'Enter'\n });\n opNode.value = chat.value.createOperateNode();\n // 订阅发送事件\n chat.value.addEventListener('enterSend', onSubmit);\n // 对输入框进行操作事件\n chat.value.addEventListener('operate', () => {\n console.log('operate');\n chatState.isEmpty = chat.value!.isEmpty(true);\n chatState.textLength = chat.value!.textLength;\n emits('change');\n });\n // 失去焦点记录最后一次光标Node节点\n chat.value.richText.addEventListener(\n 'blur',\n () => {\n const sel = getSelection()!;\n chatState.lastFocusNode = sel.focusNode;\n chatState.lastOffset = sel.focusOffset;\n },\n true\n );\n // 订阅标签选择事件\n chat.value.addEventListener('selectCheck', () => {\n if (chatState.wrapCallSelectDialog && chatState.beforeText) {\n chat.value?.insertText(chatState.beforeText);\n chatState.beforeText = '';\n }\n });\n chat.value.addEventListener('afterSelectCheck', () => {\n if (chatState.wrapCallSelectDialog && chatState.afterText) {\n chat.value?.insertText(chatState.afterText);\n chatState.afterText = '';\n chatState.wrapCallSelectDialog = false;\n }\n });\n // 接管异步匹配\n if (props.asyncMatchFun) {\n chat.value.addEventListener('atMatch', props.asyncMatchFun);\n }\n // 检测多种弹窗唤起事件\n chat.value.addEventListener('showAtDialog', () => {\n emits('showAtDialog');\n });\n chat.value.addEventListener(\n 'showSelectDialog',\n (key: string, elm: HTMLElement) => {\n emits('showSelectDialog', key, elm);\n }\n );\n chat.value.addEventListener('showTagDialog', (prefix: string) => {\n emits('showTagDialog', prefix);\n });\n // 禁用编辑器\n if (props.disabled) {\n chat.value.disabled();\n }\n // 绑定ESC按键关闭提示标签\n window.addEventListener('keydown', keydownESC);\n}\n// 获取输入框当前内容\nfunction getCurrentValue(): SubmitResult {\n const text = chat.value!.getText();\n const html = chat.value!.getHtml();\n const inputTags = chat.value!.getInputTagList();\n const userTags =\n props.userList.length > 0 ? chat.value!.getCallUserTagList() : undefined;\n const selectTags =\n props.selectList.length > 0 ? chat.value!.getSelectTagList() : undefined;\n const customTags =\n props.customTrigger.length > 0 ? chat.value!.getCustomTagList() : undefined;\n return {\n text,\n html,\n inputTags,\n userTags,\n selectTags,\n customTags\n };\n}\n// 提交发送方法\nfunction onSubmit() {\n // 内容纯空 拦截发送\n if (chatState.isEmpty) {\n return;\n }\n emits('submit', getCurrentValue());\n}\n// 取消发送方法\nfunction onCancel() {\n emits('cancel');\n}\n// 清空输入框方法\nfunction onClear(txt?: string) {\n chat.value!.clear(txt);\n // 将光标移动到末尾\n focusToEnd();\n}\n// 点击内容区域聚焦输入框\nfunction onContentMouseDown() {\n requestAnimationFrame(() => {\n const focusElm = chatState.lastFocusNode?.parentElement;\n // chatInput不是暴露给用户操作的对象 因此没有写入ts类型\n const chatInput = (chat.value as any).chatInput;\n if (focusElm && focusElm.classList.contains('input-write')) {\n chatInput.setInputTagRange(chatState.lastFocusNode, chatState.lastOffset);\n } else {\n chatInput.restCursorPos(chatInput.vnode, chatInput.cursorIndex);\n }\n });\n}\n// 聚焦到文本最前方\nfunction focusToStart() {\n if (chat.value && opNode.value) {\n opNode.value.setCursorNode(\n opNode.value.getNodeByRank(\n opNode.value.getRank(0) + opNode.value.getRank(0)\n )!,\n 0\n );\n }\n}\n// 聚焦到文本最后方\nfunction focusToEnd() {\n if (chat.value && opNode.value) {\n opNode.value.setCursorNode(\n opNode.value.getNodeByRank(\n opNode.value.getRank(-1) + opNode.value.getRank(-1)\n )!\n );\n }\n}\n// 失去焦点\nfunction blur() {\n if (chat.value) {\n const selection = getSelection()!;\n selection.removeAllRanges();\n chat.value.richText.blur();\n }\n}\n// 内容全选\nfunction selectAll() {\n if (chat.value && opNode.value) {\n const firstNode = opNode.value.getNodeByRank(\n opNode.value.getRank(0) + opNode.value.getRank(0)\n );\n const lastNode = opNode.value.getNodeByRank(\n opNode.value.getRank(-1) + opNode.value.getRank(-1)\n );\n opNode.value.setSelectNodes(firstNode!, lastNode!);\n }\n}\n// 插入一个选择标签\nfunction setSelectTag(key: string, tagId: string) {\n chatState.wrapCallSelectDialog = false;\n const tag = props.selectList\n ?.find(option => option.key === key)\n ?.options.find(tag => tag.id === tagId);\n if (tag) {\n chat.value?.setSelectTag(tag, key);\n }\n}\n// 插入一个输入标签\nfunction setInputTag(key: string, placeholder: string, defaultValue?: string) {\n chat.value?.setInputTag(key, placeholder, defaultValue);\n}\n// 插入一个@提及标签\nfunction setUserTag(userId: string) {\n const user = props.userList?.find(user => user.id === userId);\n if (user) {\n chat.value?.setUserTag(user);\n }\n}\n// 插入一个自定义触发符标签\nfunction setCustomTag(prefix: string, id: string) {\n const custom = props.customTrigger\n ?.find(option => option.prefix === prefix)\n ?.tagList.find(tag => tag.id === id);\n if (custom) {\n chat.value?.setCustomTag(custom, prefix);\n }\n}\n// 混合式插入\nfunction setMixTags(tags: MixTag[][]) {\n // 整合ChatNode\n const chatNodes = tags.map((row: MixTag[], index) => {\n return {\n type: 'gridBox',\n rank: opNode.value?.getRank(index),\n children: row.map((cRow: MixTag) => {\n return {\n type: cRow.type,\n text: cRow.value,\n html: cRow.value,\n dataset: {\n id: cRow.value,\n name: getNameByTypeId(cRow),\n prefix: cRow.key,\n key: cRow.key,\n placeholder: cRow.placeholder,\n value: cRow.value\n }\n };\n })\n };\n });\n opNode.value?.coverNodes(chatNodes as ChatNode<ChatNodeType>[]);\n}\n// 根据id和类型捕获目标name\nfunction getNameByTypeId(mixTag: MixTag): string {\n const { type, value, key } = mixTag;\n switch (type) {\n case 'userTag':\n return props.userList?.find(user => user.id === value)?.name || '';\n case 'selectTag':\n return (\n props.selectList\n ?.find(row => row.key === key)\n ?.options.find(select => select.id === value)?.name || ''\n );\n case 'customTag':\n return (\n props.customTrigger\n ?.find(row => row.prefix === key)\n ?.tagList.find(custom => custom.id === value)?.name || ''\n );\n default:\n return '';\n }\n}\n// 在当前光标处插入html片段\nfunction setHtml(html: string) {\n // 注* 插入的html标签必须是 行内 或 行内块元素,如果需要块级元素标签 请自行插入行内元素然后修改其css属性为块级元素\n chat.value?.insertHtml(html);\n}\n// 在当前光标处插入text内容\nfunction setText(txt: string) {\n chat.value?.insertText(txt);\n}\n// 外部调用唤起标签选择弹窗\nfunction openSelectDialog(option: SelectDialogOption) {\n chatState.beforeText = option.beforeText || '';\n chatState.afterText = option.afterText || '';\n chatState.wrapCallSelectDialog = true;\n chat.value?.showPCSelectDialog(option.key, option.elm);\n}\n// 打开前置提示标签\nfunction openTipTag(options: TipOptions) {\n chat.value?.openTipTag({\n ...options,\n codeLabel: 'ESC'\n });\n}\n// 关闭前置提示标签\nfunction closeTipTag() {\n chat.value?.closeTipTag();\n}\n// 绑定ESC按键关闭提示标签\nfunction keydownESC(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n closeTipTag();\n }\n}\n// 用户自定义弹窗写入@提及标签\nfunction customSetUser(user: UserInfo) {\n // 该方法并未写入ts 因为是一个私有api没暴露给用户 其区别 setUserTag 相比会去向前截取掉触发符\n (chat.value as any).onceSetTag(user);\n}\n// 用户自定义弹窗写入自定义触发符号标签\nfunction customSetTag(prefix: string, tag: TagInfo) {\n // 该方法并未写入ts 因为是一个私有api没暴露给用户 其区别 setCustomTag 相比会去向前截取掉触发符\n (chat.value as any).onceSetCustomTag(tag, prefix);\n}\n// 用户自定义弹窗更新选择标签\nfunction updateSelectTag(elm: HTMLElement, tag: TagInfo) {\n const rank = opNode.value?.getRankByElm(elm.parentElement!);\n if (!rank) {\n return;\n }\n const chatNode = opNode.value?.getNodeByRank(rank);\n if (!chatNode) {\n return;\n }\n const dataset = chatNode.dataset as Pick<\n DatasetByType,\n 'selectTag'\n >['selectTag'];\n dataset.id = tag.id;\n dataset.name = tag.name;\n opNode.value?.updateNode(chatNode);\n}\n\nfunction handleInternalPaste(e: ClipboardEvent) {\n const files = e.clipboardData?.files;\n if (files?.length && hasOnPasteFileListener.value) {\n emits('pasteFile', files[0], files);\n e.preventDefault();\n }\n}\n\n/**\n * 监听响应props的响应式修改 去更新chat示例对象对应的配置\n */\nwatch(\n () => props.disabled,\n () => {\n props.disabled ? chat.value?.disabled() : chat.value?.enable();\n }\n);\nwatch(\n () => props.placeholder,\n () => {\n chat.value?.updateConfig({\n placeholder: props.placeholder\n });\n }\n);\nwatch(\n () => props.maxLength,\n () => {\n chat.value?.updateConfig({\n maxLength: props.maxLength\n });\n }\n);\nwatch(\n () => props.submitType,\n () => {\n chat.value?.updateConfig({\n sendKeyFun:\n props.submitType === 'enter'\n ? event => !event.shiftKey && event.key === 'Enter'\n : event => event.shiftKey && event.key === 'Enter',\n wrapKeyFun:\n props.submitType === 'shiftEnter'\n ? event => !event.shiftKey && event.key === 'Enter'\n : event => event.shiftKey && event.key === 'Enter'\n });\n }\n);\nwatch(\n () => props.userList,\n () => {\n chat.value?.updateConfig({\n userList: props.userList\n });\n },\n { deep: true }\n);\nwatch(\n () => props.selectList,\n () => {\n chat.value?.updateConfig({\n selectList: props.selectList\n });\n },\n { deep: true }\n);\nwatch(\n () => props.customTrigger,\n () => {\n chat.value?.updateConfig({\n customTrigger: props.customTrigger\n });\n },\n { deep: true }\n);\n\nonMounted(() => {\n createChat();\n});\n\nonBeforeUnmount(() => {\n if (chat.value) {\n chat.value.dispose();\n chat.value = undefined;\n opNode.value = undefined;\n window.removeEventListener('keydown', keydownESC);\n }\n});\n\n/** 暴露方法 */\ndefineExpose({\n getCurrentValue,\n focusToStart,\n focusToEnd,\n blur,\n selectAll,\n clear: onClear,\n setSelectTag,\n setInputTag,\n setUserTag,\n setCustomTag,\n setMixTags,\n setHtml,\n setText,\n openSelectDialog,\n customSetUser,\n customSetTag,\n updateSelectTag,\n openTipTag,\n closeTipTag,\n chat, // 暴露chat实例对象\n opNode, // 暴露ChatNode操作对象\n chatState\n});\n</script>\n\n<template>\n <div\n class=\"el-editor-sender-wrap\"\n :style=\"{\n '--el-editor-sender-header-duration': `${headerAnimationTimer}ms`\n }\"\n >\n <!-- 头部容器 -->\n <Transition name=\"slide\">\n <div v-if=\"$slots.header\" class=\"el-editor-sender-header\">\n <div class=\"el-editor-sender-header-container\">\n <slot name=\"header\" />\n </div>\n </div>\n </Transition>\n <!-- 内容容器 -->\n <div\n class=\"el-editor-sender-content\"\n :class=\"{ 'content-variant-updown': props.variant === 'updown' }\"\n @mousedown=\"onContentMouseDown\"\n >\n <!-- 输入区域 -->\n <div class=\"el-editor-sender-chat-room\" @mousedown.stop=\"() => {}\">\n <!-- 变体 updown: Prefix 前缀 -->\n <div v-if=\"$slots.prefix\" class=\"el-editor-sender-prefix\">\n <slot name=\"prefix\" />\n </div>\n <span\n v-if=\"props.activeTag\"\n class=\"el-editor-sender-active-tag\"\n >\n {{ props.activeTag.name }}\n </span>\n <!-- 输入框载体 这里多嵌套一层是为了存放渲染后的弹窗元素 -->\n <div\n ref=\"container\"\n :style=\"{ ...customStyle }\"\n class=\"el-editor-sender-chat\"\n @paste=\"handleInternalPaste\"\n />\n </div>\n <!-- 默认操作列表 -->\n <div\n v-if=\"props.variant === 'default'\"\n class=\"el-editor-sender-action-list\"\n >\n <slot name=\"action-list\">\n <div class=\"el-editor-sender-action-list-presets\">\n <SendButton\n v-if=\"!props.loading\"\n :disabled=\"chatState.isEmpty || props.disabled\"\n @submit=\"onSubmit\"\n />\n\n <LoadingButton v-if=\"props.loading\" @cancel=\"onCancel\" />\n\n <ClearButton\n v-if=\"props.clearable\"\n :disabled=\"chatState.isEmpty || props.disabled\"\n @clear=\"onClear\"\n />\n </div>\n </slot>\n </div>\n <!-- 变体操作列表 -->\n <div\n v-else-if=\"props.variant === 'updown'\"\n class=\"el-editor-sender-updown-action-list\"\n >\n <!-- 变体 updown:操作列表 -->\n <div class=\"el-editor-sender-action-list\">\n <slot name=\"action-list\">\n <div class=\"el-editor-sender-action-list-presets\">\n <SendButton\n v-if=\"!props.loading\"\n :disabled=\"chatState.isEmpty || props.disabled\"\n @submit=\"onSubmit\"\n />\n\n <LoadingButton v-if=\"props.loading\" @cancel=\"onCancel\" />\n\n <ClearButton\n v-if=\"props.clearable\"\n :disabled=\"chatState.isEmpty || props.disabled\"\n @clear=\"onClear\"\n />\n </div>\n </slot>\n </div>\n </div>\n </div>\n <!-- 底部容器 -->\n <Transition name=\"slide\">\n <div v-if=\"$slots.footer\" class=\"el-editor-sender-footer\">\n <slot name=\"footer\" />\n </div>\n </Transition>\n </div>\n</template>\n\n<style scoped lang=\"scss\" src=\"./style.scss\"></style>\n"],"names":["tag","user","_a","_createElementBlock","_normalizeStyle","_createVNode","_Transition","$slots","_openBlock","_createElementVNode","_renderSlot","_normalizeClass","_toDisplayString","_createBlock","SendButton"],"mappings":"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"}
@@ -78,6 +78,10 @@ const XMarkdown = /* @__PURE__ */ defineComponent({
78
78
  speed: {
79
79
  type: Number,
80
80
  default: 200
81
+ },
82
+ isHistoryMessage: {
83
+ type: Boolean,
84
+ default: false
81
85
  }
82
86
  },
83
87
  expose: ["getContentText"],
@@ -141,6 +145,9 @@ ${divContent}${divEnd}`;
141
145
  }
142
146
  return content;
143
147
  });
148
+ const disabled = computed(() => {
149
+ return props.isHistoryMessage;
150
+ });
144
151
  watch(() => [props.text, props.typing], ([text, typing]) => {
145
152
  var _a, _b, _c;
146
153
  if (text) {
@@ -410,7 +417,7 @@ ${divContent}${divEnd}`;
410
417
  immediate: true
411
418
  });
412
419
  const hastToVNode = (node, index, row) => {
413
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
420
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
414
421
  if (!node) return null;
415
422
  let children = [];
416
423
  const blackTagNames = ["sub", "pre", "text", "ElForm"];
@@ -495,7 +502,8 @@ ${divContent}${divEnd}`;
495
502
  return h(ElForm, {
496
503
  ref: formRefs.value.set,
497
504
  model: hitlData.value[index],
498
- ...node.properties
505
+ ...node.properties,
506
+ disabled: ((_e = node.properties) == null ? void 0 : _e.disabled) || disabled.value
499
507
  }, children2);
500
508
  }
501
509
  if (node.tagName === "ElFormItem") {
@@ -504,12 +512,13 @@ ${divContent}${divEnd}`;
504
512
  }, children);
505
513
  }
506
514
  if (node.tagName === "ElButton") {
507
- let payload = (_e = node.properties) == null ? void 0 : _e.payload;
515
+ let payload = (_f = node.properties) == null ? void 0 : _f.payload;
508
516
  if (node.parentScope === "table") {
509
517
  payload = row;
510
518
  }
511
519
  return h(ElButton, {
512
520
  ...node.properties,
521
+ disabled: ((_g = node.properties) == null ? void 0 : _g.disabled) || disabled.value,
513
522
  onClick: () => {
514
523
  var _a2;
515
524
  btnClick(index, (_a2 = node.properties) == null ? void 0 : _a2.action, payload);
@@ -519,7 +528,8 @@ ${divContent}${divEnd}`;
519
528
  if (node.tagName === "ElSelect") {
520
529
  return h(ElSelect, {
521
530
  ...node.properties,
522
- modelValue: hitlData.value[index][(_f = node.properties) == null ? void 0 : _f.formProp],
531
+ disabled: ((_h = node.properties) == null ? void 0 : _h.disabled) || disabled.value,
532
+ modelValue: hitlData.value[index][(_i = node.properties) == null ? void 0 : _i.formProp],
523
533
  "onUpdate:modelValue": (value) => {
524
534
  var _a2;
525
535
  hitlData.value[index][(_a2 = node.properties) == null ? void 0 : _a2.formProp] = value;
@@ -529,7 +539,8 @@ ${divContent}${divEnd}`;
529
539
  if (node.tagName === "ElDatePicker") {
530
540
  return h(ElDatePicker, {
531
541
  ...node.properties,
532
- modelValue: hitlData.value[index][(_g = node.properties) == null ? void 0 : _g.formProp],
542
+ disabled: ((_j = node.properties) == null ? void 0 : _j.disabled) || disabled.value,
543
+ modelValue: hitlData.value[index][(_k = node.properties) == null ? void 0 : _k.formProp],
533
544
  "onUpdate:modelValue": (value) => {
534
545
  var _a2;
535
546
  hitlData.value[index][(_a2 = node.properties) == null ? void 0 : _a2.formProp] = value;
@@ -539,7 +550,8 @@ ${divContent}${divEnd}`;
539
550
  if (node.tagName === "ElInput") {
540
551
  return h(ElInput, {
541
552
  ...node.properties,
542
- modelValue: hitlData.value[index][(_h = node.properties) == null ? void 0 : _h.formProp],
553
+ disabled: ((_l = node.properties) == null ? void 0 : _l.disabled) || disabled.value,
554
+ modelValue: hitlData.value[index][(_m = node.properties) == null ? void 0 : _m.formProp],
543
555
  "onUpdate:modelValue": (value) => {
544
556
  var _a2;
545
557
  hitlData.value[index][(_a2 = node.properties) == null ? void 0 : _a2.formProp] = value;
@@ -549,7 +561,8 @@ ${divContent}${divEnd}`;
549
561
  if (node.tagName === "ElRadioGroup") {
550
562
  return h(ElRadioGroup, {
551
563
  ...node.properties,
552
- modelValue: hitlData.value[index][(_i = node.properties) == null ? void 0 : _i.formProp],
564
+ disabled: ((_n = node.properties) == null ? void 0 : _n.disabled) || disabled.value,
565
+ modelValue: hitlData.value[index][(_o = node.properties) == null ? void 0 : _o.formProp],
553
566
  "onUpdate:modelValue": (value) => {
554
567
  var _a2;
555
568
  hitlData.value[index][(_a2 = node.properties) == null ? void 0 : _a2.formProp] = value;
@@ -558,7 +571,8 @@ ${divContent}${divEnd}`;
558
571
  }
559
572
  if (node.tagName === "ElRadio") {
560
573
  return h(ElRadio, {
561
- ...node.properties
574
+ ...node.properties,
575
+ disabled: ((_p = node.properties) == null ? void 0 : _p.disabled) || disabled.value
562
576
  }, children);
563
577
  }
564
578
  if (node.tagName === "ElTable") {
@@ -600,10 +614,10 @@ ${divContent}${divEnd}`;
600
614
  });
601
615
  }
602
616
  if (node.tagName === "pre") {
603
- const codeNode = (_j = node.children) == null ? void 0 : _j.find((child) => child.tagName === "code");
617
+ const codeNode = (_q = node.children) == null ? void 0 : _q.find((child) => child.tagName === "code");
604
618
  if (codeNode) {
605
- if ((_l = (_k = codeNode.properties) == null ? void 0 : _k.className) == null ? void 0 : _l.includes("language-CorePilot")) {
606
- const code = ((_n = (_m = codeNode.children) == null ? void 0 : _m[0]) == null ? void 0 : _n.value) || "";
619
+ if ((_s = (_r = codeNode.properties) == null ? void 0 : _r.className) == null ? void 0 : _s.includes("language-CorePilot")) {
620
+ const code = ((_u = (_t = codeNode.children) == null ? void 0 : _t[0]) == null ? void 0 : _u.value) || "";
607
621
  const schema = JSON.parse(code);
608
622
  const viewTree = parseCorePilot(schema);
609
623
  const children2 = hastToVNode(viewTree, curInit);