@core-pilot/client-vue 0.0.8 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/cjs/client-vue.css +1 -1
  2. package/dist/cjs/components/bubble-list/index.js +1 -1
  3. package/dist/cjs/components/bubble-list/index.js.map +1 -1
  4. package/dist/cjs/components/core-card/index.js +1 -1
  5. package/dist/cjs/components/core-card/index.js.map +1 -1
  6. package/dist/cjs/components/core-upload/assets/delete.svg.js +2 -0
  7. package/dist/cjs/components/core-upload/assets/delete.svg.js.map +1 -0
  8. package/dist/cjs/components/core-upload/assets/temp.svg.js +2 -0
  9. package/dist/cjs/components/core-upload/assets/temp.svg.js.map +1 -0
  10. package/dist/cjs/components/core-upload/assets/upload.svg.js +2 -0
  11. package/dist/cjs/components/core-upload/assets/upload.svg.js.map +1 -0
  12. package/dist/cjs/components/core-upload/index.js +2 -0
  13. package/dist/cjs/components/core-upload/index.js.map +1 -0
  14. package/dist/cjs/components/editor-sender/index.js +1 -1
  15. package/dist/cjs/components/editor-sender/index.js.map +1 -1
  16. package/dist/cjs/components/index.js +1 -1
  17. package/dist/cjs/components/x-markdown/index.js +1 -1
  18. package/dist/cjs/components/x-markdown/index.js.map +1 -1
  19. package/dist/cjs/components/x-markdown/utils/parseCorePilotSchema.js +1 -1
  20. package/dist/cjs/components/x-markdown/utils/parseCorePilotSchema.js.map +1 -1
  21. package/dist/cjs/index.js +1 -1
  22. package/dist/cjs/index.js.map +1 -1
  23. package/dist/es/client-vue.css +1 -1
  24. package/dist/es/components/bubble-list/index.js +3 -0
  25. package/dist/es/components/bubble-list/index.js.map +1 -1
  26. package/dist/es/components/core-card/index.js +9 -4
  27. package/dist/es/components/core-card/index.js.map +1 -1
  28. package/dist/es/components/core-upload/assets/delete.svg.js +5 -0
  29. package/dist/es/components/core-upload/assets/delete.svg.js.map +1 -0
  30. package/dist/es/components/core-upload/assets/temp.svg.js +5 -0
  31. package/dist/es/components/core-upload/assets/temp.svg.js.map +1 -0
  32. package/dist/es/components/core-upload/assets/upload.svg.js +5 -0
  33. package/dist/es/components/core-upload/assets/upload.svg.js.map +1 -0
  34. package/dist/es/components/core-upload/index.js +267 -0
  35. package/dist/es/components/core-upload/index.js.map +1 -0
  36. package/dist/es/components/editor-sender/index.js +39 -16
  37. package/dist/es/components/editor-sender/index.js.map +1 -1
  38. package/dist/es/components/index.js +2 -0
  39. package/dist/es/components/index.js.map +1 -1
  40. package/dist/es/components/x-markdown/index.js +75 -17
  41. package/dist/es/components/x-markdown/index.js.map +1 -1
  42. package/dist/es/components/x-markdown/utils/parseCorePilotSchema.js +20 -1
  43. package/dist/es/components/x-markdown/utils/parseCorePilotSchema.js.map +1 -1
  44. package/dist/es/index.js +2 -0
  45. package/dist/es/index.js.map +1 -1
  46. package/package.json +1 -1
