@minilo/ui 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/minilo/dist/index.css +1 -1
  2. package/minilo/dist/index.full.js +1473 -111
  3. package/minilo/dist/index.full.min.js +1 -1
  4. package/minilo/dist/index.full.min.js.map +1 -1
  5. package/minilo/dist/index.full.min.mjs +1 -1
  6. package/minilo/dist/index.full.min.mjs.map +1 -1
  7. package/minilo/dist/index.full.mjs +1468 -113
  8. package/minilo/es/components/button/index.d.ts +4 -4
  9. package/minilo/es/components/button/index.vue.d.ts +2 -2
  10. package/minilo/es/components/chart/index.d.ts +4 -4
  11. package/minilo/es/components/chart/index.vue.d.ts +2 -2
  12. package/minilo/es/components/chart/index.vue2.mjs +2 -2
  13. package/minilo/es/components/detail/index.vue2.mjs +1 -1
  14. package/minilo/es/components/image-upload-pro/index.d.ts +645 -0
  15. package/minilo/es/components/image-upload-pro/index.mjs +7 -0
  16. package/minilo/es/components/image-upload-pro/index.vue.d.ts +647 -0
  17. package/minilo/es/components/image-upload-pro/index.vue.mjs +5 -0
  18. package/minilo/es/components/image-upload-pro/index.vue2.mjs +657 -0
  19. package/minilo/es/components/image-upload-pro/type.d.ts +147 -0
  20. package/minilo/es/components/image-upload-pro/type.mjs +81 -0
  21. package/minilo/es/components/index.d.ts +4 -0
  22. package/minilo/es/components/index.mjs +7 -0
  23. package/minilo/es/components/number-range-input/index.d.ts +3 -3
  24. package/minilo/es/components/number-range-input/index.vue.d.ts +1 -1
  25. package/minilo/es/components/search/index.d.ts +26 -26
  26. package/minilo/es/components/search/index.vue.d.ts +23 -23
  27. package/minilo/es/components/search/props.d.ts +2 -2
  28. package/minilo/es/components/search-table/index.d.ts +18 -18
  29. package/minilo/es/components/search-table/index.vue.d.ts +9 -9
  30. package/minilo/es/components/search-table/index.vue2.mjs +2 -2
  31. package/minilo/es/components/search-table/props.d.ts +3 -3
  32. package/minilo/es/components/tree-select/index.d.ts +32 -0
  33. package/minilo/es/components/tree-select/index.mjs +6 -0
  34. package/minilo/es/components/tree-select/index.vue.d.ts +20 -0
  35. package/minilo/es/components/tree-select/index.vue.mjs +5 -0
  36. package/minilo/es/components/tree-select/index.vue2.mjs +226 -0
  37. package/minilo/es/components/tree-select/type.d.ts +34 -0
  38. package/minilo/es/components/tree-select-dialog/index.d.ts +60 -0
  39. package/minilo/es/components/tree-select-dialog/index.mjs +7 -0
  40. package/minilo/es/components/tree-select-dialog/index.vue.d.ts +23 -0
  41. package/minilo/es/components/tree-select-dialog/index.vue.mjs +5 -0
  42. package/minilo/es/components/tree-select-dialog/index.vue2.mjs +135 -0
  43. package/minilo/es/components/tree-select-dialog/type.d.ts +9 -0
  44. package/minilo/es/components/tree-select-dialog/type.mjs +24 -0
  45. package/minilo/es/components/tree-select-drawer/index.d.ts +64 -0
  46. package/minilo/es/components/tree-select-drawer/index.mjs +7 -0
  47. package/minilo/es/components/tree-select-drawer/index.vue.d.ts +23 -0
  48. package/minilo/es/components/tree-select-drawer/index.vue.mjs +5 -0
  49. package/minilo/es/components/tree-select-drawer/index.vue2.mjs +140 -0
  50. package/minilo/es/components/tree-select-drawer/type.d.ts +10 -0
  51. package/minilo/es/components/tree-select-drawer/type.mjs +20 -0
  52. package/minilo/es/components/virtual-list/index.d.ts +4 -4
  53. package/minilo/es/components/virtual-list/index.vue.d.ts +2 -2
  54. package/minilo/es/index.d.ts +892 -61
  55. package/minilo/es/node_modules/.pnpm/{@element-plus_icons-vue@2.3.1_vue@3.5.17_typescript@5.8.3_ → @element-plus_icons-vue@2.3.1_vue@3.5.26_typescript@5.9.3_}/node_modules/@element-plus/icons-vue/dist/index.mjs +17 -1
  56. package/minilo/es/node_modules/.pnpm/{@vueuse_core@13.6.0_vue@3.5.17_typescript@5.9.3_ → @vueuse_core@13.9.0_vue@3.5.26_typescript@5.9.3_}/node_modules/@vueuse/core/index.mjs +2 -2
  57. package/minilo/es/resolver/index.d.ts +2 -2
  58. package/minilo/es/resolver/index.mjs +4 -1
  59. package/minilo/lib/components/button/index.d.ts +4 -4
  60. package/minilo/lib/components/button/index.vue.d.ts +2 -2
  61. package/minilo/lib/components/chart/index.d.ts +4 -4
  62. package/minilo/lib/components/chart/index.vue.d.ts +2 -2
  63. package/minilo/lib/components/chart/index.vue2.js +2 -2
  64. package/minilo/lib/components/detail/index.vue2.js +1 -1
  65. package/minilo/lib/components/image-upload-pro/index.d.ts +645 -0
  66. package/minilo/lib/components/image-upload-pro/index.js +13 -0
  67. package/minilo/lib/components/image-upload-pro/index.vue.d.ts +647 -0
  68. package/minilo/lib/components/image-upload-pro/index.vue.js +9 -0
  69. package/minilo/lib/components/image-upload-pro/index.vue2.js +661 -0
  70. package/minilo/lib/components/image-upload-pro/type.d.ts +147 -0
  71. package/minilo/lib/components/image-upload-pro/type.js +83 -0
  72. package/minilo/lib/components/index.d.ts +4 -0
  73. package/minilo/lib/components/index.js +14 -0
  74. package/minilo/lib/components/number-range-input/index.d.ts +3 -3
  75. package/minilo/lib/components/number-range-input/index.vue.d.ts +1 -1
  76. package/minilo/lib/components/search/index.d.ts +26 -26
  77. package/minilo/lib/components/search/index.vue.d.ts +23 -23
  78. package/minilo/lib/components/search/props.d.ts +2 -2
  79. package/minilo/lib/components/search-table/index.d.ts +18 -18
  80. package/minilo/lib/components/search-table/index.vue.d.ts +9 -9
  81. package/minilo/lib/components/search-table/index.vue2.js +2 -2
  82. package/minilo/lib/components/search-table/props.d.ts +3 -3
  83. package/minilo/lib/components/tree-select/index.d.ts +32 -0
  84. package/minilo/lib/components/tree-select/index.js +11 -0
  85. package/minilo/lib/components/tree-select/index.vue.d.ts +20 -0
  86. package/minilo/lib/components/tree-select/index.vue.js +9 -0
  87. package/minilo/lib/components/tree-select/index.vue2.js +230 -0
  88. package/minilo/lib/components/tree-select/type.d.ts +34 -0
  89. package/minilo/lib/components/tree-select-dialog/index.d.ts +60 -0
  90. package/minilo/lib/components/tree-select-dialog/index.js +13 -0
  91. package/minilo/lib/components/tree-select-dialog/index.vue.d.ts +23 -0
  92. package/minilo/lib/components/tree-select-dialog/index.vue.js +9 -0
  93. package/minilo/lib/components/tree-select-dialog/index.vue2.js +139 -0
  94. package/minilo/lib/components/tree-select-dialog/type.d.ts +9 -0
  95. package/minilo/lib/components/tree-select-dialog/type.js +26 -0
  96. package/minilo/lib/components/tree-select-drawer/index.d.ts +64 -0
  97. package/minilo/lib/components/tree-select-drawer/index.js +13 -0
  98. package/minilo/lib/components/tree-select-drawer/index.vue.d.ts +23 -0
  99. package/minilo/lib/components/tree-select-drawer/index.vue.js +9 -0
  100. package/minilo/lib/components/tree-select-drawer/index.vue2.js +144 -0
  101. package/minilo/lib/components/tree-select-drawer/type.d.ts +10 -0
  102. package/minilo/lib/components/tree-select-drawer/type.js +22 -0
  103. package/minilo/lib/components/virtual-list/index.d.ts +4 -4
  104. package/minilo/lib/components/virtual-list/index.vue.d.ts +2 -2
  105. package/minilo/lib/index.d.ts +892 -61
  106. package/minilo/lib/node_modules/.pnpm/{@element-plus_icons-vue@2.3.1_vue@3.5.17_typescript@5.8.3_ → @element-plus_icons-vue@2.3.1_vue@3.5.26_typescript@5.9.3_}/node_modules/@element-plus/icons-vue/dist/index.js +17 -0
  107. package/minilo/lib/node_modules/.pnpm/{@vueuse_core@13.6.0_vue@3.5.17_typescript@5.9.3_ → @vueuse_core@13.9.0_vue@3.5.26_typescript@5.9.3_}/node_modules/@vueuse/core/index.js +1 -1
  108. package/minilo/lib/resolver/index.d.ts +2 -2
  109. package/minilo/lib/resolver/index.js +4 -1
  110. package/minilo/theme-chalk/index.css +1 -1
  111. package/minilo/theme-chalk/ml-image-upload-pro.css +1 -0
  112. package/minilo/theme-chalk/ml-tree-select-dialog.css +0 -0
  113. package/minilo/theme-chalk/ml-tree-select-drawer.css +0 -0
  114. package/minilo/theme-chalk/ml-tree-select.css +1 -0
  115. package/minilo/theme-chalk/src/image-upload-pro.scss +70 -0
  116. package/minilo/theme-chalk/src/index.scss +2 -0
  117. package/minilo/theme-chalk/src/tree-select-dialog.scss +0 -0
  118. package/minilo/theme-chalk/src/tree-select-drawer.scss +0 -0
  119. package/minilo/theme-chalk/src/tree-select.scss +47 -0
  120. package/package.json +18 -5
  121. package/minilo/es/components/button/type.mjs +0 -1
  122. package/minilo/es/components/chart/type.mjs +0 -1
  123. package/minilo/es/components/detail/type.mjs +0 -1
  124. package/minilo/es/components/number-range-input/props.mjs +0 -1
  125. package/minilo/es/components/virtual-list/type.mjs +0 -1
  126. package/minilo/lib/components/button/type.js +0 -2
  127. package/minilo/lib/components/chart/type.js +0 -2
  128. package/minilo/lib/components/detail/type.js +0 -2
  129. package/minilo/lib/components/number-range-input/props.js +0 -2
  130. package/minilo/lib/components/virtual-list/type.js +0 -2
  131. /package/minilo/es/{packages → node_modules/.pnpm/@minilo_utils@0.0.2_vue@3.5.26_typescript@5.9.3_/node_modules/@minilo}/utils/dist/func/common.mjs +0 -0
  132. /package/minilo/es/{packages → node_modules/.pnpm/@minilo_utils@0.0.2_vue@3.5.26_typescript@5.9.3_/node_modules/@minilo}/utils/dist/request/index.mjs +0 -0
  133. /package/minilo/es/node_modules/.pnpm/{@vueuse_shared@13.6.0_vue@3.5.17_typescript@5.9.3_ → @vueuse_shared@13.9.0_vue@3.5.26_typescript@5.9.3_}/node_modules/@vueuse/shared/index.mjs +0 -0
  134. /package/minilo/lib/{packages → node_modules/.pnpm/@minilo_utils@0.0.2_vue@3.5.26_typescript@5.9.3_/node_modules/@minilo}/utils/dist/func/common.js +0 -0
  135. /package/minilo/lib/{packages → node_modules/.pnpm/@minilo_utils@0.0.2_vue@3.5.26_typescript@5.9.3_/node_modules/@minilo}/utils/dist/request/index.js +0 -0
  136. /package/minilo/lib/node_modules/.pnpm/{@vueuse_shared@13.6.0_vue@3.5.17_typescript@5.9.3_ → @vueuse_shared@13.9.0_vue@3.5.26_typescript@5.9.3_}/node_modules/@vueuse/shared/index.js +0 -0
