@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.
- 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-tips/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/editor-sender/source/index.vue.js +1 -1
- package/dist/cjs/components/editor-sender/source/index.vue2.js +1 -1
- package/dist/cjs/components/editor-sender/source/index.vue2.js.map +1 -1
- package/dist/cjs/components/x-markdown/index.js +1 -1
- package/dist/cjs/components/x-markdown/index.js.map +1 -1
- package/dist/es/client-vue.css +1 -1
- package/dist/es/components/bubble-list/index.js +1 -0
- package/dist/es/components/bubble-list/index.js.map +1 -1
- package/dist/es/components/core-tips/index.js.map +1 -1
- package/dist/es/components/editor-sender/index.js +37 -5
- package/dist/es/components/editor-sender/index.js.map +1 -1
- package/dist/es/components/editor-sender/source/index.vue.js +1 -1
- package/dist/es/components/editor-sender/source/index.vue2.js +1 -0
- package/dist/es/components/editor-sender/source/index.vue2.js.map +1 -1
- package/dist/es/components/x-markdown/index.js +25 -11
- package/dist/es/components/x-markdown/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -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' | '
|
|
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
|
-
|
|
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.
|
|
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-
|
|
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 = (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 = (
|
|
617
|
+
const codeNode = (_q = node.children) == null ? void 0 : _q.find((child) => child.tagName === "code");
|
|
604
618
|
if (codeNode) {
|
|
605
|
-
if ((
|
|
606
|
-
const code = ((
|
|
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);
|