@@ -224,6 +224,9 @@ const index = /* @__PURE__ */ defineComponent({
224
224
  "historyInputs": item.historyInputs,
225
225
  "isHistoryMessage": item.isHistoryMessage,
226
226
  "autoHideThinking": this.autoHideThinking,
227
+ "user": this.user,
228
+ "authToken": this.authToken,
229
+ "appId": this.appId,
227
230
  "onHoverActiveRefTrigger": this.hoverActiveRefTrigger,
228
231
  "onClickActiveRefTrigger": this.clickActiveRefTrigger,
229
232
  "onRefConfigUpdate": (refList) => this.lastRefConfigUpdate(refList, item),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/bubble-list/index.tsx"],"sourcesContent":["import { defineComponent, nextTick, onMounted, ref, useTemplateRef, watch } from 'vue';\nimport { BubbleList, FilesCard } from 'vue-element-plus-x';\nimport type { BubbleListItemProps } from 'vue-element-plus-x/types/BubbleList';\nimport './style/index.less';\nimport ActionBar, { BtnItemConfig } from './actionBar';\nimport XMarkdown from '../x-markdown';\n\nexport interface FeedbackItem {\n title: string;\n content: string;\n checked: boolean;\n // showInput?: boolean; // 是否显示输入框\n}\n\nexport interface MessageItem extends BubbleListItemProps {\n role: 'user' | 'ai';\n questions?: Array<string>;\n speed?: number;\n id: string;\n showActions?: boolean;\n feedback?: 'like' | 'dislike';\n files?: Array<{\n id: string,\n extension: string,\n name: string,\n }>;\n isHistoryMessage?: boolean;\n historyInputs?: Record<string, any>;\n}\n\nexport default defineComponent({\n props: {\n list: {\n type: Array as () => Array<MessageItem>,\n default: () => [],\n },\n btnLoading: {\n type: Boolean,\n default: true,\n },\n maxHeight: {\n type: String,\n default: '500px',\n },\n autoHideThinking: {\n type: Boolean,\n default: true,\n },\n speed: {\n type: Number,\n default: 200,\n },\n disLikeFeedbackList: {\n type: Array as () => Array<FeedbackItem>,\n default: () => undefined,\n },\n likeFeedbackList: {\n type: Array as () => Array<FeedbackItem>,\n default: () => undefined,\n },\n },\n expose: ['showLastActionGroup', 'scrollToBottom', 'hideLastActionGroup'],\n emits: [\n 'hoverActiveRefTrigger',\n 'clickActiveRefTrigger',\n 'like',\n 'dislike',\n 'regenerate',\n 'copy',\n 'refConfigUpdate',\n 'questionClick',\n 'downloadFile',\n 'coreSubmit',\n ],\n setup(props, { emit }) {\n const bubbleList = useTemplateRef<typeof BubbleList>('bubbleList');\n const bubbleListContainer = useTemplateRef<Element>('bubbleListContainer');\n const showLastBubbleFooter = ref(false);\n const curActiveItem = ref<Element | null>(null);\n const destoryObserver = ref<Function>(() => {});\n\n watch(() => curActiveItem.value, (newVal, oldVal) => {\n if (newVal === null) {\n return;\n }\n if (oldVal === newVal) {\n return;\n }\n const refContainer = (curActiveItem.value as HTMLElement)?.querySelector('div[hidden]');\n const curRefList = JSON.parse(refContainer?.textContent || '[]');\n emit('refConfigUpdate', curRefList);\n })\n\n watch(() => props.list.length, () => {\n console.log('props.list.length', props.list.length);\n nextTick(() => {\n destoryObserver.value();\n destoryObserver.value = scrollTrigger();\n })\n })\n\n const hoverActiveRefTrigger = (item) => {\n emit('hoverActiveRefTrigger', item);\n }\n\n const clickActiveRefTrigger = (item) => {\n emit('clickActiveRefTrigger', item);\n }\n\n const showLastActionGroup = () => {\n showLastBubbleFooter.value = true;\n }\n\n const hideLastActionGroup = () => {\n showLastBubbleFooter.value = false;\n }\n\n const clickAction = (type: BtnItemConfig['type'], content, cancel, item) => {\n emit(type, { content, message: item, cancel })\n }\n\n const scrollToBottom = () => {\n (bubbleList.value as any)?.scrollToBottom();\n }\n\n const lastRefConfigUpdate = (refList, item) => {\n // 更新最后一条消息的引用列表\n if (props.list[props.list.length - 1] === item) {\n emit('refConfigUpdate', refList);\n }\n }\n\n const getQuestions = (item) => {\n if (item.questions && item.questions.length > 0) {\n return (\n <div class='question-list'>\n {\n item.questions.map((question, index) => {\n return (\n <span\n class='question-item'\n key={index}\n onClick={() => questionClick(question)}\n >\n {question}\n <span class='icon'></span>\n </span>\n )\n })\n }\n </div>\n )\n }\n return null;\n }\n\n const questionClick = (q) => {\n emit('questionClick', q)\n }\n\n const isLastItem = (item: MessageItem) => {\n return props.list[props.list.length - 1] === item;\n }\n\n const getActionBar = (item: MessageItem) => {\n // 如果当前项中明确指定不显示actionbar,则不显示\n if (typeof item.showActions === 'boolean' && !item.showActions) {\n return null;\n }\n const isLast = isLastItem(item);\n if (isLast && showLastBubbleFooter.value) {\n return (\n <ActionBar\n isLast={isLast}\n content={item.content}\n message={item}\n disLikeFeedbackList={props.disLikeFeedbackList}\n likeFeedbackList={props.likeFeedbackList}\n onClick={(type, content, cancel) => clickAction(type, content, cancel, item)}\n />\n )\n }\n if (!isLast) {\n return (\n <ActionBar\n isLast={isLast}\n content={item.content}\n message={item}\n disLikeFeedbackList={props.disLikeFeedbackList}\n likeFeedbackList={props.likeFeedbackList}\n onClick={(type, content, cancel) => clickAction(type, content, cancel, item)}\n />\n );\n }\n }\n\n const onDownloadFile = (payload) => {\n emit('downloadFile', payload);\n }\n\n const scrollTrigger = () => {\n const messageItems = bubbleListContainer.value!.querySelectorAll('.el-bubble-start');\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n const itemBottom = entry.boundingClientRect.bottom;\n const height = entry.target.clientHeight;\n const listBottom = bubbleListContainer.value!.getBoundingClientRect().bottom;\n \n if (Math.abs(itemBottom - listBottom) < height) {\n curActiveItem.value = entry.target;\n }\n }\n });\n }, {\n root: bubbleListContainer.value!,\n threshold: [0.1, 0.9]\n });\n\n // 3. 为所有消息项添加监听\n messageItems.forEach(item => {\n observer.observe(item);\n });\n\n return () => {\n observer.disconnect();\n }\n }\n\n const coreSubmit = (payload, item) => {\n emit('coreSubmit', payload, item);\n }\n\n onMounted(() => {\n destoryObserver.value = scrollTrigger();\n })\n\n return {\n hoverActiveRefTrigger,\n showLastActionGroup,\n hideLastActionGroup,\n showLastBubbleFooter,\n clickActiveRefTrigger,\n clickAction,\n scrollToBottom,\n lastRefConfigUpdate,\n getQuestions,\n questionClick,\n isLastItem,\n getActionBar,\n onDownloadFile,\n coreSubmit,\n };\n },\n\n render() {\n return (\n <div\n ref=\"bubbleListContainer\"\n class=\"bubble-list\"\n >\n <BubbleList\n ref=\"bubbleList\"\n list={this.list}\n btnLoading={this.btnLoading}\n maxHeight={this.maxHeight}\n >\n {{\n header: ({ item }: { item: MessageItem }) => {\n if (!item.files?.length) {\n return null;\n }\n return (\n <div class=\"bubble-item-header\">\n {\n item.files.map((item) => (\n <FilesCard\n name={item.name}\n status=\"done\"\n />\n ))\n }\n </div>\n )\n },\n content: ({ item }: { item: MessageItem }) => (\n <XMarkdown\n key={item.id}\n typing={item.typing as boolean}\n speed={this.speed}\n text={item.content}\n historyInputs={item.historyInputs}\n isHistoryMessage={item.isHistoryMessage}\n autoHideThinking={this.autoHideThinking}\n onHoverActiveRefTrigger={this.hoverActiveRefTrigger}\n onClickActiveRefTrigger={this.clickActiveRefTrigger}\n onRefConfigUpdate={(refList) => this.lastRefConfigUpdate(refList, item)}\n onDownloadFile={this.onDownloadFile}\n onCoreSubmit={(payload) => this.coreSubmit(payload, item)}\n />\n ),\n footer: ({ item }: { item: MessageItem }) => {\n if (item.role === 'ai') {\n return (\n <div>\n {\n this.getActionBar(item)\n }\n {\n this.getQuestions(item)\n }\n </div>\n )\n }\n return null;\n }\n }}\n </BubbleList>\n </div>\n );\n }\n});"],"names":["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","historyInputs","isHistoryMessage","footer","role"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/bubble-list/index.tsx"],"sourcesContent":["import { defineComponent, nextTick, onMounted, ref, useTemplateRef, watch } from 'vue';\nimport { BubbleList, FilesCard } from 'vue-element-plus-x';\nimport type { BubbleListItemProps } from 'vue-element-plus-x/types/BubbleList';\nimport './style/index.less';\nimport ActionBar, { BtnItemConfig } from './actionBar';\nimport XMarkdown from '../x-markdown';\n\nexport interface FeedbackItem {\n title: string;\n content: string;\n checked: boolean;\n // showInput?: boolean; // 是否显示输入框\n}\n\nexport interface MessageItem extends BubbleListItemProps {\n role: 'user' | 'ai';\n questions?: Array<string>;\n speed?: number;\n id: string;\n showActions?: boolean;\n feedback?: 'like' | 'dislike';\n files?: Array<{\n id: string,\n extension: string,\n name: string,\n }>;\n isHistoryMessage?: boolean;\n historyInputs?: Record<string, any>;\n user?: string;\n authToken?: string;\n appId?: string;\n}\n\nexport default defineComponent({\n props: {\n list: {\n type: Array as () => Array<MessageItem>,\n default: () => [],\n },\n btnLoading: {\n type: Boolean,\n default: true,\n },\n maxHeight: {\n type: String,\n default: '500px',\n },\n autoHideThinking: {\n type: Boolean,\n default: true,\n },\n speed: {\n type: Number,\n default: 200,\n },\n disLikeFeedbackList: {\n type: Array as () => Array<FeedbackItem>,\n default: () => undefined,\n },\n likeFeedbackList: {\n type: Array as () => Array<FeedbackItem>,\n default: () => undefined,\n },\n },\n expose: ['showLastActionGroup', 'scrollToBottom', 'hideLastActionGroup'],\n emits: [\n 'hoverActiveRefTrigger',\n 'clickActiveRefTrigger',\n 'like',\n 'dislike',\n 'regenerate',\n 'copy',\n 'refConfigUpdate',\n 'questionClick',\n 'downloadFile',\n 'coreSubmit',\n ],\n setup(props, { emit }) {\n const bubbleList = useTemplateRef<typeof BubbleList>('bubbleList');\n const bubbleListContainer = useTemplateRef<Element>('bubbleListContainer');\n const showLastBubbleFooter = ref(false);\n const curActiveItem = ref<Element | null>(null);\n const destoryObserver = ref<Function>(() => {});\n\n watch(() => curActiveItem.value, (newVal, oldVal) => {\n if (newVal === null) {\n return;\n }\n if (oldVal === newVal) {\n return;\n }\n const refContainer = (curActiveItem.value as HTMLElement)?.querySelector('div[hidden]');\n const curRefList = JSON.parse(refContainer?.textContent || '[]');\n emit('refConfigUpdate', curRefList);\n })\n\n watch(() => props.list.length, () => {\n console.log('props.list.length', props.list.length);\n nextTick(() => {\n destoryObserver.value();\n destoryObserver.value = scrollTrigger();\n })\n })\n\n const hoverActiveRefTrigger = (item) => {\n emit('hoverActiveRefTrigger', item);\n }\n\n const clickActiveRefTrigger = (item) => {\n emit('clickActiveRefTrigger', item);\n }\n\n const showLastActionGroup = () => {\n showLastBubbleFooter.value = true;\n }\n\n const hideLastActionGroup = () => {\n showLastBubbleFooter.value = false;\n }\n\n const clickAction = (type: BtnItemConfig['type'], content, cancel, item) => {\n emit(type, { content, message: item, cancel })\n }\n\n const scrollToBottom = () => {\n (bubbleList.value as any)?.scrollToBottom();\n }\n\n const lastRefConfigUpdate = (refList, item) => {\n // 更新最后一条消息的引用列表\n if (props.list[props.list.length - 1] === item) {\n emit('refConfigUpdate', refList);\n }\n }\n\n const getQuestions = (item) => {\n if (item.questions && item.questions.length > 0) {\n return (\n <div class='question-list'>\n {\n item.questions.map((question, index) => {\n return (\n <span\n class='question-item'\n key={index}\n onClick={() => questionClick(question)}\n >\n {question}\n <span class='icon'></span>\n </span>\n )\n })\n }\n </div>\n )\n }\n return null;\n }\n\n const questionClick = (q) => {\n emit('questionClick', q)\n }\n\n const isLastItem = (item: MessageItem) => {\n return props.list[props.list.length - 1] === item;\n }\n\n const getActionBar = (item: MessageItem) => {\n // 如果当前项中明确指定不显示actionbar,则不显示\n if (typeof item.showActions === 'boolean' && !item.showActions) {\n return null;\n }\n const isLast = isLastItem(item);\n if (isLast && showLastBubbleFooter.value) {\n return (\n <ActionBar\n isLast={isLast}\n content={item.content}\n message={item}\n disLikeFeedbackList={props.disLikeFeedbackList}\n likeFeedbackList={props.likeFeedbackList}\n onClick={(type, content, cancel) => clickAction(type, content, cancel, item)}\n />\n )\n }\n if (!isLast) {\n return (\n <ActionBar\n isLast={isLast}\n content={item.content}\n message={item}\n disLikeFeedbackList={props.disLikeFeedbackList}\n likeFeedbackList={props.likeFeedbackList}\n onClick={(type, content, cancel) => clickAction(type, content, cancel, item)}\n />\n );\n }\n }\n\n const onDownloadFile = (payload) => {\n emit('downloadFile', payload);\n }\n\n const scrollTrigger = () => {\n const messageItems = bubbleListContainer.value!.querySelectorAll('.el-bubble-start');\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n const itemBottom = entry.boundingClientRect.bottom;\n const height = entry.target.clientHeight;\n const listBottom = bubbleListContainer.value!.getBoundingClientRect().bottom;\n \n if (Math.abs(itemBottom - listBottom) < height) {\n curActiveItem.value = entry.target;\n }\n }\n });\n }, {\n root: bubbleListContainer.value!,\n threshold: [0.1, 0.9]\n });\n\n // 3. 为所有消息项添加监听\n messageItems.forEach(item => {\n observer.observe(item);\n });\n\n return () => {\n observer.disconnect();\n }\n }\n\n const coreSubmit = (payload, item) => {\n emit('coreSubmit', payload, item);\n }\n\n onMounted(() => {\n destoryObserver.value = scrollTrigger();\n })\n\n return {\n hoverActiveRefTrigger,\n showLastActionGroup,\n hideLastActionGroup,\n showLastBubbleFooter,\n clickActiveRefTrigger,\n clickAction,\n scrollToBottom,\n lastRefConfigUpdate,\n getQuestions,\n questionClick,\n isLastItem,\n getActionBar,\n onDownloadFile,\n coreSubmit,\n };\n },\n\n render() {\n return (\n <div\n ref=\"bubbleListContainer\"\n class=\"bubble-list\"\n >\n <BubbleList\n ref=\"bubbleList\"\n list={this.list}\n btnLoading={this.btnLoading}\n maxHeight={this.maxHeight}\n >\n {{\n header: ({ item }: { item: MessageItem }) => {\n if (!item.files?.length) {\n return null;\n }\n return (\n <div class=\"bubble-item-header\">\n {\n item.files.map((item) => (\n <FilesCard\n name={item.name}\n status=\"done\"\n />\n ))\n }\n </div>\n )\n },\n content: ({ item }: { item: MessageItem }) => (\n <XMarkdown\n key={item.id}\n typing={item.typing as boolean}\n speed={this.speed}\n text={item.content}\n historyInputs={item.historyInputs}\n isHistoryMessage={item.isHistoryMessage}\n autoHideThinking={this.autoHideThinking}\n user={this.user}\n authToken={this.authToken}\n appId={this.appId}\n onHoverActiveRefTrigger={this.hoverActiveRefTrigger}\n onClickActiveRefTrigger={this.clickActiveRefTrigger}\n onRefConfigUpdate={(refList) => this.lastRefConfigUpdate(refList, item)}\n onDownloadFile={this.onDownloadFile}\n onCoreSubmit={(payload) => this.coreSubmit(payload, item)}\n />\n ),\n footer: ({ item }: { item: MessageItem }) => {\n if (item.role === 'ai') {\n return (\n <div>\n {\n this.getActionBar(item)\n }\n {\n this.getQuestions(item)\n }\n </div>\n )\n }\n return null;\n }\n }}\n </BubbleList>\n </div>\n );\n }\n});"],"names":["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","historyInputs","isHistoryMessage","user","authToken","appId","footer","role"],"mappings":"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"}
@@ -48,16 +48,21 @@ const CoreCard = /* @__PURE__ */ defineComponent({
48
48
  "shadow": this.shadow
49
49
  }, {
50
50
  header: hasHeader ? () => createVNode("div", {
51
- "class": "core-card__header",
51
+ "class": "core-card__header"
52
+ }, [createVNode("div", {
53
+ "class": "core-card__header-left",
52
54
  "onClick": this.toggleCollapse,
53
55
  "style": this.collapsible ? {
54
56
  cursor: "pointer"
55
57
  } : {}
56
58
  }, [createVNode("span", {
57
- "class": "core-card__header-text"
58
- }, [this.$slots.header ? this.$slots.header() : this.header]), this.collapsible && createVNode("i", {
59
+ "class": "core-card__header-text",
60
+ "title": this.header
61
+ }, [this.header]), this.collapsible && createVNode("i", {
59
62
  "class": `core-card__collapse-icon ${this.collapseIconClass}`
60
- }, null)]) : void 0,
63
+ }, null)]), this.$slots.header && createVNode("div", {
64
+ "class": "core-card__header-right"
65
+ }, [this.$slots.header()])]) : void 0,
61
66
  default: () => {
62
67
  var _a, _b;
63
68
  return createVNode("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/core-card/index.tsx"],"sourcesContent":["import { defineComponent, ref, PropType, computed } from 'vue';\nimport { ElCard } from 'element-plus';\nimport './style.less';\n\nexport default defineComponent({\n name: 'CoreCard',\n props: {\n header: {\n type: String,\n default: '',\n },\n shadow: {\n type: String as PropType<'always' | 'never' | 'hover'>,\n default: 'always',\n },\n collapsible: {\n type: Boolean,\n default: true,\n },\n defaultCollapsed: {\n type: Boolean,\n default: false,\n },\n },\n setup(props, { slots }) {\n const isCollapsed = ref(props.defaultCollapsed);\n\n const toggleCollapse = () => {\n if (props.collapsible) {\n isCollapsed.value = !isCollapsed.value;\n }\n };\n\n const collapseIconClass = computed(() => {\n return isCollapsed.value ? 'core-card__collapse-icon--collapsed' : 'core-card__collapse-icon--expanded';\n });\n\n return {\n isCollapsed,\n toggleCollapse,\n collapseIconClass,\n };\n },\n render() {\n const hasHeader = this.header || this.$slots.header;\n \n return (\n <ElCard\n class=\"core-card\"\n shadow={this.shadow}\n >\n {{\n header: hasHeader ? () => (\n <div \n class=\"core-card__header\" \n onClick={this.toggleCollapse}\n style={this.collapsible ? { cursor: 'pointer' } : {}}\n >\n <span class=\"core-card__header-text\">\n {this.$slots.header ? this.$slots.header() : this.header}\n </span>\n {this.collapsible && (\n <i class={`core-card__collapse-icon ${this.collapseIconClass}`}></i>\n )}\n </div>\n ) : undefined,\n default: () => (\n <div\n class={{\n 'core-card__body': true,\n 'core-card__body--collapsed': this.isCollapsed,\n }}\n >\n {this.$slots.default?.()}\n </div>\n ),\n }}\n </ElCard>\n );\n },\n});\n\n"],"names":["name","props","header","type","String","default","shadow","collapsible","Boolean","defaultCollapsed","setup","slots","isCollapsed","ref","toggleCollapse","value","collapseIconClass","computed","render","hasHeader","$slots","_createVNode","ElCard","cursor","undefined"],"mappings":";;;;;AAIA,MAAA,2CAA+B;AAAA,EAC7BA,MAAM;AAAA,EACNC,OAAO;AAAA,IACLC,QAAQ;AAAA,MACNC,MAAMC;AAAAA,MACNC,SAAS;AAAA;IAEXC,QAAQ;AAAA,MACNH,MAAMC;AAAAA,MACNC,SAAS;AAAA;IAEXE,aAAa;AAAA,MACXJ,MAAMK;AAAAA,MACNH,SAAS;AAAA;IAEXI,kBAAkB;AAAA,MAChBN,MAAMK;AAAAA,MACNH,SAAS;AAAA,IACX;AAAA;EAEFK,MAAMT,OAAO;AAAA,IAAEU;AAAAA,EAAM,GAAG;AACtB,UAAMC,cAAcC,IAAIZ,MAAMQ,gBAAgB;AAE9C,UAAMK,iBAAiBA,MAAM;AAC3B,UAAIb,MAAMM,aAAa;AACrBK,oBAAYG,QAAQ,CAACH,YAAYG;AAAAA,MACnC;AAAA,IACF;AAEA,UAAMC,oBAAoBC,SAAS,MAAM;AACvC,aAAOL,YAAYG,QAAQ,wCAAwC;AAAA,IACrE,CAAC;AAED,WAAO;AAAA,MACLH;AAAAA,MACAE;AAAAA,MACAE;AAAAA;EAEJ;AAAA,EACAE,SAAS;AACP,UAAMC,YAAY,KAAKjB,UAAU,KAAKkB,OAAOlB;AAE7C,WAAAmB,YAAAC,QAAA;AAAA,MAAA,SAAA;AAAA,MAAA,UAGY,KAAKhB;AAAAA,IAAM,GAAA;AAAA,MAGjBJ,QAAQiB,YAAY,MAAAE,YAAA,OAAA;AAAA,QAAA,SAAA;AAAA,QAAA,WAGP,KAAKP;AAAAA,QAAc,SACrB,KAAKP,cAAc;AAAA,UAAEgB,QAAQ;AAAA,QAAU,IAAI,CAAA;AAAA,MAAE,GAAA,CAAAF,YAAA,QAAA;AAAA,QAAA,SAAA;AAAA,SAAA,CAGjD,KAAKD,OAAOlB,SAAS,KAAKkB,OAAOlB,OAAM,IAAK,KAAKA,MAAM,IAEzD,KAAKK,eAAWc,YAAA,KAAA;AAAA,QAAA,SACL,4BAA4B,KAAKL,iBAAiB;AAAA,SAAE,IAAA,CAC/D,CAAA,IAEDQ;AAAAA,MACJnB,SAASA,MAAAA;;AAAAgB,2BAAA,OAAA;AAAA,UAAA,SAEE;AAAA,YACL,mBAAmB;AAAA,YACnB,8BAA8B,KAAKT;AAAAA,UACrC;AAAA,QAAC,GAAA,EAEA,gBAAKQ,QAAOf,YAAZ,2BAAuB,CAAA;AAAA;AAAA,IAE3B,CAAA;AAAA,EAIT;AACF,CAAC;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/core-card/index.tsx"],"sourcesContent":["import { defineComponent, ref, PropType, computed } from 'vue';\nimport { ElCard } from 'element-plus';\nimport './style.less';\n\nexport default defineComponent({\n name: 'CoreCard',\n props: {\n header: {\n type: String,\n default: '',\n },\n shadow: {\n type: String as PropType<'always' | 'never' | 'hover'>,\n default: 'always',\n },\n collapsible: {\n type: Boolean,\n default: true,\n },\n defaultCollapsed: {\n type: Boolean,\n default: false,\n },\n },\n setup(props, { slots }) {\n const isCollapsed = ref(props.defaultCollapsed);\n\n const toggleCollapse = () => {\n if (props.collapsible) {\n isCollapsed.value = !isCollapsed.value;\n }\n };\n\n const collapseIconClass = computed(() => {\n return isCollapsed.value ? 'core-card__collapse-icon--collapsed' : 'core-card__collapse-icon--expanded';\n });\n\n return {\n isCollapsed,\n toggleCollapse,\n collapseIconClass,\n };\n },\n render() {\n const hasHeader = this.header || this.$slots.header;\n \n return (\n <ElCard\n class=\"core-card\"\n shadow={this.shadow}\n >\n {{\n header: hasHeader ? () => (\n <div class=\"core-card__header\">\n <div \n class=\"core-card__header-left\"\n onClick={this.toggleCollapse}\n style={this.collapsible ? { cursor: 'pointer' } : {}}\n >\n <span \n class=\"core-card__header-text\"\n title={this.header}\n >\n {this.header}\n </span>\n {this.collapsible && (\n <i class={`core-card__collapse-icon ${this.collapseIconClass}`}></i>\n )}\n </div>\n {this.$slots.header && (\n <div class=\"core-card__header-right\">\n {this.$slots.header()}\n </div>\n )}\n </div>\n ) : undefined,\n default: () => (\n <div\n class={{\n 'core-card__body': true,\n 'core-card__body--collapsed': this.isCollapsed,\n }}\n >\n {this.$slots.default?.()}\n </div>\n ),\n }}\n </ElCard>\n );\n },\n});\n\n"],"names":["name","props","header","type","String","default","shadow","collapsible","Boolean","defaultCollapsed","setup","slots","isCollapsed","ref","toggleCollapse","value","collapseIconClass","computed","render","hasHeader","$slots","_createVNode","ElCard","cursor","undefined"],"mappings":";;;;;AAIA,MAAA,2CAA+B;AAAA,EAC7BA,MAAM;AAAA,EACNC,OAAO;AAAA,IACLC,QAAQ;AAAA,MACNC,MAAMC;AAAAA,MACNC,SAAS;AAAA;IAEXC,QAAQ;AAAA,MACNH,MAAMC;AAAAA,MACNC,SAAS;AAAA;IAEXE,aAAa;AAAA,MACXJ,MAAMK;AAAAA,MACNH,SAAS;AAAA;IAEXI,kBAAkB;AAAA,MAChBN,MAAMK;AAAAA,MACNH,SAAS;AAAA,IACX;AAAA;EAEFK,MAAMT,OAAO;AAAA,IAAEU;AAAAA,EAAM,GAAG;AACtB,UAAMC,cAAcC,IAAIZ,MAAMQ,gBAAgB;AAE9C,UAAMK,iBAAiBA,MAAM;AAC3B,UAAIb,MAAMM,aAAa;AACrBK,oBAAYG,QAAQ,CAACH,YAAYG;AAAAA,MACnC;AAAA,IACF;AAEA,UAAMC,oBAAoBC,SAAS,MAAM;AACvC,aAAOL,YAAYG,QAAQ,wCAAwC;AAAA,IACrE,CAAC;AAED,WAAO;AAAA,MACLH;AAAAA,MACAE;AAAAA,MACAE;AAAAA;EAEJ;AAAA,EACAE,SAAS;AACP,UAAMC,YAAY,KAAKjB,UAAU,KAAKkB,OAAOlB;AAE7C,WAAAmB,YAAAC,QAAA;AAAA,MAAA,SAAA;AAAA,MAAA,UAGY,KAAKhB;AAAAA,IAAM,GAAA;AAAA,MAGjBJ,QAAQiB,YAAY,MAAAE,YAAA,OAAA;AAAA,QAAA,SAAA;AAAA,MAAA,GAAA,CAAAA,YAAA,OAAA;AAAA,QAAA,SAAA;AAAA,QAAA,WAIL,KAAKP;AAAAA,QAAc,SACrB,KAAKP,cAAc;AAAA,UAAEgB,QAAQ;AAAA,QAAU,IAAI,CAAA;AAAA,MAAE,GAAA,CAAAF,YAAA,QAAA;AAAA,QAAA,SAAA;AAAA,QAAA,SAI3C,KAAKnB;AAAAA,SAAM,CAEjB,KAAKA,MAAM,CAAA,GAEb,KAAKK,eAAWc,YAAA,KAAA;AAAA,QAAA,SACL,4BAA4B,KAAKL,iBAAiB;AAAA,MAAE,GAAA,IAAA,CAC/D,IAEF,KAAKI,OAAOlB,UAAMmB,YAAA,OAAA;AAAA,QAAA,SAAA;AAAA,SAAA,CAEd,KAAKD,OAAOlB,OAAM,CAAE,CAAA,CAExB,CAAA,IAEDsB;AAAAA,MACJnB,SAASA,MAAAA;;AAAAgB,2BAAA,OAAA;AAAA,UAAA,SAEE;AAAA,YACL,mBAAmB;AAAA,YACnB,8BAA8B,KAAKT;AAAAA,UACrC;AAAA,QAAC,GAAA,EAEA,gBAAKQ,QAAOf,YAAZ,2BAAuB,CAAA;AAAA;AAAA,IAE3B,CAAA;AAAA,EAIT;AACF,CAAC;"}