@@ -0,0 +1,661 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var vue = require('vue');
6
+ var elementPlus = require('element-plus');
7
+ var type = require('./type.js');
8
+ var index$1 = require('../../utils/index.js');
9
+ var index = require('../../node_modules/.pnpm/@minilo_utils@0.0.2_vue@3.5.26_typescript@5.9.3_/node_modules/@minilo/utils/dist/request/index.js');
10
+ var common = require('../../node_modules/.pnpm/@minilo_utils@0.0.2_vue@3.5.26_typescript@5.9.3_/node_modules/@minilo/utils/dist/func/common.js');
11
+
12
+ const _hoisted_1 = { key: 0 };
13
+ const _hoisted_2 = ["onDragstart", "onDrop"];
14
+ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
15
+ ...{
16
+ name: "MlImageUploadPro"
17
+ },
18
+ __name: "index",
19
+ props: type.imageUploadProProps,
20
+ emits: ["update:modelValue", "change", "upload"],
21
+ setup(__props, { expose: __expose, emit: __emit }) {
22
+ const ASPECT_RATIO_OPTIONS = [
23
+ { label: "\u81EA\u7531\u6BD4\u4F8B", value: "free" },
24
+ { label: "1:1", value: "1:1" },
25
+ { label: "4:3", value: "4:3" },
26
+ { label: "16:9", value: "16:9" }
27
+ ];
28
+ const props = __props;
29
+ const uploadRef = vue.ref();
30
+ const cropperRef = vue.ref();
31
+ const fileList = vue.ref([]);
32
+ const previewList = vue.ref([]);
33
+ const cropDialogVisible = vue.ref(false);
34
+ const cropImageUrl = vue.ref("");
35
+ const cropTargetItem = vue.ref();
36
+ const dragIndex = vue.ref(-1);
37
+ const cropForm = vue.reactive({
38
+ aspectRatio: "free"
39
+ // 裁剪比例
40
+ });
41
+ const cropWidth = vue.ref(props.sizeLimit.width || 400);
42
+ const cropHeight = vue.ref(props.sizeLimit.height || 400);
43
+ const displayWidth = vue.ref(props.sizeLimit.width || 400);
44
+ const displayHeight = vue.ref(props.sizeLimit.height || 400);
45
+ const aspectRatio = vue.reactive({
46
+ fixed: false,
47
+ value: [1, 1]
48
+ });
49
+ const axios = vue.computed(() => {
50
+ if (!props.uploadApi) return null;
51
+ return index.initRequestInstance({
52
+ baseURL: "",
53
+ headers: props.uploadApi.headers || {}
54
+ });
55
+ });
56
+ const acceptDesc = vue.computed(() => {
57
+ return props.acceptType.split(",").map((type) => type.replace("image/", ".")).join("\u3001");
58
+ });
59
+ vue.watch(
60
+ () => props.modelValue,
61
+ (val) => {
62
+ if (val.length) {
63
+ previewList.value = val.map((item) => ({
64
+ ...item,
65
+ url: item.url || item.response?.url || ""
66
+ }));
67
+ fileList.value = val;
68
+ }
69
+ },
70
+ { immediate: true, deep: true }
71
+ );
72
+ const uploadSingleFile = async (file) => {
73
+ if (!props.uploadApi || !axios.value) {
74
+ throw new Error("\u672A\u914D\u7F6E\u4E0A\u4F20 API");
75
+ }
76
+ const formData = new FormData();
77
+ formData.append(props.uploadApi.fieldName || "file", file);
78
+ if (props.uploadApi.data) {
79
+ Object.keys(props.uploadApi.data).forEach((key) => {
80
+ formData.append(key, props.uploadApi.data[key]);
81
+ });
82
+ }
83
+ const method = props.uploadApi.method || "post";
84
+ const response = await axios.value[method](props.uploadApi.url, formData, {
85
+ headers: {
86
+ "Content-Type": "multipart/form-data"
87
+ }
88
+ });
89
+ const urlField = props.uploadApi.responseUrlField || "data.url";
90
+ return common.getNestedValue(response, urlField);
91
+ };
92
+ const handleBeforeUpload = (file) => {
93
+ const isAccept = props.acceptType.includes(file.type);
94
+ if (!isAccept) {
95
+ elementPlus.ElMessage.error(`\u4EC5\u652F\u6301\u4E0A\u4F20${acceptDesc.value}\u683C\u5F0F\u7684\u56FE\u7247`);
96
+ return false;
97
+ }
98
+ const isOverSize = file.size / 1024 / 1024 > props.sizeLimit.size;
99
+ if (isOverSize) {
100
+ elementPlus.ElMessage.error(`\u5355\u6587\u4EF6\u5927\u5C0F\u4E0D\u80FD\u8D85\u8FC7${props.sizeLimit.size}MB`);
101
+ return false;
102
+ }
103
+ if (previewList.value.length >= props.maxCount) {
104
+ elementPlus.ElMessage.error(`\u6700\u591A\u53EA\u80FD\u4E0A\u4F20${props.maxCount}\u5F20\u56FE\u7247`);
105
+ return false;
106
+ }
107
+ if (props.sizeLimit.width || props.sizeLimit.height) {
108
+ return new Promise((resolve) => {
109
+ const img = new Image();
110
+ img.onload = () => {
111
+ const isOverWidth = props.sizeLimit.width && img.width < props.sizeLimit.width;
112
+ const isOverHeight = props.sizeLimit.height && img.height < props.sizeLimit.height;
113
+ if (isOverWidth || isOverHeight) {
114
+ elementPlus.ElMessage.error(
115
+ `\u56FE\u7247\u5C3A\u5BF8\u8981\u6C42\uFF1A\u5BBD\u2265${props.sizeLimit.width}px \u9AD8\u2265${props.sizeLimit.height}px\uFF0C\u5F53\u524D\u56FE\u7247\u5BBD${img.width}px \u9AD8${img.height}px`
116
+ );
117
+ resolve(false);
118
+ } else {
119
+ resolve(true);
120
+ }
121
+ };
122
+ img.src = URL.createObjectURL(file);
123
+ });
124
+ }
125
+ return true;
126
+ };
127
+ const handleFileChange = async (file, files) => {
128
+ if (file.status === "ready") {
129
+ const blobUrl = URL.createObjectURL(file.raw);
130
+ const newItem = {
131
+ ...file,
132
+ rawFile: file.raw,
133
+ blobUrl,
134
+ // 保存 blob URL 用于裁剪
135
+ url: blobUrl
136
+ // 初始显示使用 blob URL
137
+ };
138
+ if (props.allowCrop) {
139
+ elementPlus.ElMessageBox.confirm("\u662F\u5426\u9700\u8981\u88C1\u526A\u8BE5\u56FE\u7247\uFF1F", "\u63D0\u793A", {
140
+ type: "info",
141
+ confirmButtonText: "\u88C1\u526A",
142
+ cancelButtonText: "\u76F4\u63A5\u4E0A\u4F20"
143
+ }).then(() => {
144
+ handleCropImage(newItem);
145
+ }).catch(async () => {
146
+ if (props.autoUpload && props.uploadApi) {
147
+ try {
148
+ const uploadedUrl = await uploadSingleFile(file.raw);
149
+ newItem.serverUrl = uploadedUrl;
150
+ newItem.url = uploadedUrl;
151
+ elementPlus.ElMessage.success("\u56FE\u7247\u4E0A\u4F20\u6210\u529F");
152
+ } catch (error) {
153
+ elementPlus.ElMessage.error("\u56FE\u7247\u4E0A\u4F20\u5931\u8D25");
154
+ console.error(error);
155
+ return;
156
+ }
157
+ }
158
+ previewList.value.push(newItem);
159
+ syncModelValue();
160
+ });
161
+ } else {
162
+ if (props.autoUpload && props.uploadApi) {
163
+ try {
164
+ const uploadedUrl = await uploadSingleFile(file.raw);
165
+ newItem.serverUrl = uploadedUrl;
166
+ newItem.url = uploadedUrl;
167
+ elementPlus.ElMessage.success("\u56FE\u7247\u4E0A\u4F20\u6210\u529F");
168
+ } catch (error) {
169
+ elementPlus.ElMessage.error("\u56FE\u7247\u4E0A\u4F20\u5931\u8D25");
170
+ console.error(error);
171
+ return;
172
+ }
173
+ }
174
+ previewList.value.push(newItem);
175
+ syncModelValue();
176
+ }
177
+ }
178
+ fileList.value = files;
179
+ };
180
+ const handleFileRemove = (file) => {
181
+ previewList.value = previewList.value.filter((item) => item.uid !== file.uid);
182
+ syncModelValue();
183
+ };
184
+ const handleCropImage = (item) => {
185
+ console.log(item);
186
+ if (!props.allowCrop) return;
187
+ cropTargetItem.value = item;
188
+ cropImageUrl.value = item.blobUrl || item.url || "";
189
+ cropDialogVisible.value = true;
190
+ vue.nextTick(() => {
191
+ cropForm.aspectRatio = "free";
192
+ cropWidth.value = props.sizeLimit.width || 400;
193
+ cropHeight.value = props.sizeLimit.height || 400;
194
+ displayWidth.value = props.sizeLimit.width || 400;
195
+ displayHeight.value = props.sizeLimit.height || 400;
196
+ aspectRatio.fixed = false;
197
+ });
198
+ };
199
+ const handleAspectRatioChange = (val) => {
200
+ if (val === "free") {
201
+ aspectRatio.fixed = false;
202
+ } else {
203
+ aspectRatio.fixed = true;
204
+ const parts = val.split(":").map(Number);
205
+ const w = parts[0] ?? 1;
206
+ const h = parts[1] ?? 1;
207
+ aspectRatio.value = [w, h];
208
+ }
209
+ };
210
+ const handleCropRealTime = (data) => {
211
+ if (data && data.w && data.h) {
212
+ displayWidth.value = Math.round(data.w);
213
+ displayHeight.value = Math.round(data.h);
214
+ }
215
+ };
216
+ const handleSizeChange = () => {
217
+ cropWidth.value = displayWidth.value;
218
+ cropHeight.value = displayHeight.value;
219
+ };
220
+ const handleCropConfirm = () => {
221
+ if (!cropperRef.value || !cropTargetItem.value) return;
222
+ cropperRef.value.getCropBlob(async (blob) => {
223
+ const croppedFile = new File([blob], cropTargetItem.value.name || "cropped.jpg", {
224
+ type: cropTargetItem.value.rawFile?.type || "image/jpeg"
225
+ });
226
+ const newBlobUrl = URL.createObjectURL(croppedFile);
227
+ let displayUrl = newBlobUrl;
228
+ if (props.autoUpload && props.uploadApi) {
229
+ try {
230
+ const serverUrl = await uploadSingleFile(croppedFile);
231
+ displayUrl = serverUrl;
232
+ elementPlus.ElMessage.success("\u56FE\u7247\u4E0A\u4F20\u6210\u529F");
233
+ const index = previewList.value.findIndex((item) => item.uid === cropTargetItem.value.uid);
234
+ const targetItem = previewList.value[index];
235
+ if (index > -1 && targetItem) {
236
+ targetItem.url = displayUrl;
237
+ targetItem.blobUrl = newBlobUrl;
238
+ targetItem.serverUrl = serverUrl;
239
+ targetItem.rawFile = croppedFile;
240
+ } else {
241
+ previewList.value.push({
242
+ ...cropTargetItem.value,
243
+ name: cropTargetItem.value.name ?? "cropped.jpg",
244
+ url: displayUrl,
245
+ blobUrl: newBlobUrl,
246
+ serverUrl,
247
+ rawFile: croppedFile
248
+ });
249
+ }
250
+ } catch (error) {
251
+ elementPlus.ElMessage.error("\u56FE\u7247\u4E0A\u4F20\u5931\u8D25");
252
+ console.error(error);
253
+ return;
254
+ }
255
+ } else {
256
+ const index = previewList.value.findIndex((item) => item.uid === cropTargetItem.value.uid);
257
+ const targetItem = previewList.value[index];
258
+ if (index > -1 && targetItem) {
259
+ targetItem.url = newBlobUrl;
260
+ targetItem.blobUrl = newBlobUrl;
261
+ targetItem.rawFile = croppedFile;
262
+ } else {
263
+ previewList.value.push({
264
+ ...cropTargetItem.value,
265
+ name: cropTargetItem.value.name ?? "cropped.jpg",
266
+ url: newBlobUrl,
267
+ blobUrl: newBlobUrl,
268
+ rawFile: croppedFile
269
+ });
270
+ }
271
+ }
272
+ syncModelValue();
273
+ cropDialogVisible.value = false;
274
+ elementPlus.ElMessage.success("\u56FE\u7247\u88C1\u526A\u6210\u529F");
275
+ });
276
+ };
277
+ const resetCropper = () => {
278
+ cropTargetItem.value = void 0;
279
+ cropImageUrl.value = "";
280
+ };
281
+ const handleRemovePreview = (item) => {
282
+ elementPlus.ElMessageBox.confirm("\u786E\u5B9A\u8981\u5220\u9664\u8BE5\u56FE\u7247\u5417\uFF1F", "\u63D0\u793A", {
283
+ type: "warning",
284
+ confirmButtonText: "\u786E\u5B9A",
285
+ cancelButtonText: "\u53D6\u6D88"
286
+ }).then(() => {
287
+ previewList.value = previewList.value.filter((i) => i.uid !== item.uid);
288
+ fileList.value = fileList.value.filter((i) => i.uid !== item.uid);
289
+ syncModelValue();
290
+ elementPlus.ElMessage.success("\u56FE\u7247\u5220\u9664\u6210\u529F");
291
+ });
292
+ };
293
+ const handleDragStart = (index) => {
294
+ if (!props.allowSort) return;
295
+ dragIndex.value = index;
296
+ };
297
+ const handleDragOver = (e) => {
298
+ e.preventDefault();
299
+ };
300
+ const handleDrop = (index) => {
301
+ if (!props.allowSort || dragIndex.value === -1 || dragIndex.value === index) return;
302
+ const temp = previewList.value[dragIndex.value];
303
+ if (!temp) return;
304
+ previewList.value.splice(dragIndex.value, 1);
305
+ previewList.value.splice(index, 0, temp);
306
+ dragIndex.value = -1;
307
+ syncModelValue();
308
+ };
309
+ const syncModelValue = () => {
310
+ emit("update:modelValue", [...previewList.value]);
311
+ emit("change", [...previewList.value]);
312
+ };
313
+ const emit = __emit;
314
+ const uploadToServer = async (uploadApi) => {
315
+ const uploadPromises = previewList.value.map(async (item) => {
316
+ if (item.rawFile) {
317
+ const url = await uploadApi(item.rawFile);
318
+ item.url = url;
319
+ return item;
320
+ }
321
+ return item;
322
+ });
323
+ const result = await Promise.all(uploadPromises);
324
+ previewList.value = result;
325
+ syncModelValue();
326
+ return result;
327
+ };
328
+ __expose({
329
+ uploadToServer,
330
+ // 暴露上传到服务器的方法
331
+ clear: () => {
332
+ previewList.value = [];
333
+ fileList.value = [];
334
+ syncModelValue();
335
+ }
336
+ });
337
+ return (_ctx, _cache) => {
338
+ const _component_vue_cropper = vue.resolveComponent("vue-cropper");
339
+ const _component_el_option = vue.resolveComponent("el-option");
340
+ return vue.openBlock(), vue.createElementBlock(
341
+ "div",
342
+ {
343
+ class: vue.normalizeClass(vue.unref(index$1.bem)("image-upload-pro"))
344
+ },
345
+ [
346
+ vue.createCommentVNode(" \u6838\u5FC3\u4E0A\u4F20\u533A\u57DF "),
347
+ vue.createVNode(vue.unref(elementPlus.ElUpload), {
348
+ ref_key: "uploadRef",
349
+ ref: uploadRef,
350
+ class: vue.normalizeClass(vue.unref(index$1.bem)("image-upload-pro", "upload-container")),
351
+ action: "",
352
+ "auto-upload": false,
353
+ "file-list": fileList.value,
354
+ "before-upload": handleBeforeUpload,
355
+ "on-change": handleFileChange,
356
+ "on-remove": handleFileRemove,
357
+ accept: _ctx.acceptType,
358
+ "show-file-list": false
359
+ }, {
360
+ tip: vue.withCtx(() => [
361
+ vue.createElementVNode(
362
+ "div",
363
+ {
364
+ class: vue.normalizeClass(vue.unref(index$1.bem)("image-upload-pro", "upload-text"))
365
+ },
366
+ [
367
+ vue.createTextVNode(
368
+ " \u652F\u6301\u683C\u5F0F\uFF1A" + vue.toDisplayString(acceptDesc.value) + " | \u5355\u6587\u4EF6\u5927\u5C0F\u2264" + vue.toDisplayString(props.sizeLimit.size) + "MB ",
369
+ 1
370
+ /* TEXT */
371
+ ),
372
+ props.sizeLimit.width || props.sizeLimit.height ? (vue.openBlock(), vue.createElementBlock(
373
+ "span",
374
+ _hoisted_1,
375
+ " | \u5C3A\u5BF8\u8981\u6C42\uFF1A\u5BBD\u2265" + vue.toDisplayString(props.sizeLimit.width) + "px \u9AD8\u2265" + vue.toDisplayString(props.sizeLimit.height) + "px ",
376
+ 1
377
+ /* TEXT */
378
+ )) : vue.createCommentVNode("v-if", true)
379
+ ],
380
+ 2
381
+ /* CLASS */
382
+ )
383
+ ]),
384
+ default: vue.withCtx(() => [
385
+ vue.createVNode(vue.unref(elementPlus.ElButton), {
386
+ disabled: fileList.value.length === props.maxCount,
387
+ type: "primary"
388
+ }, {
389
+ default: vue.withCtx(() => [..._cache[6] || (_cache[6] = [
390
+ vue.createTextVNode(
391
+ "\u9009\u62E9\u56FE\u7247",
392
+ -1
393
+ /* CACHED */
394
+ )
395
+ ])]),
396
+ _: 1
397
+ /* STABLE */
398
+ }, 8, ["disabled"])
399
+ ]),
400
+ _: 1
401
+ /* STABLE */
402
+ }, 8, ["class", "file-list", "accept"]),
403
+ vue.createCommentVNode(" \u5DF2\u4E0A\u4F20\u56FE\u7247\u9884\u89C8\u5217\u8868 "),
404
+ previewList.value.length ? (vue.openBlock(), vue.createElementBlock(
405
+ "div",
406
+ {
407
+ key: 0,
408
+ class: vue.normalizeClass(vue.unref(index$1.bem)("image-upload-pro", "preview-list"))
409
+ },
410
+ [
411
+ (vue.openBlock(true), vue.createElementBlock(
412
+ vue.Fragment,
413
+ null,
414
+ vue.renderList(previewList.value, (item, index) => {
415
+ return vue.openBlock(), vue.createElementBlock("div", {
416
+ class: vue.normalizeClass([vue.unref(index$1.bem)("image-upload-pro", "preview-item"), { active: item.isCover }]),
417
+ key: item.uid,
418
+ draggable: "true",
419
+ onDragstart: ($event) => handleDragStart(index),
420
+ onDragover: _cache[0] || (_cache[0] = ($event) => handleDragOver($event)),
421
+ onDrop: ($event) => handleDrop(index)
422
+ }, [
423
+ vue.createCommentVNode(" \u56FE\u7247\u9884\u89C8 "),
424
+ vue.createElementVNode(
425
+ "div",
426
+ {
427
+ class: vue.normalizeClass(vue.unref(index$1.bem)("image-upload-pro", "preview-img"))
428
+ },
429
+ [
430
+ vue.createVNode(vue.unref(elementPlus.ElImage), {
431
+ src: item.url,
432
+ "preview-src-list": previewList.value.filter((i) => i.url).map((i) => i.url),
433
+ "preview-current-index": index,
434
+ fit: "cover"
435
+ }, null, 8, ["src", "preview-src-list", "preview-current-index"])
436
+ ],
437
+ 2
438
+ /* CLASS */
439
+ ),
440
+ vue.createCommentVNode(" \u64CD\u4F5C\u6309\u94AE\u7EC4 "),
441
+ vue.createElementVNode(
442
+ "div",
443
+ {
444
+ class: vue.normalizeClass(vue.unref(index$1.bem)("image-upload-pro", "preview-actions"))
445
+ },
446
+ [
447
+ vue.createVNode(vue.unref(elementPlus.ElButton), {
448
+ type: "primary",
449
+ text: "",
450
+ size: "small",
451
+ onClick: ($event) => handleCropImage(item)
452
+ }, {
453
+ default: vue.withCtx(() => [..._cache[7] || (_cache[7] = [
454
+ vue.createTextVNode(
455
+ "\u88C1\u526A",
456
+ -1
457
+ /* CACHED */
458
+ )
459
+ ])]),
460
+ _: 1
461
+ /* STABLE */
462
+ }, 8, ["onClick"]),
463
+ vue.createVNode(vue.unref(elementPlus.ElButton), {
464
+ text: "",
465
+ size: "small",
466
+ type: "danger",
467
+ onClick: ($event) => handleRemovePreview(item)
468
+ }, {
469
+ default: vue.withCtx(() => [..._cache[8] || (_cache[8] = [
470
+ vue.createTextVNode(
471
+ "\u5220\u9664",
472
+ -1
473
+ /* CACHED */
474
+ )
475
+ ])]),
476
+ _: 1
477
+ /* STABLE */
478
+ }, 8, ["onClick"])
479
+ ],
480
+ 2
481
+ /* CLASS */
482
+ )
483
+ ], 42, _hoisted_2);
484
+ }),
485
+ 128
486
+ /* KEYED_FRAGMENT */
487
+ ))
488
+ ],
489
+ 2
490
+ /* CLASS */
491
+ )) : vue.createCommentVNode("v-if", true),
492
+ vue.createCommentVNode(" \u88C1\u526A\u5F39\u7A97 "),
493
+ vue.createVNode(vue.unref(elementPlus.ElDialog), {
494
+ modelValue: cropDialogVisible.value,
495
+ "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => cropDialogVisible.value = $event),
496
+ title: "\u56FE\u7247\u88C1\u526A",
497
+ width: "900px",
498
+ "close-on-click-modal": false,
499
+ "destroy-on-close": "",
500
+ onClose: resetCropper
501
+ }, {
502
+ footer: vue.withCtx(() => [
503
+ vue.createVNode(vue.unref(elementPlus.ElButton), {
504
+ onClick: _cache[4] || (_cache[4] = ($event) => cropDialogVisible.value = false)
505
+ }, {
506
+ default: vue.withCtx(() => [..._cache[10] || (_cache[10] = [
507
+ vue.createTextVNode(
508
+ "\u53D6\u6D88",
509
+ -1
510
+ /* CACHED */
511
+ )
512
+ ])]),
513
+ _: 1
514
+ /* STABLE */
515
+ }),
516
+ vue.createVNode(vue.unref(elementPlus.ElButton), {
517
+ type: "primary",
518
+ onClick: handleCropConfirm
519
+ }, {
520
+ default: vue.withCtx(() => [..._cache[11] || (_cache[11] = [
521
+ vue.createTextVNode(
522
+ "\u786E\u8BA4\u88C1\u526A",
523
+ -1
524
+ /* CACHED */
525
+ )
526
+ ])]),
527
+ _: 1
528
+ /* STABLE */
529
+ })
530
+ ]),
531
+ default: vue.withCtx(() => [
532
+ vue.createElementVNode(
533
+ "div",
534
+ {
535
+ class: vue.normalizeClass(vue.unref(index$1.bem)("image-upload-pro", "cropper-container"))
536
+ },
537
+ [
538
+ vue.createCommentVNode(" \u88C1\u526A\u533A\u57DF "),
539
+ vue.createVNode(_component_vue_cropper, {
540
+ ref_key: "cropperRef",
541
+ ref: cropperRef,
542
+ img: cropImageUrl.value,
543
+ info: true,
544
+ "auto-crop": true,
545
+ "auto-crop-width": cropWidth.value,
546
+ "auto-crop-height": cropHeight.value,
547
+ fixed: aspectRatio.fixed,
548
+ "fixed-number": aspectRatio.value,
549
+ "can-move": true,
550
+ "can-scale": true,
551
+ "can-rotate": false,
552
+ onRealTime: handleCropRealTime
553
+ }, null, 8, ["img", "auto-crop-width", "auto-crop-height", "fixed", "fixed-number"])
554
+ ],
555
+ 2
556
+ /* CLASS */
557
+ ),
558
+ vue.createElementVNode(
559
+ "div",
560
+ {
561
+ class: vue.normalizeClass(vue.unref(index$1.bem)("image-upload-pro", "cropper-config"))
562
+ },
563
+ [
564
+ vue.createVNode(vue.unref(elementPlus.ElForm), { model: cropForm }, {
565
+ default: vue.withCtx(() => [
566
+ vue.createVNode(vue.unref(elementPlus.ElRow), { gutter: 10 }, {
567
+ default: vue.withCtx(() => [
568
+ vue.createVNode(vue.unref(elementPlus.ElCol), { span: 8 }, {
569
+ default: vue.withCtx(() => [
570
+ vue.createVNode(vue.unref(elementPlus.ElFormItem), { label: "\u88C1\u526A\u6BD4\u4F8B" }, {
571
+ default: vue.withCtx(() => [
572
+ vue.createVNode(vue.unref(elementPlus.ElSelect), {
573
+ style: { "width": "100%" },
574
+ modelValue: cropForm.aspectRatio,
575
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => cropForm.aspectRatio = $event),
576
+ onChange: handleAspectRatioChange
577
+ }, {
578
+ default: vue.withCtx(() => [
579
+ (vue.openBlock(), vue.createElementBlock(
580
+ vue.Fragment,
581
+ null,
582
+ vue.renderList(ASPECT_RATIO_OPTIONS, (option) => {
583
+ return vue.createVNode(_component_el_option, {
584
+ key: option.value,
585
+ label: option.label,
586
+ value: option.value
587
+ }, null, 8, ["label", "value"]);
588
+ }),
589
+ 64
590
+ /* STABLE_FRAGMENT */
591
+ ))
592
+ ]),
593
+ _: 1
594
+ /* STABLE */
595
+ }, 8, ["modelValue"])
596
+ ]),
597
+ _: 1
598
+ /* STABLE */
599
+ })
600
+ ]),
601
+ _: 1
602
+ /* STABLE */
603
+ }),
604
+ vue.createVNode(vue.unref(elementPlus.ElCol), { span: 16 }, {
605
+ default: vue.withCtx(() => [
606
+ vue.createVNode(vue.unref(elementPlus.ElFormItem), { label: "\u88C1\u526A\u5C3A\u5BF8" }, {
607
+ default: vue.withCtx(() => [
608
+ vue.createVNode(vue.unref(elementPlus.ElInputNumber), {
609
+ modelValue: displayWidth.value,
610
+ "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => displayWidth.value = $event),
611
+ placeholder: "\u5BBD\u5EA6",
612
+ min: props.sizeLimit.width || 100,
613
+ onChange: handleSizeChange
614
+ }, null, 8, ["modelValue", "min"]),
615
+ _cache[9] || (_cache[9] = vue.createElementVNode(
616
+ "span",
617
+ { style: { "margin": "0 8px" } },
618
+ "*",
619
+ -1
620
+ /* CACHED */
621
+ )),
622
+ vue.createVNode(vue.unref(elementPlus.ElInputNumber), {
623
+ modelValue: displayHeight.value,
624
+ "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => displayHeight.value = $event),
625
+ placeholder: "\u9AD8\u5EA6",
626
+ min: props.sizeLimit.height || 100,
627
+ onChange: handleSizeChange
628
+ }, null, 8, ["modelValue", "min"])
629
+ ]),
630
+ _: 1
631
+ /* STABLE */
632
+ })
633
+ ]),
634
+ _: 1
635
+ /* STABLE */
636
+ })
637
+ ]),
638
+ _: 1
639
+ /* STABLE */
640
+ })
641
+ ]),
642
+ _: 1
643
+ /* STABLE */
644
+ }, 8, ["model"])
645
+ ],
646
+ 2
647
+ /* CLASS */
648
+ )
649
+ ]),
650
+ _: 1
651
+ /* STABLE */
652
+ }, 8, ["modelValue"])
653
+ ],
654
+ 2
655
+ /* CLASS */
656
+ );
657
+ };
658
+ }
659
+ });
660
+
661
+ exports.default = _sfc_main;