@minilo/ui 0.0.2 → 0.0.3

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