giime 0.8.12 → 0.8.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.css CHANGED
@@ -883,13 +883,57 @@ video {
883
883
  .gm-group:hover .group-hover\:gm-block {
884
884
  display: block;
885
885
  }
886
- .gm-flex-center[data-v-c17deec9] {
887
- align-items: center;
886
+ .gm-upload-pro-preview-dialog[data-v-80b383d8] [data-v-80b383d8] .el-dialog__body {
887
+ padding: 0;
888
888
  }
889
889
 
890
- .gm-flex-justify-between[data-v-c17deec9] {
891
- justify-content: space-between;
890
+ .gm-upload-pro-file-picture-card[data-v-80b383d8] [data-v-80b383d8] .el-upload-list__item, .gm-upload-pro-file-picture-card[data-v-80b383d8] [data-v-80b383d8] .el-upload--picture-card {
891
+ width: auto;
892
+ height: auto;
893
+ }
894
+ .gm-upload-pro-file {
895
+ line-height: normal;
896
+ }
897
+ .gm-upload-pro-file .el-checkbox-group {
898
+ font-size: unset;
899
+ }
900
+ .gm-upload-pro-file .el-checkbox {
901
+ position: absolute;
902
+ left: 10px;
903
+ top: 0;
904
+ z-index: 9;
905
+ }
906
+ .gm-upload-pro-file .el-upload-list--picture-card {
907
+ gap: 10px;
908
+ }
909
+ .gm-upload-pro-file .el-upload-list__item {
910
+ margin: 0;
911
+ }
912
+ .gm-upload-pro-file .el-upload-list__item-file-name {
913
+ line-height: 1.7;
914
+ }
915
+ .gm-upload-pro-file .el-upload-dragger {
916
+ padding: 0;
917
+ border: none;
918
+ width: 100%;
919
+ height: 100%;
920
+ display: flex;
921
+ }
922
+ .gm-upload-pro-file .el-upload--picture-card {
923
+ border: none;
924
+ }
925
+
926
+ .gm-upload-pro-file-disabled .el-upload--picture-card {
927
+ display: none;
928
+ }
929
+ .gm-upload-pro-file-disabled .el-upload-list__item-status-label {
930
+ display: none;
931
+ }
932
+
933
+ .gm-range-number .el-form-item[data-v-1ae16d96] {
934
+ margin: 0;
892
935
  }
936
+
893
937
  .circular[data-v-d7b04fae] {
894
938
  animation: loading-rotate-d7b04fae 2s linear infinite;
895
939
  }
@@ -921,78 +965,101 @@ video {
921
965
  stroke-dashoffset: -120px;
922
966
  }
923
967
  }
968
+ .gm-number-interval-single[data-v-4e6f4d6f] {
969
+ border-radius: var(--el-input-border-radius, var(--el-border-radius-base));
970
+ box-shadow: 0 0 0 1px var(--el-input-border-color, var(--el-border-color)) inset;
971
+ background-color: var(--el-input-bg-color, var(--el-fill-color-blank));
972
+ }
973
+ .gm-number-interval-single[data-v-4e6f4d6f] [data-v-4e6f4d6f] .el-input__wrapper {
974
+ box-shadow: none;
975
+ background: none;
976
+ }
924
977
 
925
- .gm-range-number .el-form-item[data-v-1ae16d96] {
926
- margin: 0;
978
+ .gm-number-interval-close[data-v-4e6f4d6f] {
979
+ display: none;
980
+ color: var(--el-input-icon-color, var(--el-text-color-placeholder));
927
981
  }
928
982
 
929
- .gm-upload-pro-preview-dialog[data-v-80b383d8] [data-v-80b383d8] .el-dialog__body {
983
+ .gm-number-interval-single[data-v-4e6f4d6f]:hover .gm-number-interval-close[data-v-4e6f4d6f] {
984
+ display: flex;
985
+ }
986
+ .gm-flex-center[data-v-c17deec9] {
987
+ align-items: center;
988
+ }
989
+
990
+ .gm-flex-justify-between[data-v-c17deec9] {
991
+ justify-content: space-between;
992
+ }
993
+ [data-v-79615afd] .gmSearchForm .el-form-item {
994
+ margin-right: 0;
995
+ margin-bottom: 4px;
996
+ }
997
+ .gm-upload-preview-dialog[data-v-c615121c] [data-v-c615121c] .el-dialog__body {
930
998
  padding: 0;
931
999
  }
932
1000
 
933
- .gm-upload-pro-file-picture-card[data-v-80b383d8] [data-v-80b383d8] .el-upload-list__item, .gm-upload-pro-file-picture-card[data-v-80b383d8] [data-v-80b383d8] .el-upload--picture-card {
1001
+ .gm-upload-file-picture-card[data-v-c615121c] [data-v-c615121c] .el-upload-list__item, .gm-upload-file-picture-card[data-v-c615121c] [data-v-c615121c] .el-upload--picture-card {
934
1002
  width: auto;
935
1003
  height: auto;
936
1004
  }
937
- .gm-upload-pro-file {
1005
+ .gm-upload-file {
938
1006
  line-height: normal;
939
1007
  }
940
- .gm-upload-pro-file .el-checkbox-group {
941
- font-size: unset;
942
- }
943
- .gm-upload-pro-file .el-checkbox {
1008
+ .gm-upload-file li > .el-checkbox {
944
1009
  position: absolute;
945
1010
  left: 10px;
946
1011
  top: 0;
947
1012
  z-index: 9;
948
1013
  }
949
- .gm-upload-pro-file .el-upload-list--picture-card {
1014
+ .gm-upload-file .el-upload-list--picture-card {
950
1015
  gap: 10px;
951
1016
  }
952
- .gm-upload-pro-file .el-upload-list__item {
1017
+ .gm-upload-file .el-upload-list__item {
953
1018
  margin: 0;
1019
+ border: none;
954
1020
  }
955
- .gm-upload-pro-file .el-upload-list__item-file-name {
956
- line-height: 1.7;
1021
+ .gm-upload-file .el-upload-list__item-file-name {
1022
+ line-height: normal;
957
1023
  }
958
- .gm-upload-pro-file .el-upload-dragger {
1024
+ .gm-upload-file .el-upload-dragger {
959
1025
  padding: 0;
960
1026
  border: none;
961
1027
  width: 100%;
962
1028
  height: 100%;
963
1029
  display: flex;
964
1030
  }
965
- .gm-upload-pro-file .el-upload--picture-card {
1031
+ .gm-upload-file .el-upload--picture-card {
966
1032
  border: none;
967
1033
  }
968
1034
 
969
- .gm-upload-pro-file-disabled .el-upload--picture-card {
1035
+ .gm-upload-file-disabled .el-upload--picture-card {
970
1036
  display: none;
971
1037
  }
972
- .gm-upload-pro-file-disabled .el-upload-list__item-status-label {
1038
+ .gm-upload-file-disabled .el-upload-list__item-status-label {
973
1039
  display: none;
974
1040
  }
975
- .gm-number-interval-single[data-v-4e6f4d6f] {
976
- border-radius: var(--el-input-border-radius, var(--el-border-radius-base));
977
- box-shadow: 0 0 0 1px var(--el-input-border-color, var(--el-border-color)) inset;
978
- background-color: var(--el-input-bg-color, var(--el-fill-color-blank));
1041
+ [data-v-98c2e804] .gmTableNoBorder .el-table__body .el-table__cell {
1042
+ border-right: none;
979
1043
  }
980
- .gm-number-interval-single[data-v-4e6f4d6f] [data-v-4e6f4d6f] .el-input__wrapper {
981
- box-shadow: none;
982
- background: none;
1044
+
1045
+ [data-v-98c2e804] .gmTableNoBorder .el-table__inner-wrapper:before {
1046
+ height: 0;
983
1047
  }
984
1048
 
985
- .gm-number-interval-close[data-v-4e6f4d6f] {
986
- display: none;
987
- color: var(--el-input-icon-color, var(--el-text-color-placeholder));
1049
+ [data-v-98c2e804] .gmTableNoBorder.el-table--border .el-table__inner-wrapper:after {
1050
+ height: 0;
988
1051
  }
989
1052
 
990
- .gm-number-interval-single[data-v-4e6f4d6f]:hover .gm-number-interval-close[data-v-4e6f4d6f] {
991
- display: flex;
1053
+ [data-v-98c2e804] .gmTableNoBorder.el-table--border:after {
1054
+ height: 0;
992
1055
  }
993
- [data-v-79615afd] .gmSearchForm .el-form-item {
994
- margin-right: 0;
995
- margin-bottom: 4px;
1056
+
1057
+ [data-v-98c2e804] .gmTableNoBorder.el-table--border:before {
1058
+ height: 0;
1059
+ }
1060
+
1061
+ [data-v-98c2e804] .gmTableNoBorder .el-table__border-left-patch {
1062
+ height: 0;
996
1063
  }
997
1064
  [data-v-050a4f74] .gmTableNoBorder .el-table__body .el-table__cell {
998
1065
  border-right: none;
@@ -1082,29 +1149,6 @@ video {
1082
1149
  border-radius: 10px;
1083
1150
  background: #eee;
1084
1151
  }
1085
- [data-v-98c2e804] .gmTableNoBorder .el-table__body .el-table__cell {
1086
- border-right: none;
1087
- }
1088
-
1089
- [data-v-98c2e804] .gmTableNoBorder .el-table__inner-wrapper:before {
1090
- height: 0;
1091
- }
1092
-
1093
- [data-v-98c2e804] .gmTableNoBorder.el-table--border .el-table__inner-wrapper:after {
1094
- height: 0;
1095
- }
1096
-
1097
- [data-v-98c2e804] .gmTableNoBorder.el-table--border:after {
1098
- height: 0;
1099
- }
1100
-
1101
- [data-v-98c2e804] .gmTableNoBorder.el-table--border:before {
1102
- height: 0;
1103
- }
1104
-
1105
- [data-v-98c2e804] .gmTableNoBorder .el-table__border-left-patch {
1106
- height: 0;
1107
- }
1108
1152
  @charset "UTF-8";
1109
1153
  .table-custom-header-drawer .el-drawer__header {
1110
1154
  padding: 10px 15px;
@@ -1160,48 +1204,4 @@ video {
1160
1204
  box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.1);
1161
1205
  border-radius: 10px;
1162
1206
  background: #eee;
1163
- }
1164
- .gm-upload-preview-dialog[data-v-28529631] [data-v-28529631] .el-dialog__body {
1165
- padding: 0;
1166
- }
1167
-
1168
- .gm-upload-file-picture-card[data-v-28529631] [data-v-28529631] .el-upload-list__item, .gm-upload-file-picture-card[data-v-28529631] [data-v-28529631] .el-upload--picture-card {
1169
- width: auto;
1170
- height: auto;
1171
- }
1172
- .gm-upload-file {
1173
- line-height: normal;
1174
- }
1175
- .gm-upload-file .el-checkbox {
1176
- position: absolute;
1177
- left: 10px;
1178
- top: 0;
1179
- z-index: 9;
1180
- }
1181
- .gm-upload-file .el-upload-list--picture-card {
1182
- gap: 10px;
1183
- }
1184
- .gm-upload-file .el-upload-list__item {
1185
- margin: 0;
1186
- border: none;
1187
- }
1188
- .gm-upload-file .el-upload-list__item-file-name {
1189
- line-height: normal;
1190
- }
1191
- .gm-upload-file .el-upload-dragger {
1192
- padding: 0;
1193
- border: none;
1194
- width: 100%;
1195
- height: 100%;
1196
- display: flex;
1197
- }
1198
- .gm-upload-file .el-upload--picture-card {
1199
- border: none;
1200
- }
1201
-
1202
- .gm-upload-file-disabled .el-upload--picture-card {
1203
- display: none;
1204
- }
1205
- .gm-upload-file-disabled .el-upload-list__item-status-label {
1206
- display: none;
1207
1207
  }
@@ -97,7 +97,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
97
97
  onClick: download
98
98
  }, {
99
99
  default: withCtx(() => [
100
- createTextVNode("\u4E0B\u8F7D11")
100
+ createTextVNode("\u4E0B\u8F7D")
101
101
  ]),
102
102
  _: 1
103
103
  /* STABLE */
@@ -1 +1 @@
1
- {"version":3,"file":"PreviewFile.vue2.mjs","sources":["../../../../../../../packages/components/src/composite/previewFile/PreviewFile.vue"],"sourcesContent":["<template>\n <el-dialog v-model=\"dialogVisible\" title=\"预览\" :width=\"previewWidth\" top=\"10vh\" append-to-body destroy-on-close>\n <template #header>\n <div class=\"gm-flex gm-items-center gm-justify-between\">\n <span>预览</span>\n <el-button v-if=\"openPreviewDownload\" type=\"primary\" size=\"default\" link @click=\"download\">下载11</el-button>\n </div>\n </template>\n <div class=\"gm-flex gm-select-none gm-items-center gm-justify-center gm-gap-4\">\n <div v-if=\"files.length > 1\" class=\"gm-cursor-pointer\" @click=\"prev\">\n <el-icon :size=\"40\"><ArrowLeftBold /></el-icon>\n </div>\n <div class=\"gm-flex gm-flex-1 gm-items-center gm-justify-center\" style=\"height: calc(80vh - 72px)\">\n <GmFileComponent v-bind=\"fileProps\" />\n </div>\n <div v-if=\"files.length > 1\" class=\"gm-cursor-pointer\" @click=\"next\">\n <el-icon :size=\"40\"><ArrowRightBold /></el-icon>\n </div>\n </div>\n </el-dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { ElMessage } from 'element-plus';\nimport { useDownload } from '@giime/hooks/base/useDownload';\nimport { ArrowLeftBold, ArrowRightBold } from '@element-plus/icons-vue';\nimport GmFileComponent from '../fileComponent';\nimport { previewFileProps } from './previewFile';\nimport type { UploadFile } from 'element-plus';\n\ndefineOptions({\n name: 'GmPreviewFile',\n});\n\nconst props = defineProps(previewFileProps);\nconst dialogVisible = defineModel<boolean>('dialogVisible', { default: false });\nconst fileIndex = defineModel<number>('fileIndex', { default: 0 });\n\nconst downloadMethod = useDownload();\n\nconst files = computed(() => {\n let result: Partial<UploadFile>[] = props.fileList;\n if (props.fileList && !props.fileList.length && props.file) {\n result = [props.file];\n }\n return result;\n});\n\nconst fileProps = computed(() => {\n const file = files.value[fileIndex.value];\n return {\n file,\n controls: props.controls,\n oncontextmenu: props.oncontextmenu,\n controlslist: props.controlslist,\n field: props.field,\n url: props.url,\n size: props.size,\n };\n});\n\nconst prev = () => {\n if (fileIndex.value > 0) {\n fileIndex.value--;\n return;\n }\n ElMessage.warning('已经是第一张了');\n};\n\nconst next = () => {\n if (fileIndex.value < props.fileList.length - 1) {\n fileIndex.value++;\n return;\n }\n ElMessage.warning('没有更多了!');\n};\n\nconst download = () => {\n const file = files.value[fileIndex.value];\n const url = (file[props.url as keyof UploadFile] || file.url || '') as string;\n downloadMethod.downloadByUrl(url, { filename: file.name });\n};\n</script>\n"],"names":["_useModel"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,IAAA,MAAM,KAAA,GAAQ,OAAA;AACd,IAAA,MAAM,aAAA,GAAgBA,QAAA,CAAoB,OAAA,EAAC,eAAmC,CAAA;AAC9E,IAAA,MAAM,SAAA,GAAYA,QAAA,UAAoB,WAA2B,CAAA;AAEjE,IAAA,MAAM,iBAAiB,WAAA,EAAY;AAEnC,IAAA,MAAM,KAAA,GAAQ,SAAS,MAAM;AAC3B,MAAA,IAAI,SAAgC,KAAA,CAAM,QAAA;AAC1C,MAAA,IAAI,MAAM,QAAA,IAAY,CAAC,MAAM,QAAA,CAAS,MAAA,IAAU,MAAM,IAAA,EAAM;AAC1D,QAAA,MAAA,GAAS,CAAC,MAAM,IAAI,CAAA;AAAA,MACtB;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,SAAS,MAAM;AAC/B,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA;AACxC,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,eAAe,KAAA,CAAM,aAAA;AAAA,QACrB,cAAc,KAAA,CAAM,YAAA;AAAA,QACpB,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,MAAM,KAAA,CAAM;AAAA,OACd;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,IAAI,SAAA,CAAU,QAAQ,CAAA,EAAG;AACvB,QAAA,SAAA,CAAU,KAAA,EAAA;AACV,QAAA;AAAA,MACF;AACA,MAAA,SAAA,CAAU,QAAQ,4CAAS,CAAA;AAAA,IAC7B,CAAA;AAEA,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,IAAI,SAAA,CAAU,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,EAAG;AAC/C,QAAA,SAAA,CAAU,KAAA,EAAA;AACV,QAAA;AAAA,MACF;AACA,MAAA,SAAA,CAAU,QAAQ,sCAAQ,CAAA;AAAA,IAC5B,CAAA;AAEA,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA;AACxC,MAAA,MAAM,MAAO,IAAA,CAAK,KAAA,CAAM,GAAuB,CAAA,IAAK,KAAK,GAAA,IAAO,EAAA;AAChE,MAAA,cAAA,CAAe,cAAc,GAAA,EAAK,EAAE,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,IAC3D,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"PreviewFile.vue2.mjs","sources":["../../../../../../../packages/components/src/composite/previewFile/PreviewFile.vue"],"sourcesContent":["<template>\n <el-dialog v-model=\"dialogVisible\" title=\"预览\" :width=\"previewWidth\" top=\"10vh\" append-to-body destroy-on-close>\n <template #header>\n <div class=\"gm-flex gm-items-center gm-justify-between\">\n <span>预览</span>\n <el-button v-if=\"openPreviewDownload\" type=\"primary\" size=\"default\" link @click=\"download\">下载</el-button>\n </div>\n </template>\n <div class=\"gm-flex gm-select-none gm-items-center gm-justify-center gm-gap-4\">\n <div v-if=\"files.length > 1\" class=\"gm-cursor-pointer\" @click=\"prev\">\n <el-icon :size=\"40\"><ArrowLeftBold /></el-icon>\n </div>\n <div class=\"gm-flex gm-flex-1 gm-items-center gm-justify-center\" style=\"height: calc(80vh - 72px)\">\n <GmFileComponent v-bind=\"fileProps\" />\n </div>\n <div v-if=\"files.length > 1\" class=\"gm-cursor-pointer\" @click=\"next\">\n <el-icon :size=\"40\"><ArrowRightBold /></el-icon>\n </div>\n </div>\n </el-dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { ElMessage } from 'element-plus';\nimport { useDownload } from '@giime/hooks/base/useDownload';\nimport { ArrowLeftBold, ArrowRightBold } from '@element-plus/icons-vue';\nimport GmFileComponent from '../fileComponent';\nimport { previewFileProps } from './previewFile';\nimport type { UploadFile } from 'element-plus';\n\ndefineOptions({\n name: 'GmPreviewFile',\n});\n\nconst props = defineProps(previewFileProps);\nconst dialogVisible = defineModel<boolean>('dialogVisible', { default: false });\nconst fileIndex = defineModel<number>('fileIndex', { default: 0 });\n\nconst downloadMethod = useDownload();\n\nconst files = computed(() => {\n let result: Partial<UploadFile>[] = props.fileList;\n if (props.fileList && !props.fileList.length && props.file) {\n result = [props.file];\n }\n return result;\n});\n\nconst fileProps = computed(() => {\n const file = files.value[fileIndex.value];\n return {\n file,\n controls: props.controls,\n oncontextmenu: props.oncontextmenu,\n controlslist: props.controlslist,\n field: props.field,\n url: props.url,\n size: props.size,\n };\n});\n\nconst prev = () => {\n if (fileIndex.value > 0) {\n fileIndex.value--;\n return;\n }\n ElMessage.warning('已经是第一张了');\n};\n\nconst next = () => {\n if (fileIndex.value < props.fileList.length - 1) {\n fileIndex.value++;\n return;\n }\n ElMessage.warning('没有更多了!');\n};\n\nconst download = () => {\n const file = files.value[fileIndex.value];\n const url = (file[props.url as keyof UploadFile] || file.url || '') as string;\n downloadMethod.downloadByUrl(url, { filename: file.name });\n};\n</script>\n"],"names":["_useModel"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,IAAA,MAAM,KAAA,GAAQ,OAAA;AACd,IAAA,MAAM,aAAA,GAAgBA,QAAA,CAAoB,OAAA,EAAC,eAAmC,CAAA;AAC9E,IAAA,MAAM,SAAA,GAAYA,QAAA,UAAoB,WAA2B,CAAA;AAEjE,IAAA,MAAM,iBAAiB,WAAA,EAAY;AAEnC,IAAA,MAAM,KAAA,GAAQ,SAAS,MAAM;AAC3B,MAAA,IAAI,SAAgC,KAAA,CAAM,QAAA;AAC1C,MAAA,IAAI,MAAM,QAAA,IAAY,CAAC,MAAM,QAAA,CAAS,MAAA,IAAU,MAAM,IAAA,EAAM;AAC1D,QAAA,MAAA,GAAS,CAAC,MAAM,IAAI,CAAA;AAAA,MACtB;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,SAAS,MAAM;AAC/B,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA;AACxC,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,eAAe,KAAA,CAAM,aAAA;AAAA,QACrB,cAAc,KAAA,CAAM,YAAA;AAAA,QACpB,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,MAAM,KAAA,CAAM;AAAA,OACd;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,IAAI,SAAA,CAAU,QAAQ,CAAA,EAAG;AACvB,QAAA,SAAA,CAAU,KAAA,EAAA;AACV,QAAA;AAAA,MACF;AACA,MAAA,SAAA,CAAU,QAAQ,4CAAS,CAAA;AAAA,IAC7B,CAAA;AAEA,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,IAAI,SAAA,CAAU,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,EAAG;AAC/C,QAAA,SAAA,CAAU,KAAA,EAAA;AACV,QAAA;AAAA,MACF;AACA,MAAA,SAAA,CAAU,QAAQ,sCAAQ,CAAA;AAAA,IAC5B,CAAA;AAEA,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA;AACxC,MAAA,MAAM,MAAO,IAAA,CAAK,KAAA,CAAM,GAAuB,CAAA,IAAK,KAAK,GAAA,IAAO,EAAA;AAChE,MAAA,cAAA,CAAe,cAAc,GAAA,EAAK,EAAE,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,IAC3D,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -3,7 +3,7 @@ import './UploadFile.vue3.mjs';
3
3
  import './UploadFile.vue4.mjs';
4
4
  import _export_sfc from '../../../../_virtual/_plugin-vue_export-helper.mjs';
5
5
 
6
- var UploadFile = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-28529631"]]);
6
+ var UploadFile = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-c615121c"]]);
7
7
 
8
8
  export { UploadFile as default };
9
9
  //# sourceMappingURL=UploadFile.vue.mjs.map
@@ -8,7 +8,7 @@ import { GmFileComponent } from '../fileComponent/index.mjs';
8
8
  import { GmPreviewFile } from '../previewFile/index.mjs';
9
9
  import { uploadFileProps } from './uploadFile.mjs';
10
10
 
11
- const _withScopeId = (n) => (pushScopeId("data-v-28529631"), n = n(), popScopeId(), n);
11
+ const _withScopeId = (n) => (pushScopeId("data-v-c615121c"), n = n(), popScopeId(), n);
12
12
  const _hoisted_1 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ createElementVNode(
13
13
  "div",
14
14
  { class: "el-upload__text gm-text-center !gm-text-xs gm-text-gray-500" },
@@ -1 +1 @@
1
- {"version":3,"file":"UploadFile.vue2.mjs","sources":["../../../../../../../packages/components/src/composite/uploadFile/UploadFile.vue"],"sourcesContent":["<template>\n <div>\n <div\n ref=\"pasteFileRef\"\n :class=\"{ 'gm-upload-file-picture-card': listType === 'picture-card', 'gm-upload-file-disabled': disabled }\"\n class=\"gm-upload-file\"\n >\n <el-checkbox-group v-model=\"checkoutFiles\">\n <el-upload\n ref=\"uploadFileRef\"\n v-bind=\"props\"\n v-model:file-list=\"fileList\"\n :before-remove=\"beforeRemove\"\n action=\"\"\n :http-request=\"httpRequest\"\n :on-success=\"coverFileSuccess\"\n :on-error=\"coverFileError\"\n >\n <slot v-if=\"!disabled\">\n <template v-if=\"listType === 'picture-card'\">\n <div\n class=\"gm-flex gm-flex-col gm-items-center gm-justify-center gm-rounded-md gm-border gm-border-dashed gm-p-1\"\n style=\"flex-direction: column\"\n :style=\"{ width: width + 'px', height: height + 'px' }\"\n >\n <el-icon :size=\"30\" color=\"#999\">\n <UploadFilled />\n </el-icon>\n <div class=\"el-upload__text gm-text-center !gm-text-xs gm-text-gray-500\">\n 将文件拖到此处,复制粘贴,或 <em class=\"gm-text-blue-700\">点击上传</em>\n </div>\n </div>\n </template>\n <template v-else>\n <el-button type=\"primary\" size=\"default\">点击上传</el-button>\n </template>\n </slot>\n <template v-if=\"showFileList && listType === 'picture-card'\" #file=\"{ file }\">\n <el-checkbox v-if=\"checkbox\" :value=\"file\" />\n <slot name=\"file\" :file=\"file\">\n <div :style=\"{ width: width + 'px' }\">\n <div class=\"gm-relative gm-flex gm-items-center gm-justify-center gm-overflow-hidden gm-rounded-md\">\n <GmFileComponent\n :file=\"file\"\n :size=\"width - 40\"\n :url=\"url\"\n :controls=\"false\"\n :show-icon=\"true\"\n :field=\"field\"\n :fileWidth=\"width + 'px'\"\n :fileHeight=\"height + 'px'\"\n :fileStyle=\"{ border: '1px solid #dcdfe6', overflow: 'hidden', borderRadius: '5px' }\"\n />\n <div class=\"el-upload-list__item-actions\">\n <span class=\"el-upload-list__item-preview\" @click=\"handlePreview(file)\">\n <el-icon><View /></el-icon>\n </span>\n <span v-if=\"showDelete\" class=\"el-upload-list__item-delete\" @click=\"handleRemove(file, fileList)\">\n <el-icon><Delete /></el-icon>\n </span>\n </div>\n </div>\n <slot name=\"fileBottom\" :file=\"file\" />\n </div>\n </slot>\n </template>\n </el-upload>\n </el-checkbox-group>\n\n <GmPreviewFile\n v-model:dialogVisible=\"dialogVisible\"\n v-model:file-index=\"fileIndex\"\n :file-list=\"fileList\"\n :controls=\"controls\"\n :oncontextmenu=\"oncontextmenu\"\n :controlslist=\"controlslist\"\n :field=\"field\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport { ElMessageBox } from 'element-plus';\nimport { useUploadTaskStore } from '@giime/hooks/store/useUploadTask';\nimport { usePasteFile } from '@giime/hooks/base/usePasteFile';\nimport { GmConfirmBox } from '@giime/components/src/plugins/confirmBox';\nimport { Delete, UploadFilled, View } from '@element-plus/icons-vue';\nimport GmFileComponent from '../fileComponent';\nimport GmPreviewFile from '../previewFile';\nimport { uploadFileProps } from './uploadFile';\nimport type { GmUploadProUserFileResponse } from './uploadFile';\nimport type { UploadFile, UploadFiles, UploadInstance, UploadProps, UploadRawFile, UploadRequestOptions, UploadStatus } from 'element-plus';\n\ndefineOptions({\n name: 'GmUploadFile',\n});\n\nconst props = defineProps(uploadFileProps);\nconst emit = defineEmits([\"handleRemove\"]);\n\nconst { uploadFileTask } = useUploadTaskStore();\n\n/** 上传文件 */\nconst fileList = defineModel<UploadFile[]>('fileList', { required: true, default: () => [] });\n/** 多选数据 */\nconst checkoutFiles = defineModel<any[]>('checkoutFiles', { default: () => [] });\n\nconst loadingUids = ref<Set<number>>(new Set());\n\n/* 上传 */\nconst httpRequest = async (options: UploadRequestOptions) => {\n loadingUids.value.add(options.file.uid);\n const { file } = options;\n\n const res: any = await uploadFileTask(file, {\n domainCode: props.domainCode,\n sceneCode: props.sceneCode,\n accept: props.accept,\n acl: props.acl,\n elOptions: options,\n });\n\n return { ...res, file };\n};\n\n/**判断是否全部上传完成 并触发事件 */\nconst checkAllUploadComplete = () => {\n if (loadingUids.value.size === 0) {\n // 全部文件上传完成\n props.onAllComplete?.();\n }\n};\n// 上传成功\nconst coverFileSuccess: UploadProps['onSuccess'] = (response: GmUploadProUserFileResponse, uploadFile, uploadFiles) => {\n loadingUids.value.delete(uploadFile.uid);\n uploadFile.url = response.url;\n props.onSuccess?.(response, uploadFile, uploadFiles);\n // 判断是否全部上传完成\n checkAllUploadComplete();\n};\n// 上传失败\nconst coverFileError: UploadProps['onError'] = (error, uploadFile, uploadFiles) => {\n loadingUids.value.delete(uploadFile.uid);\n props.onError?.(error, uploadFile, uploadFiles);\n // 判断是否全部上传完成\n checkAllUploadComplete();\n};\n\n/* 删除文件前 */\nconst beforeRemove = (file: UploadFile, files: UploadFiles) => {\n if (props.disabled) {\n return false;\n }\n return props.beforeRemove ? props.beforeRemove(file, files) : true;\n};\n\n/* 删除文件 */\nconst removeFile = (file: UploadFile, uploadFiles: UploadFiles) => {\n const index = fileList.value.indexOf(file);\n if (index > -1) {\n fileList.value.splice(index, 1);\n emit('handleRemove', { file, index });\n return props.onRemove?.(file, uploadFiles);\n }\n};\nconst handleRemove = async (file: UploadFile, uploadFiles: UploadFiles) => {\n if (props.deleteTip) {\n await GmConfirmBox({ message: '确定删除该文件吗?' }, async () => {});\n }\n\n removeFile(file, uploadFiles);\n};\n\nconst uploadFileRef = ref<UploadInstance>();\nconst pasteFileRef = ref<HTMLElement>();\n/* 手动上传 */\nconst submit = () => {\n uploadFileRef.value!.submit();\n};\n\n/** 取消上传 */\nconst abort = (file: UploadFile) => {\n uploadFileRef.value!.abort(file);\n};\n\n/** 清空已上传的文件列表 */\nconst clearFiles = (status?: UploadStatus[]) => {\n uploadFileRef.value!.clearFiles(status);\n};\n\n/** 手动选择文件 */\nconst handleStart = (rawFile: UploadRawFile) => {\n uploadFileRef.value!.handleStart(rawFile);\n};\n\n/** 预览 */\nconst dialogVisible = ref(false);\nconst fileIndex = ref(0);\nconst handlePreview = (file: UploadFile) => {\n fileIndex.value = fileList.value.indexOf(file);\n dialogVisible.value = true;\n};\n\n//** 复制粘贴 */\nconst { onSuccess, onError } = usePasteFile(pasteFileRef, { accept: props.accept, disabled: props.disabled });\nonSuccess((files: File[]) => {\n if (Array.isArray(files) && files.length > 0) {\n files.forEach(file => {\n if (file instanceof File) {\n const rawFile = file as UploadRawFile;\n handleStart(rawFile);\n\n // 粘贴成功自动上传\n if (props.autoUpload) {\n submit();\n }\n }\n });\n }\n});\n\nonError((error: Error) => {\n console.error('粘贴错误:', error);\n ElMessageBox.alert(error.message, '提示', {\n type: 'error',\n });\n});\n\ndefineExpose({\n submit,\n abort,\n clearFiles,\n handleStart,\n uploadFileRef,\n});\n</script>\n\n<style scoped lang=\"scss\">\n.gm-upload-preview-dialog {\n :deep(.el-dialog__body) {\n padding: 0;\n }\n}\n.gm-upload-file-picture-card {\n :deep(.el-upload-list__item),\n :deep(.el-upload--picture-card) {\n width: auto;\n height: auto;\n }\n}\n</style>\n<style lang=\"scss\">\n.gm-upload-file {\n line-height: normal;\n .el-checkbox {\n position: absolute;\n left: 10px;\n top: 0;\n z-index: 9;\n }\n .el-upload-list--picture-card {\n gap: 10px;\n }\n .el-upload-list__item {\n margin: 0;\n border: none;\n }\n .el-upload-list__item-file-name {\n line-height: normal;\n }\n .el-upload-dragger {\n padding: 0;\n border: none;\n width: 100%;\n height: 100%;\n display: flex;\n }\n .el-upload--picture-card {\n border: none;\n }\n}\n.gm-upload-file-disabled {\n .el-upload--picture-card {\n display: none;\n }\n .el-upload-list__item-status-label {\n display: none;\n }\n}\n</style>\n"],"names":["_useModel"],"mappings":"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"}
1
+ {"version":3,"file":"UploadFile.vue2.mjs","sources":["../../../../../../../packages/components/src/composite/uploadFile/UploadFile.vue"],"sourcesContent":["<template>\n <div>\n <div\n ref=\"pasteFileRef\"\n :class=\"{ 'gm-upload-file-picture-card': listType === 'picture-card', 'gm-upload-file-disabled': disabled }\"\n class=\"gm-upload-file\"\n >\n <el-checkbox-group v-model=\"checkoutFiles\">\n <el-upload\n ref=\"uploadFileRef\"\n v-bind=\"props\"\n v-model:file-list=\"fileList\"\n :before-remove=\"beforeRemove\"\n action=\"\"\n :http-request=\"httpRequest\"\n :on-success=\"coverFileSuccess\"\n :on-error=\"coverFileError\"\n >\n <slot v-if=\"!disabled\">\n <template v-if=\"listType === 'picture-card'\">\n <div\n class=\"gm-flex gm-flex-col gm-items-center gm-justify-center gm-rounded-md gm-border gm-border-dashed gm-p-1\"\n style=\"flex-direction: column\"\n :style=\"{ width: width + 'px', height: height + 'px' }\"\n >\n <el-icon :size=\"30\" color=\"#999\">\n <UploadFilled />\n </el-icon>\n <div class=\"el-upload__text gm-text-center !gm-text-xs gm-text-gray-500\">\n 将文件拖到此处,复制粘贴,或 <em class=\"gm-text-blue-700\">点击上传</em>\n </div>\n </div>\n </template>\n <template v-else>\n <el-button type=\"primary\" size=\"default\">点击上传</el-button>\n </template>\n </slot>\n <template v-if=\"showFileList && listType === 'picture-card'\" #file=\"{ file }\">\n <el-checkbox v-if=\"checkbox\" :value=\"file\" />\n <slot name=\"file\" :file=\"file\">\n <div :style=\"{ width: width + 'px' }\">\n <div class=\"gm-relative gm-flex gm-items-center gm-justify-center gm-overflow-hidden gm-rounded-md\">\n <GmFileComponent\n :file=\"file\"\n :size=\"width - 40\"\n :url=\"url\"\n :controls=\"false\"\n :show-icon=\"true\"\n :field=\"field\"\n :fileWidth=\"width + 'px'\"\n :fileHeight=\"height + 'px'\"\n :fileStyle=\"{ border: '1px solid #dcdfe6', overflow: 'hidden', borderRadius: '5px' }\"\n />\n <div class=\"el-upload-list__item-actions\">\n <span class=\"el-upload-list__item-preview\" @click=\"handlePreview(file)\">\n <el-icon><View /></el-icon>\n </span>\n <span v-if=\"showDelete\" class=\"el-upload-list__item-delete\" @click=\"handleRemove(file, fileList)\">\n <el-icon><Delete /></el-icon>\n </span>\n </div>\n </div>\n <slot name=\"fileBottom\" :file=\"file\" />\n </div>\n </slot>\n </template>\n </el-upload>\n </el-checkbox-group>\n\n <GmPreviewFile\n v-model:dialogVisible=\"dialogVisible\"\n v-model:file-index=\"fileIndex\"\n :file-list=\"fileList\"\n :controls=\"controls\"\n :oncontextmenu=\"oncontextmenu\"\n :controlslist=\"controlslist\"\n :field=\"field\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport { ElMessageBox } from 'element-plus';\nimport { useUploadTaskStore } from '@giime/hooks/store/useUploadTask';\nimport { usePasteFile } from '@giime/hooks/base/usePasteFile';\nimport { GmConfirmBox } from '@giime/components/src/plugins/confirmBox';\nimport { Delete, UploadFilled, View } from '@element-plus/icons-vue';\nimport GmFileComponent from '../fileComponent';\nimport GmPreviewFile from '../previewFile';\nimport { uploadFileProps } from './uploadFile';\nimport type { GmUploadProUserFileResponse } from './uploadFile';\nimport type { UploadFile, UploadFiles, UploadInstance, UploadProps, UploadRawFile, UploadRequestOptions, UploadStatus } from 'element-plus';\n\ndefineOptions({\n name: 'GmUploadFile',\n});\n\nconst props = defineProps(uploadFileProps);\nconst emit = defineEmits([\"handleRemove\"]);\n\nconst { uploadFileTask } = useUploadTaskStore();\n\n/** 上传文件 */\nconst fileList = defineModel<UploadFile[]>('fileList', { required: true, default: () => [] });\n/** 多选数据 */\nconst checkoutFiles = defineModel<any[]>('checkoutFiles', { default: () => [] });\n\nconst loadingUids = ref<Set<number>>(new Set());\n\n/* 上传 */\nconst httpRequest = async (options: UploadRequestOptions) => {\n loadingUids.value.add(options.file.uid);\n const { file } = options;\n\n const res: any = await uploadFileTask(file, {\n domainCode: props.domainCode,\n sceneCode: props.sceneCode,\n accept: props.accept,\n acl: props.acl,\n elOptions: options,\n });\n\n return { ...res, file };\n};\n\n/**判断是否全部上传完成 并触发事件 */\nconst checkAllUploadComplete = () => {\n if (loadingUids.value.size === 0) {\n // 全部文件上传完成\n props.onAllComplete?.();\n }\n};\n// 上传成功\nconst coverFileSuccess: UploadProps['onSuccess'] = (response: GmUploadProUserFileResponse, uploadFile, uploadFiles) => {\n loadingUids.value.delete(uploadFile.uid);\n uploadFile.url = response.url;\n props.onSuccess?.(response, uploadFile, uploadFiles);\n // 判断是否全部上传完成\n checkAllUploadComplete();\n};\n// 上传失败\nconst coverFileError: UploadProps['onError'] = (error, uploadFile, uploadFiles) => {\n loadingUids.value.delete(uploadFile.uid);\n props.onError?.(error, uploadFile, uploadFiles);\n // 判断是否全部上传完成\n checkAllUploadComplete();\n};\n\n/* 删除文件前 */\nconst beforeRemove = (file: UploadFile, files: UploadFiles) => {\n if (props.disabled) {\n return false;\n }\n return props.beforeRemove ? props.beforeRemove(file, files) : true;\n};\n\n/* 删除文件 */\nconst removeFile = (file: UploadFile, uploadFiles: UploadFiles) => {\n const index = fileList.value.indexOf(file);\n if (index > -1) {\n fileList.value.splice(index, 1);\n emit('handleRemove', { file, index });\n return props.onRemove?.(file, uploadFiles);\n }\n};\nconst handleRemove = async (file: UploadFile, uploadFiles: UploadFiles) => {\n if (props.deleteTip) {\n await GmConfirmBox({ message: '确定删除该文件吗?' }, async () => {});\n }\n\n removeFile(file, uploadFiles);\n};\n\nconst uploadFileRef = ref<UploadInstance>();\nconst pasteFileRef = ref<HTMLElement>();\n/* 手动上传 */\nconst submit = () => {\n uploadFileRef.value!.submit();\n};\n\n/** 取消上传 */\nconst abort = (file: UploadFile) => {\n uploadFileRef.value!.abort(file);\n};\n\n/** 清空已上传的文件列表 */\nconst clearFiles = (status?: UploadStatus[]) => {\n uploadFileRef.value!.clearFiles(status);\n};\n\n/** 手动选择文件 */\nconst handleStart = (rawFile: UploadRawFile) => {\n uploadFileRef.value!.handleStart(rawFile);\n};\n\n/** 预览 */\nconst dialogVisible = ref(false);\nconst fileIndex = ref(0);\nconst handlePreview = (file: UploadFile) => {\n fileIndex.value = fileList.value.indexOf(file);\n dialogVisible.value = true;\n};\n\n//** 复制粘贴 */\nconst { onSuccess, onError } = usePasteFile(pasteFileRef, { accept: props.accept, disabled: props.disabled });\nonSuccess((files: File[]) => {\n if (Array.isArray(files) && files.length > 0) {\n files.forEach(file => {\n if (file instanceof File) {\n const rawFile = file as UploadRawFile;\n handleStart(rawFile);\n\n // 粘贴成功自动上传\n if (props.autoUpload) {\n submit();\n }\n }\n });\n }\n});\n\nonError((error: Error) => {\n console.error('粘贴错误:', error);\n ElMessageBox.alert(error.message, '提示', {\n type: 'error',\n });\n});\n\ndefineExpose({\n submit,\n abort,\n clearFiles,\n handleStart,\n uploadFileRef,\n});\n</script>\n\n<style scoped lang=\"scss\">\n.gm-upload-preview-dialog {\n :deep(.el-dialog__body) {\n padding: 0;\n }\n}\n.gm-upload-file-picture-card {\n :deep(.el-upload-list__item),\n :deep(.el-upload--picture-card) {\n width: auto;\n height: auto;\n }\n}\n</style>\n<style lang=\"scss\">\n.gm-upload-file {\n line-height: normal;\n li > {\n .el-checkbox {\n position: absolute;\n left: 10px;\n top: 0;\n z-index: 9;\n }\n }\n .el-upload-list--picture-card {\n gap: 10px;\n }\n .el-upload-list__item {\n margin: 0;\n border: none;\n }\n .el-upload-list__item-file-name {\n line-height: normal;\n }\n .el-upload-dragger {\n padding: 0;\n border: none;\n width: 100%;\n height: 100%;\n display: flex;\n }\n .el-upload--picture-card {\n border: none;\n }\n}\n.gm-upload-file-disabled {\n .el-upload--picture-card {\n display: none;\n }\n .el-upload-list__item-status-label {\n display: none;\n }\n}\n</style>\n"],"names":["_useModel"],"mappings":"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"}
@@ -1 +1 @@
1
- export declare const version = "0.8.12";
1
+ export declare const version = "0.8.13";
@@ -1,4 +1,4 @@
1
- const version = "0.8.11";
1
+ const version = "0.8.13";
2
2
 
3
3
  export { version };
4
4
  //# sourceMappingURL=version.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.mjs","sources":["../../../../packages/giime/version.ts"],"sourcesContent":["export const version = '0.8.11';\n"],"names":[],"mappings":"AAAO,MAAM,OAAA,GAAU;;;;"}
1
+ {"version":3,"file":"version.mjs","sources":["../../../../packages/giime/version.ts"],"sourcesContent":["export const version = '0.8.13';\n"],"names":[],"mappings":"AAAO,MAAM,OAAA,GAAU;;;;"}
@@ -8,10 +8,6 @@ import '../../../utils/index.mjs';
8
8
  import { isString } from '../../../utils/src/is.mjs';
9
9
 
10
10
  const useDownload = () => {
11
- const getUrlFilename = (url) => {
12
- const filename = url.split("/").pop()?.split("?")[0] || "file";
13
- return filename;
14
- };
15
11
  const downloadByUrl = async (url, options) => {
16
12
  const filename = options?.filename || getUrlFilename(url);
17
13
  const curId = v4();
@@ -66,7 +62,7 @@ const useDownload = () => {
66
62
  const currentItem = fileList[i];
67
63
  const downblobOptions = {
68
64
  url: currentItem.url,
69
- filename: currentItem.filename ?? getUrlFilename(currentItem.url),
65
+ filename: ensureFilenameWithExtension(currentItem.filename, currentItem.url),
70
66
  isZip: true
71
67
  };
72
68
  createDownload(downblobOptions).then((res) => {
@@ -152,7 +148,15 @@ const useDownload = () => {
152
148
  let currentIndex = 0;
153
149
  const downloadSingleFile = async (item) => {
154
150
  try {
155
- const finalFilename = item.filename || getUrlFilename(item.url);
151
+ if (!item.url) {
152
+ if (item.folder) {
153
+ zipInstance.folder(item.folder);
154
+ }
155
+ downloadCount.value++;
156
+ editElementContent(currentContentClass, `\u603B\u6587\u4EF6\u6570\uFF1A${totalCount}\uFF0C\u5DF2\u4E0B\u8F7D\uFF1A${downloadCount.value}\uFF0C\u5931\u8D25\uFF1A${errorCount.value}`);
157
+ return;
158
+ }
159
+ const finalFilename = ensureFilenameWithExtension(item.filename, item.url);
156
160
  const blob = await createDownload({
157
161
  url: item.url,
158
162
  filename: finalFilename,
@@ -237,6 +241,26 @@ const getFileNameFromContentDisposition = (disposition) => {
237
241
  return "filename-error";
238
242
  }
239
243
  };
244
+ const getUrlFilename = (url) => {
245
+ const urlWithoutQuery = url.split("?")[0];
246
+ const filename = urlWithoutQuery.split("/").pop() || "file";
247
+ return filename;
248
+ };
249
+ const getFileExtension = (filename) => {
250
+ const match = filename.match(/\.[^./\\]+$/);
251
+ return match ? match[0] : "";
252
+ };
253
+ const ensureFilenameWithExtension = (filename, url) => {
254
+ if (!filename) {
255
+ return getUrlFilename(url);
256
+ }
257
+ if (getFileExtension(filename)) {
258
+ return filename;
259
+ }
260
+ const urlFilename = getUrlFilename(url);
261
+ const extension = getFileExtension(urlFilename);
262
+ return filename + extension;
263
+ };
240
264
 
241
265
  export { useDownload };
242
266
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../../../packages/hooks/base/useDownload/index.ts"],"sourcesContent":["import { h, ref } from 'vue';\nimport FileSaver from 'file-saver';\n\nimport GmNotification from '@giime/components/src/plugins/notification';\nimport { v4 as uuidv4 } from 'uuid';\nimport JSZip from 'jszip';\nimport { GmMessage } from '@giime/components/src/plugins/message';\nimport type { AxiosResponse } from 'axios';\nimport { isString } from '@giime/utils';\n\nexport interface DownloadOptions {\n filename?: string;\n}\nexport interface DateownloadZipItem {\n url: string;\n filename?: string;\n}\n\nexport interface DownloadFolderItem {\n url: string;\n /** 资源所在文件夹名称多级使用 / 隔开 例如:一级文件夹/二级文件夹/三级文件夹 */\n folder?: string;\n filename?: string;\n}\n\nexport const useDownload = () => {\n const getUrlFilename = (url: string) => {\n const filename = url.split('/').pop()?.split('?')[0] || 'file';\n return filename;\n };\n /**\n * 通过url下载\n * @param url\n * @param options\n */\n const downloadByUrl = async (url: string, options?: DownloadOptions) => {\n const filename = options?.filename || getUrlFilename(url);\n const curId = uuidv4();\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', { className: curId }, [`当前下载进度 0%`]),\n duration: 0,\n });\n try {\n await createDownload({\n url,\n filename,\n uuid: curId,\n });\n } finally {\n modalInfo.close();\n }\n };\n /**\n * 通过接口响应结果下载\n * @param res\n * @param options\n */\n const downloadByRes = async (res: AxiosResponse<any, any>, options?: DownloadOptions) => {\n const filename =\n options?.filename || getFileNameFromContentDisposition(res?.headers?.['content-disposition'] || res?.headers?.['Content-Disposition']);\n const resBlob = await res.data;\n const curId = uuidv4();\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', { className: curId }, [`当前下载进度 0%`]),\n duration: 0,\n });\n // 设置type类型\n const blob = new Blob([resBlob]);\n const fileUrl = window.URL.createObjectURL(blob);\n try {\n await createDownload({\n url: fileUrl,\n filename,\n uuid: curId,\n });\n } finally {\n modalInfo.close();\n }\n };\n /**\n * 下载多文件 转为zip\n * @param fileList\n * @param filename\n */\n const downloadToZip = async (fileList: DateownloadZipItem[], filename: string) => {\n return new Promise((resolve, reject) => {\n const currentContentClass = `message${Date.now()}`;\n const downloadCount = ref(0);\n const len = fileList.length;\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', [h('div', { className: currentContentClass }, [`总下载文件数:${len},已下载文件数:${downloadCount.value}`])]),\n duration: 0,\n });\n // h('div', { className: currentClass }, [`当前下载进度 ${progress.value}%`]),\n const zipInstance = new JSZip();\n for (let i = 0; i < len; i++) {\n const currentItem = fileList[i];\n // const fileBlob = await\n const downblobOptions = {\n url: currentItem.url,\n filename: currentItem.filename ?? getUrlFilename(currentItem.url),\n isZip: true,\n };\n createDownload(downblobOptions)\n .then(res => {\n zipInstance.file(downblobOptions.filename, res);\n downloadCount.value++;\n editElementContent(currentContentClass, `总下载文件数:${len},已下载文件数:${downloadCount.value}`);\n if (downloadCount.value == len) {\n editElementContent(currentContentClass, `正在合并...`);\n zipInstance\n .generateAsync({ type: 'blob' })\n .then(async res => {\n modalInfo.close();\n\n const fileUrl = window.URL.createObjectURL(res);\n // FileSaver.saveAs(res, filename);\n await downloadByUrl(fileUrl, { filename });\n resolve(true);\n })\n .catch(error => {\n console.error('error', error);\n reject(error);\n });\n }\n })\n .catch(error => {\n reject(error);\n modalInfo.close();\n });\n }\n });\n };\n const createDownload = (options: { url: string; filename: string; uuid?: string; isZip?: boolean }) => {\n return new Promise<Blob>((resolve, reject) => {\n // 创建一个新的 XMLHttpRequest 对象\n const xhr = new XMLHttpRequest();\n // 初始化一个GET请求\n xhr.open('GET', options.url, true);\n xhr.responseType = 'blob'; // 设置响应类型为blob,以便处理二进制文件\n\n // 监听 progress 事件\n xhr.onprogress = function (event) {\n if (event.lengthComputable) {\n const percentComplete = Math.floor((event.loaded / event.total) * 100);\n if (options.uuid) {\n editElementContent(options.uuid, `当前下载进度 ${percentComplete}%`);\n }\n }\n };\n\n // 监听 load 事件,表示下载完成\n xhr.onload = function (e) {\n const eventTarget = e.target as XMLHttpRequest;\n if ([200, 304].includes(eventTarget.status)) {\n const blob = eventTarget.response;\n // const url = window.URL.createObjectURL(blob);\n if (!options.isZip) {\n FileSaver.saveAs(blob, options.filename);\n GmNotification({\n type: 'success',\n title: '温馨提示',\n message: '下载完成',\n duration: 3000,\n });\n }\n\n resolve(blob);\n } else if (eventTarget.status === 404) {\n GmMessage.error('文件不存在,或已被删除');\n reject(e);\n } else {\n GmMessage.error('下载异常,请重试!');\n reject(e);\n }\n };\n\n // 监听 error 事件\n xhr.onerror = function (e) {\n GmMessage.error('下载异常,请重试');\n reject(e);\n };\n\n // 发送请求\n xhr.send();\n });\n };\n\n /**\n * - 下载文件夹和文件 支持文件夹结构\n *\n * - 如果下载多级文件夹则文件所属文件夹路径使用 / 隔开\n *\n * - 文件夹路径folder结构为:一级文件夹/二级文件夹/三级文件夹...\n * @param fileList 文件列表\n * @param zipName zip文件名,默认为 '资源+当前时间戳'\n */\n const downloadFolderToZip = async (fileList: DownloadFolderItem[], zipName?: string) => {\n const finalZipName = zipName || `资源${Date.now()}`;\n const currentContentClass = `message${Date.now()}`;\n const downloadCount = ref(0);\n const errorCount = ref(0);\n const totalCount = fileList.length;\n\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', [\n h('div', { className: currentContentClass }, [`总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`]),\n ]),\n duration: 0,\n });\n\n const zipInstance = new JSZip();\n const concurrentLimit = 5;\n let currentIndex = 0;\n\n const downloadSingleFile = async (item: DownloadFolderItem): Promise<void> => {\n try {\n // 确保文件名不为空,优先使用传入的filename,否则从URL提取\n const finalFilename = item.filename || getUrlFilename(item.url);\n\n const blob = await createDownload({\n url: item.url,\n filename: finalFilename,\n isZip: true,\n });\n\n // 构建文件在zip中的路径,使用处理后的文件名\n const filePath = item.folder ? `${item.folder}/${finalFilename}` : finalFilename;\n zipInstance.file(filePath, blob);\n\n downloadCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n } catch (error) {\n console.error(`下载文件失败: ${item.filename}`, error);\n errorCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n }\n };\n\n const processNextBatch = async (): Promise<void> => {\n const batch: Promise<void>[] = [];\n\n for (let i = 0; i < concurrentLimit && currentIndex < fileList.length; i++) {\n const item = fileList[currentIndex++];\n batch.push(downloadSingleFile(item));\n }\n\n if (batch.length > 0) {\n await Promise.all(batch);\n if (currentIndex < fileList.length) {\n await processNextBatch();\n }\n }\n };\n\n try {\n await processNextBatch();\n\n editElementContent(currentContentClass, `正在打包zip文件...`);\n\n const zipBlob = await zipInstance.generateAsync({ type: 'blob' });\n modalInfo.close();\n\n FileSaver.saveAs(zipBlob, `${finalZipName}.zip`);\n\n if (errorCount.value > 0) {\n GmNotification({\n type: 'warning',\n title: '温馨提示',\n message: `成功下载 ${downloadCount.value} 个文件,${errorCount.value} 个文件下载失败`,\n duration: 5000,\n });\n } else {\n GmNotification({\n type: 'success',\n title: '温馨提示',\n message: `成功下载 ${downloadCount.value} 个文件`,\n duration: 3000,\n });\n }\n\n return true;\n } catch (error) {\n modalInfo.close();\n GmMessage.error('打包下载失败,请重试');\n throw error;\n }\n };\n\n return { downloadByUrl, downloadByRes, downloadToZip, downloadFolderToZip };\n};\n\n// 动态更新 notify 中的message 信息\nconst editElementContent = (className: string, content: string) => {\n // eslint-disable-next-line unicorn/prefer-query-selector\n const currentEle = document.getElementsByClassName(className)[0];\n if (currentEle) {\n currentEle.innerHTML = content;\n }\n};\n\n/**\n * 从 Content-Disposition 头中解析文件名,兼容 RFC 5987、RFC 6266 和传统标准\n * @param {string} [disposition] - Content-Disposition 头内容\n * @returns {string} 解析后的文件名,默认返回 'file'\n */\nconst getFileNameFromContentDisposition = (disposition?: string) => {\n if (!disposition || !isString(disposition)) {\n return 'file';\n }\n\n const normalized = disposition.replace(/\\s+/g, '');\n\n try {\n // RFC 5987: filename*=UTF-8''encoded-filename\n const rfc5987Match = normalized.match(/filename\\*=UTF-8''([^;]+)/i);\n if (rfc5987Match) {\n return decodeURIComponent(rfc5987Match[1]);\n }\n\n // 标准: filename=\"filename\" 或 filename=filename\n const standardMatch = normalized.match(/filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/i);\n if (standardMatch) {\n return decodeURIComponent(standardMatch[1].replace(/['\"]/g, ''));\n }\n\n return 'file';\n } catch (error) {\n console.error(error);\n return 'filename-error';\n }\n};\n"],"names":["uuidv4","res"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../../../packages/hooks/base/useDownload/index.ts"],"sourcesContent":["import { h, ref } from 'vue';\nimport FileSaver from 'file-saver';\n\nimport GmNotification from '@giime/components/src/plugins/notification';\nimport { v4 as uuidv4 } from 'uuid';\nimport JSZip from 'jszip';\nimport { GmMessage } from '@giime/components/src/plugins/message';\nimport type { AxiosResponse } from 'axios';\nimport { isString } from '@giime/utils';\n\nexport interface DownloadOptions {\n filename?: string;\n}\nexport interface DateownloadZipItem {\n url: string;\n filename?: string;\n}\n\nexport interface DownloadFolderItem {\n url: string;\n /** 资源所在文件夹名称多级使用 / 隔开 例如:一级文件夹/二级文件夹/三级文件夹 */\n folder?: string;\n filename?: string;\n}\n\nexport const useDownload = () => {\n /**\n * 通过url下载\n * @param url\n * @param options\n */\n const downloadByUrl = async (url: string, options?: DownloadOptions) => {\n const filename = options?.filename || getUrlFilename(url);\n const curId = uuidv4();\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', { className: curId }, [`当前下载进度 0%`]),\n duration: 0,\n });\n try {\n await createDownload({\n url,\n filename,\n uuid: curId,\n });\n } finally {\n modalInfo.close();\n }\n };\n /**\n * 通过接口响应结果下载\n * @param res\n * @param options\n */\n const downloadByRes = async (res: AxiosResponse<any, any>, options?: DownloadOptions) => {\n const filename =\n options?.filename || getFileNameFromContentDisposition(res?.headers?.['content-disposition'] || res?.headers?.['Content-Disposition']);\n const resBlob = await res.data;\n const curId = uuidv4();\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', { className: curId }, [`当前下载进度 0%`]),\n duration: 0,\n });\n // 设置type类型\n const blob = new Blob([resBlob]);\n const fileUrl = window.URL.createObjectURL(blob);\n try {\n await createDownload({\n url: fileUrl,\n filename,\n uuid: curId,\n });\n } finally {\n modalInfo.close();\n }\n };\n /**\n * 下载多文件 转为zip\n * @param fileList\n * @param filename\n */\n const downloadToZip = async (fileList: DateownloadZipItem[], filename: string) => {\n return new Promise((resolve, reject) => {\n const currentContentClass = `message${Date.now()}`;\n const downloadCount = ref(0);\n const len = fileList.length;\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', [h('div', { className: currentContentClass }, [`总下载文件数:${len},已下载文件数:${downloadCount.value}`])]),\n duration: 0,\n });\n // h('div', { className: currentClass }, [`当前下载进度 ${progress.value}%`]),\n const zipInstance = new JSZip();\n for (let i = 0; i < len; i++) {\n const currentItem = fileList[i];\n // const fileBlob = await\n const downblobOptions = {\n url: currentItem.url,\n filename: ensureFilenameWithExtension(currentItem.filename, currentItem.url),\n isZip: true,\n };\n createDownload(downblobOptions)\n .then(res => {\n zipInstance.file(downblobOptions.filename, res);\n downloadCount.value++;\n editElementContent(currentContentClass, `总下载文件数:${len},已下载文件数:${downloadCount.value}`);\n if (downloadCount.value == len) {\n editElementContent(currentContentClass, `正在合并...`);\n zipInstance\n .generateAsync({ type: 'blob' })\n .then(async res => {\n modalInfo.close();\n\n const fileUrl = window.URL.createObjectURL(res);\n // FileSaver.saveAs(res, filename);\n await downloadByUrl(fileUrl, { filename });\n resolve(true);\n })\n .catch(error => {\n console.error('error', error);\n reject(error);\n });\n }\n })\n .catch(error => {\n reject(error);\n modalInfo.close();\n });\n }\n });\n };\n const createDownload = (options: { url: string; filename: string; uuid?: string; isZip?: boolean }) => {\n return new Promise<Blob>((resolve, reject) => {\n // 创建一个新的 XMLHttpRequest 对象\n const xhr = new XMLHttpRequest();\n // 初始化一个GET请求\n xhr.open('GET', options.url, true);\n xhr.responseType = 'blob'; // 设置响应类型为blob,以便处理二进制文件\n\n // 监听 progress 事件\n xhr.onprogress = function (event) {\n if (event.lengthComputable) {\n const percentComplete = Math.floor((event.loaded / event.total) * 100);\n if (options.uuid) {\n editElementContent(options.uuid, `当前下载进度 ${percentComplete}%`);\n }\n }\n };\n\n // 监听 load 事件,表示下载完成\n xhr.onload = function (e) {\n const eventTarget = e.target as XMLHttpRequest;\n if ([200, 304].includes(eventTarget.status)) {\n const blob = eventTarget.response;\n // const url = window.URL.createObjectURL(blob);\n if (!options.isZip) {\n FileSaver.saveAs(blob, options.filename);\n GmNotification({\n type: 'success',\n title: '温馨提示',\n message: '下载完成',\n duration: 3000,\n });\n }\n\n resolve(blob);\n } else if (eventTarget.status === 404) {\n GmMessage.error('文件不存在,或已被删除');\n reject(e);\n } else {\n GmMessage.error('下载异常,请重试!');\n reject(e);\n }\n };\n\n // 监听 error 事件\n xhr.onerror = function (e) {\n GmMessage.error('下载异常,请重试');\n reject(e);\n };\n\n // 发送请求\n xhr.send();\n });\n };\n\n /**\n * - 下载文件夹和文件 支持文件夹结构\n *\n * - 如果下载多级文件夹则文件所属文件夹路径使用 / 隔开\n *\n * - 文件夹路径folder结构为:一级文件夹/二级文件夹/三级文件夹...\n * @param fileList 文件列表\n * @param zipName zip文件名,默认为 '资源+当前时间戳'\n */\n const downloadFolderToZip = async (fileList: DownloadFolderItem[], zipName?: string) => {\n const finalZipName = zipName || `资源${Date.now()}`;\n const currentContentClass = `message${Date.now()}`;\n const downloadCount = ref(0);\n const errorCount = ref(0);\n const totalCount = fileList.length;\n\n const modalInfo = GmNotification({\n title: '下载中',\n message: h('div', [\n h('div', { className: currentContentClass }, [`总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`]),\n ]),\n duration: 0,\n });\n\n const zipInstance = new JSZip();\n const concurrentLimit = 5;\n let currentIndex = 0;\n\n const downloadSingleFile = async (item: DownloadFolderItem): Promise<void> => {\n try {\n // 如果 url 为空,只创建文件夹(如果有 folder 的话)\n if (!item.url) {\n if (item.folder) {\n zipInstance.folder(item.folder);\n }\n downloadCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n return;\n }\n\n // 确保文件名不为空且包含正确的扩展名\n const finalFilename = ensureFilenameWithExtension(item.filename, item.url);\n\n const blob = await createDownload({\n url: item.url,\n filename: finalFilename,\n isZip: true,\n });\n\n // 构建文件在zip中的路径,使用处理后的文件名\n const filePath = item.folder ? `${item.folder}/${finalFilename}` : finalFilename;\n zipInstance.file(filePath, blob);\n\n downloadCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n } catch (error) {\n console.error(`下载文件失败: ${item.filename}`, error);\n errorCount.value++;\n editElementContent(currentContentClass, `总文件数:${totalCount},已下载:${downloadCount.value},失败:${errorCount.value}`);\n }\n };\n\n const processNextBatch = async (): Promise<void> => {\n const batch: Promise<void>[] = [];\n\n for (let i = 0; i < concurrentLimit && currentIndex < fileList.length; i++) {\n const item = fileList[currentIndex++];\n batch.push(downloadSingleFile(item));\n }\n\n if (batch.length > 0) {\n await Promise.all(batch);\n if (currentIndex < fileList.length) {\n await processNextBatch();\n }\n }\n };\n\n try {\n await processNextBatch();\n\n editElementContent(currentContentClass, `正在打包zip文件...`);\n\n const zipBlob = await zipInstance.generateAsync({ type: 'blob' });\n modalInfo.close();\n\n FileSaver.saveAs(zipBlob, `${finalZipName}.zip`);\n\n if (errorCount.value > 0) {\n GmNotification({\n type: 'warning',\n title: '温馨提示',\n message: `成功下载 ${downloadCount.value} 个文件,${errorCount.value} 个文件下载失败`,\n duration: 5000,\n });\n } else {\n GmNotification({\n type: 'success',\n title: '温馨提示',\n message: `成功下载 ${downloadCount.value} 个文件`,\n duration: 3000,\n });\n }\n\n return true;\n } catch (error) {\n modalInfo.close();\n GmMessage.error('打包下载失败,请重试');\n throw error;\n }\n };\n\n return { downloadByUrl, downloadByRes, downloadToZip, downloadFolderToZip };\n};\n\n// 动态更新 notify 中的message 信息\nconst editElementContent = (className: string, content: string) => {\n // eslint-disable-next-line unicorn/prefer-query-selector\n const currentEle = document.getElementsByClassName(className)[0];\n if (currentEle) {\n currentEle.innerHTML = content;\n }\n};\n\n/**\n * 从 Content-Disposition 头中解析文件名,兼容 RFC 5987、RFC 6266 和传统标准\n * @param {string} [disposition] - Content-Disposition 头内容\n * @returns {string} 解析后的文件名,默认返回 'file'\n */\nconst getFileNameFromContentDisposition = (disposition?: string) => {\n if (!disposition || !isString(disposition)) {\n return 'file';\n }\n\n const normalized = disposition.replace(/\\s+/g, '');\n\n try {\n // RFC 5987: filename*=UTF-8''encoded-filename\n const rfc5987Match = normalized.match(/filename\\*=UTF-8''([^;]+)/i);\n if (rfc5987Match) {\n return decodeURIComponent(rfc5987Match[1]);\n }\n\n // 标准: filename=\"filename\" 或 filename=filename\n const standardMatch = normalized.match(/filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/i);\n if (standardMatch) {\n return decodeURIComponent(standardMatch[1].replace(/['\"]/g, ''));\n }\n\n return 'file';\n } catch (error) {\n console.error(error);\n return 'filename-error';\n }\n};\n\n/**\n * 从 URL 中提取文件名\n * @param url 文件URL\n * @returns 文件名\n */\nconst getUrlFilename = (url: string): string => {\n // 先去掉查询参数,再提取文件名(避免查询参数中的 / 干扰)\n const urlWithoutQuery = url.split('?')[0];\n const filename = urlWithoutQuery.split('/').pop() || 'file';\n return filename;\n};\n\n/**\n * 从文件名中提取扩展名\n * @param filename 文件名\n * @returns 扩展名(包含.)或空字符串\n */\nconst getFileExtension = (filename: string): string => {\n const match = filename.match(/\\.[^./\\\\]+$/);\n return match ? match[0] : '';\n};\n\n/**\n * 确保文件名包含正确的扩展名\n * 如果传入的 filename 没有扩展名,则从 URL 中提取扩展名并追加\n * @param filename 传入的文件名\n * @param url 文件URL\n * @returns 带有扩展名的文件名\n */\nconst ensureFilenameWithExtension = (filename: string | undefined, url: string): string => {\n // 如果没有传入 filename,直接从 URL 获取\n if (!filename) {\n return getUrlFilename(url);\n }\n\n // 检查 filename 是否已有扩展名\n if (getFileExtension(filename)) {\n return filename;\n }\n\n // 从 URL 中获取扩展名并追加\n const urlFilename = getUrlFilename(url);\n const extension = getFileExtension(urlFilename);\n\n return filename + extension;\n};\n"],"names":["uuidv4","res"],"mappings":"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"}