@@ -0,0 +1,5 @@
1
+ const deleteIcon = "data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M2.66602%203.66666H13.3327'%20stroke='%23ADB0BB'%20stroke-width='1.33333'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M6%201.66666H10'%20stroke='%23ADB0BB'%20stroke-width='1.33333'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M4%205.66666H12V13.3333C12%2013.8856%2011.5523%2014.3333%2011%2014.3333H5C4.4477%2014.3333%204%2013.8856%204%2013.3333V5.66666Z'%20stroke='%23ADB0BB'%20stroke-width='1.33333'%20stroke-linejoin='round'/%3e%3c/svg%3e";
2
+ export {
3
+ deleteIcon as default
4
+ };
5
+ //# sourceMappingURL=delete.svg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.svg.js","sources":["../../../../../src/components/core-upload/assets/delete.svg"],"sourcesContent":["export default \"data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M2.66602%203.66666H13.3327'%20stroke='%23ADB0BB'%20stroke-width='1.33333'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M6%201.66666H10'%20stroke='%23ADB0BB'%20stroke-width='1.33333'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M4%205.66666H12V13.3333C12%2013.8856%2011.5523%2014.3333%2011%2014.3333H5C4.4477%2014.3333%204%2013.8856%204%2013.3333V5.66666Z'%20stroke='%23ADB0BB'%20stroke-width='1.33333'%20stroke-linejoin='round'/%3e%3c/svg%3e\""],"names":[],"mappings":"AAAA,MAAA,aAAe;"}
@@ -0,0 +1,5 @@
1
+ const tempIcon = "data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M13%202H3C2.44772%202%202%202.44772%202%203V13C2%2013.5523%202.44772%2014%203%2014H13C13.5523%2014%2014%2013.5523%2014%2013V3C14%202.44772%2013.5523%202%2013%202Z'%20stroke='%2353576A'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M2%204.66666H13.3333'%20stroke='%2353576A'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M8%207.58334H11'%20stroke='%2353576A'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M8%2010.25H11'%20stroke='%2353576A'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M4.66602%202V14'%20stroke='%2353576A'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/svg%3e";
2
+ export {
3
+ tempIcon as default
4
+ };
5
+ //# sourceMappingURL=temp.svg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temp.svg.js","sources":["../../../../../src/components/core-upload/assets/temp.svg"],"sourcesContent":["export default \"data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M13%202H3C2.44772%202%202%202.44772%202%203V13C2%2013.5523%202.44772%2014%203%2014H13C13.5523%2014%2014%2013.5523%2014%2013V3C14%202.44772%2013.5523%202%2013%202Z'%20stroke='%2353576A'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M2%204.66666H13.3333'%20stroke='%2353576A'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M8%207.58334H11'%20stroke='%2353576A'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M8%2010.25H11'%20stroke='%2353576A'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M4.66602%202V14'%20stroke='%2353576A'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/svg%3e\""],"names":[],"mappings":"AAAA,MAAA,WAAe;"}
@@ -0,0 +1,5 @@
1
+ const uploadIcon = "data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M3.89322%206.75699C2.42557%207.10602%201.33398%208.42552%201.33398%209.99999C1.33398%2011.8409%202.82637%2013.3333%204.66732%2013.3333C4.98312%2013.3333%205.28865%2013.2894%205.57815%2013.2074'%20stroke='white'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M12.0189%206.75699C13.4866%207.10602%2014.5782%208.42552%2014.5782%209.99999C14.5782%2011.8409%2013.0858%2013.3333%2011.2448%2013.3333C10.929%2013.3333%2010.6235%2013.2894%2010.334%2013.2074'%20stroke='white'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M12%206.66666C12%204.45752%2010.2091%202.66666%208%202.66666C5.79087%202.66666%204%204.45752%204%206.66666'%20stroke='white'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M5.6875%209.29374L7.999%206.97461L10.3763%209.33341'%20stroke='white'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M8%2012.6667V8.15396'%20stroke='white'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/svg%3e";
2
+ export {
3
+ uploadIcon as default
4
+ };
5
+ //# sourceMappingURL=upload.svg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.svg.js","sources":["../../../../../src/components/core-upload/assets/upload.svg"],"sourcesContent":["export default \"data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M3.89322%206.75699C2.42557%207.10602%201.33398%208.42552%201.33398%209.99999C1.33398%2011.8409%202.82637%2013.3333%204.66732%2013.3333C4.98312%2013.3333%205.28865%2013.2894%205.57815%2013.2074'%20stroke='white'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M12.0189%206.75699C13.4866%207.10602%2014.5782%208.42552%2014.5782%209.99999C14.5782%2011.8409%2013.0858%2013.3333%2011.2448%2013.3333C10.929%2013.3333%2010.6235%2013.2894%2010.334%2013.2074'%20stroke='white'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M12%206.66666C12%204.45752%2010.2091%202.66666%208%202.66666C5.79087%202.66666%204%204.45752%204%206.66666'%20stroke='white'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M5.6875%209.29374L7.999%206.97461L10.3763%209.33341'%20stroke='white'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M8%2012.6667V8.15396'%20stroke='white'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/svg%3e\""],"names":[],"mappings":"AAAA,MAAA,aAAe;"}
@@ -0,0 +1,267 @@
1
+ import { defineComponent, createVNode, createTextVNode, ref, watch, computed } from "vue";
2
+ import { ElUpload, ElButton, ElMessage } from "element-plus";
3
+ /* empty css */
4
+ /* empty css */
5
+ /* empty css */
6
+ /* empty css */
7
+ /* empty css */
8
+ /* empty css */
9
+ import uploadIcon from "./assets/upload.svg.js";
10
+ import tempIcon from "./assets/temp.svg.js";
11
+ import deleteIcon from "./assets/delete.svg.js";
12
+ /* empty css */
13
+ const CoreUpload = /* @__PURE__ */ defineComponent({
14
+ name: "CoreUpload",
15
+ props: {
16
+ // 上传地址
17
+ action: {
18
+ type: String,
19
+ default: "/openapi/v1/app/files/upload"
20
+ },
21
+ // 允许上传的文件类型
22
+ accept: {
23
+ type: String,
24
+ default: ".xlsx,.xls,.csv"
25
+ },
26
+ // 文件大小限制(单位:MB)
27
+ maxSize: {
28
+ type: Number,
29
+ default: 10
30
+ },
31
+ // 是否支持多文件上传
32
+ multiple: {
33
+ type: Boolean,
34
+ default: true
35
+ },
36
+ // 文件列表
37
+ fileList: {
38
+ type: Array,
39
+ default: () => []
40
+ },
41
+ // 下载模板的URL
42
+ templateUrl: {
43
+ type: String,
44
+ default: ""
45
+ },
46
+ // 下载模板的文件名
47
+ templateFileName: {
48
+ type: String,
49
+ default: "模板文件"
50
+ },
51
+ // 提示文本
52
+ tips: {
53
+ type: String,
54
+ default: ""
55
+ },
56
+ // 是否禁用
57
+ disabled: {
58
+ type: Boolean,
59
+ default: false
60
+ },
61
+ // 自定义上传请求
62
+ httpRequest: {
63
+ type: Function,
64
+ default: void 0
65
+ },
66
+ headers: {
67
+ type: Object,
68
+ default: () => ({
69
+ Authorization: "Bearer ApiSecretKey_mEKsrCMvxNLzzUUKeQmpzaUZqwZxFyJf",
70
+ appId: "9a673565-d4f6-4382-bc67-f1beb07df435"
71
+ })
72
+ },
73
+ extendData: {
74
+ type: Object,
75
+ default: () => ({
76
+ "user": "abc-123"
77
+ })
78
+ }
79
+ },
80
+ emits: ["update:fileList", "success", "remove", "download-template", "error"],
81
+ setup(props, {
82
+ emit
83
+ }) {
84
+ const uploadRef = ref();
85
+ const fileList = ref(props.fileList || []);
86
+ watch(() => props.fileList, (newFileList) => {
87
+ if (newFileList && JSON.stringify(newFileList) !== JSON.stringify(fileList.value)) {
88
+ fileList.value = [...newFileList || []];
89
+ }
90
+ }, {
91
+ deep: true,
92
+ immediate: true
93
+ });
94
+ const tipsText = computed(() => {
95
+ if (props.tips) {
96
+ return props.tips;
97
+ }
98
+ const acceptTypes = props.accept.split(",").map((type) => type.replace(".", "").toUpperCase()).join(" 或 ");
99
+ return `支持 ${acceptTypes} 格式。文件大小不超过 ${props.maxSize}MB。`;
100
+ });
101
+ const formatFileSize = (size) => {
102
+ if (size < 1024) {
103
+ return size + " B";
104
+ } else if (size < 1024 * 1024) {
105
+ return (size / 1024).toFixed(2) + " KB";
106
+ } else {
107
+ return (size / (1024 * 1024)).toFixed(2) + " MB";
108
+ }
109
+ };
110
+ const getFileExtension = (filename) => {
111
+ const lastDot = filename.lastIndexOf(".");
112
+ return lastDot !== -1 ? filename.substring(lastDot).toLowerCase() : "";
113
+ };
114
+ const validateFileType = (file) => {
115
+ const acceptTypes = props.accept.split(",").map((type) => type.trim().toLowerCase());
116
+ const fileExt = getFileExtension(file.name);
117
+ const isValid = acceptTypes.some((type) => {
118
+ if (type.startsWith(".")) {
119
+ return type === fileExt;
120
+ }
121
+ return file.type && file.type.includes(type.replace(".", ""));
122
+ });
123
+ if (!isValid) {
124
+ const acceptTypesText = props.accept.split(",").map((type) => type.replace(".", "").toUpperCase()).join(" 或 ");
125
+ ElMessage.error(`只能上传 ${acceptTypesText} 格式的文件!`);
126
+ return false;
127
+ }
128
+ return true;
129
+ };
130
+ const validateFileSize = (file) => {
131
+ const maxSizeBytes = props.maxSize * 1024 * 1024;
132
+ if (file.size > maxSizeBytes) {
133
+ ElMessage.error(`文件大小不能超过 ${props.maxSize}MB!`);
134
+ return false;
135
+ }
136
+ return true;
137
+ };
138
+ const beforeUpload = (file) => {
139
+ if (!validateFileType(file)) {
140
+ return false;
141
+ }
142
+ if (!validateFileSize(file)) {
143
+ return false;
144
+ }
145
+ return true;
146
+ };
147
+ const handleRemove = (uploadFile, uploadFiles) => {
148
+ fileList.value = uploadFiles.map((file) => ({
149
+ name: file.name,
150
+ ...file.response || {}
151
+ }));
152
+ emit("update:fileList", fileList.value);
153
+ emit("remove", uploadFile, uploadFiles);
154
+ };
155
+ const handleError = (error, uploadFile) => {
156
+ ElMessage.error(`文件 ${uploadFile.name} 上传失败:${error.message}`);
157
+ emit("error", error, uploadFile);
158
+ };
159
+ const handleDownloadTemplate = () => {
160
+ if (!props.templateUrl) {
161
+ ElMessage.warning("模板文件地址未配置");
162
+ return;
163
+ }
164
+ emit("download-template", props.templateUrl);
165
+ const link = document.createElement("a");
166
+ link.href = props.templateUrl;
167
+ link.download = props.templateFileName;
168
+ document.body.appendChild(link);
169
+ link.click();
170
+ document.body.removeChild(link);
171
+ };
172
+ const handleDelete = (file) => {
173
+ const index = fileList.value.findIndex((item) => item.uid === file.uid);
174
+ if (index !== -1) {
175
+ fileList.value.splice(index, 1);
176
+ emit("update:fileList", fileList.value);
177
+ emit("remove", file, fileList.value);
178
+ }
179
+ };
180
+ const handleSuccess = (response, file, fileLists) => {
181
+ fileList.value = fileLists.map((file2) => ({
182
+ name: file2.name,
183
+ ...response || {}
184
+ }));
185
+ emit("update:fileList", fileList.value);
186
+ emit("success", response, file, fileList);
187
+ };
188
+ return {
189
+ uploadRef,
190
+ fileList,
191
+ tipsText,
192
+ formatFileSize,
193
+ beforeUpload,
194
+ handleRemove,
195
+ handleError,
196
+ handleSuccess,
197
+ handleDownloadTemplate,
198
+ handleDelete
199
+ };
200
+ },
201
+ render() {
202
+ return createVNode("div", {
203
+ "class": "core-upload"
204
+ }, [createVNode("div", {
205
+ "class": "core-upload__actions"
206
+ }, [createVNode(ElUpload, {
207
+ "ref": "uploadRef",
208
+ "class": "core-upload__upload",
209
+ "action": this.action,
210
+ "accept": this.accept,
211
+ "headers": this.headers,
212
+ "data": this.extendData,
213
+ "multiple": this.multiple,
214
+ "fileList": this.fileList,
215
+ "beforeUpload": this.beforeUpload,
216
+ "onRemove": this.handleRemove,
217
+ "onError": this.handleError,
218
+ "onSuccess": this.handleSuccess,
219
+ "httpRequest": this.httpRequest,
220
+ "disabled": this.disabled,
221
+ "showFileList": false
222
+ }, {
223
+ trigger: () => createVNode(ElButton, {
224
+ "type": "primary",
225
+ "icon": createVNode("img", {
226
+ "src": uploadIcon,
227
+ "alt": "upload"
228
+ }, null),
229
+ "disabled": this.disabled
230
+ }, {
231
+ default: () => [createTextVNode("上传文件")]
232
+ })
233
+ }), createVNode(ElButton, {
234
+ "icon": createVNode("img", {
235
+ "src": tempIcon,
236
+ "alt": "download"
237
+ }, null),
238
+ "onClick": this.handleDownloadTemplate,
239
+ "disabled": this.disabled
240
+ }, {
241
+ default: () => [createTextVNode("下载模板")]
242
+ })]), this.tipsText && createVNode("div", {
243
+ "class": "core-upload__tips"
244
+ }, [this.tipsText]), this.fileList && this.fileList.length > 0 && createVNode("div", {
245
+ "class": "core-upload__file-list"
246
+ }, [this.fileList.map((file) => createVNode("div", {
247
+ "key": file.uid,
248
+ "class": "core-upload__file-item"
249
+ }, [createVNode("div", {
250
+ "class": "core-upload__file-info"
251
+ }, [createVNode("span", {
252
+ "class": "core-upload__file-icon"
253
+ }, [createTextVNode("📄")]), createVNode("span", {
254
+ "class": "core-upload__file-name",
255
+ "title": file.name
256
+ }, [file.name])]), createVNode("img", {
257
+ "onClick": () => this.handleDelete(file),
258
+ "src": deleteIcon,
259
+ "alt": "delete",
260
+ "class": "core-upload__file-delete"
261
+ }, null)]))])]);
262
+ }
263
+ });
264
+ export {
265
+ CoreUpload as default
266
+ };
267
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/core-upload/index.tsx"],"sourcesContent":["import { defineComponent, ref, PropType, computed, watch } from 'vue';\nimport { ElUpload, ElButton, ElMessage, ElIcon } from 'element-plus';\nimport type { UploadFile, UploadFiles, UploadRequestOptions } from 'element-plus';\n// @ts-ignore\nimport uploadIcon from './assets/upload.svg';\n// @ts-ignore\nimport tempIcon from './assets/temp.svg';\n// @ts-ignore\nimport deleteIcon from './assets/delete.svg';\nimport './style.less';\n\nexport interface UploadFileItem {\n name: string;\n url?: string;\n response?: any;\n [key: string]: any;\n}\n\nexport default defineComponent({\n name: 'CoreUpload',\n props: {\n // 上传地址\n action: {\n type: String,\n default: '/openapi/v1/app/files/upload',\n },\n // 允许上传的文件类型\n accept: {\n type: String,\n default: '.xlsx,.xls,.csv',\n },\n // 文件大小限制(单位:MB)\n maxSize: {\n type: Number,\n default: 10,\n },\n // 是否支持多文件上传\n multiple: {\n type: Boolean,\n default: true,\n },\n // 文件列表\n fileList: {\n type: Array as PropType<UploadFileItem[]>,\n default: () => [],\n },\n // 下载模板的URL\n templateUrl: {\n type: String,\n default: '',\n },\n // 下载模板的文件名\n templateFileName: {\n type: String,\n default: '模板文件',\n },\n // 提示文本\n tips: {\n type: String,\n default: '',\n },\n // 是否禁用\n disabled: {\n type: Boolean,\n default: false,\n },\n // 自定义上传请求\n httpRequest: {\n type: Function as PropType<(options: UploadRequestOptions) => void>,\n default: undefined,\n },\n headers: {\n type: Object,\n default: () => ({\n Authorization: 'Bearer ApiSecretKey_mEKsrCMvxNLzzUUKeQmpzaUZqwZxFyJf',\n appId: '9a673565-d4f6-4382-bc67-f1beb07df435'\n }),\n },\n extendData: {\n type: Object,\n default: () => ({\n \"user\": \"abc-123\",\n }),\n },\n },\n emits: ['update:fileList', 'success', 'remove', 'download-template', 'error'],\n setup(props, { emit }) {\n const uploadRef = ref<InstanceType<typeof ElUpload>>();\n const fileList = ref<UploadFileItem[]>(props.fileList || []);\n\n // 监听外部 fileList 变化\n watch(\n () => props.fileList,\n (newFileList) => {\n if (newFileList && JSON.stringify(newFileList) !== JSON.stringify(fileList.value)) {\n fileList.value = [...(newFileList || [])];\n }\n },\n { deep: true, immediate: true }\n );\n\n // 生成提示文本\n const tipsText = computed(() => {\n if (props.tips) {\n return props.tips;\n }\n const acceptTypes = props.accept\n .split(',')\n .map((type) => type.replace('.', '').toUpperCase())\n .join(' 或 ');\n return `支持 ${acceptTypes} 格式。文件大小不超过 ${props.maxSize}MB。`;\n });\n\n // 格式化文件大小\n const formatFileSize = (size: number): string => {\n if (size < 1024) {\n return size + ' B';\n } else if (size < 1024 * 1024) {\n return (size / 1024).toFixed(2) + ' KB';\n } else {\n return (size / (1024 * 1024)).toFixed(2) + ' MB';\n }\n };\n\n // 获取文件扩展名\n const getFileExtension = (filename: string): string => {\n const lastDot = filename.lastIndexOf('.');\n return lastDot !== -1 ? filename.substring(lastDot).toLowerCase() : '';\n };\n\n // 验证文件类型\n const validateFileType = (file: File): boolean => {\n const acceptTypes = props.accept.split(',').map((type) => type.trim().toLowerCase());\n const fileExt = getFileExtension(file.name);\n const isValid = acceptTypes.some((type) => {\n if (type.startsWith('.')) {\n return type === fileExt;\n }\n // 支持 MIME 类型\n return file.type && file.type.includes(type.replace('.', ''));\n });\n\n if (!isValid) {\n const acceptTypesText = props.accept\n .split(',')\n .map((type) => type.replace('.', '').toUpperCase())\n .join(' 或 ');\n ElMessage.error(`只能上传 ${acceptTypesText} 格式的文件!`);\n return false;\n }\n return true;\n };\n\n // 验证文件大小\n const validateFileSize = (file: File): boolean => {\n const maxSizeBytes = props.maxSize * 1024 * 1024;\n if (file.size > maxSizeBytes) {\n ElMessage.error(`文件大小不能超过 ${props.maxSize}MB!`);\n return false;\n }\n return true;\n };\n\n // 上传前的校验\n const beforeUpload = (file: File): boolean => {\n // 类型校验\n if (!validateFileType(file)) {\n return false;\n }\n // 大小校验\n if (!validateFileSize(file)) {\n return false;\n }\n return true;\n };\n\n // 文件移除时的钩子\n const handleRemove = (uploadFile: UploadFile, uploadFiles: UploadFiles) => {\n fileList.value = uploadFiles.map((file) => ({\n name: file.name,\n ...(file.response || {} as any),\n }));\n emit('update:fileList', fileList.value);\n emit('remove', uploadFile, uploadFiles);\n };\n\n // 上传失败时的钩子\n const handleError = (error: Error, uploadFile: UploadFile) => {\n ElMessage.error(`文件 ${uploadFile.name} 上传失败:${error.message}`);\n emit('error', error, uploadFile);\n };\n\n // 下载模板\n const handleDownloadTemplate = () => {\n if (!props.templateUrl) {\n ElMessage.warning('模板文件地址未配置');\n return;\n }\n emit('download-template', props.templateUrl);\n \n // 如果没有自定义下载处理,则使用默认下载方式\n const link = document.createElement('a');\n link.href = props.templateUrl;\n link.download = props.templateFileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n };\n\n // 删除文件\n const handleDelete = (file: UploadFileItem) => {\n const index = fileList.value.findIndex((item) => item.uid === file.uid);\n if (index !== -1) {\n fileList.value.splice(index, 1);\n emit('update:fileList', fileList.value);\n emit('remove', file, fileList.value);\n }\n };\n\n // 上传成功时的钩子\n const handleSuccess = (response: any, file: UploadFile, fileLists: UploadFiles) => {\n fileList.value = fileLists.map((file) => ({\n name: file.name,\n ...(response || {} as any),\n }));\n emit('update:fileList', fileList.value);\n emit('success', response, file, fileList);\n };\n\n return {\n uploadRef,\n fileList,\n tipsText,\n formatFileSize,\n beforeUpload,\n handleRemove,\n handleError,\n handleSuccess,\n handleDownloadTemplate,\n handleDelete,\n };\n },\n render() {\n return (\n <div class=\"core-upload\">\n {/* 第一层:上传文件、下载模板按钮 */}\n <div class=\"core-upload__actions\">\n <ElUpload\n ref=\"uploadRef\"\n class=\"core-upload__upload\"\n action={this.action}\n accept={this.accept}\n headers={this.headers}\n data={this.extendData}\n multiple={this.multiple}\n fileList={this.fileList}\n beforeUpload={this.beforeUpload}\n onRemove={this.handleRemove}\n onError={this.handleError}\n onSuccess={this.handleSuccess}\n httpRequest={this.httpRequest}\n disabled={this.disabled}\n showFileList={false}\n >\n {{\n trigger: () => (\n <ElButton\n type=\"primary\"\n icon={<img src={uploadIcon} alt=\"upload\" />}\n disabled={this.disabled}\n >\n 上传文件\n </ElButton>\n ),\n }}\n </ElUpload>\n <ElButton\n icon={<img src={tempIcon} alt=\"download\" />}\n onClick={this.handleDownloadTemplate}\n disabled={this.disabled}\n >\n 下载模板\n </ElButton>\n </div>\n\n {/* 第二层:tips 简要描述当前上传限制 */}\n {this.tipsText && (\n <div class=\"core-upload__tips\">\n {this.tipsText}\n </div>\n )}\n\n {/* 第三层:已经上传的列表,支持删除 */}\n {this.fileList && this.fileList.length > 0 && (\n <div class=\"core-upload__file-list\">\n {this.fileList.map((file) => (\n <div key={file.uid} class=\"core-upload__file-item\">\n <div class=\"core-upload__file-info\">\n <span class=\"core-upload__file-icon\">📄</span>\n <span\n class=\"core-upload__file-name\"\n title={file.name}\n >\n {file.name}\n </span>\n </div>\n <img onClick={() => this.handleDelete(file)} src={deleteIcon} alt=\"delete\" class=\"core-upload__file-delete\" />\n </div>\n ))}\n </div>\n )}\n </div>\n );\n },\n});\n\n"],"names":["name","props","action","type","String","default","accept","maxSize","Number","multiple","Boolean","fileList","Array","templateUrl","templateFileName","tips","disabled","httpRequest","Function","undefined","headers","Object","Authorization","appId","extendData","emits","setup","emit","uploadRef","ref","watch","newFileList","JSON","stringify","value","deep","immediate","tipsText","computed","acceptTypes","split","map","replace","toUpperCase","join","formatFileSize","size","toFixed","getFileExtension","filename","lastDot","lastIndexOf","substring","toLowerCase","validateFileType","file","trim","fileExt","isValid","some","startsWith","includes","acceptTypesText","ElMessage","error","validateFileSize","maxSizeBytes","beforeUpload","handleRemove","uploadFile","uploadFiles","response","handleError","message","handleDownloadTemplate","warning","link","document","createElement","href","download","body","appendChild","click","removeChild","handleDelete","index","findIndex","item","uid","splice","handleSuccess","fileLists","render","_createVNode","ElUpload","trigger","ElButton","uploadIcon","_createTextVNode","tempIcon","length","onClick","deleteIcon"],"mappings":";;;;;;;;;;;;AAkBA,MAAA,6CAA+B;AAAA,EAC7BA,MAAM;AAAA,EACNC,OAAO;AAAA;AAAA,IAELC,QAAQ;AAAA,MACNC,MAAMC;AAAAA,MACNC,SAAS;AAAA;;IAGXC,QAAQ;AAAA,MACNH,MAAMC;AAAAA,MACNC,SAAS;AAAA;;IAGXE,SAAS;AAAA,MACPJ,MAAMK;AAAAA,MACNH,SAAS;AAAA;;IAGXI,UAAU;AAAA,MACRN,MAAMO;AAAAA,MACNL,SAAS;AAAA;;IAGXM,UAAU;AAAA,MACRR,MAAMS;AAAAA,MACNP,SAASA,MAAM,CAAA;AAAA;;IAGjBQ,aAAa;AAAA,MACXV,MAAMC;AAAAA,MACNC,SAAS;AAAA;;IAGXS,kBAAkB;AAAA,MAChBX,MAAMC;AAAAA,MACNC,SAAS;AAAA;;IAGXU,MAAM;AAAA,MACJZ,MAAMC;AAAAA,MACNC,SAAS;AAAA;;IAGXW,UAAU;AAAA,MACRb,MAAMO;AAAAA,MACNL,SAAS;AAAA;;IAGXY,aAAa;AAAA,MACXd,MAAMe;AAAAA,MACNb,SAASc;AAAAA;IAEXC,SAAS;AAAA,MACPjB,MAAMkB;AAAAA,MACNhB,SAASA,OAAO;AAAA,QACdiB,eAAe;AAAA,QACfC,OAAO;AAAA;;IAGXC,YAAY;AAAA,MACVrB,MAAMkB;AAAAA,MACNhB,SAASA,OAAO;AAAA,QACd,QAAQ;AAAA;IAEZ;AAAA;EAEFoB,OAAO,CAAC,mBAAmB,WAAW,UAAU,qBAAqB,OAAO;AAAA,EAC5EC,MAAMzB,OAAO;AAAA,IAAE0B;AAAAA,EAAK,GAAG;AACrB,UAAMC,YAAYC,IAAG;AACrB,UAAMlB,WAAWkB,IAAsB5B,MAAMU,YAAY,CAAA,CAAE;AAG3DmB,UACE,MAAM7B,MAAMU,UACXoB,iBAAgB;AACf,UAAIA,eAAeC,KAAKC,UAAUF,WAAW,MAAMC,KAAKC,UAAUtB,SAASuB,KAAK,GAAG;AACjFvB,iBAASuB,QAAQ,CAAC,GAAIH,eAAe,CAAA,CAAG;AAAA,MAC1C;AAAA,IACF,GACA;AAAA,MAAEI,MAAM;AAAA,MAAMC,WAAW;AAAA,IAAK,CAChC;AAGA,UAAMC,WAAWC,SAAS,MAAM;AAC9B,UAAIrC,MAAMc,MAAM;AACd,eAAOd,MAAMc;AAAAA,MACf;AACA,YAAMwB,cAActC,MAAMK,OACvBkC,MAAM,GAAG,EACTC,IAAKtC,UAASA,KAAKuC,QAAQ,KAAK,EAAE,EAAEC,YAAW,CAAE,EACjDC,KAAK,KAAK;AACb,aAAO,MAAML,WAAW,eAAetC,MAAMM,OAAO;AAAA,IACtD,CAAC;AAGD,UAAMsC,iBAAkBC,UAAyB;AAC/C,UAAIA,OAAO,MAAM;AACf,eAAOA,OAAO;AAAA,MAChB,WAAWA,OAAO,OAAO,MAAM;AAC7B,gBAAQA,OAAO,MAAMC,QAAQ,CAAC,IAAI;AAAA,MACpC,OAAO;AACL,gBAAQD,QAAQ,OAAO,OAAOC,QAAQ,CAAC,IAAI;AAAA,MAC7C;AAAA,IACF;AAGA,UAAMC,mBAAoBC,cAA6B;AACrD,YAAMC,UAAUD,SAASE,YAAY,GAAG;AACxC,aAAOD,YAAY,KAAKD,SAASG,UAAUF,OAAO,EAAEG,YAAW,IAAK;AAAA,IACtE;AAGA,UAAMC,mBAAoBC,UAAwB;AAChD,YAAMhB,cAActC,MAAMK,OAAOkC,MAAM,GAAG,EAAEC,IAAKtC,UAASA,KAAKqD,KAAI,EAAGH,YAAW,CAAE;AACnF,YAAMI,UAAUT,iBAAiBO,KAAKvD,IAAI;AAC1C,YAAM0D,UAAUnB,YAAYoB,KAAMxD,UAAS;AACzC,YAAIA,KAAKyD,WAAW,GAAG,GAAG;AACxB,iBAAOzD,SAASsD;AAAAA,QAClB;AAEA,eAAOF,KAAKpD,QAAQoD,KAAKpD,KAAK0D,SAAS1D,KAAKuC,QAAQ,KAAK,EAAE,CAAC;AAAA,MAC9D,CAAC;AAED,UAAI,CAACgB,SAAS;AACZ,cAAMI,kBAAkB7D,MAAMK,OAC3BkC,MAAM,GAAG,EACTC,IAAKtC,UAASA,KAAKuC,QAAQ,KAAK,EAAE,EAAEC,YAAW,CAAE,EACjDC,KAAK,KAAK;AACbmB,kBAAUC,MAAM,QAAQF,eAAe,SAAS;AAChD,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAGA,UAAMG,mBAAoBV,UAAwB;AAChD,YAAMW,eAAejE,MAAMM,UAAU,OAAO;AAC5C,UAAIgD,KAAKT,OAAOoB,cAAc;AAC5BH,kBAAUC,MAAM,YAAY/D,MAAMM,OAAO,KAAK;AAC9C,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAGA,UAAM4D,eAAgBZ,UAAwB;AAE5C,UAAI,CAACD,iBAAiBC,IAAI,GAAG;AAC3B,eAAO;AAAA,MACT;AAEA,UAAI,CAACU,iBAAiBV,IAAI,GAAG;AAC3B,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAGA,UAAMa,eAAeA,CAACC,YAAwBC,gBAA6B;AACzE3D,eAASuB,QAAQoC,YAAY7B,IAAKc,WAAU;AAAA,QAC1CvD,MAAMuD,KAAKvD;AAAAA,QACX,GAAIuD,KAAKgB,YAAY,CAAA;AAAA,MACvB,EAAE;AACF5C,WAAK,mBAAmBhB,SAASuB,KAAK;AACtCP,WAAK,UAAU0C,YAAYC,WAAW;AAAA,IACxC;AAGA,UAAME,cAAcA,CAACR,OAAcK,eAA2B;AAC5DN,gBAAUC,MAAM,MAAMK,WAAWrE,IAAI,SAASgE,MAAMS,OAAO,EAAE;AAC7D9C,WAAK,SAASqC,OAAOK,UAAU;AAAA,IACjC;AAGA,UAAMK,yBAAyBA,MAAM;AACnC,UAAI,CAACzE,MAAMY,aAAa;AACtBkD,kBAAUY,QAAQ,WAAW;AAC7B;AAAA,MACF;AACAhD,WAAK,qBAAqB1B,MAAMY,WAAW;AAG3C,YAAM+D,OAAOC,SAASC,cAAc,GAAG;AACvCF,WAAKG,OAAO9E,MAAMY;AAClB+D,WAAKI,WAAW/E,MAAMa;AACtB+D,eAASI,KAAKC,YAAYN,IAAI;AAC9BA,WAAKO,MAAK;AACVN,eAASI,KAAKG,YAAYR,IAAI;AAAA,IAChC;AAGA,UAAMS,eAAgB9B,UAAyB;AAC7C,YAAM+B,QAAQ3E,SAASuB,MAAMqD,UAAWC,UAASA,KAAKC,QAAQlC,KAAKkC,GAAG;AACtE,UAAIH,UAAU,IAAI;AAChB3E,iBAASuB,MAAMwD,OAAOJ,OAAO,CAAC;AAC9B3D,aAAK,mBAAmBhB,SAASuB,KAAK;AACtCP,aAAK,UAAU4B,MAAM5C,SAASuB,KAAK;AAAA,MACrC;AAAA,IACF;AAGA,UAAMyD,gBAAgBA,CAACpB,UAAehB,MAAkBqC,cAA2B;AACjFjF,eAASuB,QAAQ0D,UAAUnD,IAAKc,CAAAA,WAAU;AAAA,QACxCvD,MAAMuD,MAAKvD;AAAAA,QACX,GAAIuE,YAAY,CAAA;AAAA,MAClB,EAAE;AACF5C,WAAK,mBAAmBhB,SAASuB,KAAK;AACtCP,WAAK,WAAW4C,UAAUhB,MAAM5C,QAAQ;AAAA,IAC1C;AAEA,WAAO;AAAA,MACLiB;AAAAA,MACAjB;AAAAA,MACA0B;AAAAA,MACAQ;AAAAA,MACAsB;AAAAA,MACAC;AAAAA,MACAI;AAAAA,MACAmB;AAAAA,MACAjB;AAAAA,MACAW;AAAAA;EAEJ;AAAA,EACAQ,SAAS;AACP,WAAAC,YAAA,OAAA;AAAA,MAAA,SAAA;AAAA,IAAA,GAAA,CAAAA,YAAA,OAAA;AAAA,MAAA,SAAA;AAAA,OAAA,CAAAA,YAAAC,UAAA;AAAA,MAAA,OAAA;AAAA,MAAA,SAAA;AAAA,MAAA,UAOgB,KAAK7F;AAAAA,MAAM,UACX,KAAKI;AAAAA,MAAM,WACV,KAAKc;AAAAA,MAAO,QACf,KAAKI;AAAAA,MAAU,YACX,KAAKf;AAAAA,MAAQ,YACb,KAAKE;AAAAA,MAAQ,gBACT,KAAKwD;AAAAA,MAAY,YACrB,KAAKC;AAAAA,MAAY,WAClB,KAAKI;AAAAA,MAAW,aACd,KAAKmB;AAAAA,MAAa,eAChB,KAAK1E;AAAAA,MAAW,YACnB,KAAKD;AAAAA,MAAQ,gBACT;AAAA,IAAK,GAAA;AAAA,MAGjBgF,SAASA,MAAAF,YAAAG,UAAA;AAAA,QAAA,QAAA;AAAA,QAAA,QAAAH,YAAA,OAAA;AAAA,UAAA,OAGWI;AAAAA,UAAU,OAAA;AAAA,QAAA,GAAA,IAAA;AAAA,QAAA,YAChB,KAAKlF;AAAAA,MAAQ,GAAA;AAAA,QAAAX,SAAAA,MAAA,CAAA8F,gBAAA,MAAA,CAAA;AAAA,MAAA,CAAA;AAAA,KAI1B,GAAAL,YAAAG,UAAA;AAAA,MAAA,QAAAH,YAAA,OAAA;AAAA,QAAA,OAIaM;AAAAA,QAAQ,OAAA;AAAA,MAAA,GAAA,IAAA;AAAA,MAAA,WACf,KAAK1B;AAAAA,MAAsB,YAC1B,KAAK1D;AAAAA,IAAQ,GAAA;AAAA,MAAAX,SAAAA,MAAA,CAAA8F,gBAAA,MAAA,CAAA;AAAA,IAAA,CAAA,CAAA,CAAA,GAO1B,KAAK9D,YAAQyD,YAAA,OAAA;AAAA,MAAA,SAAA;AAAA,IAAA,GAAA,CAET,KAAKzD,QAAQ,CAAA,GAKjB,KAAK1B,YAAY,KAAKA,SAAS0F,SAAS,KAACP,YAAA,OAAA;AAAA,MAAA,SAAA;AAAA,OAAA,CAErC,KAAKnF,SAAS8B,IAAKc,UAAIuC,YAAA,OAAA;AAAA,MAAA,OACZvC,KAAKkC;AAAAA,MAAG,SAAA;AAAA,IAAA,GAAA,CAAAK,YAAA,OAAA;AAAA,MAAA,SAAA;AAAA,IAAA,GAAA,CAAAA,YAAA,QAAA;AAAA,MAAA,SAAA;AAAA,OAAA,CAAAK,yBAAAL,YAAA,QAAA;AAAA,MAAA,SAAA;AAAA,MAAA,SAKLvC,KAAKvD;AAAAA,IAAI,GAAA,CAEfuD,KAAKvD,IAAI,CAAA,CAAA,CAAA,GAAA8F,YAAA,OAAA;AAAA,MAAA,WAGAQ,MAAM,KAAKjB,aAAa9B,IAAI;AAAA,MAAC,OAAOgD;AAAAA,MAAU,OAAA;AAAA,MAAA,SAAA;AAAA,IAAA,GAAA,IAAA,CAAA,CAAA,CAE/D,CAAC,CAAA,CAEL,CAAA;AAAA,EAGP;AACF,CAAC;"}
@@ -1,4 +1,4 @@
1
- import { defineComponent, createVNode, useTemplateRef, ref, watch, nextTick, isVNode, Fragment } from "vue";
1
+ import { defineComponent, createVNode, useTemplateRef, computed, 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";
@@ -22,23 +22,23 @@ const index = /* @__PURE__ */ defineComponent({
22
22
  type: String,
23
23
  default: "/openapi/v1/app/files/upload"
24
24
  },
25
- extendData: {
26
- type: Object,
27
- default: () => ({
28
- "user": "abc-123"
29
- })
30
- },
25
+ // extendData: {
26
+ // type: Object,
27
+ // default: () => ({
28
+ // "user": "abc-123",
29
+ // }),
30
+ // },
31
31
  acceptFileType: {
32
32
  type: String,
33
33
  default: ".txt,.md,.mdx,.markdown,.pdf,.html,.xlsx,.xls,.doc,.docx,.csv,.eml,.msg,.pptx,.ppt,.xml,.epub,.jpg,.jpeg,.png,.gif,.webp,.svg"
34
34
  },
35
- headers: {
36
- type: Object,
37
- default: () => ({
38
- Authorization: "Bearer ApiSecretKey_mEKsrCMvxNLzzUUKeQmpzaUZqwZxFyJf",
39
- appId: "9a673565-d4f6-4382-bc67-f1beb07df435"
40
- })
41
- },
35
+ // headers: {
36
+ // type: Object,
37
+ // default: () => ({
38
+ // Authorization: 'Bearer ApiSecretKey_mEKsrCMvxNLzzUUKeQmpzaUZqwZxFyJf',
39
+ // appId: '9a673565-d4f6-4382-bc67-f1beb07df435'
40
+ // }),
41
+ // },
42
42
  agentName: {
43
43
  type: String,
44
44
  default: "知识问答智能体"
@@ -96,6 +96,18 @@ const index = /* @__PURE__ */ defineComponent({
96
96
  scene: {
97
97
  type: String,
98
98
  default: void 0
99
+ },
100
+ user: {
101
+ type: String,
102
+ default: ""
103
+ },
104
+ authToken: {
105
+ type: String,
106
+ default: ""
107
+ },
108
+ appId: {
109
+ type: String,
110
+ default: ""
99
111
  }
100
112
  },
101
113
  emits: ["cancel", "submit", "sceneChange", "update:scene"],
@@ -105,6 +117,17 @@ const index = /* @__PURE__ */ defineComponent({
105
117
  const editorSender = useTemplateRef("editorSender");
106
118
  const editorSenderWrapper = useTemplateRef("editorSenderWrapper");
107
119
  const fileUpload = useTemplateRef("fileUpload");
120
+ const headers = computed(() => {
121
+ return {
122
+ Authorization: `Bearer ${props.authToken}`,
123
+ appId: props.appId
124
+ };
125
+ });
126
+ const extendData = computed(() => {
127
+ return {
128
+ user: props.user
129
+ };
130
+ });
108
131
  const getInitialScene = () => {
109
132
  if (props.scene) {
110
133
  const found = props.sceneList.find((item) => item.id === props.scene);
@@ -286,9 +309,9 @@ const index = /* @__PURE__ */ defineComponent({
286
309
  "show-file-list": false,
287
310
  "multiple": true,
288
311
  "limit": props.limit - fileList.value.length,
289
- "data": props.extendData,
312
+ "data": extendData.value,
290
313
  "beforeUpload": handleUploadBefore,
291
- "headers": props.headers,
314
+ "headers": headers.value,
292
315
  "onError": handleUploadError,
293
316
  "onSuccess": handleUploadSuccess,
294
317
  "onExceed": handleUploadExceed,