@core-pilot/client-vue 0.0.7 → 0.0.9

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 (42) 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 +2 -0
  5. package/dist/cjs/components/core-card/index.js.map +1 -0
  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/index.js +1 -1
  15. package/dist/cjs/components/x-markdown/index.js +1 -1
  16. package/dist/cjs/components/x-markdown/index.js.map +1 -1
  17. package/dist/cjs/components/x-markdown/utils/parseCorePilotSchema.js +1 -1
  18. package/dist/cjs/components/x-markdown/utils/parseCorePilotSchema.js.map +1 -1
  19. package/dist/cjs/index.js +1 -1
  20. package/dist/cjs/index.js.map +1 -1
  21. package/dist/es/client-vue.css +1 -1
  22. package/dist/es/components/bubble-list/index.js +1 -0
  23. package/dist/es/components/bubble-list/index.js.map +1 -1
  24. package/dist/es/components/core-card/index.js +81 -0
  25. package/dist/es/components/core-card/index.js.map +1 -0
  26. package/dist/es/components/core-upload/assets/delete.svg.js +5 -0
  27. package/dist/es/components/core-upload/assets/delete.svg.js.map +1 -0
  28. package/dist/es/components/core-upload/assets/temp.svg.js +5 -0
  29. package/dist/es/components/core-upload/assets/temp.svg.js.map +1 -0
  30. package/dist/es/components/core-upload/assets/upload.svg.js +5 -0
  31. package/dist/es/components/core-upload/assets/upload.svg.js.map +1 -0
  32. package/dist/es/components/core-upload/index.js +258 -0
  33. package/dist/es/components/core-upload/index.js.map +1 -0
  34. package/dist/es/components/index.js +4 -0
  35. package/dist/es/components/index.js.map +1 -1
  36. package/dist/es/components/x-markdown/index.js +118 -21
  37. package/dist/es/components/x-markdown/index.js.map +1 -1
  38. package/dist/es/components/x-markdown/utils/parseCorePilotSchema.js +17 -2
  39. package/dist/es/components/x-markdown/utils/parseCorePilotSchema.js.map +1 -1
  40. package/dist/es/index.js +4 -0
  41. package/dist/es/index.js.map +1 -1
  42. 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
+ "historyInputs": item.historyInputs,
224
225
  "isHistoryMessage": item.isHistoryMessage,
225
226
  "autoHideThinking": this.autoHideThinking,
226
227
  "onHoverActiveRefTrigger": this.hoverActiveRefTrigger,
