giime 0.7.20 → 0.7.22

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/README.md CHANGED
@@ -24,7 +24,7 @@ pnpm add giime
24
24
  - [x] 接入tailwind
25
25
  - [x] 接入pinia
26
26
  - [x] 实现playground(测试操场)
27
- - [] vitepress组件文档
27
+ - [x] vitepress组件文档
28
28
 
29
29
  ## 文档构建
30
30
 
@@ -48,9 +48,10 @@ Giime遵循MIT许可证发布,请查阅LICENSE文件以获取更多信息。
48
48
  感谢所有贡献者的辛勤工作,以及`ement-Plus`团队提供的灵感和指导。
49
49
 
50
50
  ## 版本发布
51
+
51
52
  ```bash
52
53
  git tag v0.1.1
53
54
  git push origin --tags
54
55
  git tag --sort=-creatordate
55
56
  git log tag1..tag2
56
- ```
57
+ ```
package/dist/index.css CHANGED
@@ -873,41 +873,56 @@ video {
873
873
  .gm-group:hover .group-hover\:gm-block {
874
874
  display: block;
875
875
  }
876
-
877
- .gm-range-number .el-form-item[data-v-1ae16d96] {
878
- margin: 0;
879
- }
880
-
881
- .gm-upload-pro-preview-dialog[data-v-80b383d8] [data-v-80b383d8] .el-dialog__body {
882
- padding: 0;
876
+ .gm-flex-center[data-v-c17deec9] {
877
+ align-items: center;
883
878
  }
884
879
 
885
- .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 {
886
- width: auto;
887
- height: auto;
880
+ .gm-flex-justify-between[data-v-c17deec9] {
881
+ justify-content: space-between;
888
882
  }
889
- [data-v-2c351ff8] .gmTableNoBorder .el-table__body .el-table__cell {
890
- border-right: none;
883
+ .circular[data-v-d7b04fae] {
884
+ animation: loading-rotate-d7b04fae 2s linear infinite;
891
885
  }
892
886
 
893
- [data-v-2c351ff8] .gmTableNoBorder .el-table__inner-wrapper:before {
894
- height: 0;
887
+ .path[data-v-d7b04fae] {
888
+ animation: loading-dash-d7b04fae 1.5s ease-in-out infinite;
889
+ stroke-dasharray: 90, 150;
890
+ stroke-dashoffset: 0;
891
+ stroke: var(--el-color-primary);
892
+ stroke-linecap: round;
895
893
  }
896
894
 
897
- [data-v-2c351ff8] .gmTableNoBorder.el-table--border .el-table__inner-wrapper:after {
898
- height: 0;
895
+ @keyframes loading-rotate-d7b04fae {
896
+ to {
897
+ transform: rotate(360deg);
898
+ }
899
+ }
900
+ @keyframes loading-dash-d7b04fae {
901
+ 0% {
902
+ stroke-dasharray: 1, 200;
903
+ stroke-dashoffset: 0;
904
+ }
905
+ 50% {
906
+ stroke-dasharray: 90, 150;
907
+ stroke-dashoffset: -40px;
908
+ }
909
+ 100% {
910
+ stroke-dasharray: 90, 150;
911
+ stroke-dashoffset: -120px;
912
+ }
899
913
  }
900
914
 
901
- [data-v-2c351ff8] .gmTableNoBorder.el-table--border:after {
902
- height: 0;
915
+ .gm-range-number .el-form-item[data-v-1ae16d96] {
916
+ margin: 0;
903
917
  }
904
918
 
905
- [data-v-2c351ff8] .gmTableNoBorder.el-table--border:before {
906
- height: 0;
919
+ .gm-upload-pro-preview-dialog[data-v-80b383d8] [data-v-80b383d8] .el-dialog__body {
920
+ padding: 0;
907
921
  }
908
922
 
909
- [data-v-2c351ff8] .gmTableNoBorder .el-table__border-left-patch {
910
- height: 0;
923
+ .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 {
924
+ width: auto;
925
+ height: auto;
911
926
  }
912
927
  .gm-upload-pro-file {
913
928
  line-height: normal;
@@ -951,29 +966,38 @@ video {
951
966
  margin-right: 0;
952
967
  margin-bottom: 4px;
953
968
  }
954
- [data-v-98c2e804] .gmTableNoBorder .el-table__body .el-table__cell {
969
+ [data-v-2c351ff8] .gmTableNoBorder .el-table__body .el-table__cell {
955
970
  border-right: none;
956
971
  }
957
972
 
958
- [data-v-98c2e804] .gmTableNoBorder .el-table__inner-wrapper:before {
973
+ [data-v-2c351ff8] .gmTableNoBorder .el-table__inner-wrapper:before {
959
974
  height: 0;
960
975
  }
961
976
 
962
- [data-v-98c2e804] .gmTableNoBorder.el-table--border .el-table__inner-wrapper:after {
977
+ [data-v-2c351ff8] .gmTableNoBorder.el-table--border .el-table__inner-wrapper:after {
963
978
  height: 0;
964
979
  }
965
980
 
966
- [data-v-98c2e804] .gmTableNoBorder.el-table--border:after {
981
+ [data-v-2c351ff8] .gmTableNoBorder.el-table--border:after {
967
982
  height: 0;
968
983
  }
969
984
 
970
- [data-v-98c2e804] .gmTableNoBorder.el-table--border:before {
985
+ [data-v-2c351ff8] .gmTableNoBorder.el-table--border:before {
971
986
  height: 0;
972
987
  }
973
988
 
974
- [data-v-98c2e804] .gmTableNoBorder .el-table__border-left-patch {
989
+ [data-v-2c351ff8] .gmTableNoBorder .el-table__border-left-patch {
975
990
  height: 0;
976
991
  }
992
+
993
+ .pagination-container[data-v-47d35e7b] {
994
+ background: #fff;
995
+ padding-top: 12px;
996
+ }
997
+ .pagination-container.hidden[data-v-47d35e7b] {
998
+ display: none;
999
+ }
1000
+
977
1001
  .gm-number-interval-single[data-v-4e6f4d6f] {
978
1002
  border-radius: var(--el-input-border-radius, var(--el-border-radius-base));
979
1003
  box-shadow: 0 0 0 1px var(--el-input-border-color, var(--el-border-color)) inset;
@@ -992,96 +1016,6 @@ video {
992
1016
  .gm-number-interval-single[data-v-4e6f4d6f]:hover .gm-number-interval-close[data-v-4e6f4d6f] {
993
1017
  display: flex;
994
1018
  }
995
- .gm-upload-preview-dialog[data-v-312f9322] [data-v-312f9322] .el-dialog__body {
996
- padding: 0;
997
- }
998
-
999
- .gm-upload-file-picture-card[data-v-312f9322] [data-v-312f9322] .el-upload-list__item, .gm-upload-file-picture-card[data-v-312f9322] [data-v-312f9322] .el-upload--picture-card {
1000
- width: auto;
1001
- height: auto;
1002
- }
1003
- .gm-upload-file {
1004
- line-height: normal;
1005
- }
1006
- .gm-upload-file .el-checkbox {
1007
- position: absolute;
1008
- left: 10px;
1009
- top: 0;
1010
- z-index: 9;
1011
- }
1012
- .gm-upload-file .el-upload-list--picture-card {
1013
- gap: 10px;
1014
- }
1015
- .gm-upload-file .el-upload-list__item {
1016
- margin: 0;
1017
- }
1018
- .gm-upload-file .el-upload-list__item-file-name {
1019
- line-height: normal;
1020
- }
1021
- .gm-upload-file .el-upload-dragger {
1022
- padding: 0;
1023
- border: none;
1024
- width: 100%;
1025
- height: 100%;
1026
- display: flex;
1027
- }
1028
- .gm-upload-file .el-upload--picture-card {
1029
- border: none;
1030
- }
1031
-
1032
- .gm-upload-file-disabled .el-upload--picture-card {
1033
- display: none;
1034
- }
1035
- .gm-upload-file-disabled .el-upload-list__item-status-label {
1036
- display: none;
1037
- }
1038
- .gm-flex-center[data-v-c17deec9] {
1039
- align-items: center;
1040
- }
1041
-
1042
- .gm-flex-justify-between[data-v-c17deec9] {
1043
- justify-content: space-between;
1044
- }
1045
- .circular[data-v-d7b04fae] {
1046
- animation: loading-rotate-d7b04fae 2s linear infinite;
1047
- }
1048
-
1049
- .path[data-v-d7b04fae] {
1050
- animation: loading-dash-d7b04fae 1.5s ease-in-out infinite;
1051
- stroke-dasharray: 90, 150;
1052
- stroke-dashoffset: 0;
1053
- stroke: var(--el-color-primary);
1054
- stroke-linecap: round;
1055
- }
1056
-
1057
- @keyframes loading-rotate-d7b04fae {
1058
- to {
1059
- transform: rotate(360deg);
1060
- }
1061
- }
1062
- @keyframes loading-dash-d7b04fae {
1063
- 0% {
1064
- stroke-dasharray: 1, 200;
1065
- stroke-dashoffset: 0;
1066
- }
1067
- 50% {
1068
- stroke-dasharray: 90, 150;
1069
- stroke-dashoffset: -40px;
1070
- }
1071
- 100% {
1072
- stroke-dasharray: 90, 150;
1073
- stroke-dashoffset: -120px;
1074
- }
1075
- }
1076
-
1077
- .pagination-container[data-v-47d35e7b] {
1078
- background: #fff;
1079
- padding-top: 12px;
1080
- }
1081
- .pagination-container.hidden[data-v-47d35e7b] {
1082
- display: none;
1083
- }
1084
-
1085
1019
  @charset "UTF-8";
1086
1020
  .custom-operate-drawer .el-drawer__header {
1087
1021
  padding: 10px 15px;
@@ -1138,6 +1072,29 @@ video {
1138
1072
  border-radius: 10px;
1139
1073
  background: #eee;
1140
1074
  }
1075
+ [data-v-98c2e804] .gmTableNoBorder .el-table__body .el-table__cell {
1076
+ border-right: none;
1077
+ }
1078
+
1079
+ [data-v-98c2e804] .gmTableNoBorder .el-table__inner-wrapper:before {
1080
+ height: 0;
1081
+ }
1082
+
1083
+ [data-v-98c2e804] .gmTableNoBorder.el-table--border .el-table__inner-wrapper:after {
1084
+ height: 0;
1085
+ }
1086
+
1087
+ [data-v-98c2e804] .gmTableNoBorder.el-table--border:after {
1088
+ height: 0;
1089
+ }
1090
+
1091
+ [data-v-98c2e804] .gmTableNoBorder.el-table--border:before {
1092
+ height: 0;
1093
+ }
1094
+
1095
+ [data-v-98c2e804] .gmTableNoBorder .el-table__border-left-patch {
1096
+ height: 0;
1097
+ }
1141
1098
  @charset "UTF-8";
1142
1099
  .table-custom-header-drawer .el-drawer__header {
1143
1100
  padding: 10px 15px;
@@ -1193,4 +1150,47 @@ video {
1193
1150
  box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.1);
1194
1151
  border-radius: 10px;
1195
1152
  background: #eee;
1153
+ }
1154
+ .gm-upload-preview-dialog[data-v-312f9322] [data-v-312f9322] .el-dialog__body {
1155
+ padding: 0;
1156
+ }
1157
+
1158
+ .gm-upload-file-picture-card[data-v-312f9322] [data-v-312f9322] .el-upload-list__item, .gm-upload-file-picture-card[data-v-312f9322] [data-v-312f9322] .el-upload--picture-card {
1159
+ width: auto;
1160
+ height: auto;
1161
+ }
1162
+ .gm-upload-file {
1163
+ line-height: normal;
1164
+ }
1165
+ .gm-upload-file .el-checkbox {
1166
+ position: absolute;
1167
+ left: 10px;
1168
+ top: 0;
1169
+ z-index: 9;
1170
+ }
1171
+ .gm-upload-file .el-upload-list--picture-card {
1172
+ gap: 10px;
1173
+ }
1174
+ .gm-upload-file .el-upload-list__item {
1175
+ margin: 0;
1176
+ }
1177
+ .gm-upload-file .el-upload-list__item-file-name {
1178
+ line-height: normal;
1179
+ }
1180
+ .gm-upload-file .el-upload-dragger {
1181
+ padding: 0;
1182
+ border: none;
1183
+ width: 100%;
1184
+ height: 100%;
1185
+ display: flex;
1186
+ }
1187
+ .gm-upload-file .el-upload--picture-card {
1188
+ border: none;
1189
+ }
1190
+
1191
+ .gm-upload-file-disabled .el-upload--picture-card {
1192
+ display: none;
1193
+ }
1194
+ .gm-upload-file-disabled .el-upload-list__item-status-label {
1195
+ display: none;
1196
1196
  }
@@ -1,5 +1,4 @@
1
- import { defineComponent, useSlots, useAttrs, ref, computed, resolveComponent, openBlock, createBlock, mergeProps, unref, createSlots, withCtx, renderSlot, normalizeProps, guardReactiveProps } from 'vue';
2
- import { omit } from 'lodash-es';
1
+ import { defineComponent, useSlots, useAttrs, ref, computed, resolveComponent, openBlock, createBlock, mergeProps, createSlots, unref, withCtx, renderSlot, normalizeProps, guardReactiveProps } from 'vue';
3
2
  import { buttonProps } from './button.mjs';
4
3
  import { isBoolean } from '../../../../utils/src/is.mjs';
5
4
 
@@ -38,7 +37,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
38
37
  return openBlock(), createBlock(_component_el_button, mergeProps({
39
38
  ref_key: "elRef",
40
39
  ref: elRef
41
- }, unref(omit)(unref(attrs), "onClick"), {
40
+ }, props, {
42
41
  type: _ctx.disabled ? "info" : _ctx.type,
43
42
  loading: realLoading.value,
44
43
  onClick: handleClick
@@ -1 +1 @@
1
- {"version":3,"file":"Button.vue2.mjs","sources":["../../../../../../../packages/components/src/base/button/Button.vue"],"sourcesContent":["<template>\n <el-button ref=\"elRef\" v-bind=\"omit(attrs, 'onClick')\" :type=\"disabled ? 'info' : type\" :loading=\"realLoading\" @click=\"handleClick\">\n <template v-if=\"slots.loading\" #loading=\"slotValue\">\n <slot name=\"loading\" v-bind=\"slotValue\" />\n </template>\n <template v-if=\"slots.default\" #default>\n <slot />\n </template>\n <template v-if=\"slots.icon\" #icon=\"slotValue\">\n <slot name=\"icon\" v-bind=\"slotValue\" />\n </template>\n </el-button>\n</template>\n<script lang=\"ts\" setup>\nimport { computed, ref, useAttrs, useSlots } from 'vue';\nimport { omit } from 'lodash-es';\nimport { buttonProps } from './button';\nimport type { ButtonInstance } from 'element-plus';\nimport { isBoolean } from '@giime/utils/src/is';\n\ndefineOptions({\n name: 'GmButton',\n inheritAttrs: false,\n});\nconst slots = useSlots();\nconst attrs = useAttrs() as {\n onClick: (evt: MouseEvent) => Promise<any> | any;\n};\nconst props = defineProps(buttonProps);\n// const emit = defineEmits(buttonEmits);\n// 重发el的事件\n// const elEvents = getGmEvent(elButtonEmits, emit);\n\nconst elRef = ref<ButtonInstance>();\nconst isLoading = ref(false);\nconst realLoading = computed(() => {\n // 优先使用用户传进来的loading\n if (isBoolean(props.loading)) {\n return props.loading;\n }\n return isLoading.value;\n});\nconst handleClick = async (evt: MouseEvent) => {\n try {\n isLoading.value = true;\n return await attrs.onClick?.(evt);\n } finally {\n isLoading.value = false;\n }\n};\ndefineExpose({\n elRef,\n});\n</script>\n"],"names":[],"mappings":";;;;;;;;;;;;;AAwBA,IAAA,MAAM,QAAQ,QAAS,EAAA,CAAA;AACvB,IAAA,MAAM,QAAQ,QAAS,EAAA,CAAA;AAGvB,IAAA,MAAM,KAAQ,GAAA,OAAA,CAAA;AAKd,IAAA,MAAM,QAAQ,GAAoB,EAAA,CAAA;AAClC,IAAM,MAAA,SAAA,GAAY,IAAI,KAAK,CAAA,CAAA;AAC3B,IAAM,MAAA,WAAA,GAAc,SAAS,MAAM;AAEjC,MAAI,IAAA,SAAA,CAAU,KAAM,CAAA,OAAO,CAAG,EAAA;AAC5B,QAAA,OAAO,KAAM,CAAA,OAAA,CAAA;AAAA,OACf;AACA,MAAA,OAAO,SAAU,CAAA,KAAA,CAAA;AAAA,KAClB,CAAA,CAAA;AACD,IAAM,MAAA,WAAA,GAAc,OAAO,GAAoB,KAAA;AAC7C,MAAI,IAAA;AACF,QAAA,SAAA,CAAU,KAAQ,GAAA,IAAA,CAAA;AAClB,QAAO,OAAA,MAAM,KAAM,CAAA,OAAA,GAAU,GAAG,CAAA,CAAA;AAAA,OAChC,SAAA;AACA,QAAA,SAAA,CAAU,KAAQ,GAAA,KAAA,CAAA;AAAA,OACpB;AAAA,KACF,CAAA;AACA,IAAa,QAAA,CAAA;AAAA,MACX,KAAA;AAAA,KACD,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Button.vue2.mjs","sources":["../../../../../../../packages/components/src/base/button/Button.vue"],"sourcesContent":["<template>\n <el-button ref=\"elRef\" v-bind=\"props\" :type=\"disabled ? 'info' : type\" :loading=\"realLoading\" @click=\"handleClick\">\n <template v-if=\"slots.loading\" #loading=\"slotValue\">\n <slot name=\"loading\" v-bind=\"slotValue\" />\n </template>\n <template v-if=\"slots.default\" #default>\n <slot />\n </template>\n <template v-if=\"slots.icon\" #icon=\"slotValue\">\n <slot name=\"icon\" v-bind=\"slotValue\" />\n </template>\n </el-button>\n</template>\n<script lang=\"ts\" setup>\nimport { computed, ref, useAttrs, useSlots } from 'vue';\n// import { omit } from 'lodash-es';\nimport { buttonProps } from './button';\nimport type { ButtonInstance } from 'element-plus';\nimport { isBoolean } from '@giime/utils/src/is';\n\ndefineOptions({\n name: 'GmButton',\n inheritAttrs: false,\n});\nconst slots = useSlots();\nconst attrs = useAttrs() as {\n onClick: (evt: MouseEvent) => Promise<any> | any;\n};\nconst props = defineProps(buttonProps);\n// const emit = defineEmits(buttonEmits);\n// 重发el的事件\n// const elEvents = getGmEvent(elButtonEmits, emit);\n\nconst elRef = ref<ButtonInstance>();\nconst isLoading = ref(false);\nconst realLoading = computed(() => {\n // 优先使用用户传进来的loading\n if (isBoolean(props.loading)) {\n return props.loading;\n }\n return isLoading.value;\n});\nconst handleClick = async (evt: MouseEvent) => {\n try {\n isLoading.value = true;\n return await attrs.onClick?.(evt);\n } finally {\n isLoading.value = false;\n }\n};\ndefineExpose({\n elRef,\n});\n</script>\n"],"names":[],"mappings":";;;;;;;;;;;;AAwBA,IAAA,MAAM,QAAQ,QAAS,EAAA,CAAA;AACvB,IAAA,MAAM,QAAQ,QAAS,EAAA,CAAA;AAGvB,IAAA,MAAM,KAAQ,GAAA,OAAA,CAAA;AAKd,IAAA,MAAM,QAAQ,GAAoB,EAAA,CAAA;AAClC,IAAM,MAAA,SAAA,GAAY,IAAI,KAAK,CAAA,CAAA;AAC3B,IAAM,MAAA,WAAA,GAAc,SAAS,MAAM;AAEjC,MAAI,IAAA,SAAA,CAAU,KAAM,CAAA,OAAO,CAAG,EAAA;AAC5B,QAAA,OAAO,KAAM,CAAA,OAAA,CAAA;AAAA,OACf;AACA,MAAA,OAAO,SAAU,CAAA,KAAA,CAAA;AAAA,KAClB,CAAA,CAAA;AACD,IAAM,MAAA,WAAA,GAAc,OAAO,GAAoB,KAAA;AAC7C,MAAI,IAAA;AACF,QAAA,SAAA,CAAU,KAAQ,GAAA,IAAA,CAAA;AAClB,QAAO,OAAA,MAAM,KAAM,CAAA,OAAA,GAAU,GAAG,CAAA,CAAA;AAAA,OAChC,SAAA;AACA,QAAA,SAAA,CAAU,KAAQ,GAAA,KAAA,CAAA;AAAA,OACpB;AAAA,KACF,CAAA;AACA,IAAa,QAAA,CAAA;AAAA,MACX,KAAA;AAAA,KACD,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -41,7 +41,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
41
41
  createElementVNode(
42
42
  "div",
43
43
  {
44
- class: "gm-flex--wrap gm-flex gm-items-center",
44
+ class: "gm-flex gm-flex-wrap gm-items-center",
45
45
  style: normalizeStyle(fileListStyle.value)
46
46
  },
47
47
  [
@@ -1 +1 @@
1
- {"version":3,"file":"FileList.vue2.mjs","sources":["../../../../../../../packages/components/src/composite/fileList2/FileList.vue"],"sourcesContent":["<template>\n <div class=\"gm-flex--wrap gm-flex gm-items-center\" :style=\"fileListStyle\">\n <div v-for=\"(file, index) in fileList\" :key=\"index\" class=\"gm-cursor-pointer\">\n <GmFileComponent v-bind=\"props\" :fileStyle :file :controls=\"false\" :on-click=\"value => handleClick(value, index)\">\n <slot :file=\"file\" />\n </GmFileComponent>\n </div>\n </div>\n\n <GmPreviewFile v-bind=\"props\" v-model:dialogVisible=\"dialog\" v-model:file-index=\"fileIndex\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\nimport GmFileComponent from '../fileComponent';\nimport GmPreviewFile from '../previewFile';\nimport { fileProProps } from './fileList';\nimport type { UploadFile } from 'element-plus';\n\ndefineOptions({\n name: 'GmFileList',\n});\n\nconst props = defineProps(fileProProps);\n\nconst fileListStyle = computed(() => {\n return {\n gap: props.fileListGap,\n ...props.fileListStyle,\n };\n});\n\nconst fileStyle = computed(() => {\n return {\n width: props.fileWidth,\n height: props.fileHeight,\n border: '1px solid #ccc',\n overflow: 'hidden',\n borderRadius: '5px',\n ...props.fileStyle,\n };\n});\n\nconst dialog = ref(false);\nconst fileIndex = ref(0);\nconst handleClick = (file: Partial<UploadFile>, index: number) => {\n fileIndex.value = index;\n dialog.value = true;\n};\n</script>\n"],"names":[],"mappings":";;;;;;;;;;;;AAuBA,IAAA,MAAM,KAAQ,GAAA,OAAA,CAAA;AAEd,IAAM,MAAA,aAAA,GAAgB,SAAS,MAAM;AACnC,MAAO,OAAA;AAAA,QACL,KAAK,KAAM,CAAA,WAAA;AAAA,QACX,GAAG,KAAM,CAAA,aAAA;AAAA,OACX,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAM,MAAA,SAAA,GAAY,SAAS,MAAM;AAC/B,MAAO,OAAA;AAAA,QACL,OAAO,KAAM,CAAA,SAAA;AAAA,QACb,QAAQ,KAAM,CAAA,UAAA;AAAA,QACd,MAAQ,EAAA,gBAAA;AAAA,QACR,QAAU,EAAA,QAAA;AAAA,QACV,YAAc,EAAA,KAAA;AAAA,QACd,GAAG,KAAM,CAAA,SAAA;AAAA,OACX,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAM,MAAA,MAAA,GAAS,IAAI,KAAK,CAAA,CAAA;AACxB,IAAM,MAAA,SAAA,GAAY,IAAI,CAAC,CAAA,CAAA;AACvB,IAAM,MAAA,WAAA,GAAc,CAAC,IAAA,EAA2B,KAAkB,KAAA;AAChE,MAAA,SAAA,CAAU,KAAQ,GAAA,KAAA,CAAA;AAClB,MAAA,MAAA,CAAO,KAAQ,GAAA,IAAA,CAAA;AAAA,KACjB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"FileList.vue2.mjs","sources":["../../../../../../../packages/components/src/composite/fileList2/FileList.vue"],"sourcesContent":["<template>\n <div class=\"gm-flex gm-flex-wrap gm-items-center\" :style=\"fileListStyle\">\n <div v-for=\"(file, index) in fileList\" :key=\"index\" class=\"gm-cursor-pointer\">\n <GmFileComponent v-bind=\"props\" :fileStyle :file :controls=\"false\" :on-click=\"value => handleClick(value, index)\">\n <slot :file=\"file\" />\n </GmFileComponent>\n </div>\n </div>\n\n <GmPreviewFile v-bind=\"props\" v-model:dialogVisible=\"dialog\" v-model:file-index=\"fileIndex\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\nimport GmFileComponent from '../fileComponent';\nimport GmPreviewFile from '../previewFile';\nimport { fileProProps } from './fileList';\nimport type { UploadFile } from 'element-plus';\n\ndefineOptions({\n name: 'GmFileList',\n});\n\nconst props = defineProps(fileProProps);\n\nconst fileListStyle = computed(() => {\n return {\n gap: props.fileListGap,\n ...props.fileListStyle,\n };\n});\n\nconst fileStyle = computed(() => {\n return {\n width: props.fileWidth,\n height: props.fileHeight,\n border: '1px solid #ccc',\n overflow: 'hidden',\n borderRadius: '5px',\n ...props.fileStyle,\n };\n});\n\nconst dialog = ref(false);\nconst fileIndex = ref(0);\nconst handleClick = (file: Partial<UploadFile>, index: number) => {\n fileIndex.value = index;\n dialog.value = true;\n};\n</script>\n"],"names":[],"mappings":";;;;;;;;;;;;AAuBA,IAAA,MAAM,KAAQ,GAAA,OAAA,CAAA;AAEd,IAAM,MAAA,aAAA,GAAgB,SAAS,MAAM;AACnC,MAAO,OAAA;AAAA,QACL,KAAK,KAAM,CAAA,WAAA;AAAA,QACX,GAAG,KAAM,CAAA,aAAA;AAAA,OACX,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAM,MAAA,SAAA,GAAY,SAAS,MAAM;AAC/B,MAAO,OAAA;AAAA,QACL,OAAO,KAAM,CAAA,SAAA;AAAA,QACb,QAAQ,KAAM,CAAA,UAAA;AAAA,QACd,MAAQ,EAAA,gBAAA;AAAA,QACR,QAAU,EAAA,QAAA;AAAA,QACV,YAAc,EAAA,KAAA;AAAA,QACd,GAAG,KAAM,CAAA,SAAA;AAAA,OACX,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAM,MAAA,MAAA,GAAS,IAAI,KAAK,CAAA,CAAA;AACxB,IAAM,MAAA,SAAA,GAAY,IAAI,CAAC,CAAA,CAAA;AACvB,IAAM,MAAA,WAAA,GAAc,CAAC,IAAA,EAA2B,KAAkB,KAAA;AAChE,MAAA,SAAA,CAAU,KAAQ,GAAA,KAAA,CAAA;AAClB,MAAA,MAAA,CAAO,KAAQ,GAAA,IAAA,CAAA;AAAA,KACjB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- export declare const version = "0.7.20";
1
+ export declare const version = "0.7.22";
@@ -1,4 +1,4 @@
1
- const version = "0.7.19";
1
+ const version = "0.7.22";
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.7.19';\n"],"names":[],"mappings":"AAAO,MAAM,OAAU,GAAA;;;;"}
1
+ {"version":3,"file":"version.mjs","sources":["../../../../packages/giime/version.ts"],"sourcesContent":["export const version = '0.7.22';\n"],"names":[],"mappings":"AAAO,MAAM,OAAU,GAAA;;;;"}
@@ -6,8 +6,15 @@ export interface DateownloadZipItem {
6
6
  url: string;
7
7
  filename?: string;
8
8
  }
9
+ export interface DownloadFolderItem {
10
+ url: string;
11
+ /** 资源所在文件夹名称多级使用 / 隔开 例如:一级文件夹/二级文件夹/三级文件夹 */
12
+ folder?: string;
13
+ filename?: string;
14
+ }
9
15
  export declare const useDownload: () => {
10
16
  downloadByUrl: (url: string, options?: DownloadOptions) => Promise<void>;
11
17
  downloadByRes: (res: AxiosResponse<any, any>, options?: DownloadOptions) => Promise<void>;
12
18
  downloadToZip: (fileList: DateownloadZipItem[], filename: string) => Promise<unknown>;
19
+ downloadFolderToZip: (fileList: DownloadFolderItem[], zipName?: string) => Promise<boolean>;
13
20
  };
@@ -137,7 +137,82 @@ const useDownload = () => {
137
137
  xhr.send();
138
138
  });
139
139
  };
140
- return { downloadByUrl, downloadByRes, downloadToZip };
140
+ const downloadFolderToZip = async (fileList, zipName) => {
141
+ const finalZipName = zipName || `\u8D44\u6E90${Date.now()}`;
142
+ const currentContentClass = `message${Date.now()}`;
143
+ const downloadCount = ref(0);
144
+ const errorCount = ref(0);
145
+ const totalCount = fileList.length;
146
+ const modalInfo = GmNotification({
147
+ title: "\u4E0B\u8F7D\u4E2D",
148
+ message: h("div", [
149
+ h("div", { className: currentContentClass }, [`\u603B\u6587\u4EF6\u6570\uFF1A${totalCount}\uFF0C\u5DF2\u4E0B\u8F7D\uFF1A${downloadCount.value}\uFF0C\u5931\u8D25\uFF1A${errorCount.value}`])
150
+ ]),
151
+ duration: 0
152
+ });
153
+ const zipInstance = new JSZip();
154
+ const concurrentLimit = 5;
155
+ let currentIndex = 0;
156
+ const downloadSingleFile = async (item) => {
157
+ try {
158
+ const finalFilename = item.filename || getUrlFilename(item.url);
159
+ const blob = await createDownload({
160
+ url: item.url,
161
+ filename: finalFilename,
162
+ isZip: true
163
+ });
164
+ const filePath = item.folder ? `${item.folder}/${finalFilename}` : finalFilename;
165
+ zipInstance.file(filePath, blob);
166
+ downloadCount.value++;
167
+ editElementContent(currentContentClass, `\u603B\u6587\u4EF6\u6570\uFF1A${totalCount}\uFF0C\u5DF2\u4E0B\u8F7D\uFF1A${downloadCount.value}\uFF0C\u5931\u8D25\uFF1A${errorCount.value}`);
168
+ } catch (error) {
169
+ console.error(`\u4E0B\u8F7D\u6587\u4EF6\u5931\u8D25: ${item.filename}`, error);
170
+ errorCount.value++;
171
+ editElementContent(currentContentClass, `\u603B\u6587\u4EF6\u6570\uFF1A${totalCount}\uFF0C\u5DF2\u4E0B\u8F7D\uFF1A${downloadCount.value}\uFF0C\u5931\u8D25\uFF1A${errorCount.value}`);
172
+ }
173
+ };
174
+ const processNextBatch = async () => {
175
+ const batch = [];
176
+ for (let i = 0; i < concurrentLimit && currentIndex < fileList.length; i++) {
177
+ const item = fileList[currentIndex++];
178
+ batch.push(downloadSingleFile(item));
179
+ }
180
+ if (batch.length > 0) {
181
+ await Promise.all(batch);
182
+ if (currentIndex < fileList.length) {
183
+ await processNextBatch();
184
+ }
185
+ }
186
+ };
187
+ try {
188
+ await processNextBatch();
189
+ editElementContent(currentContentClass, `\u6B63\u5728\u6253\u5305zip\u6587\u4EF6...`);
190
+ const zipBlob = await zipInstance.generateAsync({ type: "blob" });
191
+ modalInfo.close();
192
+ FileSaver.saveAs(zipBlob, `${finalZipName}.zip`);
193
+ if (errorCount.value > 0) {
194
+ GmNotification({
195
+ type: "warning",
196
+ title: "\u6E29\u99A8\u63D0\u793A",
197
+ message: `\u6210\u529F\u4E0B\u8F7D ${downloadCount.value} \u4E2A\u6587\u4EF6\uFF0C${errorCount.value} \u4E2A\u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25`,
198
+ duration: 5e3
199
+ });
200
+ } else {
201
+ GmNotification({
202
+ type: "success",
203
+ title: "\u6E29\u99A8\u63D0\u793A",
204
+ message: `\u6210\u529F\u4E0B\u8F7D ${downloadCount.value} \u4E2A\u6587\u4EF6`,
205
+ duration: 3e3
206
+ });
207
+ }
208
+ return true;
209
+ } catch (error) {
210
+ modalInfo.close();
211
+ GmMessage.error("\u6253\u5305\u4E0B\u8F7D\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5");
212
+ throw error;
213
+ }
214
+ };
215
+ return { downloadByUrl, downloadByRes, downloadToZip, downloadFolderToZip };
141
216
  };
142
217
  const editElementContent = (className, content) => {
143
218
  const currentEle = document.getElementsByClassName(className)[0];
@@ -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';\n\nexport interface DownloadOptions {\n filename?: string;\n}\nexport interface DateownloadZipItem {\n url: 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 let contentDispositionName = (res?.headers?.['content-disposition'] || res?.headers?.['Content-Disposition'])?.split('filename=')[1];\n try {\n contentDispositionName = decodeURIComponent(contentDispositionName);\n } catch {}\n const filename = options?.filename || contentDispositionName || 'file';\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 return { downloadByUrl, downloadByRes, downloadToZip };\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"],"names":["uuidv4","res"],"mappings":";;;;;;;AAiBO,MAAM,cAAc,MAAM;AAC/B,EAAM,MAAA,cAAA,GAAiB,CAAC,GAAgB,KAAA;AACtC,IAAM,MAAA,QAAA,GAAW,GAAI,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,GAAI,EAAA,EAAG,KAAM,CAAA,GAAG,CAAE,CAAA,CAAC,CAAK,IAAA,MAAA,CAAA;AACxD,IAAO,OAAA,QAAA,CAAA;AAAA,GACT,CAAA;AAMA,EAAM,MAAA,aAAA,GAAgB,OAAO,GAAA,EAAa,OAA8B,KAAA;AACtE,IAAA,MAAM,QAAW,GAAA,OAAA,EAAS,QAAY,IAAA,cAAA,CAAe,GAAG,CAAA,CAAA;AACxD,IAAA,MAAM,QAAQA,EAAO,EAAA,CAAA;AACrB,IAAA,MAAM,YAAY,cAAe,CAAA;AAAA,MAC/B,KAAO,EAAA,oBAAA;AAAA,MACP,OAAA,EAAS,EAAE,KAAO,EAAA,EAAE,WAAW,KAAM,EAAA,EAAG,CAAC,CAAA,uCAAA,CAAW,CAAC,CAAA;AAAA,MACrD,QAAU,EAAA,CAAA;AAAA,KACX,CAAA,CAAA;AACD,IAAI,IAAA;AACF,MAAA,MAAM,cAAe,CAAA;AAAA,QACnB,GAAA;AAAA,QACA,QAAA;AAAA,QACA,IAAM,EAAA,KAAA;AAAA,OACP,CAAA,CAAA;AAAA,KACD,SAAA;AACA,MAAA,SAAA,CAAU,KAAM,EAAA,CAAA;AAAA,KAClB;AAAA,GACF,CAAA;AAMA,EAAM,MAAA,aAAA,GAAgB,OAAO,GAAA,EAA8B,OAA8B,KAAA;AACvF,IAAA,IAAI,sBAA0B,GAAA,CAAA,GAAA,EAAK,OAAU,GAAA,qBAAqB,CAAK,IAAA,GAAA,EAAK,OAAU,GAAA,qBAAqB,CAAI,GAAA,KAAA,CAAM,WAAW,CAAA,CAAE,CAAC,CAAA,CAAA;AACnI,IAAI,IAAA;AACF,MAAA,sBAAA,GAAyB,mBAAmB,sBAAsB,CAAA,CAAA;AAAA,KAC5D,CAAA,MAAA;AAAA,KAAC;AACT,IAAM,MAAA,QAAA,GAAW,OAAS,EAAA,QAAA,IAAY,sBAA0B,IAAA,MAAA,CAAA;AAChE,IAAM,MAAA,OAAA,GAAU,MAAM,GAAI,CAAA,IAAA,CAAA;AAC1B,IAAA,MAAM,QAAQA,EAAO,EAAA,CAAA;AACrB,IAAA,MAAM,YAAY,cAAe,CAAA;AAAA,MAC/B,KAAO,EAAA,oBAAA;AAAA,MACP,OAAA,EAAS,EAAE,KAAO,EAAA,EAAE,WAAW,KAAM,EAAA,EAAG,CAAC,CAAA,uCAAA,CAAW,CAAC,CAAA;AAAA,MACrD,QAAU,EAAA,CAAA;AAAA,KACX,CAAA,CAAA;AAED,IAAA,MAAM,IAAO,GAAA,IAAI,IAAK,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA;AAC/B,IAAA,MAAM,OAAU,GAAA,MAAA,CAAO,GAAI,CAAA,eAAA,CAAgB,IAAI,CAAA,CAAA;AAC/C,IAAI,IAAA;AACF,MAAA,MAAM,cAAe,CAAA;AAAA,QACnB,GAAK,EAAA,OAAA;AAAA,QACL,QAAA;AAAA,QACA,IAAM,EAAA,KAAA;AAAA,OACP,CAAA,CAAA;AAAA,KACD,SAAA;AACA,MAAA,SAAA,CAAU,KAAM,EAAA,CAAA;AAAA,KAClB;AAAA,GACF,CAAA;AAMA,EAAM,MAAA,aAAA,GAAgB,OAAO,QAAA,EAAgC,QAAqB,KAAA;AAChF,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACtC,MAAA,MAAM,mBAAsB,GAAA,CAAA,OAAA,EAAU,IAAK,CAAA,GAAA,EAAK,CAAA,CAAA,CAAA;AAChD,MAAM,MAAA,aAAA,GAAgB,IAAI,CAAC,CAAA,CAAA;AAC3B,MAAA,MAAM,MAAM,QAAS,CAAA,MAAA,CAAA;AACrB,MAAA,MAAM,YAAY,cAAe,CAAA;AAAA,QAC/B,KAAO,EAAA,oBAAA;AAAA,QACP,SAAS,CAAE,CAAA,KAAA,EAAO,CAAC,CAAE,CAAA,KAAA,EAAO,EAAE,SAAW,EAAA,mBAAA,IAAuB,CAAC,CAAA,0CAAA,EAAU,GAAG,CAAW,gDAAA,EAAA,aAAA,CAAc,KAAK,CAAE,CAAA,CAAC,CAAC,CAAC,CAAA;AAAA,QACjH,QAAU,EAAA,CAAA;AAAA,OACX,CAAA,CAAA;AAED,MAAM,MAAA,WAAA,GAAc,IAAI,KAAM,EAAA,CAAA;AAC9B,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,GAAA,EAAK,CAAK,EAAA,EAAA;AAC5B,QAAM,MAAA,WAAA,GAAc,SAAS,CAAC,CAAA,CAAA;AAE9B,QAAA,MAAM,eAAkB,GAAA;AAAA,UACtB,KAAK,WAAY,CAAA,GAAA;AAAA,UACjB,QAAU,EAAA,WAAA,CAAY,QAAY,IAAA,cAAA,CAAe,YAAY,GAAG,CAAA;AAAA,UAChE,KAAO,EAAA,IAAA;AAAA,SACT,CAAA;AACA,QAAe,cAAA,CAAA,eAAe,CAC3B,CAAA,IAAA,CAAK,CAAO,GAAA,KAAA;AACX,UAAY,WAAA,CAAA,IAAA,CAAK,eAAgB,CAAA,QAAA,EAAU,GAAG,CAAA,CAAA;AAC9C,UAAc,aAAA,CAAA,KAAA,EAAA,CAAA;AACd,UAAA,kBAAA,CAAmB,qBAAqB,CAAU,0CAAA,EAAA,GAAG,CAAW,gDAAA,EAAA,aAAA,CAAc,KAAK,CAAE,CAAA,CAAA,CAAA;AACrF,UAAI,IAAA,aAAA,CAAc,SAAS,GAAK,EAAA;AAC9B,YAAA,kBAAA,CAAmB,qBAAqB,CAAS,2BAAA,CAAA,CAAA,CAAA;AACjD,YACG,WAAA,CAAA,aAAA,CAAc,EAAE,IAAM,EAAA,MAAA,EAAQ,CAC9B,CAAA,IAAA,CAAK,OAAMC,IAAO,KAAA;AACjB,cAAA,SAAA,CAAU,KAAM,EAAA,CAAA;AAEhB,cAAA,MAAM,OAAU,GAAA,MAAA,CAAO,GAAI,CAAA,eAAA,CAAgBA,IAAG,CAAA,CAAA;AAE9C,cAAA,MAAM,aAAc,CAAA,OAAA,EAAS,EAAE,QAAA,EAAU,CAAA,CAAA;AACzC,cAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,aACb,CACA,CAAA,KAAA,CAAM,CAAS,KAAA,KAAA;AACd,cAAQ,OAAA,CAAA,KAAA,CAAM,SAAS,KAAK,CAAA,CAAA;AAC5B,cAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,aACb,CAAA,CAAA;AAAA,WACL;AAAA,SACD,CACA,CAAA,KAAA,CAAM,CAAS,KAAA,KAAA;AACd,UAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AACZ,UAAA,SAAA,CAAU,KAAM,EAAA,CAAA;AAAA,SACjB,CAAA,CAAA;AAAA,OACL;AAAA,KACD,CAAA,CAAA;AAAA,GACH,CAAA;AACA,EAAM,MAAA,cAAA,GAAiB,CAAC,OAA+E,KAAA;AACrG,IAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAW,KAAA;AAE5C,MAAM,MAAA,GAAA,GAAM,IAAI,cAAe,EAAA,CAAA;AAE/B,MAAA,GAAA,CAAI,IAAK,CAAA,KAAA,EAAO,OAAQ,CAAA,GAAA,EAAK,IAAI,CAAA,CAAA;AACjC,MAAA,GAAA,CAAI,YAAe,GAAA,MAAA,CAAA;AAGnB,MAAI,GAAA,CAAA,UAAA,GAAa,SAAU,KAAO,EAAA;AAChC,QAAA,IAAI,MAAM,gBAAkB,EAAA;AAC1B,UAAA,MAAM,kBAAkB,IAAK,CAAA,KAAA,CAAO,MAAM,MAAS,GAAA,KAAA,CAAM,QAAS,GAAG,CAAA,CAAA;AACrE,UAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,YAAA,kBAAA,CAAmB,OAAQ,CAAA,IAAA,EAAM,CAAU,qCAAA,EAAA,eAAe,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,WAC/D;AAAA,SACF;AAAA,OACF,CAAA;AAGA,MAAI,GAAA,CAAA,MAAA,GAAS,SAAU,CAAG,EAAA;AACxB,QAAA,MAAM,cAAc,CAAE,CAAA,MAAA,CAAA;AACtB,QAAA,IAAI,CAAC,GAAK,EAAA,GAAG,EAAE,QAAS,CAAA,WAAA,CAAY,MAAM,CAAG,EAAA;AAC3C,UAAA,MAAM,OAAO,WAAY,CAAA,QAAA,CAAA;AAEzB,UAAI,IAAA,CAAC,QAAQ,KAAO,EAAA;AAClB,YAAU,SAAA,CAAA,MAAA,CAAO,IAAM,EAAA,OAAA,CAAQ,QAAQ,CAAA,CAAA;AACvC,YAAe,cAAA,CAAA;AAAA,cACb,IAAM,EAAA,SAAA;AAAA,cACN,KAAO,EAAA,0BAAA;AAAA,cACP,OAAS,EAAA,0BAAA;AAAA,cACT,QAAU,EAAA,GAAA;AAAA,aACX,CAAA,CAAA;AAAA,WACH;AAEA,UAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,SACd,MAAA,IAAW,WAAY,CAAA,MAAA,KAAW,GAAK,EAAA;AACrC,UAAA,SAAA,CAAU,MAAM,oEAAa,CAAA,CAAA;AAC7B,UAAA,MAAA,CAAO,CAAC,CAAA,CAAA;AAAA,SACH,MAAA;AACL,UAAA,SAAA,CAAU,MAAM,wDAAW,CAAA,CAAA;AAC3B,UAAA,MAAA,CAAO,CAAC,CAAA,CAAA;AAAA,SACV;AAAA,OACF,CAAA;AAGA,MAAI,GAAA,CAAA,OAAA,GAAU,SAAU,CAAG,EAAA;AACzB,QAAA,SAAA,CAAU,MAAM,kDAAU,CAAA,CAAA;AAC1B,QAAA,MAAA,CAAO,CAAC,CAAA,CAAA;AAAA,OACV,CAAA;AAGA,MAAA,GAAA,CAAI,IAAK,EAAA,CAAA;AAAA,KACV,CAAA,CAAA;AAAA,GACH,CAAA;AACA,EAAO,OAAA,EAAE,aAAe,EAAA,aAAA,EAAe,aAAc,EAAA,CAAA;AACvD,EAAA;AAGA,MAAM,kBAAA,GAAqB,CAAC,SAAA,EAAmB,OAAoB,KAAA;AAEjE,EAAA,MAAM,UAAa,GAAA,QAAA,CAAS,sBAAuB,CAAA,SAAS,EAAE,CAAC,CAAA,CAAA;AAC/D,EAAA,IAAI,UAAY,EAAA;AACd,IAAA,UAAA,CAAW,SAAY,GAAA,OAAA,CAAA;AAAA,GACzB;AACF,CAAA;;;;"}
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';\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 let contentDispositionName = (res?.headers?.['content-disposition'] || res?.headers?.['Content-Disposition'])?.split('filename=')[1];\n try {\n contentDispositionName = decodeURIComponent(contentDispositionName);\n } catch {}\n const filename = options?.filename || contentDispositionName || 'file';\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"],"names":["uuidv4","res"],"mappings":"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"}