@qxs-bns/components 0.0.89 → 0.0.90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/_virtual/_commonjsHelpers.mjs +2 -0
- package/es/_virtual/_commonjsHelpers.mjs.map +1 -0
- package/es/_virtual/sortable.esm.mjs +2 -0
- package/es/_virtual/sortable.esm.mjs.map +1 -0
- package/es/_virtual/vuedraggable.umd.mjs +2 -0
- package/es/_virtual/vuedraggable.umd.mjs.map +1 -0
- package/es/_virtual/vuedraggable.umd2.mjs +2 -0
- package/es/_virtual/vuedraggable.umd2.mjs.map +1 -0
- package/es/index.mjs +1 -1
- package/es/index.mjs.map +1 -1
- package/es/node_modules/.pnpm/@iconify_vue@5.0.0_vue@3.5.18_typescript@5.9.2_/node_modules/@iconify/vue/dist/iconify.mjs +1 -1
- package/es/node_modules/.pnpm/@iconify_vue@5.0.0_vue@3.5.18_typescript@5.9.2_/node_modules/@iconify/vue/dist/iconify.mjs.map +1 -1
- package/es/node_modules/.pnpm/sortablejs@1.14.0/node_modules/sortablejs/modular/sortable.esm.mjs +8 -0
- package/es/node_modules/.pnpm/sortablejs@1.14.0/node_modules/sortablejs/modular/sortable.esm.mjs.map +1 -0
- package/es/node_modules/.pnpm/vuedraggable@4.1.0_vue@3.5.18_typescript@5.9.2_/node_modules/vuedraggable/dist/vuedraggable.umd.mjs +2 -0
- package/es/node_modules/.pnpm/vuedraggable@4.1.0_vue@3.5.18_typescript@5.9.2_/node_modules/vuedraggable/dist/vuedraggable.umd.mjs.map +1 -0
- package/es/package.json.mjs +1 -1
- package/es/src/alert/index.mjs +2 -0
- package/es/src/alert/index.mjs.map +1 -0
- package/es/src/alert/src/alert.mjs +2 -0
- package/es/src/alert/src/alert.mjs.map +1 -0
- package/es/src/components.mjs +1 -1
- package/es/src/data-chart/src/components/area.vue2.mjs +1 -1
- package/es/src/data-chart/src/components/area.vue2.mjs.map +1 -1
- package/es/src/data-chart/src/components/card.vue2.mjs +1 -1
- package/es/src/data-chart/src/components/card.vue2.mjs.map +1 -1
- package/es/src/data-chart/src/components/line.vue2.mjs +1 -1
- package/es/src/data-chart/src/components/line.vue2.mjs.map +1 -1
- package/es/src/data-chart/src/components/pie.vue2.mjs +1 -1
- package/es/src/data-chart/src/components/pie.vue2.mjs.map +1 -1
- package/es/src/data-chart/src/components/table.vue.mjs +1 -1
- package/es/src/data-chart/src/components/table.vue.mjs.map +1 -1
- package/es/src/data-chart/src/data-chart.vue.mjs +1 -1
- package/es/src/data-chart/src/data-chart.vue.mjs.map +1 -1
- package/es/src/data-chart/src/utils/config.mjs +1 -1
- package/es/src/data-chart/src/utils/config.mjs.map +1 -1
- package/es/src/data-chart/src/utils/safe-eval.mjs +1 -1
- package/es/src/data-chart/src/utils/safe-eval.mjs.map +1 -1
- package/es/src/data-chart/src/utils/useCharts.mjs +1 -1
- package/es/src/data-chart/src/utils/useCharts.mjs.map +1 -1
- package/es/src/dialog/src/dialog.mjs +2 -0
- package/es/src/dialog/src/dialog.mjs.map +1 -0
- package/es/src/feedback-plugin/index.mjs +2 -0
- package/es/src/feedback-plugin/index.mjs.map +1 -0
- package/es/src/file-upload/src/file-upload.vue.mjs +1 -1
- package/es/src/file-upload/src/file-upload.vue.mjs.map +1 -1
- package/es/src/file-upload/src/file-upload.vue2.mjs +1 -1
- package/es/src/file-upload/src/file-upload.vue2.mjs.map +1 -1
- package/es/src/file-upload/src/file-upload.vue3.mjs +2 -0
- package/es/src/file-upload/src/file-upload.vue3.mjs.map +1 -0
- package/es/src/image-upload/src/image-upload.vue.mjs +1 -1
- package/es/src/image-upload/src/image-upload.vue.mjs.map +1 -1
- package/es/src/image-upload/src/image-upload.vue2.mjs +1 -1
- package/es/src/image-upload/src/image-upload.vue2.mjs.map +1 -1
- package/es/src/image-upload/src/image-upload.vue3.mjs +2 -0
- package/es/src/image-upload/src/image-upload.vue3.mjs.map +1 -0
- package/es/src/make-installer.mjs +1 -1
- package/es/src/make-installer.mjs.map +1 -1
- package/es/src/message/src/message.mjs +2 -0
- package/es/src/message/src/message.mjs.map +1 -0
- package/es/src/subject-action/src/subject-action.vue.mjs +1 -1
- package/es/src/subject-action/src/subject-action.vue.mjs.map +1 -1
- package/es/src/subject-layout/src/subject-layout.vue.mjs +1 -1
- package/es/src/subject-layout/src/subject-layout.vue.mjs.map +1 -1
- package/es/src/subject-list/src/components/SubjectPageEnd.vue.mjs +1 -1
- package/es/src/subject-list/src/components/SubjectPageEnd.vue.mjs.map +1 -1
- package/es/src/subject-list/src/components/SubjectRichText.vue.mjs +1 -1
- package/es/src/subject-list/src/components/SubjectRichText.vue.mjs.map +1 -1
- package/es/src/subject-list/src/components/subject-blank-fill.vue.mjs +1 -1
- package/es/src/subject-list/src/components/subject-blank-fill.vue.mjs.map +1 -1
- package/es/src/subject-list/src/components/subject-scale.vue.mjs +1 -1
- package/es/src/subject-list/src/components/subject-scale.vue.mjs.map +1 -1
- package/es/src/subject-list/src/components/subject-single.vue.mjs +1 -1
- package/es/src/subject-list/src/components/subject-single.vue.mjs.map +1 -1
- package/es/src/subject-list/src/components/subject-text-fill.vue.mjs +1 -1
- package/es/src/subject-list/src/components/subject-text-fill.vue.mjs.map +1 -1
- package/es/src/subject-list/src/subject-list.vue.mjs +1 -1
- package/es/src/subject-list/src/subject-list.vue.mjs.map +1 -1
- package/es/src/tiny-mce-editor/src/tiny-mce-editor.vue.mjs +1 -1
- package/es/src/tiny-mce-editor/src/tiny-mce-editor.vue.mjs.map +1 -1
- package/es/src/ui/button/index.mjs +2 -0
- package/es/src/ui/button/index.mjs.map +1 -0
- package/es/src/ui/checkbox/index.mjs +2 -0
- package/es/src/ui/checkbox/index.mjs.map +1 -0
- package/es/src/ui/dialog/index.mjs +2 -0
- package/es/src/ui/dialog/index.mjs.map +1 -0
- package/es/src/ui/input/index.mjs +2 -0
- package/es/src/ui/input/index.mjs.map +1 -0
- package/es/src/ui/input-number/index.mjs +2 -0
- package/es/src/ui/input-number/index.mjs.map +1 -0
- package/es/src/ui/layout/index.mjs +2 -0
- package/es/src/ui/layout/index.mjs.map +1 -0
- package/es/src/ui/link/index.mjs +2 -0
- package/es/src/ui/link/index.mjs.map +1 -0
- package/es/src/ui/popover/index.mjs +2 -0
- package/es/src/ui/popover/index.mjs.map +1 -0
- package/es/src/ui/radio/index.mjs +2 -0
- package/es/src/ui/radio/index.mjs.map +1 -0
- package/es/src/ui/scrollbar/index.mjs +2 -0
- package/es/src/ui/scrollbar/index.mjs.map +1 -0
- package/es/src/ui/select/index.mjs +2 -0
- package/es/src/ui/select/index.mjs.map +1 -0
- package/es/src/ui/table/index.mjs +2 -0
- package/es/src/ui/table/index.mjs.map +1 -0
- package/es/src/ui/tag/index.mjs +2 -0
- package/es/src/ui/tag/index.mjs.map +1 -0
- package/lib/_virtual/_commonjsHelpers.cjs +2 -0
- package/lib/_virtual/_commonjsHelpers.cjs.map +1 -0
- package/lib/_virtual/sortable.esm.cjs +2 -0
- package/lib/_virtual/sortable.esm.cjs.map +1 -0
- package/lib/_virtual/vuedraggable.umd.cjs +2 -0
- package/lib/_virtual/vuedraggable.umd.cjs.map +1 -0
- package/lib/_virtual/vuedraggable.umd2.cjs +2 -0
- package/lib/_virtual/vuedraggable.umd2.cjs.map +1 -0
- package/lib/index.cjs +1 -1
- package/lib/index.cjs.map +1 -1
- package/lib/node_modules/.pnpm/@iconify_vue@5.0.0_vue@3.5.18_typescript@5.9.2_/node_modules/@iconify/vue/dist/iconify.cjs +1 -1
- package/lib/node_modules/.pnpm/@iconify_vue@5.0.0_vue@3.5.18_typescript@5.9.2_/node_modules/@iconify/vue/dist/iconify.cjs.map +1 -1
- package/lib/node_modules/.pnpm/sortablejs@1.14.0/node_modules/sortablejs/modular/sortable.esm.cjs +9 -0
- package/lib/node_modules/.pnpm/sortablejs@1.14.0/node_modules/sortablejs/modular/sortable.esm.cjs.map +1 -0
- package/lib/node_modules/.pnpm/vuedraggable@4.1.0_vue@3.5.18_typescript@5.9.2_/node_modules/vuedraggable/dist/vuedraggable.umd.cjs +2 -0
- package/lib/node_modules/.pnpm/vuedraggable@4.1.0_vue@3.5.18_typescript@5.9.2_/node_modules/vuedraggable/dist/vuedraggable.umd.cjs.map +1 -0
- package/lib/package.json.cjs +1 -1
- package/lib/src/alert/index.cjs +2 -0
- package/lib/src/alert/index.cjs.map +1 -0
- package/lib/src/alert/src/alert.cjs +2 -0
- package/lib/src/alert/src/alert.cjs.map +1 -0
- package/lib/src/components.cjs +1 -1
- package/lib/src/data-chart/src/components/area.vue2.cjs +1 -1
- package/lib/src/data-chart/src/components/area.vue2.cjs.map +1 -1
- package/lib/src/data-chart/src/components/card.vue2.cjs +1 -1
- package/lib/src/data-chart/src/components/card.vue2.cjs.map +1 -1
- package/lib/src/data-chart/src/components/line.vue2.cjs +1 -1
- package/lib/src/data-chart/src/components/line.vue2.cjs.map +1 -1
- package/lib/src/data-chart/src/components/pie.vue2.cjs +1 -1
- package/lib/src/data-chart/src/components/pie.vue2.cjs.map +1 -1
- package/lib/src/data-chart/src/components/table.vue.cjs +1 -1
- package/lib/src/data-chart/src/components/table.vue.cjs.map +1 -1
- package/lib/src/data-chart/src/data-chart.vue.cjs +1 -1
- package/lib/src/data-chart/src/data-chart.vue.cjs.map +1 -1
- package/lib/src/data-chart/src/utils/config.cjs +1 -1
- package/lib/src/data-chart/src/utils/config.cjs.map +1 -1
- package/lib/src/data-chart/src/utils/safe-eval.cjs +1 -1
- package/lib/src/data-chart/src/utils/safe-eval.cjs.map +1 -1
- package/lib/src/data-chart/src/utils/useCharts.cjs +1 -1
- package/lib/src/data-chart/src/utils/useCharts.cjs.map +1 -1
- package/lib/src/dialog/src/dialog.cjs +2 -0
- package/lib/src/dialog/src/dialog.cjs.map +1 -0
- package/lib/src/feedback-plugin/index.cjs +2 -0
- package/lib/src/feedback-plugin/index.cjs.map +1 -0
- package/lib/src/file-upload/src/file-upload.vue.cjs +1 -1
- package/lib/src/file-upload/src/file-upload.vue.cjs.map +1 -1
- package/lib/src/file-upload/src/file-upload.vue2.cjs +1 -1
- package/lib/src/file-upload/src/file-upload.vue2.cjs.map +1 -1
- package/lib/src/file-upload/src/file-upload.vue3.cjs +2 -0
- package/lib/src/file-upload/src/file-upload.vue3.cjs.map +1 -0
- package/lib/src/image-upload/src/image-upload.vue.cjs +1 -1
- package/lib/src/image-upload/src/image-upload.vue.cjs.map +1 -1
- package/lib/src/image-upload/src/image-upload.vue2.cjs +1 -1
- package/lib/src/image-upload/src/image-upload.vue2.cjs.map +1 -1
- package/lib/src/image-upload/src/image-upload.vue3.cjs +2 -0
- package/lib/src/image-upload/src/image-upload.vue3.cjs.map +1 -0
- package/lib/src/make-installer.cjs +1 -1
- package/lib/src/make-installer.cjs.map +1 -1
- package/lib/src/message/src/message.cjs +2 -0
- package/lib/src/message/src/message.cjs.map +1 -0
- package/lib/src/subject-action/src/subject-action.vue.cjs +1 -1
- package/lib/src/subject-action/src/subject-action.vue.cjs.map +1 -1
- package/lib/src/subject-layout/src/subject-layout.vue.cjs +1 -1
- package/lib/src/subject-layout/src/subject-layout.vue.cjs.map +1 -1
- package/lib/src/subject-list/src/components/SubjectPageEnd.vue.cjs +1 -1
- package/lib/src/subject-list/src/components/SubjectPageEnd.vue.cjs.map +1 -1
- package/lib/src/subject-list/src/components/SubjectRichText.vue.cjs +1 -1
- package/lib/src/subject-list/src/components/SubjectRichText.vue.cjs.map +1 -1
- package/lib/src/subject-list/src/components/subject-blank-fill.vue.cjs +1 -1
- package/lib/src/subject-list/src/components/subject-blank-fill.vue.cjs.map +1 -1
- package/lib/src/subject-list/src/components/subject-scale.vue.cjs +1 -1
- package/lib/src/subject-list/src/components/subject-scale.vue.cjs.map +1 -1
- package/lib/src/subject-list/src/components/subject-single.vue.cjs +1 -1
- package/lib/src/subject-list/src/components/subject-single.vue.cjs.map +1 -1
- package/lib/src/subject-list/src/components/subject-text-fill.vue.cjs +1 -1
- package/lib/src/subject-list/src/components/subject-text-fill.vue.cjs.map +1 -1
- package/lib/src/subject-list/src/subject-list.vue.cjs +1 -1
- package/lib/src/subject-list/src/subject-list.vue.cjs.map +1 -1
- package/lib/src/tiny-mce-editor/src/tiny-mce-editor.vue.cjs +1 -1
- package/lib/src/tiny-mce-editor/src/tiny-mce-editor.vue.cjs.map +1 -1
- package/lib/src/ui/button/index.cjs +2 -0
- package/lib/src/ui/button/index.cjs.map +1 -0
- package/lib/src/ui/checkbox/index.cjs +2 -0
- package/lib/src/ui/checkbox/index.cjs.map +1 -0
- package/lib/src/ui/dialog/index.cjs +2 -0
- package/lib/src/ui/dialog/index.cjs.map +1 -0
- package/lib/src/ui/input/index.cjs +2 -0
- package/lib/src/ui/input/index.cjs.map +1 -0
- package/lib/src/ui/input-number/index.cjs +2 -0
- package/lib/src/ui/input-number/index.cjs.map +1 -0
- package/lib/src/ui/layout/index.cjs +2 -0
- package/lib/src/ui/layout/index.cjs.map +1 -0
- package/lib/src/ui/link/index.cjs +2 -0
- package/lib/src/ui/link/index.cjs.map +1 -0
- package/lib/src/ui/popover/index.cjs +2 -0
- package/lib/src/ui/popover/index.cjs.map +1 -0
- package/lib/src/ui/radio/index.cjs +2 -0
- package/lib/src/ui/radio/index.cjs.map +1 -0
- package/lib/src/ui/scrollbar/index.cjs +2 -0
- package/lib/src/ui/scrollbar/index.cjs.map +1 -0
- package/lib/src/ui/select/index.cjs +2 -0
- package/lib/src/ui/select/index.cjs.map +1 -0
- package/lib/src/ui/table/index.cjs +2 -0
- package/lib/src/ui/table/index.cjs.map +1 -0
- package/lib/src/ui/tag/index.cjs +2 -0
- package/lib/src/ui/tag/index.cjs.map +1 -0
- package/package.json +3 -12
- package/theme-chalk/index.css +1 -1
- package/theme-chalk/index.scss +6 -2
- package/theme-chalk/src/common/qxs-components.css +1 -0
- package/theme-chalk/src/common/qxs-components.scss +4 -0
- package/theme-chalk/src/common/qxs-variables.css +1 -0
- package/theme-chalk/src/common/qxs-variables.scss +81 -0
- package/theme-chalk/src/dialog.css +1 -0
- package/theme-chalk/src/dialog.scss +122 -0
- package/theme-chalk/src/file-upload.css +0 -1
- package/theme-chalk/src/file-upload.scss +5 -32
- package/theme-chalk/src/fixed-action-bar.scss +1 -1
- package/theme-chalk/src/icon.scss +1 -1
- package/theme-chalk/src/image-upload.css +1 -1
- package/theme-chalk/src/image-upload.scss +22 -30
- package/theme-chalk/src/photo-crop-tool.scss +1 -1
- package/theme-chalk/src/subject-action.css +1 -1
- package/theme-chalk/src/subject-action.scss +45 -4
- package/theme-chalk/src/subject-layout.scss +1 -1
- package/theme-chalk/src/subject-list.css +1 -1
- package/theme-chalk/src/subject-list.scss +371 -93
- package/theme-chalk/src/subject-template.scss +1 -1
- package/theme-chalk/src/subject-type.css +1 -1
- package/theme-chalk/src/subject-type.scss +22 -12
- package/theme-chalk/src/tiny-mce-editor.scss +1 -1
- package/theme-chalk/src/ui/button.css +1 -0
- package/theme-chalk/src/ui/button.scss +173 -0
- package/theme-chalk/src/ui/input.css +1 -0
- package/theme-chalk/src/ui/input.scss +128 -0
- package/theme-chalk/src/ui/table.css +1 -0
- package/theme-chalk/src/ui/table.scss +166 -0
- package/types/src/alert/index.d.ts +66 -0
- package/types/src/alert/index.d.ts.map +1 -0
- package/types/src/alert/src/alert.d.ts +73 -0
- package/types/src/alert/src/alert.d.ts.map +1 -0
- package/types/src/components.d.ts +3 -0
- package/types/src/components.d.ts.map +1 -1
- package/types/src/data-chart/src/components/table.vue.d.ts.map +1 -1
- package/types/src/data-chart/src/utils/config.d.ts +4 -4
- package/types/src/dialog/index.d.ts +3 -0
- package/types/src/dialog/index.d.ts.map +1 -0
- package/types/src/dialog/src/dialog.d.ts +25 -0
- package/types/src/dialog/src/dialog.d.ts.map +1 -0
- package/types/src/feedback-plugin/index.d.ts +9 -0
- package/types/src/feedback-plugin/index.d.ts.map +1 -0
- package/types/src/file-upload/index.d.ts +16 -27
- package/types/src/file-upload/index.d.ts.map +1 -1
- package/types/src/file-upload/src/file-upload.vue.d.ts +27 -13
- package/types/src/file-upload/src/file-upload.vue.d.ts.map +1 -1
- package/types/src/icon/index.d.ts +3 -3
- package/types/src/icon/src/icon.d.ts +3 -3
- package/types/src/image-upload/index.d.ts +23 -44
- package/types/src/image-upload/index.d.ts.map +1 -1
- package/types/src/image-upload/src/image-upload.vue.d.ts +32 -42
- package/types/src/image-upload/src/image-upload.vue.d.ts.map +1 -1
- package/types/src/make-installer.d.ts +1 -4
- package/types/src/make-installer.d.ts.map +1 -1
- package/types/src/message/index.d.ts +3 -0
- package/types/src/message/index.d.ts.map +1 -0
- package/types/src/message/src/message.d.ts +21 -0
- package/types/src/message/src/message.d.ts.map +1 -0
- package/types/src/message/src/toaster.vue.d.ts +3 -0
- package/types/src/message/src/toaster.vue.d.ts.map +1 -0
- package/types/src/subject-action/src/subject-action.vue.d.ts.map +1 -1
- package/types/src/subject-layout/index.d.ts +2 -2
- package/types/src/subject-layout/src/subject-layout.vue.d.ts +2 -2
- package/types/src/subject-layout/src/subject-layout.vue.d.ts.map +1 -1
- package/types/src/subject-list/src/components/SubjectPageEnd.vue.d.ts +2 -2
- package/types/src/subject-list/src/components/SubjectRichText.vue.d.ts +2 -2
- package/types/src/subject-list/src/components/subject-blank-fill.vue.d.ts +2 -2
- package/types/src/subject-list/src/components/subject-blank-fill.vue.d.ts.map +1 -1
- package/types/src/subject-list/src/components/subject-scale.vue.d.ts +2 -2
- package/types/src/subject-list/src/components/subject-scale.vue.d.ts.map +1 -1
- package/types/src/subject-list/src/components/subject-single.vue.d.ts +2 -2
- package/types/src/subject-list/src/components/subject-single.vue.d.ts.map +1 -1
- package/types/src/subject-list/src/components/subject-text-fill.vue.d.ts +2 -2
- package/types/src/subject-list/src/components/subject-text-fill.vue.d.ts.map +1 -1
- package/types/src/subject-list/src/subject-list.vue.d.ts.map +1 -1
- package/types/src/ui/button/index.d.ts +96 -0
- package/types/src/ui/button/index.d.ts.map +1 -0
- package/types/src/ui/checkbox/index.d.ts +111 -0
- package/types/src/ui/checkbox/index.d.ts.map +1 -0
- package/types/src/ui/dialog/index.d.ts +134 -0
- package/types/src/ui/dialog/index.d.ts.map +1 -0
- package/types/src/ui/index.d.ts +16 -0
- package/types/src/ui/index.d.ts.map +1 -0
- package/types/src/ui/input/index.d.ts +132 -0
- package/types/src/ui/input/index.d.ts.map +1 -0
- package/types/src/ui/input-number/index.d.ts +106 -0
- package/types/src/ui/input-number/index.d.ts.map +1 -0
- package/types/src/ui/layout/index.d.ts +373 -0
- package/types/src/ui/layout/index.d.ts.map +1 -0
- package/types/src/ui/link/index.d.ts +57 -0
- package/types/src/ui/link/index.d.ts.map +1 -0
- package/types/src/ui/popover/index.d.ts +89 -0
- package/types/src/ui/popover/index.d.ts.map +1 -0
- package/types/src/ui/radio/index.d.ts +84 -0
- package/types/src/ui/radio/index.d.ts.map +1 -0
- package/types/src/ui/scrollbar/index.d.ts +35 -0
- package/types/src/ui/scrollbar/index.d.ts.map +1 -0
- package/types/src/ui/select/index.d.ts +113 -0
- package/types/src/ui/select/index.d.ts.map +1 -0
- package/types/src/ui/table/index.d.ts +152 -0
- package/types/src/ui/table/index.d.ts.map +1 -0
- package/types/src/ui/tag/index.d.ts +69 -0
- package/types/src/ui/tag/index.d.ts.map +1 -0
- package/types/tsconfig.tsbuildinfo +1 -1
- package/theme-chalk/src/common/element-plus-deps.css +0 -1
- package/theme-chalk/src/common/element-plus-deps.scss +0 -40
- package/theme-chalk/src/common/element-plus.css +0 -1
- package/theme-chalk/src/common/element-plus.scss +0 -606
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-chart.vue.mjs","sources":["../../../../../../packages/components/src/data-chart/src/data-chart.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ECharts } from 'echarts'\nimport type { EChartData, EChartsOption, IconRow, IFormatPublicData } from './utils/types'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport { JsonToExcel } from '@qxs-bns/utils'\nimport { cloneDeep, merge as lodashMerge } from 'lodash-es'\nimport { computed, provide, ref } from 'vue'\nimport * as analyze from './analyze'\nimport Area from './components/area.vue'\nimport Bar from './components/bar.vue'\nimport Card from './components/card.vue'\nimport Funnel from './components/funnel.vue'\nimport Line from './components/line.vue'\nimport Pie from './components/pie.vue'\nimport Radar from './components/radar.vue'\nimport ScatterSimple from './components/scatter-simple.vue'\nimport Scatter from './components/scatter.vue'\nimport Table from './components/table.vue'\nimport * as config from './utils/config'\nimport { defaultChartOption } from './utils/config'\nimport { InjectionChartMerge } from './utils/injectionKeys'\nimport { safeEvalConfig } from './utils/safe-eval'\nimport * as types from './utils/types'\nimport { useDataToExcelJson } from './utils/useCharts'\n\ndefineOptions({\n name: 'QxsDataChart',\n})\nconst {\n showTypeName = 'table',\n subShowType,\n modelName = '',\n data: propData = {\n data: [],\n desc: {\n colDesc: [],\n showDesc: {\n showType: 0,\n chartOptions: '{}',\n jsCodeSnippet: '',\n },\n groupByDesc: [],\n },\n },\n chartOptions = {},\n jsCodeSnippet = '',\n lazyLoad = true,\n} = defineProps<{\n modelName?: string\n showTypeName?: IconRow['showTypeName']\n subShowType?: string\n data?: EChartData\n chartOptions?: EChartsOption\n jsCodeSnippet?: string\n lazyLoad?: boolean\n}>()\n\nconst ns = useNamespace('data-chart')\n\n// 子组件引用\nconst myChartRef = ref<any>(null)\n\nconst QxsDataChartConfig = {\n analyze,\n config,\n types,\n}\nconst coms: {\n [key: string]: any\n} = {\n 'table': Table,\n 'bar': Bar,\n 'line': Line,\n 'pie': Pie,\n 'radar': Radar,\n 'scatter': Scatter,\n 'funnel': Funnel,\n 'area': Area,\n 'card': Card,\n 'scatter-simple': ScatterSimple,\n}\n\nconst defaultChartOptionCopy = computed(() => {\n return cloneDeep(defaultChartOption[showTypeName])\n})\n\nconst formatPublicData = computed<IFormatPublicData>(() => {\n const { desc: { colDesc = [], groupByDesc = [] } = {}, data = [] } = propData\n\n // 处理 X 轴数据\n let xValue: EChartData['desc']['groupByDesc'] = []\n\n let xGroupByDesc: EChartData['desc']['groupByDesc'][0] | null = null\n const typedGroupByDesc = groupByDesc as EChartData['desc']['groupByDesc']\n xValue = typedGroupByDesc?.map((groupByDescItem) => {\n // if (groupByDescItem.colValues) {\n // groupByDescItem.colValuesDesc = {}\n // groupByDescItem.colValues.split(',')?.forEach((item) => {\n // const [key, value] = item.split(':')\n // groupByDescItem.colValuesDesc[key] = value\n // })\n // }\n if (groupByDescItem.xAxis) {\n xGroupByDesc = groupByDescItem\n }\n return groupByDescItem\n }) || []\n\n // 修复数据过滤逻辑,避免因为字段不存在导致数据被过滤掉\n const dataValue = xGroupByDesc && (xGroupByDesc as EChartData['desc']['groupByDesc'][0]).colDesc\n ? data.filter((item) => {\n const colDescKey = (xGroupByDesc as EChartData['desc']['groupByDesc'][0]).colDesc\n return item && colDescKey && (item[colDescKey] !== undefined && item[colDescKey] !== null)\n })\n : data\n\n // if (xGroupByDesc && xGroupByDesc.colValuesDesc && Object.keys(xGroupByDesc.colValuesDesc).length) {\n // const { colDesc: colDescItem, colValuesDesc } = xGroupByDesc\n // console.log('colDesc: colDescItem, colValuesDesc: ', colDescItem, colValuesDesc)\n // dataValue = dataValue.map((item) => {\n // if (typeof item[colDescItem] === 'number') {\n // item[colDescItem] = colValuesDesc[item[colDescItem]]\n // }\n // return item\n // })\n // }\n\n const mergeConfig = {\n colDesc: colDesc || [],\n modelName,\n subShowType,\n xGroupByDesc: xGroupByDesc || {\n colDesc: '',\n groupByDesc: '',\n groupByValues: [],\n xAxis: false,\n },\n groupByDesc: xValue,\n data: dataValue,\n }\n return mergeConfig\n})\n\n// 导出数据\nfunction exportExal() {\n if (propData.data.length === 0) {\n // useMessage.error('暂无数据')\n console.log('暂无数据')\n return\n }\n const arr = useDataToExcelJson(propData)\n JsonToExcel(modelName, arr)\n}\nfunction merge(config: EChartsOption, defaultConfig: EChartsOption) {\n const mergeOpt = lodashMerge({}, defaultChartOptionCopy.value, config, defaultConfig)\n let conf = mergeOpt || {}\n\n if (jsCodeSnippet) {\n try {\n // 使用安全的配置处理函数\n conf = safeEvalConfig(jsCodeSnippet, conf)\n }\n catch (error) {\n console.error('代码执行失败:', error)\n }\n }\n\n return conf\n}\n\n// 获取内部 myChart 实例的方法\nfunction getMyChart(): ECharts | null {\n // 对于 table 类型,没有 myChart 实例\n if (showTypeName === 'table') {\n return null\n }\n\n // 尝试从子组件获取 myChart 实例\n const childComponent = myChartRef.value\n if (!childComponent) {\n return null\n }\n\n // 检查子组件是否有 myChart 方法(来自 useCharts)\n if (typeof childComponent.myChart === 'function') {\n return childComponent.myChart()\n }\n\n return null\n}\n\n// 为了保持向后兼容,提供 myChart 计算属性\nconst myChart = computed(() => getMyChart())\n\ndefineExpose({\n exportExal,\n QxsDataChartConfig,\n myChart,\n getMyChart,\n})\nprovide(InjectionChartMerge, merge)\n</script>\n\n<template>\n <component\n :is=\"coms[showTypeName]\"\n ref=\"myChartRef\"\n :key=\"showTypeName\"\n :class=\"[ns.e('wrapper')]\"\n :sub-show-type=\"subShowType\"\n :chart-data=\"formatPublicData\"\n :chart-options=\"chartOptions\"\n :lazy-load=\"lazyLoad\"\n />\n</template>\n"],"names":["ns","useNamespace","myChartRef","ref","QxsDataChartConfig","analyze","config","types","coms","table","Table","bar","Bar","line","Line","pie","Pie","radar","Radar","scatter","Scatter","funnel","Funnel","area","Area","card","Card","ScatterSimple","defaultChartOptionCopy","computed","cloneDeep","defaultChartOption","__props","formatPublicData","desc","colDesc","groupByDesc","data","xValue","xGroupByDesc","typedGroupByDesc","map","groupByDescItem","xAxis","dataValue","filter","item","colDescKey","modelName","subShowType","groupByValues","getMyChart","showTypeName","childComponent","value","myChart","__expose","exportExal","length","
|
|
1
|
+
{"version":3,"file":"data-chart.vue.mjs","sources":["../../../../../../packages/components/src/data-chart/src/data-chart.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ECharts } from 'echarts'\nimport type { EChartData, EChartsOption, IconRow, IFormatPublicData } from './utils/types'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport { JsonToExcel } from '@qxs-bns/utils'\nimport { cloneDeep, merge as lodashMerge } from 'lodash-es'\nimport { computed, provide, ref } from 'vue'\nimport * as analyze from './analyze'\nimport Area from './components/area.vue'\nimport Bar from './components/bar.vue'\nimport Card from './components/card.vue'\nimport Funnel from './components/funnel.vue'\nimport Line from './components/line.vue'\nimport Pie from './components/pie.vue'\nimport Radar from './components/radar.vue'\nimport ScatterSimple from './components/scatter-simple.vue'\nimport Scatter from './components/scatter.vue'\nimport Table from './components/table.vue'\nimport * as config from './utils/config'\nimport { defaultChartOption } from './utils/config'\nimport { InjectionChartMerge } from './utils/injectionKeys'\nimport { safeEvalConfig } from './utils/safe-eval'\nimport * as types from './utils/types'\nimport { useDataToExcelJson } from './utils/useCharts'\n\ndefineOptions({\n name: 'QxsDataChart',\n})\nconst {\n showTypeName = 'table',\n subShowType,\n modelName = '',\n data: propData = {\n data: [],\n desc: {\n colDesc: [],\n showDesc: {\n showType: 0,\n chartOptions: '{}',\n jsCodeSnippet: '',\n },\n groupByDesc: [],\n },\n },\n chartOptions = {},\n jsCodeSnippet = '',\n lazyLoad = true,\n} = defineProps<{\n modelName?: string\n showTypeName?: IconRow['showTypeName']\n subShowType?: string\n data?: EChartData\n chartOptions?: EChartsOption\n jsCodeSnippet?: string\n lazyLoad?: boolean\n}>()\n\nconst ns = useNamespace('data-chart')\n\n// 子组件引用\nconst myChartRef = ref<any>(null)\n\nconst QxsDataChartConfig = {\n analyze,\n config,\n types,\n}\nconst coms: {\n [key: string]: any\n} = {\n 'table': Table,\n 'bar': Bar,\n 'line': Line,\n 'pie': Pie,\n 'radar': Radar,\n 'scatter': Scatter,\n 'funnel': Funnel,\n 'area': Area,\n 'card': Card,\n 'scatter-simple': ScatterSimple,\n}\n\nconst defaultChartOptionCopy = computed(() => {\n return cloneDeep(defaultChartOption[showTypeName])\n})\n\nconst formatPublicData = computed<IFormatPublicData>(() => {\n const { desc: { colDesc = [], groupByDesc = [] } = {}, data = [] } = propData\n\n // 处理 X 轴数据\n let xValue: EChartData['desc']['groupByDesc'] = []\n\n let xGroupByDesc: EChartData['desc']['groupByDesc'][0] | null = null\n const typedGroupByDesc = groupByDesc as EChartData['desc']['groupByDesc']\n xValue = typedGroupByDesc?.map((groupByDescItem) => {\n // if (groupByDescItem.colValues) {\n // groupByDescItem.colValuesDesc = {}\n // groupByDescItem.colValues.split(',')?.forEach((item) => {\n // const [key, value] = item.split(':')\n // groupByDescItem.colValuesDesc[key] = value\n // })\n // }\n if (groupByDescItem.xAxis) {\n xGroupByDesc = groupByDescItem\n }\n return groupByDescItem\n }) || []\n\n // 修复数据过滤逻辑,避免因为字段不存在导致数据被过滤掉\n const dataValue = xGroupByDesc && (xGroupByDesc as EChartData['desc']['groupByDesc'][0]).colDesc\n ? data.filter((item) => {\n const colDescKey = (xGroupByDesc as EChartData['desc']['groupByDesc'][0]).colDesc\n return item && colDescKey && (item[colDescKey] !== undefined && item[colDescKey] !== null)\n })\n : data\n\n // if (xGroupByDesc && xGroupByDesc.colValuesDesc && Object.keys(xGroupByDesc.colValuesDesc).length) {\n // const { colDesc: colDescItem, colValuesDesc } = xGroupByDesc\n // console.log('colDesc: colDescItem, colValuesDesc: ', colDescItem, colValuesDesc)\n // dataValue = dataValue.map((item) => {\n // if (typeof item[colDescItem] === 'number') {\n // item[colDescItem] = colValuesDesc[item[colDescItem]]\n // }\n // return item\n // })\n // }\n\n const mergeConfig = {\n colDesc: colDesc || [],\n modelName,\n subShowType,\n xGroupByDesc: xGroupByDesc || {\n colDesc: '',\n groupByDesc: '',\n groupByValues: [],\n xAxis: false,\n },\n groupByDesc: xValue,\n data: dataValue,\n }\n return mergeConfig\n})\n\n// 导出数据\nfunction exportExal() {\n if (propData.data.length === 0) {\n // useMessage.error('暂无数据')\n console.log('暂无数据')\n return\n }\n const arr = useDataToExcelJson(propData)\n JsonToExcel(modelName, arr)\n}\nfunction merge(config: EChartsOption, defaultConfig: EChartsOption) {\n const mergeOpt = lodashMerge({}, defaultChartOptionCopy.value, config, defaultConfig)\n let conf = mergeOpt || {}\n\n if (jsCodeSnippet) {\n try {\n // 使用安全的配置处理函数\n conf = safeEvalConfig(jsCodeSnippet, conf)\n }\n catch (error) {\n console.error('代码执行失败:', error)\n }\n }\n\n return conf\n}\n\n// 获取内部 myChart 实例的方法\nfunction getMyChart(): ECharts | null {\n // 对于 table 类型,没有 myChart 实例\n if (showTypeName === 'table') {\n return null\n }\n\n // 尝试从子组件获取 myChart 实例\n const childComponent = myChartRef.value\n if (!childComponent) {\n return null\n }\n\n // 检查子组件是否有 myChart 方法(来自 useCharts)\n if (typeof childComponent.myChart === 'function') {\n return childComponent.myChart()\n }\n\n return null\n}\n\n// 为了保持向后兼容,提供 myChart 计算属性\nconst myChart = computed(() => getMyChart())\n\ndefineExpose({\n exportExal,\n QxsDataChartConfig,\n myChart,\n getMyChart,\n})\nprovide(InjectionChartMerge, merge)\n</script>\n\n<template>\n <component\n :is=\"coms[showTypeName]\"\n ref=\"myChartRef\"\n :key=\"showTypeName\"\n :class=\"[ns.e('wrapper')]\"\n :sub-show-type=\"subShowType\"\n :chart-data=\"formatPublicData\"\n :chart-options=\"chartOptions\"\n :lazy-load=\"lazyLoad\"\n />\n</template>\n"],"names":["ns","useNamespace","myChartRef","ref","QxsDataChartConfig","analyze","config","types","coms","table","Table","bar","Bar","line","Line","pie","Pie","radar","Radar","scatter","Scatter","funnel","Funnel","area","Area","card","Card","ScatterSimple","defaultChartOptionCopy","computed","cloneDeep","defaultChartOption","__props","formatPublicData","desc","colDesc","groupByDesc","data","xValue","xGroupByDesc","typedGroupByDesc","map","groupByDescItem","xAxis","dataValue","filter","item","colDescKey","modelName","subShowType","groupByValues","getMyChart","showTypeName","childComponent","value","myChart","__expose","exportExal","length","arr","useDataToExcelJson","JsonToExcel","provide","InjectionChartMerge","defaultConfig","conf","lodashMerge","jsCodeSnippet","safeEvalConfig","error","_createBlock","_resolveDynamicComponent","key","class","_normalizeClass","_unref","e","chartOptions","lazyLoad"],"mappings":"gjDAyDA,MAAMA,EAAKC,EAAa,cAGlBC,EAAaC,EAAS,MAEtBC,EAAqB,CACzBC,UACAC,SACAC,SAEIC,EAEF,CACFC,MAASC,EACTC,IAAOC,EACPC,KAAQC,EACRC,IAAOC,EACPC,MAASC,EACTC,QAAWC,EACXC,OAAUC,EACVC,KAAQC,EACRC,KAAQC,EACR,iBAAkBC,GAGdC,EAAyBC,EAAS,IAC/BC,EAAUC,EAAmBC,kBAGhCC,EAAmBJ,EAA4B,KACnD,MAAQK,MAAMC,QAAEA,EAAU,eAAIC,EAAc,IAAO,CAAA,EAACC,KAAGA,EAAO,IAAOL,EAAAK,KAGrE,IAAIC,EAA4C,GAE5CC,EAA4D,KAChE,MAAMC,EAAmBJ,EACzBE,EAASE,GAAkBC,IAAKC,IAQ1BA,EAAgBC,QAClBJ,EAAeG,GAEVA,KACH,GAGN,MAAME,EAAYL,GAAiBA,EAAsDJ,QACrFE,EAAKQ,OAAQC,IACX,MAAMC,EAAcR,EAAsDJ,QAC1E,OAAOW,GAAQC,QAAoC,IAArBD,EAAKC,IAAkD,OAArBD,EAAKC,KAEvEV,EA0BJ,MAboB,CAClBF,QAASA,GAAW,GACpBa,UAAQhB,EAAAgB,UACRC,YAAUjB,EAAAiB,YACVV,aAAcA,GAAgB,CAC5BJ,QAAS,GACTC,YAAa,GACbc,cAAe,GACfP,OAAO,GAETP,YAAaE,EACbD,KAAMO,KAiCV,SAASO,IAEP,GAAqB,UAAjBnB,EAAAoB,aACF,OAAO,KAIT,MAAMC,EAAiBnD,EAAWoD,MAClC,OAAKD,GAKiC,mBAA3BA,EAAeE,QACjBF,EAAeE,UALf,IASX,QAKAC,EAAa,CACXC,WAnDF,WACE,GAA6B,IAAzBzB,OAASK,KAAKqB,OAGhB,OAEF,MAAMC,EAAMC,EAAmB5B,EAAAK,MAC/BwB,EAAY7B,EAAAgB,UAAWW,EACzB,EA4CEvD,qBACAmD,QALc1B,EAAS,IAAMsB,KAM7BA,eAEFW,EAAQC,EA/CR,SAAezD,EAAuB0D,GAEpC,IAAIC,EADaC,EAAY,CAAA,EAAItC,EAAuB0B,MAAOhD,EAAQ0D,IAChD,CAAA,EAEvB,GAAIhC,EAAAmC,cACF,IAEEF,EAAOG,EAAepC,gBAAeiC,EACvC,OACOI,GAEP,CAGF,OAAOJ,CACT,eAoCEK,EASEC,EARK/D,EAAK4C,EAAAA,eAAY,SAClB,aAAJjD,IAAID,EACHsE,IAAKpB,EAAAA,aACLqB,MAAKC,EAAA,CAAGC,EAAA3E,GAAG4E,EAAC,aACZ,gBAAe3B,EAAAA,YACf,aAAYhB,EAAAqB,MACZ,gBAAeuB,EAAAA,aACf,YAAWC,EAAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import*as e from"echarts";import{merge as t}from"lodash-es";import{getProvinceCode as o,isProvinceCode as a}from"./mapData.mjs";const s={get:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"showTypeName",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"table";return s.data.find(o=>o[e].toString()===t||o[e]===t)},data:[{showTypeName:"table",label:"表格",coverImg:"table.png",disabled:()=>!1,subTypeList:[],showType:0,baseConfig:{}},{showTypeName:"line",label:"折线图",coverImg:"line-stack.png",showType:1,subTypeList:[{value:"line-simple",icon:"line-smooth",tooltipContent:"折线图"},{value:"area-basic",icon:"chart-line-area",tooltipContent:"折线面积图"}],baseConfig:{tooltip:{confine:!1,trigger:"axis",axisPointer:{type:"line"}},toolbox:{show:!1,showTitle:!1,feature:{saveAsImage:{}}},legend:{type:"scroll",top:"25px"},grid:{left:"0",bottom:"10px",containLabel:!0},xAxis:{type:"category",boundaryGap:!1},yAxis:{type:"value"},dataZoom:[{type:"inside"}]},disabled:(e,t)=>{const o=t?.length;return!(o>=1&&o<2)}},{showTypeName:"bar",label:"柱状图",coverImg:"bar-tick-align.png",showType:2,baseConfig:{legend:{type:"scroll",top:"25px"},tooltip:{confine:!1,trigger:"axis",axisPointer:{type:"shadow"}},toolbox:{show:!1,showTitle:!1,feature:{saveAsImage:{}}},grid:{left:"0",bottom:"20px",containLabel:!0},xAxis:{axisLabel:{showMaxLabel:!0},axisTick:{alignWithLabel:!0}},yAxis:{},dataZoom:[{type:"inside"}]},subTypeList:[{value:"bar-simple",icon:"bar-simple",tooltipContent:"垂直条形图"},{value:"bar-y-category",icon:"bar-y-category",tooltipContent:"水平条形图"}],disabled:(e,t)=>{const o=t?.length;return!(o>=1)}},{showTypeName:"pie",label:"饼图",coverImg:"pie-simple.png",showType:4,subTypeList:[{value:"pie-simple",icon:"pie-simple",tooltipContent:"饼图"},{value:"pie-borderRadius",icon:"pie-borderRadius",tooltipContent:"环形图"}],baseConfig:{tooltip:{confine:!0,formatter:"{a}<br>{b}: {c}({d}%)",trigger:"item"},toolbox:{show:!1,showTitle:!1,feature:{saveAsImage:{}}},legend:{type:"scroll",top:"25px"}},disabled:(e,t)=>{const o=t?.length,a=e?.length;return!(a<=4&&o>0&&o<=1)}},{showTypeName:"area",label:"地图",coverImg:"area.png",showType:5,subTypeList:[],baseConfig:{tooltip:{confine:!0,trigger:"item"},toolbox:{show:!1,showTitle:!1,feature:{saveAsImage:{}}},visualMap:{text:["高","低"],realtime:!1,calculable:!0,inRange:{color:["#E8F4FD","#B8D4F7","#7BA4F0","#4A7BE8","#3562e1"]}}},disabled:(e,t)=>{const o=t?.length,a=t?.some(e=>{let{colDesc:t}=e;return t.includes("省")||t.includes("市")});return!(a&&o>0)}},{showTypeName:"funnel",label:"漏斗图",coverImg:"funnel.png",showType:6,subTypeList:[],baseConfig:{tooltip:{confine:!0,trigger:"item",formatter:"{a} <br/>{b} : {c}"},toolbox:{show:!1,showTitle:!1,feature:{saveAsImage:{}}},legend:{type:"scroll",top:20}},disabled:(e,t)=>{const o=t?.length,a=e?.length;return!(a<=5&&o>0&&o<=1)}},{showTypeName:"card",label:"卡片",coverImg:"card.png",showType:9,subTypeList:[],baseConfig:{},disabled:(e,t)=>{const o=t?.length,a=e?.length;return!(a>0&&o<=1)}},{showTypeName:"radar",label:"雷达图",coverImg:"radar.png",showType:10,subTypeList:[],baseConfig:{legend:{type:"scroll",orient:"vertical",left:"left",top:"25px"},tooltip:{confine:!0,trigger:"item"},toolbox:{show:!1,showTitle:!1,feature:{saveAsImage:{}}},radar:{center:["50%","55%"]}},disabled:(e,t)=>{const o=t?.length;return 1!==o||1!==e.length}},{showTypeName:"scatter-simple",label:"散点图",coverImg:"",showType:11,subTypeList:[],disabled:()=>!1,baseConfig:{grid:{left:"0",bottom:"10px",containLabel:!0},tooltip:{showDelay:0,axisPointer:{show:!0,type:"cross",lineStyle:{type:"dashed",width:1}}},toolbox:{show:!1,showTitle:!1,feature:{saveAsImage:{}}},legend:{type:"scroll",top:"25px"},xAxis:{splitLine:{lineStyle:{type:"dashed"}}},yAxis:{splitLine:{lineStyle:{type:"dashed"}}}}}]};function i(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return s.get("showType",e)}function n(e,o){const a={};return e.forEach(e=>{a[e.showTypeName]=t(e.baseConfig,o)}),a}const l=n(s.data,{backgroundColor:"transparent",title:{textStyle:{fontSize:14,lineHeight:16}}}),r=new Map;function p(){try{const t=e.getMap("china");if(t&&t.geoJson)return t.geoJson}catch(e){
|
|
1
|
+
import*as e from"echarts";import{merge as t}from"lodash-es";import{getProvinceCode as o,isProvinceCode as a}from"./mapData.mjs";const s={get:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"showTypeName",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"table";return s.data.find(o=>o[e].toString()===t||o[e]===t)},data:[{showTypeName:"table",label:"表格",coverImg:"table.png",disabled:()=>!1,subTypeList:[],showType:0,baseConfig:{}},{showTypeName:"line",label:"折线图",coverImg:"line-stack.png",showType:1,subTypeList:[{value:"line-simple",icon:"line-smooth",tooltipContent:"折线图"},{value:"area-basic",icon:"chart-line-area",tooltipContent:"折线面积图"}],baseConfig:{tooltip:{confine:!1,trigger:"axis",axisPointer:{type:"line"}},toolbox:{show:!1,showTitle:!1,feature:{saveAsImage:{}}},legend:{type:"scroll",top:"25px"},grid:{left:"0",bottom:"10px",containLabel:!0},xAxis:{type:"category",boundaryGap:!1},yAxis:{type:"value"},dataZoom:[{type:"inside"}]},disabled:(e,t)=>{const o=t?.length;return!(o>=1&&o<2)}},{showTypeName:"bar",label:"柱状图",coverImg:"bar-tick-align.png",showType:2,baseConfig:{legend:{type:"scroll",top:"25px"},tooltip:{confine:!1,trigger:"axis",axisPointer:{type:"shadow"}},toolbox:{show:!1,showTitle:!1,feature:{saveAsImage:{}}},grid:{left:"0",bottom:"20px",containLabel:!0},xAxis:{axisLabel:{showMaxLabel:!0},axisTick:{alignWithLabel:!0}},yAxis:{},dataZoom:[{type:"inside"}]},subTypeList:[{value:"bar-simple",icon:"bar-simple",tooltipContent:"垂直条形图"},{value:"bar-y-category",icon:"bar-y-category",tooltipContent:"水平条形图"}],disabled:(e,t)=>{const o=t?.length;return!(o>=1)}},{showTypeName:"pie",label:"饼图",coverImg:"pie-simple.png",showType:4,subTypeList:[{value:"pie-simple",icon:"pie-simple",tooltipContent:"饼图"},{value:"pie-borderRadius",icon:"pie-borderRadius",tooltipContent:"环形图"}],baseConfig:{tooltip:{confine:!0,formatter:"{a}<br>{b}: {c}({d}%)",trigger:"item"},toolbox:{show:!1,showTitle:!1,feature:{saveAsImage:{}}},legend:{type:"scroll",top:"25px"}},disabled:(e,t)=>{const o=t?.length,a=e?.length;return!(a<=4&&o>0&&o<=1)}},{showTypeName:"area",label:"地图",coverImg:"area.png",showType:5,subTypeList:[],baseConfig:{tooltip:{confine:!0,trigger:"item"},toolbox:{show:!1,showTitle:!1,feature:{saveAsImage:{}}},visualMap:{text:["高","低"],realtime:!1,calculable:!0,inRange:{color:["#E8F4FD","#B8D4F7","#7BA4F0","#4A7BE8","#3562e1"]}}},disabled:(e,t)=>{const o=t?.length,a=t?.some(e=>{let{colDesc:t}=e;return t.includes("省")||t.includes("市")});return!(a&&o>0)}},{showTypeName:"funnel",label:"漏斗图",coverImg:"funnel.png",showType:6,subTypeList:[],baseConfig:{tooltip:{confine:!0,trigger:"item",formatter:"{a} <br/>{b} : {c}"},toolbox:{show:!1,showTitle:!1,feature:{saveAsImage:{}}},legend:{type:"scroll",top:20}},disabled:(e,t)=>{const o=t?.length,a=e?.length;return!(a<=5&&o>0&&o<=1)}},{showTypeName:"card",label:"卡片",coverImg:"card.png",showType:9,subTypeList:[],baseConfig:{},disabled:(e,t)=>{const o=t?.length,a=e?.length;return!(a>0&&o<=1)}},{showTypeName:"radar",label:"雷达图",coverImg:"radar.png",showType:10,subTypeList:[],baseConfig:{legend:{type:"scroll",orient:"vertical",left:"left",top:"25px"},tooltip:{confine:!0,trigger:"item"},toolbox:{show:!1,showTitle:!1,feature:{saveAsImage:{}}},radar:{center:["50%","55%"]}},disabled:(e,t)=>{const o=t?.length;return 1!==o||1!==e.length}},{showTypeName:"scatter-simple",label:"散点图",coverImg:"",showType:11,subTypeList:[],disabled:()=>!1,baseConfig:{grid:{left:"0",bottom:"10px",containLabel:!0},tooltip:{showDelay:0,axisPointer:{show:!0,type:"cross",lineStyle:{type:"dashed",width:1}}},toolbox:{show:!1,showTitle:!1,feature:{saveAsImage:{}}},legend:{type:"scroll",top:"25px"},xAxis:{splitLine:{lineStyle:{type:"dashed"}}},yAxis:{splitLine:{lineStyle:{type:"dashed"}}}}}]};function i(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return s.get("showType",e)}function n(e,o){const a={};return e.forEach(e=>{a[e.showTypeName]=t(e.baseConfig,o)}),a}const l=n(s.data,{backgroundColor:"transparent",title:{textStyle:{fontSize:14,lineHeight:16}}}),r=new Map;function p(){try{const t=e.getMap("china");if(t&&t.geoJson)return t.geoJson}catch(e){}return{type:"FeatureCollection",features:[]}}function c(e){let{adcode:t}=e;const s="https://cdnfile.yaomaitong.cn/ksh/lib/geo-data";if("string"!=typeof t||t.match(/^\d{6}$/)||"中国"===t||"100000"===t||(t=o(t)),r.has(t)){const e=r.get(t);if(e)return Promise.resolve(e)}return(async()=>{try{if("中国"===t||"100000"===t)try{const e=await fetch(`${s}/china.json`);if(e.ok){const o=await e.json();return r.set(t,o),o}}catch(e){}if(a(t))try{const e=await fetch(`${s}/${t}.json`);if(e.ok){const o=await e.json();if(o&&o.features&&o.features.length>0)return r.set(t,o),o}}catch(e){}const e=p();return r.set(t,e),e}catch(e){const o=p();return r.set(t,o),o}})()}export{l as defaultChartOption,c as getGeoJsonData,s as iconList,n as setDefaultChartOption,i as showTypeText};
|
|
2
2
|
//# sourceMappingURL=config.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.mjs","sources":["../../../../../../../packages/components/src/data-chart/src/utils/config.ts"],"sourcesContent":["import type { GeoJson, IconRow, IGroupByInfos, ISelectInfos } from './types'\nimport * as echarts from 'echarts'\nimport { merge } from 'lodash-es'\nimport { getProvinceCode, isProvinceCode } from './mapData'\n\n/**\n * 禁用功能函数\n * 判断当前图表类型是否被禁用\n * 调用时机:渲染页面\n * @param {object} selectInfos 选择信息\n * @param {object} groupByInfos 分组信息\n * @param {Message[]|Message} data 数据\n * @returns Boolean 布尔值\n */\nexport const iconList: {\n data: IconRow[]\n get: (type: keyof IconRow, value: any) => IconRow\n} = {\n get: (type: keyof IconRow = 'showTypeName', value: any = 'table') => {\n return iconList.data.find(item => item[type].toString() === value || item[type] === value)!\n },\n data: [\n {\n showTypeName: 'table',\n label: '表格',\n coverImg: 'table.png',\n disabled: () => false,\n subTypeList: [],\n showType: 0,\n baseConfig: {},\n },\n {\n showTypeName: 'line',\n label: '折线图',\n coverImg: 'line-stack.png',\n showType: 1,\n subTypeList: [\n {\n value: 'line-simple',\n icon: 'line-smooth',\n tooltipContent: '折线图',\n },\n {\n value: 'area-basic',\n icon: 'chart-line-area',\n tooltipContent: '折线面积图',\n },\n ],\n baseConfig: {\n tooltip: {\n confine: false,\n trigger: 'axis',\n axisPointer: {\n type: 'line',\n },\n },\n toolbox: {\n show: false,\n showTitle: false,\n feature: {\n // dataView: { readOnly: true },\n // restore: {},\n saveAsImage: {},\n },\n },\n legend: {\n type: 'scroll',\n top: '25px',\n },\n grid: {\n left: '0',\n bottom: '10px',\n containLabel: true,\n },\n xAxis: {\n type: 'category',\n boundaryGap: false,\n },\n yAxis: {\n type: 'value',\n },\n dataZoom: [\n {\n type: 'inside',\n },\n ],\n },\n disabled: (_: ISelectInfos[], groupByInfos: IGroupByInfos[]) => {\n const groupByInfosLenght = groupByInfos?.length\n if (groupByInfosLenght >= 1 && groupByInfosLenght < 2) {\n return false\n }\n return true\n },\n },\n {\n showTypeName: 'bar',\n label: '柱状图',\n coverImg: 'bar-tick-align.png',\n showType: 2,\n baseConfig: {\n legend: {\n type: 'scroll',\n top: '25px',\n },\n tooltip: {\n confine: false,\n trigger: 'axis',\n axisPointer: {\n type: 'shadow',\n },\n },\n toolbox: {\n show: false,\n showTitle: false,\n feature: {\n // dataView: { readOnly: true },\n // restore: {},\n saveAsImage: {},\n // myFull: { // 全屏\n // show: true,\n // title: '全屏',\n // icon: 'path://...',\n // }\n },\n },\n grid: {\n left: '0',\n bottom: '20px',\n containLabel: true,\n },\n xAxis: {\n axisLabel: {\n showMaxLabel: true,\n },\n axisTick: {\n alignWithLabel: true,\n },\n },\n yAxis: {},\n dataZoom: [\n {\n type: 'inside',\n },\n ],\n },\n subTypeList: [\n {\n value: 'bar-simple',\n icon: 'bar-simple',\n tooltipContent: '垂直条形图',\n },\n {\n value: 'bar-y-category',\n icon: 'bar-y-category',\n tooltipContent: '水平条形图',\n },\n ],\n disabled: (_: ISelectInfos[], groupByInfos: IGroupByInfos[]) => {\n const groupByInfosLenght = groupByInfos?.length\n if (groupByInfosLenght >= 1) {\n return false\n }\n return true\n },\n },\n {\n showTypeName: 'pie',\n label: '饼图',\n coverImg: 'pie-simple.png',\n showType: 4,\n subTypeList: [\n {\n value: 'pie-simple',\n icon: 'pie-simple',\n tooltipContent: '饼图',\n },\n {\n value: 'pie-borderRadius',\n icon: 'pie-borderRadius',\n tooltipContent: '环形图',\n },\n ],\n baseConfig: {\n tooltip: {\n confine: true,\n formatter: '{a}<br>{b}: {c}({d}%)',\n trigger: 'item',\n },\n toolbox: {\n show: false,\n showTitle: false,\n feature: {\n // dataView: { readOnly: true },\n // restore: {},\n saveAsImage: {},\n },\n },\n legend: {\n type: 'scroll',\n top: '25px',\n },\n },\n disabled: (selectInfos: ISelectInfos[], groupByInfos: IGroupByInfos[]) => {\n const groupByInfosLenght = groupByInfos?.length\n const selectInfosLength = selectInfos?.length\n if (selectInfosLength <= 4 && groupByInfosLenght > 0 && groupByInfosLenght <= 1) {\n return false\n }\n return true\n },\n },\n {\n showTypeName: 'area',\n label: '地图',\n coverImg: 'area.png',\n showType: 5,\n subTypeList: [],\n baseConfig: {\n tooltip: {\n confine: true,\n trigger: 'item',\n },\n toolbox: {\n show: false,\n showTitle: false,\n feature: {\n // dataView: { readOnly: true },\n // restore: {},\n saveAsImage: {},\n },\n },\n visualMap: {\n text: ['高', '低'],\n realtime: false,\n calculable: true,\n inRange: {\n color: ['#E8F4FD', '#B8D4F7', '#7BA4F0', '#4A7BE8', '#3562e1'],\n },\n },\n },\n disabled: (_: ISelectInfos[], groupByInfos: IGroupByInfos[]) => {\n const groupByInfosLenght = groupByInfos?.length\n const flag = groupByInfos?.some(({ colDesc }) => (colDesc.includes('省') || colDesc.includes('市')))\n if (flag && groupByInfosLenght > 0) {\n return false\n }\n return true\n },\n },\n {\n showTypeName: 'funnel',\n label: '漏斗图',\n coverImg: 'funnel.png',\n showType: 6,\n subTypeList: [],\n baseConfig: {\n tooltip: {\n confine: true,\n trigger: 'item',\n formatter: '{a} <br/>{b} : {c}',\n },\n toolbox: {\n show: false,\n showTitle: false,\n feature: {\n // dataView: { readOnly: true },\n // restore: {},\n saveAsImage: {},\n },\n },\n legend: {\n type: 'scroll',\n top: 20,\n },\n },\n disabled: (selectInfos: ISelectInfos[], groupByInfos: IGroupByInfos[]) => {\n const groupByInfosLenght = groupByInfos?.length\n const selectInfosLength = selectInfos?.length\n if (selectInfosLength <= 5 && groupByInfosLenght > 0 && groupByInfosLenght <= 1) {\n return false\n }\n return true\n },\n },\n\n // { label: 'scatter', value: 7 },\n {\n showTypeName: 'card',\n label: '卡片',\n coverImg: 'card.png',\n showType: 9,\n subTypeList: [],\n baseConfig: {},\n disabled: (selectInfos: ISelectInfos[], groupByInfos: IGroupByInfos[]) => {\n const groupByInfosLenght = groupByInfos?.length\n const selectInfosLength = selectInfos?.length\n if (selectInfosLength > 0 && groupByInfosLenght <= 1) {\n return false\n }\n return true\n },\n },\n {\n showTypeName: 'radar',\n label: '雷达图',\n coverImg: 'radar.png',\n showType: 10,\n subTypeList: [],\n baseConfig: {\n legend: {\n type: 'scroll',\n orient: 'vertical',\n left: 'left',\n top: '25px',\n },\n tooltip: {\n confine: true,\n trigger: 'item',\n },\n toolbox: {\n show: false,\n showTitle: false,\n feature: {\n // dataView: { readOnly: true },\n // restore: {},\n saveAsImage: {},\n },\n },\n radar: {\n // shape: 'circle',\n center: ['50%', '55%'],\n },\n },\n disabled: (selectInfos: ISelectInfos[], groupByInfos: IGroupByInfos[]) => {\n const groupByInfosLenght = groupByInfos?.length\n if (groupByInfosLenght === 1 && selectInfos.length === 1) {\n return false\n }\n return true\n },\n },\n {\n showTypeName: 'scatter-simple',\n label: '散点图',\n coverImg: '',\n showType: 11,\n subTypeList: [],\n disabled: () => false,\n baseConfig: {\n grid: {\n left: '0',\n bottom: '10px',\n containLabel: true,\n },\n tooltip: {\n showDelay: 0,\n axisPointer: {\n show: true,\n type: 'cross',\n lineStyle: {\n type: 'dashed',\n width: 1,\n },\n },\n },\n toolbox: {\n show: false,\n showTitle: false,\n feature: {\n // dataView: { readOnly: true },\n // restore: {},\n saveAsImage: {},\n },\n },\n legend: {\n type: 'scroll',\n top: '25px',\n },\n xAxis: {\n splitLine: {\n lineStyle: {\n type: 'dashed',\n },\n },\n },\n yAxis: {\n splitLine: {\n lineStyle: {\n type: 'dashed',\n },\n },\n },\n },\n },\n ],\n}\n\nexport function showTypeText(showType = 0): IconRow {\n const row = iconList.get('showType', showType)\n return row\n}\n\n// 修改默认配置\nexport function setDefaultChartOption(option: IconRow[], changeConfig: any) {\n const obj: {\n [key in IconRow['showTypeName']]: any\n } = {} as { [key in IconRow['showTypeName']]: any }\n option.forEach((item) => {\n obj[item.showTypeName] = merge(item.baseConfig, changeConfig)\n })\n return obj\n}\nexport const defaultChartOption = setDefaultChartOption(iconList.data, {\n backgroundColor: 'transparent',\n title: {\n textStyle: {\n fontSize: 14,\n lineHeight: 16,\n },\n },\n})\n// 获取地图数据(GeoJson)\n// 添加缓存对象\nconst geoJsonCache = new Map<string, GeoJson>()\n\n// 使用 ECharts 内置的中国地图数据\nfunction getBuiltinChinaMap(): GeoJson {\n try {\n // 尝试获取 ECharts 内置的中国地图数据\n const chinaMap = echarts.getMap('china')\n if (chinaMap && chinaMap.geoJson) {\n return chinaMap.geoJson as GeoJson\n }\n }\n catch (error) {\n console.warn('Failed to get builtin China map:', error)\n }\n\n // 如果获取失败,返回空的地图数据\n return {\n type: 'FeatureCollection',\n features: [],\n } as GeoJson\n}\nexport function getGeoJsonData(options: any): Promise<GeoJson> {\n let { adcode } = options\n const baseUrl = 'https://cdnfile.yaomaitong.cn/ksh/lib/geo-data'\n\n // 如果传入的是省份名称,转换为代码\n if (typeof adcode === 'string' && !adcode.match(/^\\d{6}$/) && adcode !== '中国' && adcode !== '100000') {\n adcode = getProvinceCode(adcode)\n }\n\n // 检查缓存中是否存在对应的 GeoJSON 数据\n if (geoJsonCache.has(adcode)) {\n const cachedGeoJson = geoJsonCache.get(adcode)\n if (cachedGeoJson) {\n return Promise.resolve(cachedGeoJson)\n }\n }\n\n // 构建基础 URL\n return (async () => {\n try {\n // 方案1: 使用本地地图数据\n if (adcode === '中国' || adcode === '100000') {\n try {\n // 优先尝试本地中国地图数据\n const response = await fetch(`${baseUrl}/china.json`)\n if (response.ok) {\n const chinaData = await response.json()\n geoJsonCache.set(adcode, chinaData)\n return chinaData\n }\n }\n catch (error) {\n console.warn('Failed to load local China map data:', error)\n }\n }\n\n // 方案2: 使用本地省级地图数据\n if (isProvinceCode(adcode)) {\n try {\n const response = await fetch(`${baseUrl}/${adcode}.json`)\n if (response.ok) {\n const geoJson = await response.json()\n if (geoJson && geoJson.features && geoJson.features.length > 0) {\n geoJsonCache.set(adcode, geoJson)\n return geoJson\n }\n }\n }\n catch (error) {\n console.warn('Failed to load local province map data:', error)\n }\n }\n\n // 方案3: 使用内置的中国地图数据作为备用\n const builtinMap = getBuiltinChinaMap()\n geoJsonCache.set(adcode, builtinMap)\n return builtinMap\n }\n catch (error) {\n console.error('All map data sources failed, using simple fallback:', error)\n const builtinMap = getBuiltinChinaMap()\n geoJsonCache.set(adcode, builtinMap)\n return builtinMap\n }\n })()\n}\n"],"names":["iconList","get","type","arguments","length","undefined","value","data","find","item","toString","showTypeName","label","coverImg","disabled","subTypeList","showType","baseConfig","icon","tooltipContent","tooltip","confine","trigger","axisPointer","toolbox","show","showTitle","feature","saveAsImage","legend","top","grid","left","bottom","containLabel","xAxis","boundaryGap","yAxis","dataZoom","_","groupByInfos","groupByInfosLenght","axisLabel","showMaxLabel","axisTick","alignWithLabel","formatter","selectInfos","selectInfosLength","visualMap","text","realtime","calculable","inRange","color","flag","some","_ref","colDesc","includes","orient","radar","center","showDelay","lineStyle","width","splitLine","showTypeText","setDefaultChartOption","option","changeConfig","obj","forEach","merge","defaultChartOption","backgroundColor","title","textStyle","fontSize","lineHeight","geoJsonCache","Map","getBuiltinChinaMap","chinaMap","echarts","getMap","geoJson","error","console","warn","features","getGeoJsonData","options","adcode","baseUrl","match","getProvinceCode","has","cachedGeoJson","Promise","resolve","response","fetch","ok","chinaData","json","set","isProvinceCode","builtinMap"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.mjs","sources":["../../../../../../../packages/components/src/data-chart/src/utils/config.ts"],"sourcesContent":["import type { GeoJson, IconRow, IGroupByInfos, ISelectInfos } from './types'\nimport * as echarts from 'echarts'\nimport { merge } from 'lodash-es'\nimport { getProvinceCode, isProvinceCode } from './mapData'\n\n/**\n * 禁用功能函数\n * 判断当前图表类型是否被禁用\n * 调用时机:渲染页面\n * @param {object} selectInfos 选择信息\n * @param {object} groupByInfos 分组信息\n * @param {Message[]|Message} data 数据\n * @returns Boolean 布尔值\n */\nexport const iconList: {\n data: IconRow[]\n get: (type: keyof IconRow, value: any) => IconRow\n} = {\n get: (type: keyof IconRow = 'showTypeName', value: any = 'table') => {\n return iconList.data.find(item => item[type].toString() === value || item[type] === value)!\n },\n data: [\n {\n showTypeName: 'table',\n label: '表格',\n coverImg: 'table.png',\n disabled: () => false,\n subTypeList: [],\n showType: 0,\n baseConfig: {},\n },\n {\n showTypeName: 'line',\n label: '折线图',\n coverImg: 'line-stack.png',\n showType: 1,\n subTypeList: [\n {\n value: 'line-simple',\n icon: 'line-smooth',\n tooltipContent: '折线图',\n },\n {\n value: 'area-basic',\n icon: 'chart-line-area',\n tooltipContent: '折线面积图',\n },\n ],\n baseConfig: {\n tooltip: {\n confine: false,\n trigger: 'axis',\n axisPointer: {\n type: 'line',\n },\n },\n toolbox: {\n show: false,\n showTitle: false,\n feature: {\n // dataView: { readOnly: true },\n // restore: {},\n saveAsImage: {},\n },\n },\n legend: {\n type: 'scroll',\n top: '25px',\n },\n grid: {\n left: '0',\n bottom: '10px',\n containLabel: true,\n },\n xAxis: {\n type: 'category',\n boundaryGap: false,\n },\n yAxis: {\n type: 'value',\n },\n dataZoom: [\n {\n type: 'inside',\n },\n ],\n },\n disabled: (_: ISelectInfos[], groupByInfos: IGroupByInfos[]) => {\n const groupByInfosLenght = groupByInfos?.length\n if (groupByInfosLenght >= 1 && groupByInfosLenght < 2) {\n return false\n }\n return true\n },\n },\n {\n showTypeName: 'bar',\n label: '柱状图',\n coverImg: 'bar-tick-align.png',\n showType: 2,\n baseConfig: {\n legend: {\n type: 'scroll',\n top: '25px',\n },\n tooltip: {\n confine: false,\n trigger: 'axis',\n axisPointer: {\n type: 'shadow',\n },\n },\n toolbox: {\n show: false,\n showTitle: false,\n feature: {\n // dataView: { readOnly: true },\n // restore: {},\n saveAsImage: {},\n // myFull: { // 全屏\n // show: true,\n // title: '全屏',\n // icon: 'path://...',\n // }\n },\n },\n grid: {\n left: '0',\n bottom: '20px',\n containLabel: true,\n },\n xAxis: {\n axisLabel: {\n showMaxLabel: true,\n },\n axisTick: {\n alignWithLabel: true,\n },\n },\n yAxis: {},\n dataZoom: [\n {\n type: 'inside',\n },\n ],\n },\n subTypeList: [\n {\n value: 'bar-simple',\n icon: 'bar-simple',\n tooltipContent: '垂直条形图',\n },\n {\n value: 'bar-y-category',\n icon: 'bar-y-category',\n tooltipContent: '水平条形图',\n },\n ],\n disabled: (_: ISelectInfos[], groupByInfos: IGroupByInfos[]) => {\n const groupByInfosLenght = groupByInfos?.length\n if (groupByInfosLenght >= 1) {\n return false\n }\n return true\n },\n },\n {\n showTypeName: 'pie',\n label: '饼图',\n coverImg: 'pie-simple.png',\n showType: 4,\n subTypeList: [\n {\n value: 'pie-simple',\n icon: 'pie-simple',\n tooltipContent: '饼图',\n },\n {\n value: 'pie-borderRadius',\n icon: 'pie-borderRadius',\n tooltipContent: '环形图',\n },\n ],\n baseConfig: {\n tooltip: {\n confine: true,\n formatter: '{a}<br>{b}: {c}({d}%)',\n trigger: 'item',\n },\n toolbox: {\n show: false,\n showTitle: false,\n feature: {\n // dataView: { readOnly: true },\n // restore: {},\n saveAsImage: {},\n },\n },\n legend: {\n type: 'scroll',\n top: '25px',\n },\n },\n disabled: (selectInfos: ISelectInfos[], groupByInfos: IGroupByInfos[]) => {\n const groupByInfosLenght = groupByInfos?.length\n const selectInfosLength = selectInfos?.length\n if (selectInfosLength <= 4 && groupByInfosLenght > 0 && groupByInfosLenght <= 1) {\n return false\n }\n return true\n },\n },\n {\n showTypeName: 'area',\n label: '地图',\n coverImg: 'area.png',\n showType: 5,\n subTypeList: [],\n baseConfig: {\n tooltip: {\n confine: true,\n trigger: 'item',\n },\n toolbox: {\n show: false,\n showTitle: false,\n feature: {\n // dataView: { readOnly: true },\n // restore: {},\n saveAsImage: {},\n },\n },\n visualMap: {\n text: ['高', '低'],\n realtime: false,\n calculable: true,\n inRange: {\n color: ['#E8F4FD', '#B8D4F7', '#7BA4F0', '#4A7BE8', '#3562e1'],\n },\n },\n },\n disabled: (_: ISelectInfos[], groupByInfos: IGroupByInfos[]) => {\n const groupByInfosLenght = groupByInfos?.length\n const flag = groupByInfos?.some(({ colDesc }) => (colDesc.includes('省') || colDesc.includes('市')))\n if (flag && groupByInfosLenght > 0) {\n return false\n }\n return true\n },\n },\n {\n showTypeName: 'funnel',\n label: '漏斗图',\n coverImg: 'funnel.png',\n showType: 6,\n subTypeList: [],\n baseConfig: {\n tooltip: {\n confine: true,\n trigger: 'item',\n formatter: '{a} <br/>{b} : {c}',\n },\n toolbox: {\n show: false,\n showTitle: false,\n feature: {\n // dataView: { readOnly: true },\n // restore: {},\n saveAsImage: {},\n },\n },\n legend: {\n type: 'scroll',\n top: 20,\n },\n },\n disabled: (selectInfos: ISelectInfos[], groupByInfos: IGroupByInfos[]) => {\n const groupByInfosLenght = groupByInfos?.length\n const selectInfosLength = selectInfos?.length\n if (selectInfosLength <= 5 && groupByInfosLenght > 0 && groupByInfosLenght <= 1) {\n return false\n }\n return true\n },\n },\n\n // { label: 'scatter', value: 7 },\n {\n showTypeName: 'card',\n label: '卡片',\n coverImg: 'card.png',\n showType: 9,\n subTypeList: [],\n baseConfig: {},\n disabled: (selectInfos: ISelectInfos[], groupByInfos: IGroupByInfos[]) => {\n const groupByInfosLenght = groupByInfos?.length\n const selectInfosLength = selectInfos?.length\n if (selectInfosLength > 0 && groupByInfosLenght <= 1) {\n return false\n }\n return true\n },\n },\n {\n showTypeName: 'radar',\n label: '雷达图',\n coverImg: 'radar.png',\n showType: 10,\n subTypeList: [],\n baseConfig: {\n legend: {\n type: 'scroll',\n orient: 'vertical',\n left: 'left',\n top: '25px',\n },\n tooltip: {\n confine: true,\n trigger: 'item',\n },\n toolbox: {\n show: false,\n showTitle: false,\n feature: {\n // dataView: { readOnly: true },\n // restore: {},\n saveAsImage: {},\n },\n },\n radar: {\n // shape: 'circle',\n center: ['50%', '55%'],\n },\n },\n disabled: (selectInfos: ISelectInfos[], groupByInfos: IGroupByInfos[]) => {\n const groupByInfosLenght = groupByInfos?.length\n if (groupByInfosLenght === 1 && selectInfos.length === 1) {\n return false\n }\n return true\n },\n },\n {\n showTypeName: 'scatter-simple',\n label: '散点图',\n coverImg: '',\n showType: 11,\n subTypeList: [],\n disabled: () => false,\n baseConfig: {\n grid: {\n left: '0',\n bottom: '10px',\n containLabel: true,\n },\n tooltip: {\n showDelay: 0,\n axisPointer: {\n show: true,\n type: 'cross',\n lineStyle: {\n type: 'dashed',\n width: 1,\n },\n },\n },\n toolbox: {\n show: false,\n showTitle: false,\n feature: {\n // dataView: { readOnly: true },\n // restore: {},\n saveAsImage: {},\n },\n },\n legend: {\n type: 'scroll',\n top: '25px',\n },\n xAxis: {\n splitLine: {\n lineStyle: {\n type: 'dashed',\n },\n },\n },\n yAxis: {\n splitLine: {\n lineStyle: {\n type: 'dashed',\n },\n },\n },\n },\n },\n ],\n}\n\nexport function showTypeText(showType = 0): IconRow {\n const row = iconList.get('showType', showType)\n return row\n}\n\n// 修改默认配置\nexport function setDefaultChartOption(option: IconRow[], changeConfig: any) {\n const obj: {\n [key in IconRow['showTypeName']]: any\n } = {} as { [key in IconRow['showTypeName']]: any }\n option.forEach((item) => {\n obj[item.showTypeName] = merge(item.baseConfig, changeConfig)\n })\n return obj\n}\nexport const defaultChartOption = setDefaultChartOption(iconList.data, {\n backgroundColor: 'transparent',\n title: {\n textStyle: {\n fontSize: 14,\n lineHeight: 16,\n },\n },\n})\n// 获取地图数据(GeoJson)\n// 添加缓存对象\nconst geoJsonCache = new Map<string, GeoJson>()\n\n// 使用 ECharts 内置的中国地图数据\nfunction getBuiltinChinaMap(): GeoJson {\n try {\n // 尝试获取 ECharts 内置的中国地图数据\n const chinaMap = echarts.getMap('china')\n if (chinaMap && chinaMap.geoJson) {\n return chinaMap.geoJson as GeoJson\n }\n }\n catch (error) {\n console.warn('Failed to get builtin China map:', error)\n }\n\n // 如果获取失败,返回空的地图数据\n return {\n type: 'FeatureCollection',\n features: [],\n } as GeoJson\n}\nexport function getGeoJsonData(options: any): Promise<GeoJson> {\n let { adcode } = options\n const baseUrl = 'https://cdnfile.yaomaitong.cn/ksh/lib/geo-data'\n\n // 如果传入的是省份名称,转换为代码\n if (typeof adcode === 'string' && !adcode.match(/^\\d{6}$/) && adcode !== '中国' && adcode !== '100000') {\n adcode = getProvinceCode(adcode)\n }\n\n // 检查缓存中是否存在对应的 GeoJSON 数据\n if (geoJsonCache.has(adcode)) {\n const cachedGeoJson = geoJsonCache.get(adcode)\n if (cachedGeoJson) {\n return Promise.resolve(cachedGeoJson)\n }\n }\n\n // 构建基础 URL\n return (async () => {\n try {\n // 方案1: 使用本地地图数据\n if (adcode === '中国' || adcode === '100000') {\n try {\n // 优先尝试本地中国地图数据\n const response = await fetch(`${baseUrl}/china.json`)\n if (response.ok) {\n const chinaData = await response.json()\n geoJsonCache.set(adcode, chinaData)\n return chinaData\n }\n }\n catch (error) {\n console.warn('Failed to load local China map data:', error)\n }\n }\n\n // 方案2: 使用本地省级地图数据\n if (isProvinceCode(adcode)) {\n try {\n const response = await fetch(`${baseUrl}/${adcode}.json`)\n if (response.ok) {\n const geoJson = await response.json()\n if (geoJson && geoJson.features && geoJson.features.length > 0) {\n geoJsonCache.set(adcode, geoJson)\n return geoJson\n }\n }\n }\n catch (error) {\n console.warn('Failed to load local province map data:', error)\n }\n }\n\n // 方案3: 使用内置的中国地图数据作为备用\n const builtinMap = getBuiltinChinaMap()\n geoJsonCache.set(adcode, builtinMap)\n return builtinMap\n }\n catch (error) {\n console.error('All map data sources failed, using simple fallback:', error)\n const builtinMap = getBuiltinChinaMap()\n geoJsonCache.set(adcode, builtinMap)\n return builtinMap\n }\n })()\n}\n"],"names":["iconList","get","type","arguments","length","undefined","value","data","find","item","toString","showTypeName","label","coverImg","disabled","subTypeList","showType","baseConfig","icon","tooltipContent","tooltip","confine","trigger","axisPointer","toolbox","show","showTitle","feature","saveAsImage","legend","top","grid","left","bottom","containLabel","xAxis","boundaryGap","yAxis","dataZoom","_","groupByInfos","groupByInfosLenght","axisLabel","showMaxLabel","axisTick","alignWithLabel","formatter","selectInfos","selectInfosLength","visualMap","text","realtime","calculable","inRange","color","flag","some","_ref","colDesc","includes","orient","radar","center","showDelay","lineStyle","width","splitLine","showTypeText","setDefaultChartOption","option","changeConfig","obj","forEach","merge","defaultChartOption","backgroundColor","title","textStyle","fontSize","lineHeight","geoJsonCache","Map","getBuiltinChinaMap","chinaMap","echarts","getMap","geoJson","error","features","getGeoJsonData","options","adcode","baseUrl","match","getProvinceCode","has","cachedGeoJson","Promise","resolve","response","fetch","ok","chinaData","json","set","isProvinceCode","builtinMap"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function
|
|
1
|
+
function t(t,e){const n={...{Math:Math,Date:Date,Array:Array,Object:Object,String:String,Number:Number,Boolean:Boolean,console:console,JSON:JSON},config:{...e}},o=new Proxy(n,{has:(t,e)=>!0,get:(t,e)=>{if("symbol"==typeof e){if(e===Symbol.unscopables)return;return Reflect.get(t,e)}return t[e]}});try{const e=`with (sandbox) { ${t} }`;return new Function("sandbox",e)(o),o.config}catch(t){return e}}export{t as safeEvalConfig};
|
|
2
2
|
//# sourceMappingURL=safe-eval.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-eval.mjs","sources":["../../../../../../../packages/components/src/data-chart/src/utils/safe-eval.ts"],"sourcesContent":["import type { EChartsOption } from './types'\n\n/**\n * 安全的配置处理函数\n * @param jsCode - JavaScript 代码片段\n * @param config - ECharts 配置对象\n * @returns 处理后的配置对象\n */\nexport function safeEvalConfig(jsCode: string, config: EChartsOption): EChartsOption {\n // 预定义允许的操作和函数\n const allowedGlobals = {\n Math,\n Date,\n Array,\n Object,\n String,\n Number,\n Boolean,\n console,\n JSON,\n }\n\n // 创建安全的执行环境\n const sandbox = {\n ...allowedGlobals,\n config: { ...config },\n }\n\n // 使用 with 和 Proxy 创建安全的执行环境\n const handler: ProxyHandler<typeof sandbox> = {\n has: (_target, _key) => {\n return true // 使所有变量查找都在 sandbox 中\n },\n get: (target, key) => {\n // 处理 Symbol 类型的 key\n if (typeof key === 'symbol') {\n if (key === Symbol.unscopables) {\n return undefined\n }\n return Reflect.get(target, key)\n }\n return target[key as keyof typeof target]\n },\n }\n\n const proxiedSandbox = new Proxy(sandbox, handler)\n\n try {\n // 使用 with 语句创建局部作用域\n const code = `with (sandbox) { ${jsCode} }`\n // eslint-disable-next-line no-new-func\n const fn = new Function('sandbox', code)\n fn(proxiedSandbox)\n\n return proxiedSandbox.config as EChartsOption\n }\n catch (error) {\n console.error('配置处理失败:', error)\n return config\n }\n}\n"],"names":["safeEvalConfig","jsCode","config","sandbox","Math","Date","Array","Object","String","Number","Boolean","console","JSON","proxiedSandbox","Proxy","has","_target","_key","get","target","key","Symbol","unscopables","Reflect","code","Function","fn","error"],"mappings":"AAQO,SAASA,EAAeC,EAAgBC,GAE7C,MAaMC,EAAU,IAbO,CACrBC,UACAC,UACAC,YACAC,cACAC,cACAC,cACAC,gBACAC,gBACAC,WAMAV,OAAQ,IAAKA,IAoBTW,EAAiB,IAAIC,MAAMX,EAhBa,CAC5CY,IAAKA,CAACC,EAASC,KACN,EAETC,IAAKA,CAACC,EAAQC,KAEZ,GAAmB,iBAARA,EAAkB,CAC3B,GAAIA,IAAQC,OAAOC,YACjB,OAEF,OAAOC,QAAQL,IAAIC,EAAQC,EAC7B,CACA,OAAOD,EAAOC,MAMlB,IAEE,MAAMI,EAAO,oBAAoBvB,MAKjC,OAHW,IAAIwB,SAAS,UAAWD,EACnCE,CAAGb,GAEIA,EAAeX,MACxB,OACOyB,GAEL,
|
|
1
|
+
{"version":3,"file":"safe-eval.mjs","sources":["../../../../../../../packages/components/src/data-chart/src/utils/safe-eval.ts"],"sourcesContent":["import type { EChartsOption } from './types'\n\n/**\n * 安全的配置处理函数\n * @param jsCode - JavaScript 代码片段\n * @param config - ECharts 配置对象\n * @returns 处理后的配置对象\n */\nexport function safeEvalConfig(jsCode: string, config: EChartsOption): EChartsOption {\n // 预定义允许的操作和函数\n const allowedGlobals = {\n Math,\n Date,\n Array,\n Object,\n String,\n Number,\n Boolean,\n console,\n JSON,\n }\n\n // 创建安全的执行环境\n const sandbox = {\n ...allowedGlobals,\n config: { ...config },\n }\n\n // 使用 with 和 Proxy 创建安全的执行环境\n const handler: ProxyHandler<typeof sandbox> = {\n has: (_target, _key) => {\n return true // 使所有变量查找都在 sandbox 中\n },\n get: (target, key) => {\n // 处理 Symbol 类型的 key\n if (typeof key === 'symbol') {\n if (key === Symbol.unscopables) {\n return undefined\n }\n return Reflect.get(target, key)\n }\n return target[key as keyof typeof target]\n },\n }\n\n const proxiedSandbox = new Proxy(sandbox, handler)\n\n try {\n // 使用 with 语句创建局部作用域\n const code = `with (sandbox) { ${jsCode} }`\n // eslint-disable-next-line no-new-func\n const fn = new Function('sandbox', code)\n fn(proxiedSandbox)\n\n return proxiedSandbox.config as EChartsOption\n }\n catch (error) {\n console.error('配置处理失败:', error)\n return config\n }\n}\n"],"names":["safeEvalConfig","jsCode","config","sandbox","Math","Date","Array","Object","String","Number","Boolean","console","JSON","proxiedSandbox","Proxy","has","_target","_key","get","target","key","Symbol","unscopables","Reflect","code","Function","fn","error"],"mappings":"AAQO,SAASA,EAAeC,EAAgBC,GAE7C,MAaMC,EAAU,IAbO,CACrBC,UACAC,UACAC,YACAC,cACAC,cACAC,cACAC,gBACAC,gBACAC,WAMAV,OAAQ,IAAKA,IAoBTW,EAAiB,IAAIC,MAAMX,EAhBa,CAC5CY,IAAKA,CAACC,EAASC,KACN,EAETC,IAAKA,CAACC,EAAQC,KAEZ,GAAmB,iBAARA,EAAkB,CAC3B,GAAIA,IAAQC,OAAOC,YACjB,OAEF,OAAOC,QAAQL,IAAIC,EAAQC,EAC7B,CACA,OAAOD,EAAOC,MAMlB,IAEE,MAAMI,EAAO,oBAAoBvB,MAKjC,OAHW,IAAIwB,SAAS,UAAWD,EACnCE,CAAGb,GAEIA,EAAeX,MACxB,OACOyB,GAEL,OAAOzB,CACT,CACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useMouseInElement as e,watchDebounced as t,useElementSize as i}from"@vueuse/core";import*as
|
|
1
|
+
import{useMouseInElement as e,watchDebounced as t,useElementSize as i}from"@vueuse/core";import*as s from"echarts";import{onMounted as n,nextTick as o,onUnmounted as r}from"vue";import a from"../components/empty.svg.mjs";var c=Object.defineProperty,l=(e,t,i)=>((e,t,i)=>t in e?c(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i)(e,"symbol"!=typeof t?t+"":t,i);const u=new class{constructor(){l(this,"observer",null),l(this,"callbacks",new Map)}createObserver(){return"undefined"==typeof IntersectionObserver?null:new IntersectionObserver(e=>{for(const t of e)if(t.isIntersecting){const e=this.callbacks.get(t.target);e&&(e(),this.unobserve(t.target))}},{threshold:0,rootMargin:"200px"})}observe(e,t){this.observer||(this.observer=this.createObserver()),this.observer&&(this.callbacks.set(e,t),this.observer.observe(e))}unobserve(e){this.observer&&(this.observer.unobserve(e),this.callbacks.delete(e))}disconnect(){this.observer&&(this.observer.disconnect(),this.callbacks.clear(),this.observer=null)}};function f(i){let{chartDOM:c,chartData:l,chartOptions:f,initBefore:d,initAfter:v,lazyLoad:b=!0}=i,p=null,g=!1,m=null,w=[];const y=window.devicePixelRatio||1;function D(){if(p){try{p.isDisposed()||p.dispose()}catch(e){}p=null}}function x(){if(!p||p.isDisposed()){if(!c.value)return null;const{clientWidth:e,clientHeight:t}=c.value;if(0===e||0===t)return null;p=s.init(c.value,null,{devicePixelRatio:y,renderer:"svg"})}return p}function O(){c.value&&u.unobserve(c.value)}function k(){if(w.length>0)return;const{isOutside:i}=e(c),s=t(i,e=>{"boolean"==typeof e&&p&&!p.isDisposed()&&function(e){if(p&&!p.isDisposed())try{p.setOption({toolbox:{show:e}})}catch(e){}}(!e)},{debounce:200}),n=t(()=>f.value,async()=>{await async function(){for(var e=arguments.length,t=new Array(e),i=0;i<e;i++)t[i]=arguments[i];try{p&&!p.isDisposed()||await M(),p?.showLoading(),l.value?.data?.length?(!0===g&&(t[1]||(t[1]={}),t[1].notMerge=!0),g=!1):t=await R(),p?.setOption(...t)}catch(e){p&&!p.isDisposed()&&D(),x(),t=await R("配置项错误"),p?.setOption(...t)}finally{p?.hideLoading()}}(f.value)},{debounce:500,deep:!0,immediate:!0});w.push(s,n)}async function z(){await o();const{clientWidth:e,clientHeight:t}=c.value||{clientWidth:0,clientHeight:0};if(e>0&&t>0){x()&&(v&&v(p),p&&!p.isDisposed()&&h(p,c),k()),O()}else!function(){if(!c.value||"undefined"==typeof ResizeObserver)return;m=new ResizeObserver(e=>{for(const t of e){const{width:e,height:i}=t.contentRect;if(e>0&&i>0){x()&&(v&&v(p),p&&!p.isDisposed()&&h(p,c),k()),m?.disconnect(),m=null,O();break}}}),m.observe(c.value)}()}async function M(){return c.value?(await o(),b?(c.value&&u.observe(c.value,()=>{z()}),p):(await z(),p)):p}function R(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"暂无数据";return new Promise(t=>{const i=new Image;i.src=a,i.onload=()=>{const s=i.width/i.height,n={title:[{text:l.value?.modelName,...f.value.title},{subtext:e,top:"center",left:"center",text:"{a|}",itemGap:-20,subtextStyle:{fontSize:14},textStyle:{align:"center",rich:{a:{height:100/s,width:100,backgroundColor:{image:a}}}}}]};g=!0,t([n,{notMerge:!0,replaceMerge:["xAxis","yAxis","series"],lazyUpdate:!1}])}})}return n(async()=>{d&&await d(),await o(),await M(),p&&!p.isDisposed()&&(v&&v(p),h(p,c),k())}),r(()=>{if(w.forEach(e=>e()),w=[],m&&(m.disconnect(),m=null),O(),p&&!p.isDisposed())try{p.getZr()?.off("mousemove"),p.getZr()?.off("mouseout"),p.getZr()?.off("click"),p.off("click"),D()}catch(e){}}),{myChart:()=>p}}function h(e,s){const{width:n,height:o}=i(s);t([n,o],()=>{if(e&&!e.isDisposed())try{e.resize()}catch(e){}})}function d(e){const{desc:{colDesc:t=[],groupByDesc:i=[]}={},data:s=[]}=e,n=[...i.map(e=>e.colDesc),...t].filter(e=>e),o=s.map(e=>n.map(t=>e[t]||""));return[n,...o]}export{f as useCharts,d as useDataToExcelJson,h as useResize};
|
|
2
2
|
//# sourceMappingURL=useCharts.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCharts.mjs","sources":["../../../../../../../packages/components/src/data-chart/src/utils/useCharts.ts"],"sourcesContent":["import type { ECharts, SetOptionOpts } from 'echarts'\nimport type { Ref } from 'vue'\nimport type { EChartData, EChartsOption, IFormatPublicData } from './types'\nimport { useElementSize, useMouseInElement, watchDebounced } from '@vueuse/core'\nimport * as echarts from 'echarts'\nimport { nextTick, onMounted, onUnmounted } from 'vue'\n\n// 使用别名路径导入 SVG\nimport emptyImg from '../components/empty.svg'\n\n// 全局 IntersectionObserver 管理器\nclass IntersectionObserverManager {\n private observer: IntersectionObserver | null = null\n private callbacks = new Map<Element, () => void>()\n\n private createObserver() {\n if (typeof IntersectionObserver === 'undefined') {\n return null\n }\n\n return new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n const callback = this.callbacks.get(entry.target)\n if (callback) {\n callback()\n // 执行回调后移除监听,避免重复初始化\n this.unobserve(entry.target)\n }\n }\n }\n },\n {\n threshold: 0,\n rootMargin: '200px',\n },\n )\n }\n\n observe(element: Element, callback: () => void) {\n if (!this.observer) {\n this.observer = this.createObserver()\n }\n\n if (this.observer) {\n this.callbacks.set(element, callback)\n this.observer.observe(element)\n }\n }\n\n unobserve(element: Element) {\n if (this.observer) {\n this.observer.unobserve(element)\n this.callbacks.delete(element)\n }\n }\n\n disconnect() {\n if (this.observer) {\n this.observer.disconnect()\n this.callbacks.clear()\n this.observer = null\n }\n }\n}\n\n// 全局单例实例\nconst globalIntersectionObserver = new IntersectionObserverManager()\n\nexport function useCharts({ chartDOM, chartData, chartOptions, initBefore, initAfter, lazyLoad = true }: {\n chartDOM: Ref<HTMLElement | null>\n chartData: Ref<IFormatPublicData>\n chartOptions: Ref<EChartsOption>\n initBefore?: () => Promise<void>\n initAfter?: (e: ECharts | null) => void\n lazyLoad?: boolean\n}) {\n // 每个组件实例的独立状态\n let myChart: ECharts | null = null\n let isEmpty = false\n let resizeObserver: ResizeObserver | null = null\n let watchStopHandles: Array<() => void> = [] // 存储 watch 停止函数\n\n // 获取设备像素比\n const dpr = window.devicePixelRatio || 1\n\n function disposeChart() {\n if (myChart) {\n try {\n if (!myChart.isDisposed()) {\n myChart.dispose()\n }\n }\n catch (error) {\n console.warn('Error disposing chart:', error)\n }\n myChart = null\n }\n }\n\n function initChart() {\n if (!(myChart && !myChart.isDisposed())) {\n // 检查 DOM 元素是否存在\n if (!chartDOM.value) {\n console.warn('[ECharts] DOM element not found')\n return null\n }\n\n // 检查容器尺寸\n const { clientWidth, clientHeight } = chartDOM.value\n if (clientWidth === 0 || clientHeight === 0) {\n // 如果容器没有尺寸,返回 null 而不是强制初始化\n console.warn('[ECharts] Container has zero size. Width:', clientWidth, 'Height:', clientHeight, '. Skipping initialization.')\n return null\n }\n\n // 创建 ECharts 实例\n myChart = echarts.init(chartDOM.value, null, {\n devicePixelRatio: dpr,\n renderer: 'svg',\n })\n }\n return myChart\n }\n\n // 清理所有观察器\n function cleanupObservers() {\n // 从全局观察器中移除当前元素\n if (chartDOM.value) {\n globalIntersectionObserver.unobserve(chartDOM.value)\n }\n }\n\n // 初始化 watchDebounced 监听器\n function setupWatchers() {\n if (watchStopHandles.length > 0) {\n return // 已经设置过了,避免重复设置\n }\n\n // 鼠标悬停监听\n const { isOutside: mouseInChart } = useMouseInElement(chartDOM)\n const stopMouseWatch = watchDebounced(mouseInChart, (newVal) => {\n if (typeof newVal !== 'boolean' || (!myChart || myChart.isDisposed())) {\n return\n }\n toggleToolbox(!newVal)\n }, { debounce: 200 })\n\n // 图表选项监听\n const stopOptionsWatch = watchDebounced(\n () => chartOptions.value,\n async () => {\n await renderChart(chartOptions.value)\n },\n { debounce: 500, deep: true, immediate: true },\n )\n\n watchStopHandles.push(stopMouseWatch, stopOptionsWatch)\n }\n\n // 开始初始化流程\n async function startInitialization() {\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 检查容器是否已经有尺寸\n const { clientWidth, clientHeight } = chartDOM.value || { clientWidth: 0, clientHeight: 0 }\n if (clientWidth > 0 && clientHeight > 0) {\n // 直接初始化\n const chart = initChart()\n if (chart) {\n if (initAfter) {\n initAfter(myChart)\n }\n if (myChart && !myChart.isDisposed()) {\n useResize(myChart, chartDOM)\n }\n // 图表初始化成功后,设置监听器\n setupWatchers()\n }\n // 初始化成功后清理观察器\n cleanupObservers()\n }\n else {\n // 如果没有尺寸,使用 ResizeObserver 等待\n setupResizeObserver()\n }\n }\n\n // 使用全局 IntersectionObserver 监听元素是否进入可视区域\n function setupIntersectionObserver() {\n if (!chartDOM.value) {\n return\n }\n\n // 使用全局观察器,避免重复创建\n globalIntersectionObserver.observe(chartDOM.value, () => {\n startInitialization()\n })\n }\n\n // 使用 ResizeObserver 监听容器尺寸变化\n function setupResizeObserver() {\n if (!chartDOM.value || typeof ResizeObserver === 'undefined') {\n return\n }\n\n resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect\n if (width > 0 && height > 0) {\n // 容器有尺寸了,可以安全初始化\n const chart = initChart()\n if (chart) {\n if (initAfter) {\n initAfter(myChart)\n }\n // 设置 resize 监听\n if (myChart && !myChart.isDisposed()) {\n useResize(myChart, chartDOM)\n }\n // 图表初始化成功后,设置监听器\n setupWatchers()\n }\n // 初始化后停止观察并清理其他观察器\n resizeObserver?.disconnect()\n resizeObserver = null\n cleanupObservers()\n break\n }\n }\n })\n\n resizeObserver.observe(chartDOM.value)\n }\n\n // 安全的初始化函数\n async function safeInitChart() {\n if (!chartDOM.value) {\n return myChart\n }\n\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 如果启用了懒加载\n if (lazyLoad) {\n // 直接设置 IntersectionObserver,让它检测元素是否进入可视区域\n setupIntersectionObserver()\n return myChart\n }\n\n // 非懒加载模式,直接开始初始化流程\n await startInitialization()\n\n return myChart\n }\n\n async function renderChart(...opt: [EChartsOption, SetOptionOpts?]) {\n try {\n // 确保图表已初始化\n if (!myChart || myChart.isDisposed()) {\n await safeInitChart()\n }\n\n myChart?.showLoading()\n if (chartData.value?.data?.length) {\n if (isEmpty === true) {\n if (!opt[1]) {\n opt[1] = {}\n }\n opt[1].notMerge = true\n }\n isEmpty = false\n }\n else {\n // 数据为空时保持原有配置\n opt = await setEmpty()\n }\n myChart?.setOption(...opt)\n }\n catch (error) {\n console.log(`🚀 ~ renderChart ~ error:`, error)\n if (myChart && !myChart.isDisposed()) {\n disposeChart()\n }\n // 如果实例已被销毁,重新创建\n initChart()\n opt = await setEmpty('配置项错误')\n myChart?.setOption(...opt)\n }\n finally {\n myChart?.hideLoading()\n }\n }\n\n function setEmpty(subtext = '暂无数据'): Promise<[EChartsOption, SetOptionOpts]> {\n return new Promise((resolve) => {\n const img = new Image()\n img.src = emptyImg\n\n img.onload = () => {\n const aspectRatio = img.width / img.height\n\n const obj: EChartsOption = {\n title: [{\n text: chartData.value?.modelName,\n ...chartOptions.value.title,\n }, {\n subtext,\n top: 'center',\n left: 'center',\n text: '{a|}',\n itemGap: -20,\n subtextStyle: {\n fontSize: 14,\n },\n textStyle: {\n align: 'center',\n rich: {\n a: {\n height: 100 / aspectRatio,\n width: 100,\n backgroundColor: {\n image: emptyImg,\n },\n },\n },\n },\n }],\n }\n isEmpty = true\n resolve([obj, {\n notMerge: true,\n replaceMerge: ['xAxis', 'yAxis', 'series'],\n lazyUpdate: false,\n }])\n }\n })\n }\n\n function toggleToolbox(show: boolean) {\n // 修改条件判断,移除 isDisposed 检查\n if (myChart && !myChart.isDisposed()) {\n try {\n myChart.setOption({\n toolbox: {\n show,\n },\n })\n }\n catch (error) {\n console.warn('Error toggling toolbox:', error)\n }\n }\n }\n\n // 移除这里的 watchDebounced 调用,改为在图表初始化后调用\n\n onMounted(async () => {\n if (initBefore) {\n await initBefore()\n }\n\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 使用安全的初始化函数\n await safeInitChart()\n\n // 如果图表已经初始化(容器有尺寸),调用 initAfter 和设置 resize\n if (myChart && !myChart.isDisposed()) {\n if (initAfter) {\n initAfter(myChart)\n }\n useResize(myChart, chartDOM)\n // 图表初始化成功后,设置监听器\n setupWatchers()\n }\n })\n\n onUnmounted(() => {\n // 停止所有 watch 监听器\n watchStopHandles.forEach(stop => stop())\n watchStopHandles = []\n\n // 清理 ResizeObserver\n if (resizeObserver) {\n resizeObserver.disconnect()\n resizeObserver = null\n }\n\n // 清理全局 IntersectionObserver 中的当前元素\n cleanupObservers()\n\n if (myChart && !myChart.isDisposed()) {\n try {\n // 清理所有事件监听器\n myChart.getZr()?.off('mousemove')\n myChart.getZr()?.off('mouseout')\n myChart.getZr()?.off('click')\n myChart.off('click')\n disposeChart()\n }\n catch (error) {\n console.warn('Error during chart cleanup:', error)\n }\n }\n })\n\n return {\n myChart: () => myChart,\n }\n}\n\nexport function useResize(myChart: ECharts, chartDOM: Ref<HTMLElement | null>) {\n const { width, height } = useElementSize(chartDOM)\n watchDebounced([width, height], () => {\n if (myChart && !myChart.isDisposed()) {\n try {\n myChart.resize()\n }\n catch (error) {\n console.warn('Error during chart resize:', error)\n }\n }\n })\n}\n\nexport function useDataToExcelJson(dataSource: EChartData) {\n const { desc: { colDesc = [], groupByDesc = [] } = {}, data = [] } = dataSource\n const header = [...groupByDesc.map(item => item.colDesc), ...colDesc].filter(v => v) as string[]\n const json = data.map((item) => {\n return header.map((headerItem) => {\n return item[headerItem as keyof typeof item] || ''\n })\n })\n return [header, ...json]\n}\n"],"names":["globalIntersectionObserver","constructor","__publicField","this","Map","createObserver","IntersectionObserver","entries","entry","isIntersecting","callback","callbacks","get","target","unobserve","threshold","rootMargin","observe","element","observer","set","delete","disconnect","clear","useCharts","_ref","chartDOM","chartData","chartOptions","initBefore","initAfter","lazyLoad","myChart","isEmpty","resizeObserver","watchStopHandles","dpr","window","devicePixelRatio","disposeChart","isDisposed","dispose","error","console","warn","initChart","value","clientWidth","clientHeight","echarts","init","renderer","cleanupObservers","setupWatchers","length","isOutside","mouseInChart","useMouseInElement","stopMouseWatch","watchDebounced","newVal","show","setOption","toolbox","toggleToolbox","debounce","stopOptionsWatch","async","_len","arguments","opt","Array","_key","safeInitChart","showLoading","data","notMerge","setEmpty","log","hideLoading","renderChart","deep","immediate","push","startInitialization","nextTick","useResize","ResizeObserver","width","height","contentRect","setupResizeObserver","subtext","Promise","resolve","img","Image","src","emptyImg","onload","aspectRatio","obj","title","text","modelName","top","left","itemGap","subtextStyle","fontSize","textStyle","align","rich","a","backgroundColor","image","replaceMerge","lazyUpdate","onMounted","onUnmounted","forEach","stop","getZr","off","useElementSize","resize","useDataToExcelJson","dataSource","desc","colDesc","groupByDesc","header","map","item","filter","v","json","headerItem"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useCharts.mjs","sources":["../../../../../../../packages/components/src/data-chart/src/utils/useCharts.ts"],"sourcesContent":["import type { ECharts, SetOptionOpts } from 'echarts'\nimport type { Ref } from 'vue'\nimport type { EChartData, EChartsOption, IFormatPublicData } from './types'\nimport { useElementSize, useMouseInElement, watchDebounced } from '@vueuse/core'\nimport * as echarts from 'echarts'\nimport { nextTick, onMounted, onUnmounted } from 'vue'\n\n// 使用别名路径导入 SVG\nimport emptyImg from '../components/empty.svg'\n\n// 全局 IntersectionObserver 管理器\nclass IntersectionObserverManager {\n private observer: IntersectionObserver | null = null\n private callbacks = new Map<Element, () => void>()\n\n private createObserver() {\n if (typeof IntersectionObserver === 'undefined') {\n return null\n }\n\n return new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n const callback = this.callbacks.get(entry.target)\n if (callback) {\n callback()\n // 执行回调后移除监听,避免重复初始化\n this.unobserve(entry.target)\n }\n }\n }\n },\n {\n threshold: 0,\n rootMargin: '200px',\n },\n )\n }\n\n observe(element: Element, callback: () => void) {\n if (!this.observer) {\n this.observer = this.createObserver()\n }\n\n if (this.observer) {\n this.callbacks.set(element, callback)\n this.observer.observe(element)\n }\n }\n\n unobserve(element: Element) {\n if (this.observer) {\n this.observer.unobserve(element)\n this.callbacks.delete(element)\n }\n }\n\n disconnect() {\n if (this.observer) {\n this.observer.disconnect()\n this.callbacks.clear()\n this.observer = null\n }\n }\n}\n\n// 全局单例实例\nconst globalIntersectionObserver = new IntersectionObserverManager()\n\nexport function useCharts({ chartDOM, chartData, chartOptions, initBefore, initAfter, lazyLoad = true }: {\n chartDOM: Ref<HTMLElement | null>\n chartData: Ref<IFormatPublicData>\n chartOptions: Ref<EChartsOption>\n initBefore?: () => Promise<void>\n initAfter?: (e: ECharts | null) => void\n lazyLoad?: boolean\n}) {\n // 每个组件实例的独立状态\n let myChart: ECharts | null = null\n let isEmpty = false\n let resizeObserver: ResizeObserver | null = null\n let watchStopHandles: Array<() => void> = [] // 存储 watch 停止函数\n\n // 获取设备像素比\n const dpr = window.devicePixelRatio || 1\n\n function disposeChart() {\n if (myChart) {\n try {\n if (!myChart.isDisposed()) {\n myChart.dispose()\n }\n }\n catch (error) {\n console.warn('Error disposing chart:', error)\n }\n myChart = null\n }\n }\n\n function initChart() {\n if (!(myChart && !myChart.isDisposed())) {\n // 检查 DOM 元素是否存在\n if (!chartDOM.value) {\n console.warn('[ECharts] DOM element not found')\n return null\n }\n\n // 检查容器尺寸\n const { clientWidth, clientHeight } = chartDOM.value\n if (clientWidth === 0 || clientHeight === 0) {\n // 如果容器没有尺寸,返回 null 而不是强制初始化\n console.warn('[ECharts] Container has zero size. Width:', clientWidth, 'Height:', clientHeight, '. Skipping initialization.')\n return null\n }\n\n // 创建 ECharts 实例\n myChart = echarts.init(chartDOM.value, null, {\n devicePixelRatio: dpr,\n renderer: 'svg',\n })\n }\n return myChart\n }\n\n // 清理所有观察器\n function cleanupObservers() {\n // 从全局观察器中移除当前元素\n if (chartDOM.value) {\n globalIntersectionObserver.unobserve(chartDOM.value)\n }\n }\n\n // 初始化 watchDebounced 监听器\n function setupWatchers() {\n if (watchStopHandles.length > 0) {\n return // 已经设置过了,避免重复设置\n }\n\n // 鼠标悬停监听\n const { isOutside: mouseInChart } = useMouseInElement(chartDOM)\n const stopMouseWatch = watchDebounced(mouseInChart, (newVal) => {\n if (typeof newVal !== 'boolean' || (!myChart || myChart.isDisposed())) {\n return\n }\n toggleToolbox(!newVal)\n }, { debounce: 200 })\n\n // 图表选项监听\n const stopOptionsWatch = watchDebounced(\n () => chartOptions.value,\n async () => {\n await renderChart(chartOptions.value)\n },\n { debounce: 500, deep: true, immediate: true },\n )\n\n watchStopHandles.push(stopMouseWatch, stopOptionsWatch)\n }\n\n // 开始初始化流程\n async function startInitialization() {\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 检查容器是否已经有尺寸\n const { clientWidth, clientHeight } = chartDOM.value || { clientWidth: 0, clientHeight: 0 }\n if (clientWidth > 0 && clientHeight > 0) {\n // 直接初始化\n const chart = initChart()\n if (chart) {\n if (initAfter) {\n initAfter(myChart)\n }\n if (myChart && !myChart.isDisposed()) {\n useResize(myChart, chartDOM)\n }\n // 图表初始化成功后,设置监听器\n setupWatchers()\n }\n // 初始化成功后清理观察器\n cleanupObservers()\n }\n else {\n // 如果没有尺寸,使用 ResizeObserver 等待\n setupResizeObserver()\n }\n }\n\n // 使用全局 IntersectionObserver 监听元素是否进入可视区域\n function setupIntersectionObserver() {\n if (!chartDOM.value) {\n return\n }\n\n // 使用全局观察器,避免重复创建\n globalIntersectionObserver.observe(chartDOM.value, () => {\n startInitialization()\n })\n }\n\n // 使用 ResizeObserver 监听容器尺寸变化\n function setupResizeObserver() {\n if (!chartDOM.value || typeof ResizeObserver === 'undefined') {\n return\n }\n\n resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect\n if (width > 0 && height > 0) {\n // 容器有尺寸了,可以安全初始化\n const chart = initChart()\n if (chart) {\n if (initAfter) {\n initAfter(myChart)\n }\n // 设置 resize 监听\n if (myChart && !myChart.isDisposed()) {\n useResize(myChart, chartDOM)\n }\n // 图表初始化成功后,设置监听器\n setupWatchers()\n }\n // 初始化后停止观察并清理其他观察器\n resizeObserver?.disconnect()\n resizeObserver = null\n cleanupObservers()\n break\n }\n }\n })\n\n resizeObserver.observe(chartDOM.value)\n }\n\n // 安全的初始化函数\n async function safeInitChart() {\n if (!chartDOM.value) {\n return myChart\n }\n\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 如果启用了懒加载\n if (lazyLoad) {\n // 直接设置 IntersectionObserver,让它检测元素是否进入可视区域\n setupIntersectionObserver()\n return myChart\n }\n\n // 非懒加载模式,直接开始初始化流程\n await startInitialization()\n\n return myChart\n }\n\n async function renderChart(...opt: [EChartsOption, SetOptionOpts?]) {\n try {\n // 确保图表已初始化\n if (!myChart || myChart.isDisposed()) {\n await safeInitChart()\n }\n\n myChart?.showLoading()\n if (chartData.value?.data?.length) {\n if (isEmpty === true) {\n if (!opt[1]) {\n opt[1] = {}\n }\n opt[1].notMerge = true\n }\n isEmpty = false\n }\n else {\n // 数据为空时保持原有配置\n opt = await setEmpty()\n }\n myChart?.setOption(...opt)\n }\n catch (error) {\n console.log(`🚀 ~ renderChart ~ error:`, error)\n if (myChart && !myChart.isDisposed()) {\n disposeChart()\n }\n // 如果实例已被销毁,重新创建\n initChart()\n opt = await setEmpty('配置项错误')\n myChart?.setOption(...opt)\n }\n finally {\n myChart?.hideLoading()\n }\n }\n\n function setEmpty(subtext = '暂无数据'): Promise<[EChartsOption, SetOptionOpts]> {\n return new Promise((resolve) => {\n const img = new Image()\n img.src = emptyImg\n\n img.onload = () => {\n const aspectRatio = img.width / img.height\n\n const obj: EChartsOption = {\n title: [{\n text: chartData.value?.modelName,\n ...chartOptions.value.title,\n }, {\n subtext,\n top: 'center',\n left: 'center',\n text: '{a|}',\n itemGap: -20,\n subtextStyle: {\n fontSize: 14,\n },\n textStyle: {\n align: 'center',\n rich: {\n a: {\n height: 100 / aspectRatio,\n width: 100,\n backgroundColor: {\n image: emptyImg,\n },\n },\n },\n },\n }],\n }\n isEmpty = true\n resolve([obj, {\n notMerge: true,\n replaceMerge: ['xAxis', 'yAxis', 'series'],\n lazyUpdate: false,\n }])\n }\n })\n }\n\n function toggleToolbox(show: boolean) {\n // 修改条件判断,移除 isDisposed 检查\n if (myChart && !myChart.isDisposed()) {\n try {\n myChart.setOption({\n toolbox: {\n show,\n },\n })\n }\n catch (error) {\n console.warn('Error toggling toolbox:', error)\n }\n }\n }\n\n // 移除这里的 watchDebounced 调用,改为在图表初始化后调用\n\n onMounted(async () => {\n if (initBefore) {\n await initBefore()\n }\n\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 使用安全的初始化函数\n await safeInitChart()\n\n // 如果图表已经初始化(容器有尺寸),调用 initAfter 和设置 resize\n if (myChart && !myChart.isDisposed()) {\n if (initAfter) {\n initAfter(myChart)\n }\n useResize(myChart, chartDOM)\n // 图表初始化成功后,设置监听器\n setupWatchers()\n }\n })\n\n onUnmounted(() => {\n // 停止所有 watch 监听器\n watchStopHandles.forEach(stop => stop())\n watchStopHandles = []\n\n // 清理 ResizeObserver\n if (resizeObserver) {\n resizeObserver.disconnect()\n resizeObserver = null\n }\n\n // 清理全局 IntersectionObserver 中的当前元素\n cleanupObservers()\n\n if (myChart && !myChart.isDisposed()) {\n try {\n // 清理所有事件监听器\n myChart.getZr()?.off('mousemove')\n myChart.getZr()?.off('mouseout')\n myChart.getZr()?.off('click')\n myChart.off('click')\n disposeChart()\n }\n catch (error) {\n console.warn('Error during chart cleanup:', error)\n }\n }\n })\n\n return {\n myChart: () => myChart,\n }\n}\n\nexport function useResize(myChart: ECharts, chartDOM: Ref<HTMLElement | null>) {\n const { width, height } = useElementSize(chartDOM)\n watchDebounced([width, height], () => {\n if (myChart && !myChart.isDisposed()) {\n try {\n myChart.resize()\n }\n catch (error) {\n console.warn('Error during chart resize:', error)\n }\n }\n })\n}\n\nexport function useDataToExcelJson(dataSource: EChartData) {\n const { desc: { colDesc = [], groupByDesc = [] } = {}, data = [] } = dataSource\n const header = [...groupByDesc.map(item => item.colDesc), ...colDesc].filter(v => v) as string[]\n const json = data.map((item) => {\n return header.map((headerItem) => {\n return item[headerItem as keyof typeof item] || ''\n })\n })\n return [header, ...json]\n}\n"],"names":["globalIntersectionObserver","constructor","__publicField","this","Map","createObserver","IntersectionObserver","entries","entry","isIntersecting","callback","callbacks","get","target","unobserve","threshold","rootMargin","observe","element","observer","set","delete","disconnect","clear","useCharts","_ref","chartDOM","chartData","chartOptions","initBefore","initAfter","lazyLoad","myChart","isEmpty","resizeObserver","watchStopHandles","dpr","window","devicePixelRatio","disposeChart","isDisposed","dispose","error","initChart","value","clientWidth","clientHeight","echarts","init","renderer","cleanupObservers","setupWatchers","length","isOutside","mouseInChart","useMouseInElement","stopMouseWatch","watchDebounced","newVal","show","setOption","toolbox","toggleToolbox","debounce","stopOptionsWatch","async","_len","arguments","opt","Array","_key","safeInitChart","showLoading","data","notMerge","setEmpty","hideLoading","renderChart","deep","immediate","push","startInitialization","nextTick","useResize","ResizeObserver","width","height","contentRect","setupResizeObserver","subtext","Promise","resolve","img","Image","src","emptyImg","onload","aspectRatio","obj","title","text","modelName","top","left","itemGap","subtextStyle","fontSize","textStyle","align","rich","a","backgroundColor","image","replaceMerge","lazyUpdate","onMounted","onUnmounted","forEach","stop","getZr","off","useElementSize","resize","useDataToExcelJson","dataSource","desc","colDesc","groupByDesc","header","map","item","filter","v","json","headerItem"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
let n=!1;const o=function(o){!function(){if(!n){const o=document.createElement("style");o.id="qxs-dialog-styles",o.textContent="\n.qxs-dialog-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 9998;\n animation: qxs-overlay-fade-in 0.3s ease;\n}\n.qxs-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background-color: #fff;\n border-radius: 8px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);\n z-index: 9999;\n min-width: 300px;\n max-width: 90vw;\n display: flex;\n flex-direction: column;\n animation: qxs-dialog-scale-in 0.3s ease;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n.qxs-dialog__header {\n padding: 16px 20px;\n border-bottom: 1px solid #eee;\n font-size: 16px;\n font-weight: 600;\n color: #303133;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.qxs-dialog__title { flex: 1; }\n.qxs-dialog__close {\n cursor: pointer;\n font-size: 20px;\n color: #909399;\n background: none;\n border: none;\n padding: 0;\n line-height: 1;\n}\n.qxs-dialog__close:hover { color: #409eff; }\n.qxs-dialog__body {\n padding: 20px;\n color: #606266;\n font-size: 14px;\n line-height: 1.6;\n}\n.qxs-dialog__footer {\n padding: 12px 20px;\n border-top: 1px solid #eee;\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n}\n.qxs-dialog__button {\n padding: 8px 20px;\n border-radius: 4px;\n font-size: 14px;\n cursor: pointer;\n border: 1px solid #dcdfe6;\n background-color: #fff;\n color: #606266;\n}\n.qxs-dialog__button:hover { border-color: #409eff; color: #409eff; }\n.qxs-dialog__button--primary { background-color: #409eff; border-color: #409eff; color: #fff; }\n.qxs-dialog__button--primary:hover { background-color: #66b1ff; border-color: #66b1ff; }\n@keyframes qxs-overlay-fade-in { from { opacity: 0; } to { opacity: 1; } }\n@keyframes qxs-dialog-scale-in { from { opacity: 0; transform: translate(-50%, -50%) scale(0.9); } to { opacity: 1; transform: translate(-50%, -50%) scale(1); } }\n",document.head.appendChild(o),n=!0}}();const{title:e="提示",content:t="",width:a="30%",showClose:s=!0,closeOnClickModal:i=!1,closeOnPressEscape:l=!0,confirmButtonText:d="确定",cancelButtonText:r="取消",showConfirmButton:c=!0,showCancelButton:x=!0,onConfirm:f,onCancel:p,onClose:g}=o,u=document.createElement("div");u.className="qxs-dialog-overlay";const _=document.createElement("div");_.className="qxs-dialog",_.style.width=a,_.innerHTML=`\n <div class="qxs-dialog__header">\n <span class="qxs-dialog__title">${e}</span>\n ${s?'<button class="qxs-dialog__close">×</button>':""}\n </div>\n <div class="qxs-dialog__body">${t}</div>\n ${c||x?`\n <div class="qxs-dialog__footer">\n ${x?`<button class="qxs-dialog__button qxs-dialog__button--cancel">${r}</button>`:""}\n ${c?`<button class="qxs-dialog__button qxs-dialog__button--primary qxs-dialog__button--confirm">${d}</button>`:""}\n </div>\n `:""}\n `,document.body.appendChild(u),document.body.appendChild(_);let b=!1;const m=()=>{b||(b=!0,_.style.animation="qxs-dialog-scale-in 0.2s ease reverse",u.style.animation="qxs-overlay-fade-in 0.2s ease reverse",setTimeout(()=>{u.remove(),_.remove(),g?.()},200))},y=async()=>{try{await(f?.()),m()}catch(n){}},q=()=>{p?.(),m()};if(s&&_.querySelector(".qxs-dialog__close")?.addEventListener("click",m),x&&_.querySelector(".qxs-dialog__button--cancel")?.addEventListener("click",q),c&&_.querySelector(".qxs-dialog__button--confirm")?.addEventListener("click",y),i&&u.addEventListener("click",m),l){const n=o=>{"Escape"===o.key&&(m(),document.removeEventListener("keydown",n))};document.addEventListener("keydown",n)}return{close:m}};export{o as QxsDialog,o as default};
|
|
2
|
+
//# sourceMappingURL=dialog.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog.mjs","sources":["../../../../../../packages/components/src/dialog/src/dialog.ts"],"sourcesContent":["export interface QxsDialogOptions {\n title?: string\n content?: string\n width?: string\n showClose?: boolean\n closeOnClickModal?: boolean\n closeOnPressEscape?: boolean\n confirmButtonText?: string\n cancelButtonText?: string\n showConfirmButton?: boolean\n showCancelButton?: boolean\n onConfirm?: () => void | Promise<void>\n onCancel?: () => void\n onClose?: () => void\n}\n\ninterface QxsDialogInstance {\n close: () => void\n}\n\nconst styles = `\n.qxs-dialog-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 9998;\n animation: qxs-overlay-fade-in 0.3s ease;\n}\n.qxs-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background-color: #fff;\n border-radius: 8px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);\n z-index: 9999;\n min-width: 300px;\n max-width: 90vw;\n display: flex;\n flex-direction: column;\n animation: qxs-dialog-scale-in 0.3s ease;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n.qxs-dialog__header {\n padding: 16px 20px;\n border-bottom: 1px solid #eee;\n font-size: 16px;\n font-weight: 600;\n color: #303133;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.qxs-dialog__title { flex: 1; }\n.qxs-dialog__close {\n cursor: pointer;\n font-size: 20px;\n color: #909399;\n background: none;\n border: none;\n padding: 0;\n line-height: 1;\n}\n.qxs-dialog__close:hover { color: #409eff; }\n.qxs-dialog__body {\n padding: 20px;\n color: #606266;\n font-size: 14px;\n line-height: 1.6;\n}\n.qxs-dialog__footer {\n padding: 12px 20px;\n border-top: 1px solid #eee;\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n}\n.qxs-dialog__button {\n padding: 8px 20px;\n border-radius: 4px;\n font-size: 14px;\n cursor: pointer;\n border: 1px solid #dcdfe6;\n background-color: #fff;\n color: #606266;\n}\n.qxs-dialog__button:hover { border-color: #409eff; color: #409eff; }\n.qxs-dialog__button--primary { background-color: #409eff; border-color: #409eff; color: #fff; }\n.qxs-dialog__button--primary:hover { background-color: #66b1ff; border-color: #66b1ff; }\n@keyframes qxs-overlay-fade-in { from { opacity: 0; } to { opacity: 1; } }\n@keyframes qxs-dialog-scale-in { from { opacity: 0; transform: translate(-50%, -50%) scale(0.9); } to { opacity: 1; transform: translate(-50%, -50%) scale(1); } }\n`\n\nlet stylesInjected = false\n\nfunction injectStyles() {\n if (!stylesInjected) {\n const styleEl = document.createElement('style')\n styleEl.id = 'qxs-dialog-styles'\n styleEl.textContent = styles\n document.head.appendChild(styleEl)\n stylesInjected = true\n }\n}\n\nfunction createDialog(options: QxsDialogOptions): QxsDialogInstance {\n injectStyles()\n\n const {\n title = '提示',\n content = '',\n width = '30%',\n showClose = true,\n closeOnClickModal = false,\n closeOnPressEscape = true,\n confirmButtonText = '确定',\n cancelButtonText = '取消',\n showConfirmButton = true,\n showCancelButton = true,\n onConfirm,\n onCancel,\n onClose,\n } = options\n\n const overlay = document.createElement('div')\n overlay.className = 'qxs-dialog-overlay'\n\n const dialog = document.createElement('div')\n dialog.className = 'qxs-dialog'\n dialog.style.width = width\n\n dialog.innerHTML = `\n <div class=\"qxs-dialog__header\">\n <span class=\"qxs-dialog__title\">${title}</span>\n ${showClose ? '<button class=\"qxs-dialog__close\">×</button>' : ''}\n </div>\n <div class=\"qxs-dialog__body\">${content}</div>\n ${showConfirmButton || showCancelButton ? `\n <div class=\"qxs-dialog__footer\">\n ${showCancelButton ? `<button class=\"qxs-dialog__button qxs-dialog__button--cancel\">${cancelButtonText}</button>` : ''}\n ${showConfirmButton ? `<button class=\"qxs-dialog__button qxs-dialog__button--primary qxs-dialog__button--confirm\">${confirmButtonText}</button>` : ''}\n </div>\n ` : ''}\n `\n\n document.body.appendChild(overlay)\n document.body.appendChild(dialog)\n\n let closed = false\n\n const close = () => {\n if (closed) return\n closed = true\n dialog.style.animation = 'qxs-dialog-scale-in 0.2s ease reverse'\n overlay.style.animation = 'qxs-overlay-fade-in 0.2s ease reverse'\n setTimeout(() => {\n overlay.remove()\n dialog.remove()\n onClose?.()\n }, 200)\n }\n\n const handleConfirm = async () => {\n try {\n await onConfirm?.()\n close()\n } catch (error) {\n console.error('Dialog confirm error:', error)\n }\n }\n\n const handleCancel = () => {\n onCancel?.()\n close()\n }\n\n if (showClose) {\n dialog.querySelector('.qxs-dialog__close')?.addEventListener('click', close)\n }\n\n if (showCancelButton) {\n dialog.querySelector('.qxs-dialog__button--cancel')?.addEventListener('click', handleCancel)\n }\n\n if (showConfirmButton) {\n dialog.querySelector('.qxs-dialog__button--confirm')?.addEventListener('click', handleConfirm)\n }\n\n if (closeOnClickModal) {\n overlay.addEventListener('click', close)\n }\n\n if (closeOnPressEscape) {\n const handleKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n close()\n document.removeEventListener('keydown', handleKeydown)\n }\n }\n document.addEventListener('keydown', handleKeydown)\n }\n\n return { close }\n}\n\ninterface QxsDialogFunction {\n (options: QxsDialogOptions): QxsDialogInstance\n}\n\nconst QxsDialog = createDialog as QxsDialogFunction\n\nexport { QxsDialog, type QxsDialogFunction, type QxsDialogInstance }\nexport default QxsDialog\n"],"names":["stylesInjected","QxsDialog","options","styleEl","document","createElement","id","textContent","head","appendChild","injectStyles","title","content","width","showClose","closeOnClickModal","closeOnPressEscape","confirmButtonText","cancelButtonText","showConfirmButton","showCancelButton","onConfirm","onCancel","onClose","overlay","className","dialog","style","innerHTML","body","closed","close","animation","setTimeout","remove","handleConfirm","async","error","handleCancel","querySelector","addEventListener","handleKeydown","e","key","removeEventListener"],"mappings":"AAiGA,IAAIA,GAAiB,EAoHrB,MAAMC,EAxGN,SAAsBC,IAVtB,WACE,IAAKF,EAAgB,CACnB,MAAMG,EAAUC,SAASC,cAAc,SACvCF,EAAQG,GAAK,oBACbH,EAAQI,YAnFG,k+DAoFXH,SAASI,KAAKC,YAAYN,GAC1BH,GAAiB,CACnB,CACF,CAGEU,GAEA,MAAMC,MACJA,EAAQ,KAAAC,QACRA,EAAU,GAAAC,MACVA,EAAQ,MAAAC,UACRA,GAAY,EAAAC,kBACZA,GAAoB,EAAAC,mBACpBA,GAAqB,EAAAC,kBACrBA,EAAoB,KAAAC,iBACpBA,EAAmB,KAAAC,kBACnBA,GAAoB,EAAAC,iBACpBA,GAAmB,EAAAC,UACnBA,EAAAC,SACAA,EAAAC,QACAA,GACErB,EAEEsB,EAAUpB,SAASC,cAAc,OACvCmB,EAAQC,UAAY,qBAEpB,MAAMC,EAAStB,SAASC,cAAc,OACtCqB,EAAOD,UAAY,aACnBC,EAAOC,MAAMd,MAAQA,EAErBa,EAAOE,UAAY,iFAEmBjB,mBAChCG,EAAY,+CAAiD,qDAEjCF,gBAC9BO,GAAqBC,EAAmB,qDAEpCA,EAAmB,iEAAiEF,aAA8B,eAClHC,EAAoB,8FAA8FF,aAA+B,yBAEnJ,SAGNb,SAASyB,KAAKpB,YAAYe,GAC1BpB,SAASyB,KAAKpB,YAAYiB,GAE1B,IAAII,GAAS,EAEb,MAAMC,EAAQA,KACRD,IACJA,GAAS,EACTJ,EAAOC,MAAMK,UAAY,wCACzBR,EAAQG,MAAMK,UAAY,wCAC1BC,WAAW,KACTT,EAAQU,SACRR,EAAOQ,SACPX,OACC,OAGCY,EAAgBC,UACpB,UACQf,OACNU,GACF,OAASM,GAET,GAGIC,EAAeA,KACnBhB,MACAS,KAmBF,GAhBIjB,GACFY,EAAOa,cAAc,uBAAuBC,iBAAiB,QAAST,GAGpEX,GACFM,EAAOa,cAAc,gCAAgCC,iBAAiB,QAASF,GAG7EnB,GACFO,EAAOa,cAAc,iCAAiCC,iBAAiB,QAASL,GAG9EpB,GACFS,EAAQgB,iBAAiB,QAAST,GAGhCf,EAAoB,CACtB,MAAMyB,EAAiBC,IACP,WAAVA,EAAEC,MACJZ,IACA3B,SAASwC,oBAAoB,UAAWH,KAG5CrC,SAASoC,iBAAiB,UAAWC,EACvC,CAEA,MAAO,CAAEV,QACX"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{QxsDialog as s}from"../dialog/src/dialog.mjs";import{QxsMessage as o}from"../message/src/message.mjs";const e={install(e){let a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{message:g=!0,dialog:i=!0}=a;g&&(e.config.globalProperties.$qxsMessage=o,e.provide("$qxsMessage",o)),i&&(e.config.globalProperties.$qxsDialog=s,e.provide("$qxsDialog",s))}};export{e as QxsFeedbackPlugin,e as default};
|
|
2
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../../packages/components/src/feedback-plugin/index.ts"],"sourcesContent":["import type { App, Plugin } from 'vue'\nimport { QxsDialog } from '../dialog'\nimport { QxsMessage } from '../message'\n\nexport interface QxsFeedbackPluginOptions {\n message?: boolean\n dialog?: boolean\n}\n\nconst QxsFeedbackPlugin: Plugin = {\n install(app: App, options: QxsFeedbackPluginOptions = {}) {\n const {\n message = true,\n dialog = true,\n } = options\n\n if (message) {\n app.config.globalProperties.$qxsMessage = QxsMessage\n app.provide('$qxsMessage', QxsMessage)\n }\n\n if (dialog) {\n app.config.globalProperties.$qxsDialog = QxsDialog\n app.provide('$qxsDialog', QxsDialog)\n }\n },\n}\n\nexport { QxsFeedbackPlugin }\nexport default QxsFeedbackPlugin\n"],"names":["QxsFeedbackPlugin","install","app","options","arguments","length","undefined","message","dialog","config","globalProperties","$qxsMessage","QxsMessage","provide","$qxsDialog","QxsDialog"],"mappings":"6GASA,MAAMA,EAA4B,CAChCC,OAAAA,CAAQC,GAAkD,IAAxCC,EAAAC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAoC,CAAA,EACpD,MAAMG,QACJA,GAAU,EAAAC,OACVA,GAAS,GACPL,EAEAI,IACFL,EAAIO,OAAOC,iBAAiBC,YAAcC,EAC1CV,EAAIW,QAAQ,cAAeD,IAGzBJ,IACFN,EAAIO,OAAOC,iBAAiBI,WAAaC,EACzCb,EAAIW,QAAQ,aAAcE,GAE9B"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import e from"./file-upload.vue2.mjs";import"./file-upload.vue3.mjs";import o from"../../../_virtual/_plugin-vue_export-helper.mjs";var p=o(e,[["__scopeId","data-v-1059eba1"]]);export{p as default};
|
|
2
2
|
//# sourceMappingURL=file-upload.vue.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-upload.vue.mjs","sources":[
|
|
1
|
+
{"version":3,"file":"file-upload.vue.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"
|
|
1
|
+
import{defineComponent as e,computed as t,ref as a,createElementBlock as r,openBlock as l,normalizeClass as i,unref as s,createElementVNode as n,createCommentVNode as o,createTextVNode as u,Fragment as p,renderList as c,toDisplayString as d,withModifiers as f,createVNode as m}from"vue";import{useNamespace as v}from"@qxs-bns/hooks";import{QxsMessage as y}from"../../message/src/message.mjs";import{QxsAlert as h}from"../../alert/index.mjs";const g=["accept","multiple"],q=["onClick"];var x=e({name:"QxsFileUpload",__name:"file-upload",props:{action:{type:String,required:!0},headers:{type:Object,required:!1},data:{type:Object,required:!1},name:{type:String,required:!1,default:"file"},size:{type:Number,required:!1,default:20},max:{type:Number,required:!1,default:3},accept:{type:String,required:!1,default:"zip,rar"},files:{type:Array,required:!1,default:()=>[]},notip:{type:Boolean,required:!1,default:!1},ext:{type:Array,required:!1}},emits:["onSuccess"],setup(e,{emit:x}){const b=e,j=x,k=v("file-upload"),z=t(()=>b.accept.split(",")),S=a([...b.files]),C=a(!1),O=e=>{const t=e.name.split(".").at(-1)??"",a=z.value.includes(t),r=e.size/1024/1024<b.size;return a?r?!(S.value.length>=b.max)||(y.warning("文件上传超过限制"),!1):(y.error(`上传文件大小不能超过 ${b.size}MB!`),!1):(y.error(`上传文件只支持 ${z.value.join(" / ")} 格式!`),!1)},$=e=>{C.value=!1;const t=e.dataTransfer?.files;t&&Array.from(t).forEach(e=>{O(e)&&M(e)})},w=e=>{e.preventDefault(),C.value=!0},B=()=>{C.value=!1},D=e=>{const t=e.target,a=t.files;a&&(Array.from(a).forEach(e=>{O(e)&&M(e)}),t.value="")},M=e=>{const t=new FormData;t.append(b.name,e),b.data&&Object.entries(b.data).forEach(([e,a])=>{t.append(e,a)});const a=new XMLHttpRequest;a.open("POST",b.action),b.headers&&Object.entries(b.headers).forEach(([e,t])=>{a.setRequestHeader(e,t)}),a.onload=()=>{if(a.status>=200&&a.status<300){const t=JSON.parse(a.responseText);S.value.push({name:e.name,file:e}),j("onSuccess",t,e,S.value.map(e=>e.file).filter(Boolean))}else y.error("上传失败")},a.onerror=()=>{y.error("上传失败")},a.send(t)};return(e,t)=>(l(),r("div",{class:i(s(k).b())},[n("div",{class:i([s(k).e("control"),{"is-dragging":C.value}]),onDrop:$,onDragover:w,onDragleave:B,onClick:t[0]||(t[0]=t=>e.$refs.fileInput.click())},[n("input",{ref:"fileInput",type:"file",accept:e.accept,multiple:e.max>1,style:{display:"none"},onChange:D},null,40,g),n("div",{class:i(s(k).e("icon"))},t[1]||(t[1]=[n("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:"48",height:"48"},[n("path",{d:"M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"})],-1)]),2),n("div",{class:i(s(k).e("text"))},t[2]||(t[2]=[u(" 将文件拖到此处,或",-1),n("em",null,"点击上传",-1)]),2)],34),S.value.length?(l(),r("div",{key:0,class:i(s(k).e("list"))},[(l(!0),r(p,null,c(S.value,(e,t)=>(l(),r("div",{key:t,class:i(s(k).e("item"))},[n("span",null,d(e.name),1),n("button",{type:"button",class:i(s(k).e("remove")),onClick:f(e=>(e=>{S.value.splice(e,1)})(t),["stop"])}," × ",10,q)],2))),128))],2)):o("v-if",!0),e.notip?o("v-if",!0):(l(),r("div",{key:1,class:i(s(k).e("tip"))},[m(s(h),{title:`上传文件支持 ${z.value.join(" / ")} 格式,单个文件大小不超过 ${e.size}MB,且文件数量不超过 ${e.max} 个`,type:"info"},null,8,["title"])],2))],2))}});export{x as default};
|
|
2
2
|
//# sourceMappingURL=file-upload.vue2.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-upload.vue2.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"file-upload.vue2.mjs","sources":["../../../../../../packages/components/src/file-upload/src/file-upload.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useNamespace } from '@qxs-bns/hooks'\nimport { computed, ref } from 'vue'\nimport { QxsMessage } from '../../message'\nimport { QxsAlert } from '../../alert'\n\ndefineOptions({\n name: 'QxsFileUpload',\n})\n\nexport interface FileUploadProps {\n action: string\n headers?: Record<string, string>\n data?: Record<string, string | Blob>\n name?: string\n size?: number\n max?: number\n accept?: string\n files?: Array<{ name: string; url?: string; file?: File }>\n notip?: boolean\n ext?: string[]\n}\n\nconst props = withDefaults(defineProps<FileUploadProps>(), {\n name: 'file',\n size: 20,\n max: 3,\n files: () => [],\n notip: false,\n accept: 'zip,rar',\n})\n\nconst emit = defineEmits<{\n onSuccess: [res: any, file: File, fileList: File[]]\n}>()\n\nconst ns = useNamespace('file-upload')\n\nconst exts = computed(() => {\n return props.accept.split(',')\n})\n\nconst internalFiles = ref<Array<{ name: string; url?: string; file?: File }>>([...props.files])\nconst isDragging = ref(false)\n\nconst beforeUpload = (file: File): boolean => {\n const fileName = file.name.split('.')\n const fileExt = fileName.at(-1) ?? ''\n const isTypeOk = exts.value.includes(fileExt)\n const isSizeOk = file.size / 1024 / 1024 < props.size\n\n if (!isTypeOk) {\n QxsMessage.error(`上传文件只支持 ${exts.value.join(' / ')} 格式!`)\n return false\n }\n if (!isSizeOk) {\n QxsMessage.error(`上传文件大小不能超过 ${props.size}MB!`)\n return false\n }\n if (internalFiles.value.length >= props.max) {\n QxsMessage.warning('文件上传超过限制')\n return false\n }\n\n return true\n}\n\nconst handleDrop = (e: DragEvent) => {\n isDragging.value = false\n const files = e.dataTransfer?.files\n if (!files) return\n\n Array.from(files).forEach((file) => {\n if (beforeUpload(file)) {\n uploadFile(file)\n }\n })\n}\n\nconst handleDragOver = (e: DragEvent) => {\n e.preventDefault()\n isDragging.value = true\n}\n\nconst handleDragLeave = () => {\n isDragging.value = false\n}\n\nconst handleFileSelect = (e: Event) => {\n const target = e.target as HTMLInputElement\n const files = target.files\n if (!files) return\n\n Array.from(files).forEach((file) => {\n if (beforeUpload(file)) {\n uploadFile(file)\n }\n })\n\n target.value = ''\n}\n\nconst uploadFile = (file: File) => {\n const formData = new FormData()\n formData.append(props.name, file)\n\n if (props.data) {\n Object.entries(props.data).forEach(([key, value]) => {\n formData.append(key, value)\n })\n }\n\n const xhr = new XMLHttpRequest()\n xhr.open('POST', props.action)\n\n if (props.headers) {\n Object.entries(props.headers).forEach(([key, value]) => {\n xhr.setRequestHeader(key, value)\n })\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n const res = JSON.parse(xhr.responseText)\n internalFiles.value.push({ name: file.name, file })\n emit('onSuccess', res, file, internalFiles.value.map((f) => f.file).filter(Boolean) as File[])\n } else {\n QxsMessage.error('上传失败')\n }\n }\n\n xhr.onerror = () => {\n QxsMessage.error('上传失败')\n }\n\n xhr.send(formData)\n}\n\nconst handleRemove = (index: number) => {\n internalFiles.value.splice(index, 1)\n}\n</script>\n\n<template>\n <div :class=\"ns.b()\">\n <div\n :class=\"[ns.e('control'), { 'is-dragging': isDragging }]\"\n @drop=\"handleDrop\"\n @dragover=\"handleDragOver\"\n @dragleave=\"handleDragLeave\"\n @click=\"($refs.fileInput as HTMLInputElement).click()\"\n >\n <input\n ref=\"fileInput\"\n type=\"file\"\n :accept=\"accept\"\n :multiple=\"max > 1\"\n style=\"display: none;\"\n @change=\"handleFileSelect\"\n >\n <div :class=\"ns.e('icon')\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"48\" height=\"48\">\n <path d=\"M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z\" />\n </svg>\n </div>\n <div :class=\"ns.e('text')\">\n 将文件拖到此处,或<em>点击上传</em>\n </div>\n </div>\n\n <div v-if=\"internalFiles.length\" :class=\"ns.e('list')\">\n <div v-for=\"(file, index) in internalFiles\" :key=\"index\" :class=\"ns.e('item')\">\n <span>{{ file.name }}</span>\n <button type=\"button\" :class=\"ns.e('remove')\" @click.stop=\"handleRemove(index)\">\n ×\n </button>\n </div>\n </div>\n\n <div v-if=\"!notip\" :class=\"ns.e('tip')\">\n <QxsAlert\n :title=\"`上传文件支持 ${exts.join(' / ')} 格式,单个文件大小不超过 ${size}MB,且文件数量不超过 ${max} 个`\"\n type=\"info\"\n />\n </div>\n </div>\n</template>\n\n<style scoped>\n.qxs-file-upload {\n width: 100%;\n}\n\n.qxs-file-upload__control {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 150px;\n padding: 24px;\n cursor: pointer;\n background: #fafafa;\n border: 1px dashed #d9d9d9;\n border-radius: 4px;\n transition: border-color 0.2s;\n}\n\n.qxs-file-upload__control:hover,\n.qxs-file-upload__control.is-dragging {\n border-color: #409eff;\n}\n\n.qxs-file-upload__icon {\n margin-bottom: 12px;\n color: #c0c4cc;\n}\n\n.qxs-file-upload__text {\n font-size: 14px;\n color: #909399;\n}\n\n.qxs-file-upload__text em {\n font-style: normal;\n color: #409eff;\n}\n\n.qxs-file-upload__list {\n margin-top: 12px;\n}\n\n.qxs-file-upload__item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n font-size: 14px;\n color: #606266;\n border-bottom: 1px solid #eee;\n}\n\n.qxs-file-upload__item:last-child {\n border-bottom: none;\n}\n\n.qxs-file-upload__item span {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.qxs-file-upload__remove {\n padding: 0;\n margin-left: 12px;\n font-size: 16px;\n color: #c0c4cc;\n cursor: pointer;\n background: none;\n border: none;\n transition: color 0.2s;\n}\n\n.qxs-file-upload__remove:hover {\n color: #f56c6c;\n}\n\n.qxs-file-upload__tip {\n margin-top: 12px;\n}\n</style>\n"],"names":["props","__props","emit","__emit","ns","useNamespace","exts","computed","accept","split","internalFiles","ref","files","isDragging","beforeUpload","file","fileExt","name","at","isTypeOk","value","includes","isSizeOk","size","length","max","QxsMessage","warning","error","join","handleDrop","e","dataTransfer","Array","from","forEach","uploadFile","handleDragOver","preventDefault","handleDragLeave","handleFileSelect","target","formData","FormData","append","data","Object","entries","key","xhr","XMLHttpRequest","open","action","headers","setRequestHeader","onload","status","res","JSON","parse","responseText","push","map","f","filter","Boolean","onerror","send","_createElementBlock","class","_normalizeClass","_unref","b","_createElementVNode","onDrop","onDragover","onDragleave","onClick","_cache","$event","$refs","fileInput","click","type","multiple","style","display","onChange","viewBox","fill","width","height","d","_openBlock","_Fragment","_renderList","index","_toDisplayString","_withModifiers","splice","handleRemove","_hoisted_2","notip","_createVNode","QxsAlert","title"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import e from"../../../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.mjs";var o=".qxs-file-upload[data-v-1059eba1]{width:100%}.qxs-file-upload__control[data-v-1059eba1]{align-items:center;background:#fafafa;border:1px dashed #d9d9d9;border-radius:4px;cursor:pointer;display:flex;flex-direction:column;justify-content:center;min-height:150px;padding:24px;transition:border-color .2s}.qxs-file-upload__control.is-dragging[data-v-1059eba1],.qxs-file-upload__control[data-v-1059eba1]:hover{border-color:#409eff}.qxs-file-upload__icon[data-v-1059eba1]{color:#c0c4cc;margin-bottom:12px}.qxs-file-upload__text[data-v-1059eba1]{color:#909399;font-size:14px}.qxs-file-upload__text em[data-v-1059eba1]{color:#409eff;font-style:normal}.qxs-file-upload__list[data-v-1059eba1]{margin-top:12px}.qxs-file-upload__item[data-v-1059eba1]{align-items:center;border-bottom:1px solid #eee;color:#606266;display:flex;font-size:14px;justify-content:space-between;padding:8px 12px}.qxs-file-upload__item[data-v-1059eba1]:last-child{border-bottom:none}.qxs-file-upload__item span[data-v-1059eba1]{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.qxs-file-upload__remove[data-v-1059eba1]{background:none;border:none;color:#c0c4cc;cursor:pointer;font-size:16px;margin-left:12px;padding:0;transition:color .2s}.qxs-file-upload__remove[data-v-1059eba1]:hover{color:#f56c6c}.qxs-file-upload__tip[data-v-1059eba1]{margin-top:12px}";e(o);export{o as default};
|
|
2
|
+
//# sourceMappingURL=file-upload.vue3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-upload.vue3.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import e from"./image-upload.vue2.mjs";import"./image-upload.vue3.mjs";import a from"../../../_virtual/_plugin-vue_export-helper.mjs";var m=a(e,[["__scopeId","data-v-299e0c8a"]]);export{m as default};
|
|
2
2
|
//# sourceMappingURL=image-upload.vue.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-upload.vue.mjs","sources":["../../../../../../packages/components/src/image-upload/src/image-upload.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { UploadFile, UploadFiles, UploadProps } from 'element-plus'\nimport { Delete, UploadImage, ZoomIn } from '@qxs-bns/icons'\nimport { ElImageViewer, ElMessage, ElUpload, useNamespace } from 'element-plus'\nimport { computed, onUnmounted, ref, useAttrs } from 'vue'\n\n// 类型定义\nexport interface ImageUploadProps {\n /** 上传地址(必需) */\n action: UploadProps['action']\n /** 请求头 */\n headers?: UploadProps['headers']\n /** 上传时附带的额外参数 */\n data?: UploadProps['data']\n /** 上传的文件字段名 */\n name?: UploadProps['name']\n /** 文件大小限制(MB) */\n size?: number\n /** 图片显示宽度(px) */\n width?: number\n /** 图片显示高度(px) */\n height?: number\n /** 接受的文件类型 */\n accept?: string\n /** 上传区域提示文字 */\n placeholder?: string\n /** 是否隐藏提示文字 */\n notip?: boolean\n /** 自定义提示文字 */\n tipText?: string\n /** 上传前的钩子函数 */\n beforeUpload?: UploadProps['beforeUpload']\n /** 是否禁用 */\n disabled?: boolean\n /** 最大上传数量 */\n limit?: number\n}\n\n// 组件名称\ndefineOptions({\n name: 'QxsImageUpload',\n})\n\n// Props 定义\nconst {\n action,\n headers,\n data,\n name = 'file',\n size = 20,\n width = 160,\n height = 90,\n limit = 1,\n placeholder = '上传图片',\n notip = false,\n accept = 'image/jpeg,image/jpg,image/png,image/gif',\n beforeUpload,\n tipText = '',\n disabled = false,\n} = defineProps<ImageUploadProps>()\n\n// Emits 定义\nconst emits = defineEmits<{\n success: [res: any, uploadFile: UploadFile, uploadFiles: UploadFiles]\n remove: [file: UploadFile]\n}>()\n\nconst attrs = useAttrs()\n\nconst fileList = defineModel('fileList', {\n type: Array as () => UploadFile[],\n default: () => [],\n})\n\n// 命名空间\nconst nsEl = useNamespace('image-upload')\n\n// 响应式数据\nconst imageViewerVisible = ref(false)\nconst initialIndex = ref(0)\nconst previewUrl = ref('')\nconst uploadProgress = ref(0)\nconst isUploading = ref(false)\n\nconst cssVar = computed(() => {\n return nsEl.cssVarBlock({\n ns: nsEl.namespace.value,\n width: `${width}px`,\n height: `${height}px`,\n })\n})\n\n// 计算属性\nconst exts = computed(() =>\n accept.split(',').map(ext => ext.split('/').pop()),\n)\n\nconst tipMessage = computed(() => {\n if (tipText) {\n return tipText\n }\n\n const formatText = `支持 ${exts.value.join(' / ')} 格式,大小不超过 ${size}MB`\n const sizeText = width && height ? `,建议尺寸 ${width}×${height}` : ''\n\n return formatText + sizeText\n})\n\n// 状态文本转换\nfunction getStatusText(status: string | undefined): string {\n const statusMap: Record<string, string> = {\n ready: '准备中',\n uploading: '上传中',\n success: '上传成功',\n fail: '上传失败',\n error: '上传错误',\n }\n return statusMap[status || ''] || status || '未知状态'\n}\n\n// 方法\nfunction onPreview(file: UploadFile) {\n if (!file.url) {\n console.warn('文件缺少 URL,无法预览:', file)\n return\n }\n\n // 简化索引查找:优先对象引用,备用 URL 匹配\n let index = fileList.value.indexOf(file)\n if (index === -1) {\n index = fileList.value.findIndex(item => item.url === file.url)\n }\n\n initialIndex.value = Math.max(0, index)\n imageViewerVisible.value = true\n}\n\nfunction onRemove(file: UploadFile) {\n if (disabled) {\n return\n }\n\n // 如果正在上传,重置上传状态\n if (file.status === 'uploading' && isUploading.value) {\n isUploading.value = false\n uploadProgress.value = 0\n\n // 清理预览 URL\n if (previewUrl.value) {\n URL.revokeObjectURL(previewUrl.value)\n previewUrl.value = ''\n }\n }\n\n // 清理可能的 Object URL\n if (file.url?.startsWith('blob:')) {\n URL.revokeObjectURL(file.url)\n }\n\n // 从数组中移除文件\n const index = fileList.value.indexOf(file)\n if (index > -1) {\n fileList.value.splice(index, 1)\n }\n\n emits('remove', file)\n}\n\nfunction previewClose() {\n imageViewerVisible.value = false\n}\n\nconst handleBeforeUpload: UploadProps['beforeUpload'] = (file) => {\n if (!file?.name) {\n ElMessage.error('文件信息无效,请重新选择文件')\n return false\n }\n\n // 文件类型校验\n const fileExt = file.name.split('.').pop()?.toLowerCase() ?? ''\n const isTypeOk = exts.value.some(ext => ext?.toLowerCase() === fileExt)\n if (!isTypeOk) {\n ElMessage.error(`仅支持上传 ${exts.value.join(' / ')} 格式的图片`)\n return false\n }\n\n // 文件大小校验\n const fileSizeMB = file.size / 1024 / 1024\n if (fileSizeMB > size) {\n ElMessage.error(`图片大小不能超过 ${size}MB`)\n return false\n }\n\n // 设置预览和上传状态\n try {\n previewUrl.value = URL.createObjectURL(file)\n }\n catch (error) {\n console.warn('创建预览失败:', error)\n }\n\n // 开始上传\n isUploading.value = true\n uploadProgress.value = 0\n\n return beforeUpload ? beforeUpload(file) : true\n}\n\nconst onProgress: UploadProps['onProgress'] = (evt) => {\n uploadProgress.value = Math.floor(evt.percent)\n}\n\nconst onSuccess: UploadProps['onSuccess'] = (response, uploadFile, uploadFiles) => {\n // 检查文件是否还在列表中(可能已被删除)\n const fileExists = fileList.value.some(file =>\n file.uid === uploadFile.uid\n || (file.name === uploadFile.name && file.size === uploadFile.size),\n )\n\n // 清理预览 URL 和重置状态\n if (previewUrl.value) {\n URL.revokeObjectURL(previewUrl.value)\n previewUrl.value = ''\n }\n isUploading.value = false\n uploadProgress.value = 0\n\n // 只有文件还存在时才触发成功回调\n if (fileExists) {\n emits('success', response, uploadFile, uploadFiles)\n }\n}\n\nconst onError: UploadProps['onError'] = (error, uploadFile, _uploadFiles) => {\n // 检查文件是否还在列表中(可能已被删除)\n const fileExists = fileList.value.some(file =>\n file.uid === uploadFile.uid\n || (file.name === uploadFile.name && file.size === uploadFile.size),\n )\n\n // 清理预览 URL 和重置状态\n if (previewUrl.value) {\n URL.revokeObjectURL(previewUrl.value)\n previewUrl.value = ''\n }\n isUploading.value = false\n uploadProgress.value = 0\n\n // 只有文件还存在时才显示错误信息\n if (fileExists) {\n ElMessage.error(`图片上传失败:${error.message || '网络异常,请重试'}`)\n }\n}\n\n// 组件卸载时清理资源\nonUnmounted(() => {\n if (previewUrl.value) {\n URL.revokeObjectURL(previewUrl.value)\n }\n // 清理文件列表中的 blob URL\n fileList.value.forEach((file) => {\n if (file.url?.startsWith('blob:')) {\n URL.revokeObjectURL(file.url)\n }\n })\n})\n</script>\n\n<template>\n <div\n :class=\"nsEl.e('container')\"\n :style=\"cssVar\"\n >\n <ElUpload\n v-bind=\"attrs\"\n v-model:file-list=\"fileList\"\n drag\n :limit=\"limit\"\n list-type=\"picture-card\"\n :headers=\"headers\"\n :action=\"action\"\n :data=\"data\"\n :name=\"name\"\n :accept=\"accept\"\n :before-upload=\"handleBeforeUpload\"\n :on-progress=\"onProgress\"\n :on-preview=\"onPreview\"\n :on-success=\"onSuccess\"\n :on-error=\"onError\"\n :class=\"[nsEl.e('control'), limit <= fileList.length ? nsEl.e('more-than-limit') : '']\"\n :on-remove=\"onRemove\"\n >\n <slot>\n <div class=\"image-slot\">\n <QxsIcon\n size=\"32px\"\n :icon=\"UploadImage\"\n />\n <p>{{ placeholder }}</p>\n </div>\n </slot>\n <template #file=\"{ file }\">\n <div style=\"position: relative; width: 100%; height: 100%;\">\n <img\n v-if=\"file.url\"\n :class=\"`${nsEl.namespace.value}-upload-list__item-thumbnail`\"\n :src=\"file.url\"\n :alt=\"file.name || '图片'\"\n >\n <div\n v-else\n :class=\"`${nsEl.namespace.value}-upload-list__item-thumbnail`\"\n style=\"display: flex; align-items: center; justify-content: center; color: #909399; background: #f5f7fa;\"\n >\n 无图片\n </div>\n\n <!-- 上传进度条 -->\n <div\n v-if=\"isUploading\"\n class=\"upload-progress\"\n >\n <div\n class=\"upload-progress-bar\"\n :style=\"{ width: `${uploadProgress}%` }\"\n />\n </div>\n\n <!-- 调试信息 -->\n <div\n v-if=\"isUploading\"\n class=\"upload-debug\"\n >\n {{ uploadProgress }}% - {{ getStatusText(file.status) }}\n </div>\n </div>\n\n <span :class=\"`${nsEl.namespace.value}-upload-list__item-actions`\">\n <span\n v-if=\"file.url\"\n :class=\"[\n `${nsEl.namespace.value}-upload-list__item-preview`,\n `${nsEl.namespace.value}-image-upload__action-btn`,\n `${nsEl.namespace.value}-image-upload__action-btn--preview`,\n ]\"\n @click=\"onPreview(file)\"\n >\n <ZoomIn size=\"14px\" />\n </span>\n <span\n v-if=\"file.url\"\n :class=\"`${nsEl.namespace.value}-upload-list__item-divider`\"\n />\n <span\n :class=\"[\n `${nsEl.namespace.value}-upload-list__item-delete`,\n `${nsEl.namespace.value}-image-upload__action-btn`,\n `${nsEl.namespace.value}-image-upload__action-btn--delete`,\n disabled ? 'is-disabled' : '',\n ]\"\n @click=\"onRemove(file)\"\n >\n <Delete size=\"14px\" />\n </span>\n </span>\n </template>\n <template #tip>\n <slot name=\"tip\">\n <div\n v-if=\"!notip\"\n :class=\"`${nsEl.namespace.value}-upload__tip-text`\"\n >\n <div class=\"tip-content\">\n {{ tipMessage }}\n </div>\n </div>\n </slot>\n </template>\n </ElUpload>\n\n <ElImageViewer\n v-if=\"imageViewerVisible\"\n :url-list=\"fileList.map((item: UploadFile) => item.url!).filter(Boolean)\"\n :initial-index=\"initialIndex\"\n :show-progress=\"fileList.length > 1\"\n teleported\n @close=\"previewClose\"\n />\n </div>\n</template>\n"],"names":["emits","__emit","attrs","useAttrs","fileList","_useModel","__props","nsEl","useNamespace","imageViewerVisible","ref","initialIndex","previewUrl","uploadProgress","isUploading","cssVar","computed","cssVarBlock","ns","namespace","value","width","height","exts","split","map","ext","pop","tipMessage","tipText","join","size","onPreview","file","url","console","warn","index","indexOf","findIndex","item","Math","max","onRemove","disabled","status","URL","revokeObjectURL","startsWith","splice","previewClose","handleBeforeUpload","name","ElMessage","error","fileExt","toLowerCase","some","createObjectURL","beforeUpload","onProgress","evt","floor","percent","onSuccess","response","uploadFile","uploadFiles","fileExists","uid","onError","_uploadFiles","message","onUnmounted","forEach","_createElementBlock","class","_normalizeClass","_unref","e","style","_createVNode","ElUpload","_mergeProps","$event","drag","limit","headers","action","data","accept","length","_withCtx","_createElementVNode","_hoisted_2","src","alt","display","color","background","_createCommentVNode","_openBlock","_hoisted_4","_hoisted_5","_toDisplayString","ready","uploading","success","fail","onClick","ZoomIn","Delete","tip","_renderSlot","_ctx","notip","_hoisted_8","_hoisted_1","_component_QxsIcon","icon","UploadImage","placeholder","_createBlock","ElImageViewer","filter","Boolean","teleported","onClose"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"image-upload.vue.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import a from"
|
|
1
|
+
import{defineComponent as e,mergeModels as a,useModel as i,ref as l,computed as t,onUnmounted as s,createElementBlock as u,openBlock as r,normalizeStyle as o,createElementVNode as n,createCommentVNode as d,Fragment as p,renderList as c,createVNode as m,unref as v,normalizeClass as g,toDisplayString as f,withModifiers as h}from"vue";import{ZoomIn as q,Delete as _,UploadImage as x}from"@qxs-bns/icons";import{QxsIcon as y}from"../../icon/index.mjs";import{QxsMessage as b}from"../../message/src/message.mjs";const k={class:"qxs-image-upload__list"},w=["src","alt"],j={key:1,class:"qxs-image-upload__placeholder"},C={key:2,class:"qxs-image-upload__progress"},L={class:"qxs-image-upload__actions"},z=["onClick"],$=["onClick"],O=["accept","multiple","disabled"],R={class:"qxs-image-upload__add-content"},S={key:0,class:"qxs-image-upload__tip"},U=["src"];var M=e({name:"QxsImageUpload",__name:"image-upload",props:a({action:{type:String,required:!0},headers:{type:Object,required:!1},data:{type:Object,required:!1},name:{type:String,required:!1,default:"file"},size:{type:Number,required:!1,default:20},width:{type:Number,required:!1,default:160},height:{type:Number,required:!1,default:90},accept:{type:String,required:!1,default:"image/jpeg,image/jpg,image/png,image/gif"},placeholder:{type:String,required:!1,default:"上传图片"},notip:{type:Boolean,required:!1,default:!1},tipText:{type:String,required:!1,default:""},disabled:{type:Boolean,required:!1,default:!1},limit:{type:Number,required:!1,default:1}},{fileList:{type:Array,default:()=>[]},fileListModifiers:{}}),emits:a(["success","remove"],["update:fileList"]),setup(e,{emit:a}){const M=e,N=a,T=i(e,"fileList"),B=l(!1),E=l(0),A=l(!1),D=l(0),H=t(()=>M.accept.split(",").map(e=>e.split("/").pop())),I=t(()=>{if(M.tipText)return M.tipText;return`支持 ${H.value.join(" / ")} 格式,大小不超过 ${M.size}MB`+(M.width&&M.height?`,建议尺寸 ${M.width}×${M.height}`:"")}),W=t(()=>({"--upload-width":`${M.width}px`,"--upload-height":`${M.height}px`}));function F(e){const a=e.target,i=a.files;i&&!M.disabled&&(T.value.length+i.length>M.limit?b.warning(`最多上传 ${M.limit} 张图片`):(Array.from(i).forEach(e=>{if(!function(e){const a=e.name.split(".").pop()?.toLowerCase()??"";return H.value.some(e=>e?.toLowerCase()===a)?!(e.size/1024/1024>M.size&&(b.error(`图片大小不能超过 ${M.size}MB`),1)):(b.error(`仅支持上传 ${H.value.join(" / ")} 格式的图片`),!1)}(e))return;const a={uid:Date.now()+Math.random(),name:e.name,size:e.size,status:"uploading",url:URL.createObjectURL(e),file:e};T.value.push(a),function(e,a){const i=new FormData;i.append(M.name,e),M.data&&Object.entries(M.data).forEach(([e,a])=>{i.append(e,a)});const l=new XMLHttpRequest;l.open("POST",M.action),M.headers&&Object.entries(M.headers).forEach(([e,a])=>{l.setRequestHeader(e,a)});l.upload.onprogress=e=>{e.lengthComputable&&(E.value=Math.floor(e.loaded/e.total*100))},l.onload=()=>{if(B.value=!1,E.value=0,l.status>=200&&l.status<300){const e=JSON.parse(l.responseText);a.status="success",N("success",e,a,T.value)}else a.status="fail",b.error("上传失败")},l.onerror=()=>{B.value=!1,E.value=0,a.status="fail",b.error("上传失败")},B.value=!0,E.value=0,l.send(i)}(e,a)}),a.value=""))}function J(){A.value=!1}function P(){D.value=(D.value-1+T.value.length)%T.value.length}function Q(){D.value=(D.value+1)%T.value.length}return s(()=>{T.value.forEach(e=>{e.url?.startsWith("blob:")&&URL.revokeObjectURL(e.url)})}),(e,a)=>(r(),u("div",{class:"qxs-image-upload",style:o(W.value)},[n("div",k,[(r(!0),u(p,null,c(T.value,(a,i)=>(r(),u("div",{key:a.uid||i,class:"qxs-image-upload__item"},[a.url?(r(),u("img",{key:0,src:a.url,alt:a.name},null,8,w)):(r(),u("div",j,"无图片")),"uploading"===a.status?(r(),u("div",C,[n("div",{class:"qxs-image-upload__progress-bar",style:o({width:`${E.value}%`})},null,4)])):d("v-if",!0),n("div",L,[a.url?(r(),u("span",{key:0,class:"qxs-image-upload__action",onClick:e=>function(e){D.value=e,A.value=!0}(i)},[m(v(y),{icon:v(q),size:"14px"},null,8,["icon"])],8,z)):d("v-if",!0),n("span",{class:g(["qxs-image-upload__action",{"is-disabled":e.disabled}]),onClick:e=>function(e){if(M.disabled)return;const a=T.value[e];a.url?.startsWith("blob:")&&URL.revokeObjectURL(a.url),T.value.splice(e,1),N("remove",a)}(i)},[m(v(y),{icon:v(_),size:"14px"},null,8,["icon"])],10,$)])]))),128)),T.value.length<e.limit?(r(),u("label",{key:0,class:g(["qxs-image-upload__add",{"is-disabled":e.disabled}])},[n("input",{type:"file",accept:e.accept,multiple:e.limit>1,disabled:e.disabled,onChange:F},null,40,O),n("div",R,[m(v(y),{icon:v(x),size:"32px"},null,8,["icon"]),n("p",null,f(e.placeholder),1)])],2)):d("v-if",!0)]),e.notip?d("v-if",!0):(r(),u("div",S,f(I.value),1)),d(" Image Viewer "),A.value?(r(),u("div",{key:1,class:"qxs-image-viewer",onClick:h(J,["self"])},[n("div",{class:"qxs-image-viewer__mask",onClick:J}),n("span",{class:"qxs-image-viewer__close",onClick:J},"×"),T.value.length>1?(r(),u("span",{key:0,class:"qxs-image-viewer__prev",onClick:P},"‹")):d("v-if",!0),T.value.length>1?(r(),u("span",{key:1,class:"qxs-image-viewer__next",onClick:Q},"›")):d("v-if",!0),T.value[D.value]?.url?(r(),u("img",{key:2,src:T.value[D.value].url,class:"qxs-image-viewer__img"},null,8,U)):d("v-if",!0)])):d("v-if",!0)],4))}});export{M as default};
|
|
2
2
|
//# sourceMappingURL=image-upload.vue2.mjs.map
|