@@ -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}\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
+ {"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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"}
@@ -0,0 +1,81 @@
1
+ import { defineComponent, createVNode, ref, computed } from "vue";
2
+ import { ElCard } from "element-plus";
3
+ /* empty css */
4
+ /* empty css */
5
+ /* empty css */
6
+ const CoreCard = /* @__PURE__ */ defineComponent({
7
+ name: "CoreCard",
8
+ props: {
9
+ header: {
10
+ type: String,
11
+ default: ""
12
+ },
13
+ shadow: {
14
+ type: String,
15
+ default: "always"
16
+ },
17
+ collapsible: {
18
+ type: Boolean,
19
+ default: true
20
+ },
21
+ defaultCollapsed: {
22
+ type: Boolean,
23
+ default: false
24
+ }
25
+ },
26
+ setup(props, {
27
+ slots
28
+ }) {
29
+ const isCollapsed = ref(props.defaultCollapsed);
30
+ const toggleCollapse = () => {
31
+ if (props.collapsible) {
32
+ isCollapsed.value = !isCollapsed.value;
33
+ }
34
+ };
35
+ const collapseIconClass = computed(() => {
36
+ return isCollapsed.value ? "core-card__collapse-icon--collapsed" : "core-card__collapse-icon--expanded";
37
+ });
38
+ return {
39
+ isCollapsed,
40
+ toggleCollapse,
41
+ collapseIconClass
42
+ };
43
+ },
44
+ render() {
45
+ const hasHeader = this.header || this.$slots.header;
46
+ return createVNode(ElCard, {
47
+ "class": "core-card",
48
+ "shadow": this.shadow
49
+ }, {
50
+ header: hasHeader ? () => createVNode("div", {
51
+ "class": "core-card__header"
52
+ }, [createVNode("div", {
53
+ "class": "core-card__header-left",
54
+ "onClick": this.toggleCollapse,
55
+ "style": this.collapsible ? {
56
+ cursor: "pointer"
57
+ } : {}
58
+ }, [createVNode("span", {
59
+ "class": "core-card__header-text",
60
+ "title": this.header
61
+ }, [this.header]), this.collapsible && createVNode("i", {
62
+ "class": `core-card__collapse-icon ${this.collapseIconClass}`
63
+ }, null)]), this.$slots.header && createVNode("div", {
64
+ "class": "core-card__header-right"
65
+ }, [this.$slots.header()])]) : void 0,
66
+ default: () => {
67
+ var _a, _b;
68
+ return createVNode("div", {
69
+ "class": {
70
+ "core-card__body": true,
71
+ "core-card__body--collapsed": this.isCollapsed
72
+ }
73
+ }, [(_b = (_a = this.$slots).default) == null ? void 0 : _b.call(_a)]);
74
+ }
75
+ });
76
+ }
77
+ });
78
+ export {
79
+ CoreCard as default
80
+ };
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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 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,258 @@
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 index = /* @__PURE__ */ defineComponent({
14
+ name: "CoreUpload",
15
+ props: {
16
+ // 上传地址
17
+ action: {
18
+ type: String,
19
+ default: ""
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
+ },
67
+ emits: ["update:fileList", "change", "remove", "download-template", "error"],
68
+ setup(props, {
69
+ emit
70
+ }) {
71
+ const uploadRef = ref();
72
+ const fileList = ref(props.fileList || []);
73
+ watch(() => props.fileList, (newFileList) => {
74
+ if (newFileList && JSON.stringify(newFileList) !== JSON.stringify(fileList.value)) {
75
+ fileList.value = [...newFileList || []];
76
+ }
77
+ }, {
78
+ deep: true,
79
+ immediate: true
80
+ });
81
+ const tipsText = computed(() => {
82
+ if (props.tips) {
83
+ return props.tips;
84
+ }
85
+ const acceptTypes = props.accept.split(",").map((type) => type.replace(".", "").toUpperCase()).join(" 或 ");
86
+ return `支持 ${acceptTypes} 格式。文件大小不超过 ${props.maxSize}MB。`;
87
+ });
88
+ const formatFileSize = (size) => {
89
+ if (size < 1024) {
90
+ return size + " B";
91
+ } else if (size < 1024 * 1024) {
92
+ return (size / 1024).toFixed(2) + " KB";
93
+ } else {
94
+ return (size / (1024 * 1024)).toFixed(2) + " MB";
95
+ }
96
+ };
97
+ const getFileExtension = (filename) => {
98
+ const lastDot = filename.lastIndexOf(".");
99
+ return lastDot !== -1 ? filename.substring(lastDot).toLowerCase() : "";
100
+ };
101
+ const validateFileType = (file) => {
102
+ const acceptTypes = props.accept.split(",").map((type) => type.trim().toLowerCase());
103
+ const fileExt = getFileExtension(file.name);
104
+ const isValid = acceptTypes.some((type) => {
105
+ if (type.startsWith(".")) {
106
+ return type === fileExt;
107
+ }
108
+ return file.type && file.type.includes(type.replace(".", ""));
109
+ });
110
+ if (!isValid) {
111
+ const acceptTypesText = props.accept.split(",").map((type) => type.replace(".", "").toUpperCase()).join(" 或 ");
112
+ ElMessage.error(`只能上传 ${acceptTypesText} 格式的文件!`);
113
+ return false;
114
+ }
115
+ return true;
116
+ };
117
+ const validateFileSize = (file) => {
118
+ const maxSizeBytes = props.maxSize * 1024 * 1024;
119
+ if (file.size > maxSizeBytes) {
120
+ ElMessage.error(`文件大小不能超过 ${props.maxSize}MB!`);
121
+ return false;
122
+ }
123
+ return true;
124
+ };
125
+ const beforeUpload = (file) => {
126
+ if (!validateFileType(file)) {
127
+ return false;
128
+ }
129
+ if (!validateFileSize(file)) {
130
+ return false;
131
+ }
132
+ return true;
133
+ };
134
+ const handleChange = (uploadFile, uploadFiles) => {
135
+ fileList.value = uploadFiles.map((file) => ({
136
+ name: file.name,
137
+ url: file.url,
138
+ uid: file.uid,
139
+ status: file.status,
140
+ response: file.response
141
+ }));
142
+ emit("update:fileList", fileList.value);
143
+ emit("change", uploadFile, uploadFiles);
144
+ };
145
+ const handleRemove = (uploadFile, uploadFiles) => {
146
+ fileList.value = uploadFiles.map((file) => ({
147
+ name: file.name,
148
+ url: file.url,
149
+ uid: file.uid,
150
+ status: file.status,
151
+ response: file.response
152
+ }));
153
+ emit("update:fileList", fileList.value);
154
+ emit("remove", uploadFile, uploadFiles);
155
+ };
156
+ const handleError = (error, uploadFile) => {
157
+ ElMessage.error(`文件 ${uploadFile.name} 上传失败:${error.message}`);
158
+ emit("error", error, uploadFile);
159
+ };
160
+ const handleDownloadTemplate = () => {
161
+ if (!props.templateUrl) {
162
+ ElMessage.warning("模板文件地址未配置");
163
+ return;
164
+ }
165
+ emit("download-template", props.templateUrl);
166
+ const link = document.createElement("a");
167
+ link.href = props.templateUrl;
168
+ link.download = props.templateFileName;
169
+ document.body.appendChild(link);
170
+ link.click();
171
+ document.body.removeChild(link);
172
+ };
173
+ const handleDelete = (file) => {
174
+ const index2 = fileList.value.findIndex((item) => item.uid === file.uid);
175
+ if (index2 !== -1) {
176
+ fileList.value.splice(index2, 1);
177
+ emit("update:fileList", fileList.value);
178
+ emit("remove", file, fileList.value);
179
+ }
180
+ };
181
+ return {
182
+ uploadRef,
183
+ fileList,
184
+ tipsText,
185
+ formatFileSize,
186
+ beforeUpload,
187
+ handleChange,
188
+ handleRemove,
189
+ handleError,
190
+ handleDownloadTemplate,
191
+ handleDelete
192
+ };
193
+ },
194
+ render() {
195
+ return createVNode("div", {
196
+ "class": "core-upload"
197
+ }, [createVNode("div", {
198
+ "class": "core-upload__actions"
199
+ }, [createVNode(ElUpload, {
200
+ "ref": "uploadRef",
201
+ "class": "core-upload__upload",
202
+ "action": this.action,
203
+ "accept": this.accept,
204
+ "multiple": this.multiple,
205
+ "fileList": this.fileList,
206
+ "beforeUpload": this.beforeUpload,
207
+ "onChange": this.handleChange,
208
+ "onRemove": this.handleRemove,
209
+ "onError": this.handleError,
210
+ "httpRequest": this.httpRequest,
211
+ "disabled": this.disabled,
212
+ "showFileList": false
213
+ }, {
214
+ trigger: () => createVNode(ElButton, {
215
+ "type": "primary",
216
+ "icon": createVNode("img", {
217
+ "src": uploadIcon,
218
+ "alt": "upload"
219
+ }, null),
220
+ "disabled": this.disabled
221
+ }, {
222
+ default: () => [createTextVNode("上传文件")]
223
+ })
224
+ }), createVNode(ElButton, {
225
+ "icon": createVNode("img", {
226
+ "src": tempIcon,
227
+ "alt": "download"
228
+ }, null),
229
+ "onClick": this.handleDownloadTemplate,
230
+ "disabled": this.disabled
231
+ }, {
232
+ default: () => [createTextVNode("下载模板")]
233
+ })]), this.tipsText && createVNode("div", {
234
+ "class": "core-upload__tips"
235
+ }, [this.tipsText]), this.fileList && this.fileList.length > 0 && createVNode("div", {
236
+ "class": "core-upload__file-list"
237
+ }, [this.fileList.map((file) => createVNode("div", {
238
+ "key": file.uid,
239
+ "class": "core-upload__file-item"
240
+ }, [createVNode("div", {
241
+ "class": "core-upload__file-info"
242
+ }, [createVNode("span", {
243
+ "class": "core-upload__file-icon"
244
+ }, [createTextVNode("📄")]), createVNode("span", {
245
+ "class": "core-upload__file-name",
246
+ "title": file.name
247
+ }, [file.name])]), createVNode("img", {
248
+ "onClick": () => this.handleDelete(file),
249
+ "src": deleteIcon,
250
+ "alt": "delete",
251
+ "class": "core-upload__file-delete"
252
+ }, null)]))])]);
253
+ }
254
+ });
255
+ export {
256
+ index as default
257
+ };
258
+ //# 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 uid?: number;\n status?: 'ready' | 'uploading' | 'success' | 'fail';\n response?: any;\n [key: string]: any;\n}\n\nexport default defineComponent({\n name: 'CoreUpload',\n props: {\n // 上传地址\n action: {\n type: String,\n default: '',\n },\n // 允许上传的文件类型\n accept: {\n type: String,\n default: '.xlsx,.xls,.csv',\n },\n // 文件大小限制(单位:MB)\n maxSize: {\n type: Number,\n default: 10,\n },\n // 是否支持多文件上传\n multiple: {\n type: Boolean,\n default: true,\n },\n // 文件列表\n fileList: {\n type: Array as PropType<UploadFileItem[]>,\n default: () => [],\n },\n // 下载模板的URL\n templateUrl: {\n type: String,\n default: '',\n },\n // 下载模板的文件名\n templateFileName: {\n type: String,\n default: '模板文件',\n },\n // 提示文本\n tips: {\n type: String,\n default: '',\n },\n // 是否禁用\n disabled: {\n type: Boolean,\n default: false,\n },\n // 自定义上传请求\n httpRequest: {\n type: Function as PropType<(options: UploadRequestOptions) => void>,\n default: undefined,\n },\n },\n emits: ['update:fileList', 'change', 'remove', 'download-template', 'error'],\n setup(props, { emit }) {\n const uploadRef = ref<InstanceType<typeof ElUpload>>();\n const fileList = ref<UploadFileItem[]>(props.fileList || []);\n\n // 监听外部 fileList 变化\n watch(\n () => props.fileList,\n (newFileList) => {\n if (newFileList && JSON.stringify(newFileList) !== JSON.stringify(fileList.value)) {\n fileList.value = [...(newFileList || [])];\n }\n },\n { deep: true, immediate: true }\n );\n\n // 生成提示文本\n const tipsText = computed(() => {\n if (props.tips) {\n return props.tips;\n }\n const acceptTypes = props.accept\n .split(',')\n .map((type) => type.replace('.', '').toUpperCase())\n .join(' 或 ');\n return `支持 ${acceptTypes} 格式。文件大小不超过 ${props.maxSize}MB。`;\n });\n\n // 格式化文件大小\n const formatFileSize = (size: number): string => {\n if (size < 1024) {\n return size + ' B';\n } else if (size < 1024 * 1024) {\n return (size / 1024).toFixed(2) + ' KB';\n } else {\n return (size / (1024 * 1024)).toFixed(2) + ' MB';\n }\n };\n\n // 获取文件扩展名\n const getFileExtension = (filename: string): string => {\n const lastDot = filename.lastIndexOf('.');\n return lastDot !== -1 ? filename.substring(lastDot).toLowerCase() : '';\n };\n\n // 验证文件类型\n const validateFileType = (file: File): boolean => {\n const acceptTypes = props.accept.split(',').map((type) => type.trim().toLowerCase());\n const fileExt = getFileExtension(file.name);\n const isValid = acceptTypes.some((type) => {\n if (type.startsWith('.')) {\n return type === fileExt;\n }\n // 支持 MIME 类型\n return file.type && file.type.includes(type.replace('.', ''));\n });\n\n if (!isValid) {\n const acceptTypesText = props.accept\n .split(',')\n .map((type) => type.replace('.', '').toUpperCase())\n .join(' 或 ');\n ElMessage.error(`只能上传 ${acceptTypesText} 格式的文件!`);\n return false;\n }\n return true;\n };\n\n // 验证文件大小\n const validateFileSize = (file: File): boolean => {\n const maxSizeBytes = props.maxSize * 1024 * 1024;\n if (file.size > maxSizeBytes) {\n ElMessage.error(`文件大小不能超过 ${props.maxSize}MB!`);\n return false;\n }\n return true;\n };\n\n // 上传前的校验\n const beforeUpload = (file: File): boolean => {\n // 类型校验\n if (!validateFileType(file)) {\n return false;\n }\n // 大小校验\n if (!validateFileSize(file)) {\n return false;\n }\n return true;\n };\n\n // 文件状态改变时的钩子\n const handleChange = (uploadFile: UploadFile, uploadFiles: UploadFiles) => {\n fileList.value = uploadFiles.map((file) => ({\n name: file.name,\n url: file.url,\n uid: file.uid,\n status: file.status,\n response: file.response,\n }));\n emit('update:fileList', fileList.value);\n emit('change', uploadFile, uploadFiles);\n };\n\n // 文件移除时的钩子\n const handleRemove = (uploadFile: UploadFile, uploadFiles: UploadFiles) => {\n fileList.value = uploadFiles.map((file) => ({\n name: file.name,\n url: file.url,\n uid: file.uid,\n status: file.status,\n response: file.response,\n }));\n emit('update:fileList', fileList.value);\n emit('remove', uploadFile, uploadFiles);\n };\n\n // 上传失败时的钩子\n const handleError = (error: Error, uploadFile: UploadFile) => {\n ElMessage.error(`文件 ${uploadFile.name} 上传失败:${error.message}`);\n emit('error', error, uploadFile);\n };\n\n // 下载模板\n const handleDownloadTemplate = () => {\n if (!props.templateUrl) {\n ElMessage.warning('模板文件地址未配置');\n return;\n }\n emit('download-template', props.templateUrl);\n \n // 如果没有自定义下载处理,则使用默认下载方式\n const link = document.createElement('a');\n link.href = props.templateUrl;\n link.download = props.templateFileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n };\n\n // 删除文件\n const handleDelete = (file: UploadFileItem) => {\n const index = fileList.value.findIndex((item) => item.uid === file.uid);\n if (index !== -1) {\n fileList.value.splice(index, 1);\n emit('update:fileList', fileList.value);\n emit('remove', file, fileList.value);\n }\n };\n\n return {\n uploadRef,\n fileList,\n tipsText,\n formatFileSize,\n beforeUpload,\n handleChange,\n handleRemove,\n handleError,\n handleDownloadTemplate,\n handleDelete,\n };\n },\n render() {\n return (\n <div class=\"core-upload\">\n {/* 第一层:上传文件、下载模板按钮 */}\n <div class=\"core-upload__actions\">\n <ElUpload\n ref=\"uploadRef\"\n class=\"core-upload__upload\"\n action={this.action}\n accept={this.accept}\n multiple={this.multiple}\n fileList={this.fileList}\n beforeUpload={this.beforeUpload}\n onChange={this.handleChange}\n onRemove={this.handleRemove}\n onError={this.handleError}\n httpRequest={this.httpRequest}\n disabled={this.disabled}\n showFileList={false}\n >\n {{\n trigger: () => (\n <ElButton\n type=\"primary\"\n icon={<img src={uploadIcon} alt=\"upload\" />}\n disabled={this.disabled}\n >\n 上传文件\n </ElButton>\n ),\n }}\n </ElUpload>\n <ElButton\n icon={<img src={tempIcon} alt=\"download\" />}\n onClick={this.handleDownloadTemplate}\n disabled={this.disabled}\n >\n 下载模板\n </ElButton>\n </div>\n\n {/* 第二层:tips 简要描述当前上传限制 */}\n {this.tipsText && (\n <div class=\"core-upload__tips\">\n {this.tipsText}\n </div>\n )}\n\n {/* 第三层:已经上传的列表,支持删除 */}\n {this.fileList && this.fileList.length > 0 && (\n <div class=\"core-upload__file-list\">\n {this.fileList.map((file) => (\n <div key={file.uid} class=\"core-upload__file-item\">\n <div class=\"core-upload__file-info\">\n <span class=\"core-upload__file-icon\">📄</span>\n <span\n class=\"core-upload__file-name\"\n title={file.name}\n >\n {file.name}\n </span>\n </div>\n <img onClick={() => this.handleDelete(file)} src={deleteIcon} alt=\"delete\" class=\"core-upload__file-delete\" />\n </div>\n ))}\n </div>\n )}\n </div>\n );\n },\n});\n\n"],"names":["name","props","action","type","String","default","accept","maxSize","Number","multiple","Boolean","fileList","Array","templateUrl","templateFileName","tips","disabled","httpRequest","Function","undefined","emits","setup","emit","uploadRef","ref","watch","newFileList","JSON","stringify","value","deep","immediate","tipsText","computed","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","handleChange","uploadFile","uploadFiles","url","uid","status","response","handleRemove","handleError","message","handleDownloadTemplate","warning","link","document","createElement","href","download","body","appendChild","click","removeChild","handleDelete","index","findIndex","item","splice","render","_createVNode","ElUpload","trigger","ElButton","uploadIcon","_createTextVNode","tempIcon","length","onClick","deleteIcon"],"mappings":"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"}
@@ -8,13 +8,17 @@ import { default as default8 } from "./core-tips/index.js";
8
8
  import { default as default9 } from "./core-result/index.js";
9
9
  import { default as default10 } from "./core-table/index.js";
10
10
  import { default as default11 } from "./core-chart/index.js";
11
+ import { default as default12 } from "./core-card/index.js";
12
+ import { default as default13 } from "./core-upload/index.js";
11
13
  export {
12
14
  default2 as BubbleList,
15
+ default12 as CoreCard,
13
16
  default11 as CoreChart,
14
17
  default9 as CoreResult,
15
18
  default10 as CoreTable,
16
19
  default7 as CoreText,
17
20
  default8 as CoreTips,
21
+ default13 as CoreUpload,
18
22
  default5 as EditorSender,
19
23
  default6 as FileCard,
20
24
  default4 as FilePreview,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}