vant-vtk 1.0.1 → 1.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.
- package/README.md +28 -0
- package/dist/style.css +1 -1
- package/dist/vant-vtk.es.js +637 -51
- package/dist/vant-vtk.es.js.map +1 -1
- package/dist/vant-vtk.umd.js +1 -1
- package/dist/vant-vtk.umd.js.map +1 -1
- package/package.json +30 -13
- package/types/index.d.ts +63 -4
package/README.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
## 本地测试步骤
|
|
2
|
+
|
|
3
|
+
### 1. 构建组件库
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm run build
|
|
7
|
+
npm run build:lib
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
### 2. 创建 npm link(在组件库目录)
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm link
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### 3. 在测试项目中链接组件库
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
cd test-demo
|
|
20
|
+
npm link vant-vtk
|
|
21
|
+
npm install
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 4. 运行测试项目
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm run dev
|
|
28
|
+
```
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
[data-v-
|
|
1
|
+
[data-v-eb64e8a9] .van-checkbox{margin-bottom:8px;margin-right:12px}[data-v-3482e335] .van-radio{margin-right:12px}[data-v-2ccc0da3] .van-uploader__preview-image,[data-v-2ccc0da3] .van-uploader__upload{border-radius:4px}.file-preview-container[data-v-1ad2c749]{display:flex;flex-direction:column;height:100%;background-color:#fff;border-radius:8px;overflow:hidden}.file-header[data-v-1ad2c749]{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid #ebedf0;background-color:#f7f8fa}.file-title[data-v-1ad2c749]{font-size:16px;font-weight:600;color:#323233}.file-content[data-v-1ad2c749]{flex:1;overflow:hidden;display:flex;flex-direction:column}.image-preview[data-v-1ad2c749]{flex:1;display:flex;flex-direction:column;overflow:hidden}.preview-image[data-v-1ad2c749]{flex:1;width:100%;height:100%}.image-footer[data-v-1ad2c749]{display:flex;align-items:center;justify-content:center;gap:16px;padding:12px 16px;border-top:1px solid #ebedf0;background-color:#fff}.file-info[data-v-1ad2c749]{font-size:14px;color:#646566;min-width:80px;text-align:center}.pdf-preview[data-v-1ad2c749]{flex:1;display:flex;flex-direction:column;overflow:hidden}.pdf-embed-preview[data-v-1ad2c749]{flex:1;max-width:100%;overflow-y:auto;padding:16px;display:flex;justify-content:center;align-items:flex-start;background-color:#f5f5f5;box-shadow:0 2px 8px #0000001a}.pdf-placeholder[data-v-1ad2c749]{flex:1;display:flex;align-items:center;justify-content:center;color:#969799;font-size:14px}.pdf-footer[data-v-1ad2c749]{display:flex;align-items:center;justify-content:center;gap:16px;padding:12px 16px;border-top:1px solid #ebedf0;background-color:#fff}.page-info[data-v-1ad2c749]{font-size:14px;color:#646566;min-width:80px;text-align:center}.footer[data-v-1ad2c749]{position:fixed;top:40%;width:100%}.footer .van-button[data-v-1ad2c749]:nth-child(2){float:right}
|
package/dist/vant-vtk.es.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import { computed as
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { computed as $, resolveComponent as V, openBlock as k, createBlock as L, normalizeProps as J, guardReactiveProps as K, withCtx as S, createVNode as x, createElementBlock as P, Fragment as W, renderList as Q, createTextVNode as T, toDisplayString as w, ref as C, watch as z, mergeProps as X, createElementVNode as A, unref as Z, createCommentVNode as O } from "vue";
|
|
2
|
+
import { showLoadingToast as H, closeToast as ee, showToast as M } from "vant";
|
|
3
|
+
import ae from "vue-pdf-embed";
|
|
4
|
+
const q = (n, h) => {
|
|
5
|
+
const r = n.__vccOpts || n;
|
|
6
|
+
for (const [c, m] of h)
|
|
7
|
+
r[c] = m;
|
|
8
|
+
return r;
|
|
9
|
+
}, te = /* @__PURE__ */ Object.assign({
|
|
10
|
+
name: "VtkCheckbox"
|
|
9
11
|
}, {
|
|
10
12
|
__name: "index",
|
|
11
13
|
props: {
|
|
@@ -23,7 +25,7 @@ const j = (o, n) => {
|
|
|
23
25
|
valueType: {
|
|
24
26
|
type: String,
|
|
25
27
|
default: "array",
|
|
26
|
-
validator: (
|
|
28
|
+
validator: (n) => ["string", "array", "object"].includes(n)
|
|
27
29
|
},
|
|
28
30
|
// 当 valueType 为 string 时的分隔符
|
|
29
31
|
separator: {
|
|
@@ -32,42 +34,42 @@ const j = (o, n) => {
|
|
|
32
34
|
}
|
|
33
35
|
},
|
|
34
36
|
emits: ["update:modelValue", "change"],
|
|
35
|
-
setup(
|
|
36
|
-
const
|
|
37
|
-
const [
|
|
37
|
+
setup(n, { emit: h }) {
|
|
38
|
+
const r = n, c = h, m = $(() => Array.isArray(r.options) ? r.options : typeof r.options == "string" && r.options ? r.options.split("/").filter(Boolean).map((t) => {
|
|
39
|
+
const [o, s] = t.split(":");
|
|
38
40
|
return {
|
|
39
|
-
text:
|
|
40
|
-
value:
|
|
41
|
+
text: s || o,
|
|
42
|
+
value: o
|
|
41
43
|
};
|
|
42
|
-
}) : []),
|
|
44
|
+
}) : []), i = $({
|
|
43
45
|
get: () => {
|
|
44
|
-
const
|
|
45
|
-
if (!
|
|
46
|
-
let
|
|
47
|
-
return
|
|
46
|
+
const t = r.modelValue;
|
|
47
|
+
if (!t) return [];
|
|
48
|
+
let o = [];
|
|
49
|
+
return r.valueType === "string" ? o = typeof t == "string" ? t.split(r.separator).filter(Boolean) : [] : r.valueType === "object" ? o = Array.isArray(t) ? t.map((s) => (s == null ? void 0 : s.value) ?? s) : [] : o = Array.isArray(t) ? t : [], o.map(String);
|
|
48
50
|
},
|
|
49
|
-
set: (
|
|
50
|
-
let
|
|
51
|
-
|
|
51
|
+
set: (t) => {
|
|
52
|
+
let o;
|
|
53
|
+
r.valueType === "string" ? o = t.join(r.separator) : r.valueType === "object" ? o = m.value.filter((s) => t.includes(String(s.value))) : o = t.map((s) => isNaN(Number(s)) ? s : Array.isArray(r.modelValue) && typeof r.modelValue[0] == "number" ? Number(s) : s), c("update:modelValue", o), c("change", o);
|
|
52
54
|
}
|
|
53
55
|
});
|
|
54
|
-
return (
|
|
55
|
-
const
|
|
56
|
-
return
|
|
57
|
-
input:
|
|
58
|
-
|
|
59
|
-
modelValue:
|
|
60
|
-
"onUpdate:modelValue":
|
|
56
|
+
return (t, o) => {
|
|
57
|
+
const s = V("van-checkbox"), y = V("van-checkbox-group"), v = V("van-field");
|
|
58
|
+
return k(), L(v, J(K(t.$attrs)), {
|
|
59
|
+
input: S(() => [
|
|
60
|
+
x(y, {
|
|
61
|
+
modelValue: i.value,
|
|
62
|
+
"onUpdate:modelValue": o[0] || (o[0] = (g) => i.value = g),
|
|
61
63
|
direction: "horizontal"
|
|
62
64
|
}, {
|
|
63
|
-
default:
|
|
64
|
-
(
|
|
65
|
-
key: String(
|
|
66
|
-
name: String(
|
|
65
|
+
default: S(() => [
|
|
66
|
+
(k(!0), P(W, null, Q(m.value, (g) => (k(), L(s, {
|
|
67
|
+
key: String(g.value),
|
|
68
|
+
name: String(g.value),
|
|
67
69
|
shape: "square"
|
|
68
70
|
}, {
|
|
69
|
-
default:
|
|
70
|
-
|
|
71
|
+
default: S(() => [
|
|
72
|
+
T(w(g.text), 1)
|
|
71
73
|
]),
|
|
72
74
|
_: 2
|
|
73
75
|
}, 1032, ["name"]))), 128))
|
|
@@ -79,25 +81,609 @@ const j = (o, n) => {
|
|
|
79
81
|
}, 16);
|
|
80
82
|
};
|
|
81
83
|
}
|
|
82
|
-
}),
|
|
83
|
-
|
|
84
|
-
|
|
84
|
+
}), F = /* @__PURE__ */ q(te, [["__scopeId", "data-v-eb64e8a9"]]);
|
|
85
|
+
F.install = (n) => {
|
|
86
|
+
n.component(F.name || "VtkCheckbox", F);
|
|
85
87
|
};
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
88
|
+
const I = /* @__PURE__ */ Object.assign({
|
|
89
|
+
name: "VtkArea"
|
|
90
|
+
}, {
|
|
91
|
+
__name: "index",
|
|
92
|
+
props: {
|
|
93
|
+
// 绑定值,根据 valueType 返回不同类型
|
|
94
|
+
modelValue: {
|
|
95
|
+
type: [String, Object, Array],
|
|
96
|
+
default: ""
|
|
97
|
+
},
|
|
98
|
+
// 默认地区编码,用于初始化加载
|
|
99
|
+
defaultAreaCode: {
|
|
100
|
+
type: String,
|
|
101
|
+
default: "33"
|
|
102
|
+
},
|
|
103
|
+
// 返回值类型: 'code' 返回最后一级areaCode, 'codes' 返回所有级别areaCode数组, 'object' 返回完整对象信息
|
|
104
|
+
valueType: {
|
|
105
|
+
type: String,
|
|
106
|
+
default: "code",
|
|
107
|
+
validator: (n) => ["code", "codes", "object"].includes(n)
|
|
108
|
+
},
|
|
109
|
+
// 显示分隔符
|
|
110
|
+
separator: {
|
|
111
|
+
type: String,
|
|
112
|
+
default: "/"
|
|
113
|
+
},
|
|
114
|
+
// 弹窗标题
|
|
115
|
+
title: {
|
|
116
|
+
type: String,
|
|
117
|
+
default: "请选择所在地区"
|
|
118
|
+
},
|
|
119
|
+
// 占位文本
|
|
120
|
+
placeholder: {
|
|
121
|
+
type: String,
|
|
122
|
+
default: "请选择所在地区"
|
|
123
|
+
},
|
|
124
|
+
// 最大层级限制,达到该层级后不再加载下级
|
|
125
|
+
maxLevel: {
|
|
126
|
+
type: Number,
|
|
127
|
+
default: 12
|
|
128
|
+
},
|
|
129
|
+
// 显示模式: 'full' 显示完整路径, 'last' 只显示最后一级
|
|
130
|
+
displayMode: {
|
|
131
|
+
type: String,
|
|
132
|
+
default: "full",
|
|
133
|
+
validator: (n) => ["full", "last"].includes(n)
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
emits: ["update:modelValue", "change", "finish"],
|
|
137
|
+
setup(n, { expose: h, emit: r }) {
|
|
138
|
+
const c = n, m = r, i = C(!1), t = C(""), o = C([]), s = C(""), y = C(!1), v = C([]), g = {
|
|
139
|
+
text: "areaName",
|
|
140
|
+
value: "areaCode",
|
|
141
|
+
children: "children"
|
|
142
|
+
};
|
|
143
|
+
z(
|
|
144
|
+
() => c.modelValue,
|
|
145
|
+
(a) => {
|
|
146
|
+
a || (s.value = "", t.value = "", v.value = []);
|
|
147
|
+
},
|
|
148
|
+
{ immediate: !0 }
|
|
149
|
+
);
|
|
150
|
+
const N = () => {
|
|
151
|
+
i.value = !0, o.value.length === 0 && U();
|
|
152
|
+
}, U = async () => {
|
|
153
|
+
if (!y.value) {
|
|
154
|
+
y.value = !0;
|
|
155
|
+
try {
|
|
156
|
+
const a = c.defaultAreaCode, e = await Request.getForm(`dict/area/show/${a}`);
|
|
157
|
+
if (e.data) {
|
|
158
|
+
const l = {
|
|
159
|
+
areaCode: e.data.areaCode,
|
|
160
|
+
areaName: e.data.areaName,
|
|
161
|
+
areaLeve: e.data.areaLeve,
|
|
162
|
+
children: e.data.areaLeve < c.maxLevel ? [] : void 0
|
|
163
|
+
};
|
|
164
|
+
o.value = [l];
|
|
165
|
+
}
|
|
166
|
+
} catch (a) {
|
|
167
|
+
console.error("加载初始地区失败:", a);
|
|
168
|
+
} finally {
|
|
169
|
+
y.value = !1;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}, u = async (a) => {
|
|
173
|
+
if (!a._loading) {
|
|
174
|
+
a._loading = !0;
|
|
175
|
+
try {
|
|
176
|
+
const e = await Request.getForm(`dict/area/next/${a.areaCode}`);
|
|
177
|
+
e.data && e.data.length > 0 ? (e.data.forEach((l) => {
|
|
178
|
+
l.areaLeve < c.maxLevel && (l.children = []);
|
|
179
|
+
}), a.children = e.data) : delete a.children;
|
|
180
|
+
} catch (e) {
|
|
181
|
+
console.error("加载下级地区失败:", e);
|
|
182
|
+
} finally {
|
|
183
|
+
a._loading = !1;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}, d = ({ value: a, selectedOptions: e, tabIndex: l }) => {
|
|
187
|
+
const p = e[l];
|
|
188
|
+
p && p.areaLeve < c.maxLevel && Array.isArray(p.children) && p.children.length === 0 && u(p), m("change", { value: a, selectedOptions: e, tabIndex: l });
|
|
189
|
+
}, f = ({ selectedOptions: a }) => {
|
|
190
|
+
var l, p, j, b, E;
|
|
191
|
+
c.displayMode === "last" ? s.value = ((l = a[a.length - 1]) == null ? void 0 : l.areaName) || "" : s.value = a.map((_) => _.areaName).join(c.separator), v.value = a.map((_) => ({
|
|
192
|
+
areaCode: _.areaCode,
|
|
193
|
+
areaName: _.areaName,
|
|
194
|
+
areaLeve: _.areaLeve
|
|
195
|
+
}));
|
|
196
|
+
let e;
|
|
197
|
+
switch (c.valueType) {
|
|
198
|
+
case "code":
|
|
199
|
+
e = ((p = a[a.length - 1]) == null ? void 0 : p.areaCode) || "";
|
|
200
|
+
break;
|
|
201
|
+
case "codes":
|
|
202
|
+
e = a.map((_) => _.areaCode);
|
|
203
|
+
break;
|
|
204
|
+
case "object":
|
|
205
|
+
e = {
|
|
206
|
+
codes: a.map((_) => _.areaCode),
|
|
207
|
+
names: a.map((_) => _.areaName),
|
|
208
|
+
fullName: a.map((_) => _.areaName).join(c.separator),
|
|
209
|
+
lastCode: ((j = a[a.length - 1]) == null ? void 0 : j.areaCode) || "",
|
|
210
|
+
lastLevel: (b = a[a.length - 1]) == null ? void 0 : b.areaLeve,
|
|
211
|
+
options: v.value
|
|
212
|
+
};
|
|
213
|
+
break;
|
|
214
|
+
default:
|
|
215
|
+
e = ((E = a[a.length - 1]) == null ? void 0 : E.areaCode) || "";
|
|
216
|
+
}
|
|
217
|
+
m("update:modelValue", e), m("finish", { selectedOptions: a, value: e }), i.value = !1;
|
|
218
|
+
};
|
|
219
|
+
return h({
|
|
220
|
+
// 获取当前选中的完整数据
|
|
221
|
+
getSelectedData: () => v.value,
|
|
222
|
+
// 获取显示值
|
|
223
|
+
getDisplayValue: () => s.value,
|
|
224
|
+
// 重置选择
|
|
225
|
+
reset: () => {
|
|
226
|
+
s.value = "", t.value = "", v.value = [], m("update:modelValue", c.valueType === "codes" ? [] : c.valueType === "object" ? null : "");
|
|
227
|
+
},
|
|
228
|
+
// 打开选择器
|
|
229
|
+
open: () => {
|
|
230
|
+
N();
|
|
231
|
+
},
|
|
232
|
+
// 关闭选择器
|
|
233
|
+
close: () => {
|
|
234
|
+
i.value = !1;
|
|
235
|
+
}
|
|
236
|
+
}), (a, e) => {
|
|
237
|
+
const l = V("van-field"), p = V("van-cascader"), j = V("van-popup");
|
|
238
|
+
return k(), P(W, null, [
|
|
239
|
+
x(l, X({
|
|
240
|
+
modelValue: s.value,
|
|
241
|
+
"onUpdate:modelValue": e[0] || (e[0] = (b) => s.value = b),
|
|
242
|
+
"is-link": "",
|
|
243
|
+
readonly: ""
|
|
244
|
+
}, a.$attrs, {
|
|
245
|
+
placeholder: n.placeholder,
|
|
246
|
+
onClick: N
|
|
247
|
+
}), null, 16, ["modelValue", "placeholder"]),
|
|
248
|
+
x(j, {
|
|
249
|
+
show: i.value,
|
|
250
|
+
"onUpdate:show": e[3] || (e[3] = (b) => i.value = b),
|
|
251
|
+
round: "",
|
|
252
|
+
position: "bottom"
|
|
253
|
+
}, {
|
|
254
|
+
default: S(() => [
|
|
255
|
+
x(p, {
|
|
256
|
+
modelValue: t.value,
|
|
257
|
+
"onUpdate:modelValue": e[1] || (e[1] = (b) => t.value = b),
|
|
258
|
+
title: n.title,
|
|
259
|
+
options: o.value,
|
|
260
|
+
"field-names": g,
|
|
261
|
+
onClose: e[2] || (e[2] = (b) => i.value = !1),
|
|
262
|
+
onFinish: f,
|
|
263
|
+
onChange: d
|
|
264
|
+
}, null, 8, ["modelValue", "title", "options"])
|
|
265
|
+
]),
|
|
266
|
+
_: 1
|
|
267
|
+
}, 8, ["show"])
|
|
268
|
+
], 64);
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
I.install = (n) => {
|
|
273
|
+
n.component(I.name || "VtkArea", I);
|
|
274
|
+
};
|
|
275
|
+
const le = /* @__PURE__ */ Object.assign({
|
|
276
|
+
name: "VtkRadio"
|
|
277
|
+
}, {
|
|
278
|
+
__name: "index",
|
|
279
|
+
props: {
|
|
280
|
+
// 绑定值
|
|
281
|
+
modelValue: {
|
|
282
|
+
type: [String, Number, Object],
|
|
283
|
+
default: ""
|
|
284
|
+
},
|
|
285
|
+
// 选项数据:支持数组 [{value, text}] 或 字符串 '1:选项1/2:选项2'
|
|
286
|
+
options: {
|
|
287
|
+
type: [Array, String],
|
|
288
|
+
default: () => []
|
|
289
|
+
},
|
|
290
|
+
// 返回值类型: 'string' (基本类型), 'object' (完整对象)
|
|
291
|
+
valueType: {
|
|
292
|
+
type: String,
|
|
293
|
+
default: "string",
|
|
294
|
+
validator: (n) => ["string", "object"].includes(n)
|
|
295
|
+
}
|
|
296
|
+
},
|
|
297
|
+
emits: ["update:modelValue", "change"],
|
|
298
|
+
setup(n, { emit: h }) {
|
|
299
|
+
const r = n, c = h, m = $(() => Array.isArray(r.options) ? r.options : typeof r.options == "string" && r.options ? r.options.split("/").filter(Boolean).map((t) => {
|
|
300
|
+
const [o, s] = t.split(":");
|
|
301
|
+
return {
|
|
302
|
+
text: s || o,
|
|
303
|
+
value: o
|
|
304
|
+
};
|
|
305
|
+
}) : []), i = $({
|
|
306
|
+
get: () => {
|
|
307
|
+
const t = r.modelValue;
|
|
308
|
+
return t == null ? "" : r.valueType === "object" && t && typeof t == "object" ? String(t.value ?? "") : String(t);
|
|
309
|
+
},
|
|
310
|
+
set: (t) => {
|
|
311
|
+
var y;
|
|
312
|
+
let o = t;
|
|
313
|
+
typeof (r.valueType === "object" ? (y = r.modelValue) == null ? void 0 : y.value : r.modelValue) == "number" && !isNaN(Number(t)) && (o = Number(t)), r.valueType === "object" && (o = m.value.find((v) => String(v.value) === String(t)) || null), c("update:modelValue", o), c("change", o);
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
return (t, o) => {
|
|
317
|
+
const s = V("van-radio"), y = V("van-radio-group"), v = V("van-field");
|
|
318
|
+
return k(), L(v, J(K(t.$attrs)), {
|
|
319
|
+
input: S(() => [
|
|
320
|
+
x(y, {
|
|
321
|
+
modelValue: i.value,
|
|
322
|
+
"onUpdate:modelValue": o[0] || (o[0] = (g) => i.value = g),
|
|
323
|
+
direction: "horizontal"
|
|
324
|
+
}, {
|
|
325
|
+
default: S(() => [
|
|
326
|
+
(k(!0), P(W, null, Q(m.value, (g) => (k(), L(s, {
|
|
327
|
+
key: String(g.value),
|
|
328
|
+
name: String(g.value)
|
|
329
|
+
}, {
|
|
330
|
+
default: S(() => [
|
|
331
|
+
T(w(g.text), 1)
|
|
332
|
+
]),
|
|
333
|
+
_: 2
|
|
334
|
+
}, 1032, ["name"]))), 128))
|
|
335
|
+
]),
|
|
336
|
+
_: 1
|
|
337
|
+
}, 8, ["modelValue"])
|
|
338
|
+
]),
|
|
339
|
+
_: 1
|
|
340
|
+
}, 16);
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
}), R = /* @__PURE__ */ q(le, [["__scopeId", "data-v-3482e335"]]);
|
|
344
|
+
R.install = (n) => {
|
|
345
|
+
n.component(R.name || "VtkRadio", R);
|
|
346
|
+
};
|
|
347
|
+
const ne = /* @__PURE__ */ Object.assign({
|
|
348
|
+
name: "VtkUploader",
|
|
349
|
+
inheritAttrs: !1
|
|
350
|
+
}, {
|
|
351
|
+
__name: "index",
|
|
352
|
+
props: {
|
|
353
|
+
/** 绑定值,支持字符串或数组 */
|
|
354
|
+
modelValue: {
|
|
355
|
+
type: [String, Array],
|
|
356
|
+
default: () => []
|
|
357
|
+
},
|
|
358
|
+
/** 返回值类型:'string' 返回逗号分隔的字符串,'array' 返回数组 */
|
|
359
|
+
valueType: {
|
|
360
|
+
type: String,
|
|
361
|
+
default: "array",
|
|
362
|
+
validator: (n) => ["string", "array"].includes(n)
|
|
363
|
+
},
|
|
364
|
+
/** 单个文件最大大小(字节),默认10MB */
|
|
365
|
+
maxSize: {
|
|
366
|
+
type: Number,
|
|
367
|
+
default: 10 * 1024 * 1024
|
|
368
|
+
},
|
|
369
|
+
/** 接受的文件类型 */
|
|
370
|
+
accept: {
|
|
371
|
+
type: String,
|
|
372
|
+
default: "image/*"
|
|
373
|
+
},
|
|
374
|
+
/** 上传接口地址 */
|
|
375
|
+
uploadUrl: {
|
|
376
|
+
type: String,
|
|
377
|
+
default: "/bizp/admin/upload"
|
|
378
|
+
},
|
|
379
|
+
/** 上传文件的字段名 */
|
|
380
|
+
fieldName: {
|
|
381
|
+
type: String,
|
|
382
|
+
default: "file"
|
|
383
|
+
}
|
|
384
|
+
},
|
|
385
|
+
emits: ["update:modelValue", "change", "success", "error"],
|
|
386
|
+
setup(n, { expose: h, emit: r }) {
|
|
387
|
+
const c = n, m = r, i = C([]), t = (u) => {
|
|
388
|
+
if (!u) return [];
|
|
389
|
+
let d = [];
|
|
390
|
+
return typeof u == "string" ? d = u.split(",").filter((f) => f.trim()) : Array.isArray(u) && (d = u.filter((f) => f)), d.map((f) => ({
|
|
391
|
+
url: f,
|
|
392
|
+
status: "done",
|
|
393
|
+
message: ""
|
|
394
|
+
}));
|
|
395
|
+
}, o = () => i.value.filter((u) => u.status === "done" && u.url).map((u) => u.url), s = (u) => c.valueType === "string" ? u.join(",") : u, y = () => {
|
|
396
|
+
const u = o(), d = s(u);
|
|
397
|
+
m("update:modelValue", d), m("change", d);
|
|
398
|
+
};
|
|
399
|
+
z(
|
|
400
|
+
() => c.modelValue,
|
|
401
|
+
(u) => {
|
|
402
|
+
const d = o().join(","), f = Array.isArray(u) ? u.join(",") : u || "";
|
|
403
|
+
d !== f && (i.value = t(u));
|
|
404
|
+
},
|
|
405
|
+
{ immediate: !0 }
|
|
406
|
+
);
|
|
407
|
+
const v = (u) => {
|
|
408
|
+
const d = Array.isArray(u) ? u : [u];
|
|
409
|
+
for (const f of d)
|
|
410
|
+
if (f.size > c.maxSize) {
|
|
411
|
+
const a = (c.maxSize / 1024 / 1024).toFixed(1);
|
|
412
|
+
return M(`文件大小不能超过${a}MB`), !1;
|
|
413
|
+
}
|
|
414
|
+
return !0;
|
|
415
|
+
}, g = async (u) => {
|
|
416
|
+
var f, a, e, l;
|
|
417
|
+
const d = new FormData();
|
|
418
|
+
d.append(c.fieldName, u.file);
|
|
419
|
+
try {
|
|
420
|
+
const p = await Request.imp(c.uploadUrl, d);
|
|
421
|
+
return (f = p.meta) != null && f.success ? { success: !0, url: ((a = p.data) == null ? void 0 : a.url) || ((e = p.data) == null ? void 0 : e.path) || p.data } : { success: !1, message: ((l = p.meta) == null ? void 0 : l.message) || "上传失败" };
|
|
422
|
+
} catch (p) {
|
|
423
|
+
return { success: !1, message: p.message || "上传失败" };
|
|
424
|
+
}
|
|
425
|
+
}, N = async (u) => {
|
|
426
|
+
const d = Array.isArray(u) ? u : [u];
|
|
427
|
+
d.length > 1 && H({
|
|
428
|
+
message: `正在上传 0/${d.length}`,
|
|
429
|
+
forbidClick: !0,
|
|
430
|
+
duration: 0
|
|
431
|
+
});
|
|
432
|
+
let f = 0, a = 0;
|
|
433
|
+
for (let e = 0; e < d.length; e++) {
|
|
434
|
+
const l = d[e];
|
|
435
|
+
l.status = "uploading", l.message = "上传中...", d.length > 1 && H({
|
|
436
|
+
message: `正在上传 ${e + 1}/${d.length}`,
|
|
437
|
+
forbidClick: !0,
|
|
438
|
+
duration: 0
|
|
439
|
+
});
|
|
440
|
+
const p = await g(l);
|
|
441
|
+
p.success ? (l.status = "done", l.message = "", l.url = p.url, f++, m("success", { file: l, url: p.url })) : (l.status = "failed", l.message = p.message, a++, m("error", { file: l, message: p.message }));
|
|
442
|
+
}
|
|
443
|
+
ee(), d.length > 1 ? a === 0 ? M(`${f}个文件上传成功`) : M(`${f}个成功,${a}个失败`) : a > 0 && M(d[0].message || "上传失败"), y();
|
|
444
|
+
}, U = () => {
|
|
445
|
+
setTimeout(() => {
|
|
446
|
+
y();
|
|
447
|
+
}, 0);
|
|
448
|
+
};
|
|
449
|
+
return h({
|
|
450
|
+
/** 获取已上传的URL列表 */
|
|
451
|
+
getUrls: o,
|
|
452
|
+
/** 清空文件列表 */
|
|
453
|
+
clear: () => {
|
|
454
|
+
i.value = [], y();
|
|
455
|
+
},
|
|
456
|
+
/** 获取文件列表 */
|
|
457
|
+
getFileList: () => i.value
|
|
458
|
+
}), (u, d) => {
|
|
459
|
+
const f = V("van-uploader");
|
|
460
|
+
return k(), L(f, X({
|
|
461
|
+
modelValue: i.value,
|
|
462
|
+
"onUpdate:modelValue": d[0] || (d[0] = (a) => i.value = a)
|
|
463
|
+
}, u.$attrs, {
|
|
464
|
+
"max-size": n.maxSize,
|
|
465
|
+
accept: n.accept,
|
|
466
|
+
"before-read": v,
|
|
467
|
+
"after-read": N,
|
|
468
|
+
onDelete: U
|
|
469
|
+
}), null, 16, ["modelValue", "max-size", "accept"]);
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
}), D = /* @__PURE__ */ q(ne, [["__scopeId", "data-v-2ccc0da3"]]);
|
|
473
|
+
D.install = (n) => {
|
|
474
|
+
n.component(D.name || "VtkUploader", D);
|
|
475
|
+
};
|
|
476
|
+
const oe = { class: "file-preview-container" }, re = { class: "file-header" }, se = { class: "file-title" }, ue = { class: "file-content" }, ie = {
|
|
477
|
+
key: 0,
|
|
478
|
+
class: "image-preview"
|
|
479
|
+
}, de = { class: "image-footer" }, ce = { class: "file-info" }, pe = {
|
|
480
|
+
key: 1,
|
|
481
|
+
class: "pdf-preview"
|
|
482
|
+
}, me = {
|
|
483
|
+
key: 1,
|
|
484
|
+
class: "pdf-placeholder"
|
|
485
|
+
}, fe = { class: "pdf-footer" }, ve = { class: "page-info" }, ge = { class: "footer" }, ye = /* @__PURE__ */ Object.assign({
|
|
486
|
+
name: "VtkPreview"
|
|
487
|
+
}, {
|
|
488
|
+
__name: "index",
|
|
489
|
+
props: {
|
|
490
|
+
modelValue: {
|
|
491
|
+
type: Boolean,
|
|
492
|
+
default: !1
|
|
493
|
+
},
|
|
494
|
+
files: {
|
|
495
|
+
type: Array,
|
|
496
|
+
default: () => []
|
|
497
|
+
},
|
|
498
|
+
startIndex: {
|
|
499
|
+
type: Number,
|
|
500
|
+
default: 0
|
|
501
|
+
}
|
|
502
|
+
},
|
|
503
|
+
emits: ["update:modelValue", "close"],
|
|
504
|
+
setup(n, { emit: h }) {
|
|
505
|
+
const r = n, c = h, m = C(r.modelValue), i = C(r.startIndex), t = C(1), o = C(null), s = C(0), y = $(() => r.files.map((e, l) => {
|
|
506
|
+
if (typeof e == "string") {
|
|
507
|
+
const p = e.toLowerCase().endsWith(".pdf");
|
|
508
|
+
return {
|
|
509
|
+
name: p ? `文档${l + 1}.pdf` : `图片${l + 1}`,
|
|
510
|
+
url: e,
|
|
511
|
+
type: p ? "pdf" : "image"
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
return e;
|
|
515
|
+
})), v = $(() => y.value[i.value] || null), g = $(() => {
|
|
516
|
+
if (!v.value) return null;
|
|
517
|
+
const e = v.value.url || v.value;
|
|
518
|
+
return typeof e == "string" ? e.toLowerCase().endsWith(".pdf") ? "pdf" : "image" : v.value.type || "image";
|
|
519
|
+
});
|
|
520
|
+
z(
|
|
521
|
+
() => r.modelValue,
|
|
522
|
+
(e) => {
|
|
523
|
+
m.value = e, e && y.value.length > 0 && (i.value = r.startIndex, N());
|
|
524
|
+
}
|
|
525
|
+
), z(
|
|
526
|
+
() => r.startIndex,
|
|
527
|
+
(e) => {
|
|
528
|
+
i.value = e, N();
|
|
529
|
+
}
|
|
530
|
+
), z(m, (e) => {
|
|
531
|
+
c("update:modelValue", e), e || a();
|
|
532
|
+
}), z(i, () => {
|
|
533
|
+
t.value = 1, s.value = 0, N();
|
|
534
|
+
});
|
|
535
|
+
const N = () => {
|
|
536
|
+
const e = v.value;
|
|
537
|
+
e && (g.value === "pdf" ? o.value = e.url || e : o.value = null);
|
|
538
|
+
}, U = (e) => {
|
|
539
|
+
s.value = e.numPages || 0;
|
|
540
|
+
}, u = () => {
|
|
541
|
+
console.log("PDF rendered successfully");
|
|
542
|
+
}, d = () => {
|
|
543
|
+
i.value > 0 && i.value--;
|
|
544
|
+
}, f = () => {
|
|
545
|
+
i.value < y.value.length - 1 && i.value++;
|
|
546
|
+
}, a = () => {
|
|
547
|
+
m.value = !1, o.value = null, t.value = 1, s.value = 0, c("close");
|
|
548
|
+
};
|
|
549
|
+
return (e, l) => {
|
|
550
|
+
const p = V("van-icon"), j = V("van-image"), b = V("van-button"), E = V("van-popup");
|
|
551
|
+
return k(), L(E, {
|
|
552
|
+
show: m.value,
|
|
553
|
+
"onUpdate:show": l[2] || (l[2] = (_) => m.value = _),
|
|
554
|
+
position: "bottom",
|
|
555
|
+
style: { height: "100vh" }
|
|
556
|
+
}, {
|
|
557
|
+
default: S(() => {
|
|
558
|
+
var _, G;
|
|
559
|
+
return [
|
|
560
|
+
A("div", oe, [
|
|
561
|
+
A("div", re, [
|
|
562
|
+
A("div", se, w(((_ = v.value) == null ? void 0 : _.name) || "文件预览"), 1),
|
|
563
|
+
x(p, {
|
|
564
|
+
name: "cross",
|
|
565
|
+
size: "20",
|
|
566
|
+
onClick: a
|
|
567
|
+
})
|
|
568
|
+
]),
|
|
569
|
+
A("div", ue, [
|
|
570
|
+
g.value === "image" ? (k(), P("div", ie, [
|
|
571
|
+
x(j, {
|
|
572
|
+
src: (G = v.value) == null ? void 0 : G.url,
|
|
573
|
+
fit: "contain",
|
|
574
|
+
class: "preview-image"
|
|
575
|
+
}, null, 8, ["src"]),
|
|
576
|
+
A("div", de, [
|
|
577
|
+
x(b, {
|
|
578
|
+
size: "small",
|
|
579
|
+
disabled: i.value <= 0,
|
|
580
|
+
onClick: d
|
|
581
|
+
}, {
|
|
582
|
+
default: S(() => [...l[3] || (l[3] = [
|
|
583
|
+
T("上一个", -1)
|
|
584
|
+
])]),
|
|
585
|
+
_: 1
|
|
586
|
+
}, 8, ["disabled"]),
|
|
587
|
+
A("span", ce, w(i.value + 1) + " / " + w(n.files.length), 1),
|
|
588
|
+
x(b, {
|
|
589
|
+
size: "small",
|
|
590
|
+
disabled: i.value >= n.files.length - 1,
|
|
591
|
+
onClick: f
|
|
592
|
+
}, {
|
|
593
|
+
default: S(() => [...l[4] || (l[4] = [
|
|
594
|
+
T("下一个", -1)
|
|
595
|
+
])]),
|
|
596
|
+
_: 1
|
|
597
|
+
}, 8, ["disabled"])
|
|
598
|
+
])
|
|
599
|
+
])) : g.value === "pdf" ? (k(), P("div", pe, [
|
|
600
|
+
o.value ? (k(), L(Z(ae), {
|
|
601
|
+
key: 0,
|
|
602
|
+
source: o.value,
|
|
603
|
+
page: t.value,
|
|
604
|
+
class: "pdf-embed-preview",
|
|
605
|
+
onRendered: u,
|
|
606
|
+
onLoaded: U
|
|
607
|
+
}, null, 8, ["source", "page"])) : (k(), P("div", me, "请选择PDF文件")),
|
|
608
|
+
A("div", fe, [
|
|
609
|
+
x(b, {
|
|
610
|
+
size: "small",
|
|
611
|
+
disabled: t.value <= 1,
|
|
612
|
+
onClick: l[0] || (l[0] = (Y) => t.value--)
|
|
613
|
+
}, {
|
|
614
|
+
default: S(() => [...l[5] || (l[5] = [
|
|
615
|
+
T("上一页", -1)
|
|
616
|
+
])]),
|
|
617
|
+
_: 1
|
|
618
|
+
}, 8, ["disabled"]),
|
|
619
|
+
A("span", ve, "第 " + w(t.value) + " / " + w(s.value || "?") + " 页", 1),
|
|
620
|
+
x(b, {
|
|
621
|
+
size: "small",
|
|
622
|
+
disabled: !o.value || t.value >= s.value,
|
|
623
|
+
onClick: l[1] || (l[1] = (Y) => t.value++)
|
|
624
|
+
}, {
|
|
625
|
+
default: S(() => [...l[6] || (l[6] = [
|
|
626
|
+
T("下一页", -1)
|
|
627
|
+
])]),
|
|
628
|
+
_: 1
|
|
629
|
+
}, 8, ["disabled"])
|
|
630
|
+
])
|
|
631
|
+
])) : O("", !0),
|
|
632
|
+
A("div", ge, [
|
|
633
|
+
x(b, {
|
|
634
|
+
disabled: i.value <= 0,
|
|
635
|
+
onClick: d,
|
|
636
|
+
icon: "arrow-left",
|
|
637
|
+
type: "primary",
|
|
638
|
+
round: ""
|
|
639
|
+
}, null, 8, ["disabled"]),
|
|
640
|
+
x(b, {
|
|
641
|
+
disabled: i.value >= n.files.length - 1,
|
|
642
|
+
onClick: f,
|
|
643
|
+
icon: "arrow",
|
|
644
|
+
type: "primary",
|
|
645
|
+
round: ""
|
|
646
|
+
}, null, 8, ["disabled"])
|
|
647
|
+
])
|
|
648
|
+
])
|
|
649
|
+
])
|
|
650
|
+
];
|
|
651
|
+
}),
|
|
652
|
+
_: 1
|
|
653
|
+
}, 8, ["show"]);
|
|
654
|
+
};
|
|
655
|
+
}
|
|
656
|
+
}), B = /* @__PURE__ */ q(ye, [["__scopeId", "data-v-1ad2c749"]]);
|
|
657
|
+
B.install = (n) => {
|
|
658
|
+
n.component(B.name || "VtkPreview", B);
|
|
659
|
+
};
|
|
660
|
+
const _e = [
|
|
661
|
+
F,
|
|
662
|
+
I,
|
|
663
|
+
R,
|
|
664
|
+
D,
|
|
665
|
+
B
|
|
666
|
+
], he = (n) => {
|
|
667
|
+
_e.forEach((h) => {
|
|
668
|
+
h.install ? n.use(h) : h.name && n.component(h.name, h);
|
|
91
669
|
});
|
|
92
|
-
},
|
|
93
|
-
install:
|
|
670
|
+
}, ke = {
|
|
671
|
+
install: he,
|
|
94
672
|
// 也导出所有组件,方便直接访问
|
|
95
|
-
|
|
96
|
-
|
|
673
|
+
Checkbox: F,
|
|
674
|
+
Area: I,
|
|
675
|
+
Radio: R,
|
|
676
|
+
Uploader: D,
|
|
677
|
+
Preview: B
|
|
678
|
+
}, Ce = "1.0.0";
|
|
97
679
|
export {
|
|
98
|
-
|
|
99
|
-
F as
|
|
100
|
-
B as
|
|
101
|
-
|
|
680
|
+
I as Area,
|
|
681
|
+
F as Checkbox,
|
|
682
|
+
B as Preview,
|
|
683
|
+
R as Radio,
|
|
684
|
+
D as Uploader,
|
|
685
|
+
ke as default,
|
|
686
|
+
he as install,
|
|
687
|
+
Ce as version
|
|
102
688
|
};
|
|
103
689
|
//# sourceMappingURL=vant-vtk.es.js.map
|
package/dist/vant-vtk.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vant-vtk.es.js","sources":["../packages/checkbox-field/index.vue","../packages/checkbox-field/index.js","../src/index.js"],"sourcesContent":["<template>\r\n <van-field v-bind=\"$attrs\">\r\n <template #input>\r\n <van-checkbox-group v-model=\"internalValue\" direction=\"horizontal\">\r\n <van-checkbox v-for=\"item in parsedOptions\" :key=\"String(item.value)\" :name=\"String(item.value)\" shape=\"square\">\r\n {{ item.text }}\r\n </van-checkbox>\r\n </van-checkbox-group>\r\n </template>\r\n </van-field>\r\n</template>\r\n\r\n<script setup>\r\n import { computed } from 'vue'\r\n\r\n defineOptions({\r\n name: 'VtkCheckboxField'\r\n })\r\n\r\n const props = defineProps({\r\n // 绑定值\r\n modelValue: {\r\n type: [String, Array, Object],\r\n default: () => [],\r\n },\r\n // 选项数据:支持数组 [{value, text}] 或 字符串 '1:选项1/2:选项2'\r\n options: {\r\n type: [Array, String],\r\n default: () => [],\r\n },\r\n // 返回值类型: 'string' (逗号分隔), 'array' (值数组), 'object' (对象数组)\r\n valueType: {\r\n type: String,\r\n default: 'array',\r\n validator: (val) => ['string', 'array', 'object'].includes(val),\r\n },\r\n // 当 valueType 为 string 时的分隔符\r\n separator: {\r\n type: String,\r\n default: ',',\r\n },\r\n })\r\n\r\n const emit = defineEmits(['update:modelValue', 'change'])\r\n\r\n // 解析选项\r\n const parsedOptions = computed(() => {\r\n if (Array.isArray(props.options)) {\r\n return props.options\r\n }\r\n if (typeof props.options === 'string' && props.options) {\r\n return props.options\r\n .split('/')\r\n .filter(Boolean)\r\n .map((item) => {\r\n const [value, text] = item.split(':')\r\n return {\r\n text: text || value,\r\n value: value,\r\n }\r\n })\r\n }\r\n return []\r\n })\r\n\r\n // 使用可写计算属性处理 v-model 绑定\r\n const internalValue = computed({\r\n get: () => {\r\n const val = props.modelValue\r\n if (!val) return []\r\n\r\n let arr = []\r\n if (props.valueType === 'string') {\r\n arr = typeof val === 'string' ? val.split(props.separator).filter(Boolean) : []\r\n } else if (props.valueType === 'object') {\r\n arr = Array.isArray(val) ? val.map((item) => item?.value ?? item) : []\r\n } else {\r\n arr = Array.isArray(val) ? val : []\r\n }\r\n // 统一转为字符串,确保与 van-checkbox 的 name 匹配\r\n return arr.map(String)\r\n },\r\n set: (newValues) => {\r\n let emitValue\r\n if (props.valueType === 'string') {\r\n emitValue = newValues.join(props.separator)\r\n } else if (props.valueType === 'object') {\r\n // 从解析后的选项中过滤出完整的对象\r\n emitValue = parsedOptions.value.filter((opt) => newValues.includes(String(opt.value)))\r\n } else {\r\n // 如果原始数据是数字,则尝试转回数字,否则保持字符串\r\n emitValue = newValues.map((val) => {\r\n return isNaN(Number(val)) ? val : Array.isArray(props.modelValue) && typeof props.modelValue[0] === 'number' ? Number(val) : val\r\n })\r\n }\r\n\r\n emit('update:modelValue', emitValue)\r\n emit('change', emitValue)\r\n },\r\n })\r\n</script>\r\n\r\n<style scoped>\r\n :deep(.van-checkbox) {\r\n margin-bottom: 8px;\r\n margin-right: 12px;\r\n }\r\n</style>\r\n","/**\r\n * CheckboxField 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport CheckboxField from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nCheckboxField.install = (app) => {\r\n app.component(CheckboxField.name || 'VtkCheckboxField', CheckboxField)\r\n}\r\n\r\nexport default CheckboxField\r\nexport { CheckboxField }\r\n","/**\r\n * Vant-VTK 组件库全量导出入口\r\n * 支持全量引入和按需引入\r\n */\r\nimport CheckboxField from '../packages/checkbox-field/index.js'\r\n\r\n// 所有组件列表\r\nconst components = [\r\n CheckboxField\r\n]\r\n\r\n// 全量注册方法\r\nconst install = (app) => {\r\n components.forEach(component => {\r\n if (component.install) {\r\n app.use(component)\r\n } else if (component.name) {\r\n app.component(component.name, component)\r\n }\r\n })\r\n}\r\n\r\n// 默认导出 - 支持 app.use(VantVtk) 全量注册\r\nexport default {\r\n install,\r\n // 也导出所有组件,方便直接访问\r\n CheckboxField\r\n}\r\n\r\n// 具名导出 - 支持按需引入\r\nexport {\r\n install,\r\n CheckboxField\r\n}\r\n\r\n// 导出版本号\r\nexport const version = '1.0.0'\r\n"],"names":["props","__props","emit","__emit","parsedOptions","computed","item","value","text","internalValue","val","arr","newValues","emitValue","opt","_openBlock","_createBlock","_component_van_field","$attrs","_createVNode","_component_van_checkbox_group","$event","_createElementBlock","_Fragment","_renderList","_component_van_checkbox","_createTextVNode","_toDisplayString","CheckboxField","app","components","install","component","index","version"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBE,UAAMA,IAAQC,GAwBRC,IAAOC,GAGPC,IAAgBC,EAAS,MACzB,MAAM,QAAQL,EAAM,OAAO,IACtBA,EAAM,UAEX,OAAOA,EAAM,WAAY,YAAYA,EAAM,UACtCA,EAAM,QACV,MAAM,GAAG,EACT,OAAO,OAAO,EACd,IAAI,CAACM,MAAS;AACb,YAAM,CAACC,GAAOC,CAAI,IAAIF,EAAK,MAAM,GAAG;AACpC,aAAO;AAAA,QACL,MAAME,KAAQD;AAAA,QACd,OAAOA;AAAA,MACnB;AAAA,IACQ,CAAC,IAEE,CAAA,CACR,GAGKE,IAAgBJ,EAAS;AAAA,MAC7B,KAAK,MAAM;AACT,cAAMK,IAAMV,EAAM;AAClB,YAAI,CAACU,EAAK,QAAO,CAAA;AAEjB,YAAIC,IAAM,CAAA;AACV,eAAIX,EAAM,cAAc,WACtBW,IAAM,OAAOD,KAAQ,WAAWA,EAAI,MAAMV,EAAM,SAAS,EAAE,OAAO,OAAO,IAAI,CAAA,IACpEA,EAAM,cAAc,WAC7BW,IAAM,MAAM,QAAQD,CAAG,IAAIA,EAAI,IAAI,CAACJ,OAASA,KAAA,gBAAAA,EAAM,UAASA,CAAI,IAAI,CAAA,IAEpEK,IAAM,MAAM,QAAQD,CAAG,IAAIA,IAAM,CAAA,GAG5BC,EAAI,IAAI,MAAM;AAAA,MACvB;AAAA,MACA,KAAK,CAACC,MAAc;AAClB,YAAIC;AACJ,QAAIb,EAAM,cAAc,WACtBa,IAAYD,EAAU,KAAKZ,EAAM,SAAS,IACjCA,EAAM,cAAc,WAE7Ba,IAAYT,EAAc,MAAM,OAAO,CAACU,MAAQF,EAAU,SAAS,OAAOE,EAAI,KAAK,CAAC,CAAC,IAGrFD,IAAYD,EAAU,IAAI,CAACF,MAClB,MAAM,OAAOA,CAAG,CAAC,IAAIA,IAAM,MAAM,QAAQV,EAAM,UAAU,KAAK,OAAOA,EAAM,WAAW,CAAC,KAAM,WAAW,OAAOU,CAAG,IAAIA,CAC9H,GAGHR,EAAK,qBAAqBW,CAAS,GACnCX,EAAK,UAAUW,CAAS;AAAA,MAC1B;AAAA,IACJ,CAAG;;;AAlGD,aAAAE,EAAA,GAAAC,EAQYC,OAROC,EAAAA,MAAM,CAAA,GAAA;AAAA,QACZ,SACT,MAIqB;AAAA,UAJrBC,EAIqBC,GAAA;AAAA,wBAJQX,EAAA;AAAA,0DAAAA,EAAa,QAAAY;AAAA,YAAE,WAAU;AAAA;uBACtC,MAA6B;AAAA,sBAA3CC,EAEeC,GAAA,MAAAC,EAFcpB,EAAA,OAAa,CAArBE,YAArBU,EAEeS,GAAA;AAAA,gBAF8B,KAAK,OAAOnB,EAAK,KAAK;AAAA,gBAAI,MAAM,OAAOA,EAAK,KAAK;AAAA,gBAAG,OAAM;AAAA;2BACrG,MAAe;AAAA,kBAAZoB,EAAAC,EAAArB,EAAK,IAAI,GAAA,CAAA;AAAA;;;;;;;;;;;;ACEtBsB,EAAc,UAAU,CAACC,MAAQ;AAC/B,EAAAA,EAAI,UAAUD,EAAc,QAAQ,oBAAoBA,CAAa;AACvE;ACFA,MAAME,IAAa;AAAA,EACjBF;AACF,GAGMG,IAAU,CAACF,MAAQ;AACvB,EAAAC,EAAW,QAAQ,CAAAE,MAAa;AAC9B,IAAIA,EAAU,UACZH,EAAI,IAAIG,CAAS,IACRA,EAAU,QACnBH,EAAI,UAAUG,EAAU,MAAMA,CAAS;AAAA,EAE3C,CAAC;AACH,GAGAC,IAAe;AAAA,EACb,SAAAF;AAAA;AAAA,EAEA,eAAAH;AACF,GASaM,IAAU;"}
|
|
1
|
+
{"version":3,"file":"vant-vtk.es.js","sources":["../packages/checkbox/index.vue","../packages/checkbox/index.js","../packages/Area/index.vue","../packages/Area/index.js","../packages/Radio/index.vue","../packages/Radio/index.js","../packages/Uploader/index.vue","../packages/Uploader/index.js","../packages/preview/index.vue","../packages/preview/index.js","../src/index.js"],"sourcesContent":["<template>\r\n <van-field v-bind=\"$attrs\">\r\n <template #input>\r\n <van-checkbox-group v-model=\"internalValue\" direction=\"horizontal\">\r\n <van-checkbox v-for=\"item in parsedOptions\" :key=\"String(item.value)\" :name=\"String(item.value)\" shape=\"square\">\r\n {{ item.text }}\r\n </van-checkbox>\r\n </van-checkbox-group>\r\n </template>\r\n </van-field>\r\n</template>\r\n\r\n<script setup>\r\n import { computed } from 'vue'\r\n\r\n defineOptions({\r\n name: 'VtkCheckbox'\r\n })\r\n\r\n const props = defineProps({\r\n // 绑定值\r\n modelValue: {\r\n type: [String, Array, Object],\r\n default: () => [],\r\n },\r\n // 选项数据:支持数组 [{value, text}] 或 字符串 '1:选项1/2:选项2'\r\n options: {\r\n type: [Array, String],\r\n default: () => [],\r\n },\r\n // 返回值类型: 'string' (逗号分隔), 'array' (值数组), 'object' (对象数组)\r\n valueType: {\r\n type: String,\r\n default: 'array',\r\n validator: (val) => ['string', 'array', 'object'].includes(val),\r\n },\r\n // 当 valueType 为 string 时的分隔符\r\n separator: {\r\n type: String,\r\n default: ',',\r\n },\r\n })\r\n\r\n const emit = defineEmits(['update:modelValue', 'change'])\r\n\r\n // 解析选项\r\n const parsedOptions = computed(() => {\r\n if (Array.isArray(props.options)) {\r\n return props.options\r\n }\r\n if (typeof props.options === 'string' && props.options) {\r\n return props.options\r\n .split('/')\r\n .filter(Boolean)\r\n .map((item) => {\r\n const [value, text] = item.split(':')\r\n return {\r\n text: text || value,\r\n value: value,\r\n }\r\n })\r\n }\r\n return []\r\n })\r\n\r\n // 使用可写计算属性处理 v-model 绑定\r\n const internalValue = computed({\r\n get: () => {\r\n const val = props.modelValue\r\n if (!val) return []\r\n\r\n let arr = []\r\n if (props.valueType === 'string') {\r\n arr = typeof val === 'string' ? val.split(props.separator).filter(Boolean) : []\r\n } else if (props.valueType === 'object') {\r\n arr = Array.isArray(val) ? val.map((item) => item?.value ?? item) : []\r\n } else {\r\n arr = Array.isArray(val) ? val : []\r\n }\r\n // 统一转为字符串,确保与 van-checkbox 的 name 匹配\r\n return arr.map(String)\r\n },\r\n set: (newValues) => {\r\n let emitValue\r\n if (props.valueType === 'string') {\r\n emitValue = newValues.join(props.separator)\r\n } else if (props.valueType === 'object') {\r\n // 从解析后的选项中过滤出完整的对象\r\n emitValue = parsedOptions.value.filter((opt) => newValues.includes(String(opt.value)))\r\n } else {\r\n // 如果原始数据是数字,则尝试转回数字,否则保持字符串\r\n emitValue = newValues.map((val) => {\r\n return isNaN(Number(val)) ? val : Array.isArray(props.modelValue) && typeof props.modelValue[0] === 'number' ? Number(val) : val\r\n })\r\n }\r\n\r\n emit('update:modelValue', emitValue)\r\n emit('change', emitValue)\r\n },\r\n })\r\n</script>\r\n\r\n<style scoped>\r\n :deep(.van-checkbox) {\r\n margin-bottom: 8px;\r\n margin-right: 12px;\r\n }\r\n</style>\r\n","/**\r\n * Checkbox 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Checkbox from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nCheckbox.install = (app) => {\r\n app.component(Checkbox.name || 'VtkCheckbox', Checkbox)\r\n}\r\n\r\nexport default Checkbox\r\nexport { Checkbox }\r\n","<template>\r\n\t<van-field v-model=\"displayValue\" is-link readonly v-bind=\"$attrs\" :placeholder=\"placeholder\" @click=\"handleClick\" />\r\n\t<van-popup v-model:show=\"show\" round position=\"bottom\">\r\n\t\t<van-cascader v-model=\"cascaderValue\" :title=\"title\" :options=\"options\" :field-names=\"fieldNames\" @close=\"show = false\" @finish=\"onFinish\" @change=\"onChange\" />\r\n\t</van-popup>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n\tname: \"VtkArea\",\r\n});\r\nimport { ref, watch } from \"vue\";\r\n// import Request from \"@/utils/request\";\r\n\r\nconst props = defineProps({\r\n\t// 绑定值,根据 valueType 返回不同类型\r\n\tmodelValue: {\r\n\t\ttype: [String, Object, Array],\r\n\t\tdefault: \"\",\r\n\t},\r\n\t// 默认地区编码,用于初始化加载\r\n\tdefaultAreaCode: {\r\n\t\ttype: String,\r\n\t\tdefault: \"33\",\r\n\t},\r\n\t// 返回值类型: 'code' 返回最后一级areaCode, 'codes' 返回所有级别areaCode数组, 'object' 返回完整对象信息\r\n\tvalueType: {\r\n\t\ttype: String,\r\n\t\tdefault: \"code\",\r\n\t\tvalidator: (val) => [\"code\", \"codes\", \"object\"].includes(val),\r\n\t},\r\n\t// 显示分隔符\r\n\tseparator: {\r\n\t\ttype: String,\r\n\t\tdefault: \"/\",\r\n\t},\r\n\t// 弹窗标题\r\n\ttitle: {\r\n\t\ttype: String,\r\n\t\tdefault: \"请选择所在地区\",\r\n\t},\r\n\t// 占位文本\r\n\tplaceholder: {\r\n\t\ttype: String,\r\n\t\tdefault: \"请选择所在地区\",\r\n\t},\r\n\t// 最大层级限制,达到该层级后不再加载下级\r\n\tmaxLevel: {\r\n\t\ttype: Number,\r\n\t\tdefault: 12,\r\n\t},\r\n\t// 显示模式: 'full' 显示完整路径, 'last' 只显示最后一级\r\n\tdisplayMode: {\r\n\t\ttype: String,\r\n\t\tdefault: \"full\",\r\n\t\tvalidator: (val) => [\"full\", \"last\"].includes(val),\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"change\", \"finish\"]);\r\n\r\nconst show = ref(false); //弹窗显示隐藏\r\nconst cascaderValue = ref(\"\"); //级联选择器绑定值\r\nconst options = ref([]); //级联选择器选项\r\nconst displayValue = ref(\"\"); //显示值\r\nconst loading = ref(false); //加载状态\r\n// 存储完整的选中信息\r\nconst selectedData = ref([]);\r\n\r\nconst fieldNames = {\r\n\ttext: \"areaName\",\r\n\tvalue: \"areaCode\",\r\n\tchildren: \"children\",\r\n};\r\n\r\n// 监听 modelValue 变化,用于回显\r\nwatch(\r\n\t() => props.modelValue,\r\n\t(val) => {\r\n\t\tif (!val) {\r\n\t\t\tdisplayValue.value = \"\";\r\n\t\t\tcascaderValue.value = \"\";\r\n\t\t\tselectedData.value = [];\r\n\t\t}\r\n\t},\r\n\t{ immediate: true },\r\n);\r\n\r\nconst handleClick = () => {\r\n\tshow.value = true;\r\n\tif (options.value.length === 0) {\r\n\t\tloadInitialArea();\r\n\t}\r\n};\r\n\r\n// 加载初始地区\r\nconst loadInitialArea = async () => {\r\n\tif (loading.value) return;\r\n\tloading.value = true;\r\n\ttry {\r\n\t\tconst areaCode = props.defaultAreaCode;\r\n\t\tconst res = await Request.getForm(`dict/area/show/${areaCode}`);\r\n\t\tif (res.data) {\r\n\t\t\tconst rootArea = {\r\n\t\t\t\tareaCode: res.data.areaCode,\r\n\t\t\t\tareaName: res.data.areaName,\r\n\t\t\t\tareaLeve: res.data.areaLeve,\r\n\t\t\t\tchildren: res.data.areaLeve < props.maxLevel ? [] : undefined,\r\n\t\t\t};\r\n\t\t\toptions.value = [rootArea];\r\n\t\t}\r\n\t} catch (error) {\r\n\t\tconsole.error(\"加载初始地区失败:\", error);\r\n\t} finally {\r\n\t\tloading.value = false;\r\n\t}\r\n};\r\n\r\n// 加载下级地区\r\nconst loadChildren = async (item) => {\r\n\tif (item._loading) return;\r\n\titem._loading = true;\r\n\ttry {\r\n\t\tconst res = await Request.getForm(`dict/area/next/${item.areaCode}`);\r\n\t\tif (res.data && res.data.length > 0) {\r\n\t\t\tres.data.forEach((it) => {\r\n\t\t\t\t// 根据 maxLevel 判断是否还有下级\r\n\t\t\t\tif (it.areaLeve < props.maxLevel) {\r\n\t\t\t\t\tit.children = [];\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\titem.children = res.data;\r\n\t\t} else {\r\n\t\t\t// 没有下级数据,移除 children 属性使其成为叶子节点\r\n\t\t\tdelete item.children;\r\n\t\t}\r\n\t} catch (error) {\r\n\t\tconsole.error(\"加载下级地区失败:\", error);\r\n\t} finally {\r\n\t\titem._loading = false;\r\n\t}\r\n};\r\n\r\n// 选项变化时加载下级\r\nconst onChange = ({ value, selectedOptions, tabIndex }) => {\r\n\tconst currentItem = selectedOptions[tabIndex];\r\n\tif (currentItem && currentItem.areaLeve < props.maxLevel && Array.isArray(currentItem.children) && currentItem.children.length === 0) {\r\n\t\tloadChildren(currentItem);\r\n\t}\r\n\temit(\"change\", { value, selectedOptions, tabIndex });\r\n};\r\n\r\n// 完成选择\r\nconst onFinish = ({ selectedOptions }) => {\r\n\t// 根据 displayMode 决定显示值\r\n\tif (props.displayMode === \"last\") {\r\n\t\t// 只显示最后一级\r\n\t\tdisplayValue.value = selectedOptions[selectedOptions.length - 1]?.areaName || \"\";\r\n\t} else {\r\n\t\t// 显示完整路径(默认)\r\n\t\tdisplayValue.value = selectedOptions.map((option) => option.areaName).join(props.separator);\r\n\t}\r\n\r\n\t// 存储完整选中数据\r\n\tselectedData.value = selectedOptions.map((option) => ({\r\n\t\tareaCode: option.areaCode,\r\n\t\tareaName: option.areaName,\r\n\t\tareaLeve: option.areaLeve,\r\n\t}));\r\n\r\n\t// 根据 valueType 返回不同格式的值\r\n\tlet emitValue;\r\n\tswitch (props.valueType) {\r\n\t\tcase \"code\":\r\n\t\t\t// 返回最后一级的 areaCode\r\n\t\t\temitValue = selectedOptions[selectedOptions.length - 1]?.areaCode || \"\";\r\n\t\t\tbreak;\r\n\t\tcase \"codes\":\r\n\t\t\t// 返回所有级别的 areaCode 数组\r\n\t\t\temitValue = selectedOptions.map((option) => option.areaCode);\r\n\t\t\tbreak;\r\n\t\tcase \"object\":\r\n\t\t\t// 返回完整对象信息\r\n\t\t\temitValue = {\r\n\t\t\t\tcodes: selectedOptions.map((option) => option.areaCode),\r\n\t\t\t\tnames: selectedOptions.map((option) => option.areaName),\r\n\t\t\t\tfullName: selectedOptions.map((option) => option.areaName).join(props.separator),\r\n\t\t\t\tlastCode: selectedOptions[selectedOptions.length - 1]?.areaCode || \"\",\r\n\t\t\t\tlastLevel: selectedOptions[selectedOptions.length - 1]?.areaLeve,\r\n\t\t\t\toptions: selectedData.value,\r\n\t\t\t};\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\temitValue = selectedOptions[selectedOptions.length - 1]?.areaCode || \"\";\r\n\t}\r\n\r\n\temit(\"update:modelValue\", emitValue);\r\n\temit(\"finish\", { selectedOptions, value: emitValue });\r\n\tshow.value = false;\r\n};\r\n\r\n// 暴露方法供外部调用\r\ndefineExpose({\r\n\t// 获取当前选中的完整数据\r\n\tgetSelectedData: () => selectedData.value,\r\n\t// 获取显示值\r\n\tgetDisplayValue: () => displayValue.value,\r\n\t// 重置选择\r\n\treset: () => {\r\n\t\tdisplayValue.value = \"\";\r\n\t\tcascaderValue.value = \"\";\r\n\t\tselectedData.value = [];\r\n\t\temit(\"update:modelValue\", props.valueType === \"codes\" ? [] : props.valueType === \"object\" ? null : \"\");\r\n\t},\r\n\t// 打开选择器\r\n\topen: () => {\r\n\t\thandleClick();\r\n\t},\r\n\t// 关闭选择器\r\n\tclose: () => {\r\n\t\tshow.value = false;\r\n\t},\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped></style>\r\n","/**\r\n * Area 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Area from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nArea.install = (app) => {\r\n app.component(Area.name || 'VtkArea', Area)\r\n}\r\n\r\nexport default Area\r\nexport { Area }\r\n","<template>\r\n\t<van-field v-bind=\"$attrs\">\r\n\t\t<template #input>\r\n\t\t\t<van-radio-group v-model=\"internalValue\" direction=\"horizontal\">\r\n\t\t\t\t<van-radio v-for=\"item in parsedOptions\" :key=\"String(item.value)\" :name=\"String(item.value)\">\r\n\t\t\t\t\t{{ item.text }}\r\n\t\t\t\t</van-radio>\r\n\t\t\t</van-radio-group>\r\n\t\t</template>\r\n\t</van-field>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n\tname: \"VtkRadio\",\r\n});\r\nimport { computed } from \"vue\";\r\n\r\nconst props = defineProps({\r\n\t// 绑定值\r\n\tmodelValue: {\r\n\t\ttype: [String, Number, Object],\r\n\t\tdefault: \"\",\r\n\t},\r\n\t// 选项数据:支持数组 [{value, text}] 或 字符串 '1:选项1/2:选项2'\r\n\toptions: {\r\n\t\ttype: [Array, String],\r\n\t\tdefault: () => [],\r\n\t},\r\n\t// 返回值类型: 'string' (基本类型), 'object' (完整对象)\r\n\tvalueType: {\r\n\t\ttype: String,\r\n\t\tdefault: \"string\",\r\n\t\tvalidator: (val) => [\"string\", \"object\"].includes(val),\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"change\"]);\r\n\r\n// 解析选项\r\nconst parsedOptions = computed(() => {\r\n\tif (Array.isArray(props.options)) {\r\n\t\treturn props.options;\r\n\t}\r\n\tif (typeof props.options === \"string\" && props.options) {\r\n\t\treturn props.options\r\n\t\t\t.split(\"/\")\r\n\t\t\t.filter(Boolean)\r\n\t\t\t.map((item) => {\r\n\t\t\t\tconst [value, text] = item.split(\":\");\r\n\t\t\t\treturn {\r\n\t\t\t\t\ttext: text || value,\r\n\t\t\t\t\tvalue: value,\r\n\t\t\t\t};\r\n\t\t\t});\r\n\t}\r\n\treturn [];\r\n});\r\n\r\n// 使用可写计算属性处理 v-model 绑定\r\nconst internalValue = computed({\r\n\tget: () => {\r\n\t\tconst val = props.modelValue;\r\n\t\tif (val === undefined || val === null) return \"\";\r\n\r\n\t\t// 如果是对象类型,提取其中的 value\r\n\t\tif (props.valueType === \"object\" && val && typeof val === \"object\") {\r\n\t\t\treturn String(val.value ?? \"\");\r\n\t\t}\r\n\t\treturn String(val);\r\n\t},\r\n\tset: (newValue) => {\r\n\t\tlet emitValue = newValue;\r\n\r\n\t\t// 处理原始数据类型逻辑(如果父组件传入的是数字,尝试转回数字)\r\n\t\tconst originalValue = props.valueType === \"object\" ? props.modelValue?.value : props.modelValue;\r\n\t\tif (typeof originalValue === \"number\" && !isNaN(Number(newValue))) {\r\n\t\t\temitValue = Number(newValue);\r\n\t\t}\r\n\r\n\t\tif (props.valueType === \"object\") {\r\n\t\t\t// 找回完整对象\r\n\t\t\temitValue = parsedOptions.value.find((opt) => String(opt.value) === String(newValue)) || null;\r\n\t\t}\r\n\r\n\t\temit(\"update:modelValue\", emitValue);\r\n\t\temit(\"change\", emitValue);\r\n\t},\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n:deep(.van-radio) {\r\n\tmargin-right: 12px;\r\n}\r\n</style>\r\n","/**\r\n * Radio 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Radio from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nRadio.install = (app) => {\r\n app.component(Radio.name || 'VtkRadio', Radio)\r\n}\r\n\r\nexport default Radio\r\nexport { Radio }\r\n","<template>\r\n\t<van-uploader v-model=\"fileList\" v-bind=\"$attrs\" :max-size=\"maxSize\" :accept=\"accept\" :before-read=\"beforeRead\" :after-read=\"afterRead\" @delete=\"onDelete\" />\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n\tname: \"VtkUploader\",\r\n\tinheritAttrs: false,\r\n});\r\nimport { ref, watch } from \"vue\";\r\nimport { showToast, showLoadingToast, closeToast } from \"vant\";\r\n\r\nconst props = defineProps({\r\n\t/** 绑定值,支持字符串或数组 */\r\n\tmodelValue: {\r\n\t\ttype: [String, Array],\r\n\t\tdefault: () => [],\r\n\t},\r\n\t/** 返回值类型:'string' 返回逗号分隔的字符串,'array' 返回数组 */\r\n\tvalueType: {\r\n\t\ttype: String,\r\n\t\tdefault: \"array\",\r\n\t\tvalidator: (val) => [\"string\", \"array\"].includes(val),\r\n\t},\r\n\t/** 单个文件最大大小(字节),默认10MB */\r\n\tmaxSize: {\r\n\t\ttype: Number,\r\n\t\tdefault: 10 * 1024 * 1024,\r\n\t},\r\n\t/** 接受的文件类型 */\r\n\taccept: {\r\n\t\ttype: String,\r\n\t\tdefault: \"image/*\",\r\n\t},\r\n\t/** 上传接口地址 */\r\n\tuploadUrl: {\r\n\t\ttype: String,\r\n\t\tdefault: \"/bizp/admin/upload\",\r\n\t},\r\n\t/** 上传文件的字段名 */\r\n\tfieldName: {\r\n\t\ttype: String,\r\n\t\tdefault: \"file\",\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"change\", \"success\", \"error\"]);\r\n\r\n// 文件列表\r\nconst fileList = ref([]);\r\n\r\n// 解析初始值\r\nconst parseModelValue = (value) => {\r\n\tif (!value) return [];\r\n\r\n\tlet urls = [];\r\n\tif (typeof value === \"string\") {\r\n\t\turls = value.split(\",\").filter((url) => url.trim());\r\n\t} else if (Array.isArray(value)) {\r\n\t\turls = value.filter((url) => url);\r\n\t}\r\n\r\n\treturn urls.map((url) => ({\r\n\t\turl,\r\n\t\tstatus: \"done\",\r\n\t\tmessage: \"\",\r\n\t}));\r\n};\r\n\r\n// 获取已上传的URL列表\r\nconst getUploadedUrls = () => {\r\n\treturn fileList.value.filter((file) => file.status === \"done\" && file.url).map((file) => file.url);\r\n};\r\n\r\n// 格式化输出值\r\nconst formatOutput = (urls) => {\r\n\tif (props.valueType === \"string\") {\r\n\t\treturn urls.join(\",\");\r\n\t}\r\n\treturn urls;\r\n};\r\n\r\n// 触发更新\r\nconst emitValue = () => {\r\n\tconst urls = getUploadedUrls();\r\n\tconst output = formatOutput(urls);\r\n\temit(\"update:modelValue\", output);\r\n\temit(\"change\", output);\r\n};\r\n\r\n// 监听外部值变化\r\nwatch(\r\n\t() => props.modelValue,\r\n\t(newVal) => {\r\n\t\tconst currentUrls = getUploadedUrls().join(\",\");\r\n\t\tconst newUrls = Array.isArray(newVal) ? newVal.join(\",\") : newVal || \"\";\r\n\r\n\t\t// 只有外部值确实改变时才更新\r\n\t\tif (currentUrls !== newUrls) {\r\n\t\t\tfileList.value = parseModelValue(newVal);\r\n\t\t}\r\n\t},\r\n\t{ immediate: true },\r\n);\r\n\r\n// 上传前校验\r\nconst beforeRead = (file) => {\r\n\tconst files = Array.isArray(file) ? file : [file];\r\n\r\n\tfor (const f of files) {\r\n\t\t// 文件大小校验\r\n\t\tif (f.size > props.maxSize) {\r\n\t\t\tconst maxSizeMB = (props.maxSize / 1024 / 1024).toFixed(1);\r\n\t\t\tshowToast(`文件大小不能超过${maxSizeMB}MB`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\treturn true;\r\n};\r\n\r\n// 上传文件\r\nconst uploadFile = async (file) => {\r\n\tconst formData = new FormData();\r\n\tformData.append(props.fieldName, file.file);\r\n\r\n\ttry {\r\n\t\tconst res = await Request.imp(props.uploadUrl, formData);\r\n\r\n\t\tif (res.meta?.success) {\r\n\t\t\t// 根据实际接口返回格式获取URL\r\n\t\t\tconst url = res.data?.url || res.data?.path || res.data;\r\n\t\t\treturn { success: true, url };\r\n\t\t} else {\r\n\t\t\treturn { success: false, message: res.meta?.message || \"上传失败\" };\r\n\t\t}\r\n\t} catch (error) {\r\n\t\treturn { success: false, message: error.message || \"上传失败\" };\r\n\t}\r\n};\r\n\r\n// 文件读取完成后处理\r\nconst afterRead = async (file) => {\r\n\tconst files = Array.isArray(file) ? file : [file];\r\n\r\n\t// 显示上传中提示\r\n\tif (files.length > 1) {\r\n\t\tshowLoadingToast({\r\n\t\t\tmessage: `正在上传 0/${files.length}`,\r\n\t\t\tforbidClick: true,\r\n\t\t\tduration: 0,\r\n\t\t});\r\n\t}\r\n\r\n\tlet successCount = 0;\r\n\tlet failCount = 0;\r\n\r\n\t// 逐个上传\r\n\tfor (let i = 0; i < files.length; i++) {\r\n\t\tconst fileItem = files[i];\r\n\t\tfileItem.status = \"uploading\";\r\n\t\tfileItem.message = \"上传中...\";\r\n\r\n\t\t// 更新进度提示\r\n\t\tif (files.length > 1) {\r\n\t\t\tshowLoadingToast({\r\n\t\t\t\tmessage: `正在上传 ${i + 1}/${files.length}`,\r\n\t\t\t\tforbidClick: true,\r\n\t\t\t\tduration: 0,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst result = await uploadFile(fileItem);\r\n\r\n\t\tif (result.success) {\r\n\t\t\tfileItem.status = \"done\";\r\n\t\t\tfileItem.message = \"\";\r\n\t\t\tfileItem.url = result.url;\r\n\t\t\tsuccessCount++;\r\n\t\t\temit(\"success\", { file: fileItem, url: result.url });\r\n\t\t} else {\r\n\t\t\tfileItem.status = \"failed\";\r\n\t\t\tfileItem.message = result.message;\r\n\t\t\tfailCount++;\r\n\t\t\temit(\"error\", { file: fileItem, message: result.message });\r\n\t\t}\r\n\t}\r\n\r\n\tcloseToast();\r\n\r\n\t// 显示上传结果\r\n\tif (files.length > 1) {\r\n\t\tif (failCount === 0) {\r\n\t\t\tshowToast(`${successCount}个文件上传成功`);\r\n\t\t} else {\r\n\t\t\tshowToast(`${successCount}个成功,${failCount}个失败`);\r\n\t\t}\r\n\t} else if (failCount > 0) {\r\n\t\tshowToast(files[0].message || \"上传失败\");\r\n\t}\r\n\r\n\t// 触发值更新\r\n\temitValue();\r\n};\r\n\r\n// 删除文件\r\nconst onDelete = () => {\r\n\t// 下一个tick再触发,确保fileList已更新\r\n\tsetTimeout(() => {\r\n\t\temitValue();\r\n\t}, 0);\r\n};\r\n\r\n// 暴露方法给父组件\r\ndefineExpose({\r\n\t/** 获取已上传的URL列表 */\r\n\tgetUrls: getUploadedUrls,\r\n\t/** 清空文件列表 */\r\n\tclear: () => {\r\n\t\tfileList.value = [];\r\n\t\temitValue();\r\n\t},\r\n\t/** 获取文件列表 */\r\n\tgetFileList: () => fileList.value,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n:deep(.van-uploader__preview-image) {\r\n\tborder-radius: 4px;\r\n}\r\n\r\n:deep(.van-uploader__upload) {\r\n\tborder-radius: 4px;\r\n}\r\n</style>\r\n","/**\r\n * Uploader 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Uploader from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nUploader.install = (app) => {\r\n app.component(Uploader.name || 'VtkUploader', Uploader)\r\n}\r\n\r\nexport default Uploader\r\nexport { Uploader }\r\n","<template>\r\n\t<van-popup v-model:show=\"showPopup\" position=\"bottom\" :style=\"{ height: '100vh' }\">\r\n\t\t<div class=\"file-preview-container\">\r\n\t\t\t<div class=\"file-header\">\r\n\t\t\t\t<div class=\"file-title\">{{ currentFile?.name || \"文件预览\" }}</div>\r\n\t\t\t\t<van-icon name=\"cross\" size=\"20\" @click=\"handleClose\" />\r\n\t\t\t</div>\r\n\r\n\t\t\t<div class=\"file-content\">\r\n\t\t\t\t<div v-if=\"currentType === 'image'\" class=\"image-preview\">\r\n\t\t\t\t\t<van-image :src=\"currentFile?.url\" fit=\"contain\" class=\"preview-image\" />\r\n\t\t\t\t\t<div class=\"image-footer\">\r\n\t\t\t\t\t\t<van-button size=\"small\" :disabled=\"currentIndex <= 0\" @click=\"prevFile\">上一个</van-button>\r\n\t\t\t\t\t\t<span class=\"file-info\">{{ currentIndex + 1 }} / {{ files.length }}</span>\r\n\t\t\t\t\t\t<van-button size=\"small\" :disabled=\"currentIndex >= files.length - 1\" @click=\"nextFile\">下一个</van-button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<div v-else-if=\"currentType === 'pdf'\" class=\"pdf-preview\">\r\n\t\t\t\t\t<VuePdfEmbed v-if=\"pdfSource\" :source=\"pdfSource\" :page=\"currentPage\" class=\"pdf-embed-preview\" @rendered=\"handlePdfRendered\" @loaded=\"handlePdfLoaded\" />\r\n\t\t\t\t\t<div v-else class=\"pdf-placeholder\">请选择PDF文件</div>\r\n\t\t\t\t\t<div class=\"pdf-footer\">\r\n\t\t\t\t\t\t<van-button size=\"small\" :disabled=\"currentPage <= 1\" @click=\"currentPage--\">上一页</van-button>\r\n\t\t\t\t\t\t<span class=\"page-info\">第 {{ currentPage }} / {{ totalPages || \"?\" }} 页</span>\r\n\t\t\t\t\t\t<van-button size=\"small\" :disabled=\"!pdfSource || currentPage >= totalPages\" @click=\"currentPage++\">下一页</van-button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<div class=\"footer\">\r\n\t\t\t\t\t<van-button :disabled=\"currentIndex <= 0\" @click=\"prevFile\" icon=\"arrow-left\" type=\"primary\" round />\r\n\t\t\t\t\t<van-button :disabled=\"currentIndex >= files.length - 1\" @click=\"nextFile\" icon=\"arrow\" type=\"primary\" round />\r\n\t\t\t\t\t<!-- <van-button size=\"small\" :disabled=\"currentIndex <= 0\" @click=\"prevFile\">上一个</van-button>\r\n <span class=\"file-info\">{{ currentIndex + 1 }} / {{ files.length }}</span>\r\n <van-button size=\"small\" :disabled=\"currentIndex >= files.length - 1\" @click=\"nextFile\">下一个</van-button> -->\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</van-popup>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n\tname: \"VtkPreview\",\r\n});\r\nimport { ref, watch, computed } from \"vue\";\r\nimport VuePdfEmbed from \"vue-pdf-embed\";\r\n\r\nconst props = defineProps({\r\n\tmodelValue: {\r\n\t\ttype: Boolean,\r\n\t\tdefault: false,\r\n\t},\r\n\tfiles: {\r\n\t\ttype: Array,\r\n\t\tdefault: () => [],\r\n\t},\r\n\tstartIndex: {\r\n\t\ttype: Number,\r\n\t\tdefault: 0,\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"close\"]);\r\n\r\nconst showPopup = ref(props.modelValue);\r\nconst currentIndex = ref(props.startIndex);\r\nconst currentPage = ref(1);\r\nconst pdfSource = ref(null);\r\nconst totalPages = ref(0);\r\n\r\nconst normalizedFiles = computed(() => {\r\n\treturn props.files.map((file, index) => {\r\n\t\tif (typeof file === \"string\") {\r\n\t\t\tconst isPdf = file.toLowerCase().endsWith(\".pdf\");\r\n\t\t\treturn {\r\n\t\t\t\tname: isPdf ? `文档${index + 1}.pdf` : `图片${index + 1}`,\r\n\t\t\t\turl: file,\r\n\t\t\t\ttype: isPdf ? \"pdf\" : \"image\",\r\n\t\t\t};\r\n\t\t}\r\n\t\treturn file;\r\n\t});\r\n});\r\n\r\nconst currentFile = computed(() => {\r\n\treturn normalizedFiles.value[currentIndex.value] || null;\r\n});\r\n\r\nconst currentType = computed(() => {\r\n\tif (!currentFile.value) return null;\r\n\tconst url = currentFile.value.url || currentFile.value;\r\n\tif (typeof url === \"string\") {\r\n\t\treturn url.toLowerCase().endsWith(\".pdf\") ? \"pdf\" : \"image\";\r\n\t}\r\n\treturn currentFile.value.type || \"image\";\r\n});\r\n\r\nwatch(\r\n\t() => props.modelValue,\r\n\t(val) => {\r\n\t\tshowPopup.value = val;\r\n\t\tif (val && normalizedFiles.value.length > 0) {\r\n\t\t\tcurrentIndex.value = props.startIndex;\r\n\t\t\tupdatePreview();\r\n\t\t}\r\n\t},\r\n);\r\n\r\nwatch(\r\n\t() => props.startIndex,\r\n\t(val) => {\r\n\t\tcurrentIndex.value = val;\r\n\t\tupdatePreview();\r\n\t},\r\n);\r\n\r\nwatch(showPopup, (val) => {\r\n\temit(\"update:modelValue\", val);\r\n\tif (!val) {\r\n\t\thandleClose();\r\n\t}\r\n});\r\n\r\nwatch(currentIndex, () => {\r\n\tcurrentPage.value = 1;\r\n\ttotalPages.value = 0;\r\n\tupdatePreview();\r\n});\r\n\r\nconst updatePreview = () => {\r\n\tconst file = currentFile.value;\r\n\tif (!file) return;\r\n\r\n\tif (currentType.value === \"pdf\") {\r\n\t\tpdfSource.value = file.url || file;\r\n\t} else {\r\n\t\tpdfSource.value = null;\r\n\t}\r\n};\r\n\r\nconst handlePdfLoaded = (pdf) => {\r\n\ttotalPages.value = pdf.numPages || 0;\r\n};\r\n\r\nconst handlePdfRendered = () => {\r\n\tconsole.log(\"PDF rendered successfully\");\r\n};\r\n\r\nconst prevFile = () => {\r\n\tif (currentIndex.value > 0) {\r\n\t\tcurrentIndex.value--;\r\n\t}\r\n};\r\n\r\nconst nextFile = () => {\r\n\tif (currentIndex.value < normalizedFiles.value.length - 1) {\r\n\t\tcurrentIndex.value++;\r\n\t}\r\n};\r\n\r\nconst handleClose = () => {\r\n\tshowPopup.value = false;\r\n\tpdfSource.value = null;\r\n\tcurrentPage.value = 1;\r\n\ttotalPages.value = 0;\r\n\temit(\"close\");\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.file-preview-container {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\theight: 100%;\r\n\tbackground-color: #fff;\r\n\tborder-radius: 8px;\r\n\toverflow: hidden;\r\n}\r\n\r\n.file-header {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: space-between;\r\n\tpadding: 12px 16px;\r\n\tborder-bottom: 1px solid #ebedf0;\r\n\tbackground-color: #f7f8fa;\r\n}\r\n\r\n.file-title {\r\n\tfont-size: 16px;\r\n\tfont-weight: 600;\r\n\tcolor: #323233;\r\n}\r\n\r\n.file-content {\r\n\tflex: 1;\r\n\toverflow: hidden;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n}\r\n\r\n.image-preview {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\toverflow: hidden;\r\n}\r\n\r\n.preview-image {\r\n\tflex: 1;\r\n\twidth: 100%;\r\n\theight: 100%;\r\n}\r\n\r\n.image-footer {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tgap: 16px;\r\n\tpadding: 12px 16px;\r\n\tborder-top: 1px solid #ebedf0;\r\n\tbackground-color: #fff;\r\n}\r\n\r\n.file-info {\r\n\tfont-size: 14px;\r\n\tcolor: #646566;\r\n\tmin-width: 80px;\r\n\ttext-align: center;\r\n}\r\n\r\n.pdf-preview {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\toverflow: hidden;\r\n}\r\n\r\n.pdf-embed-preview {\r\n\tflex: 1;\r\n\tmax-width: 100%;\r\n\toverflow-y: auto;\r\n\tpadding: 16px;\r\n\tdisplay: flex;\r\n\tjustify-content: center;\r\n\talign-items: flex-start;\r\n\tbackground-color: #f5f5f5;\r\n\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.pdf-placeholder {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tcolor: #969799;\r\n\tfont-size: 14px;\r\n}\r\n\r\n.pdf-footer {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tgap: 16px;\r\n\tpadding: 12px 16px;\r\n\tborder-top: 1px solid #ebedf0;\r\n\tbackground-color: #fff;\r\n}\r\n\r\n.page-info {\r\n\tfont-size: 14px;\r\n\tcolor: #646566;\r\n\tmin-width: 80px;\r\n\ttext-align: center;\r\n}\r\n.footer {\r\n\tposition: fixed;\r\n\ttop: 40%;\r\n\twidth: 100%;\r\n\t.van-button {\r\n\t}\r\n\t.van-button:nth-child(2) {\r\n\t\tfloat: right;\r\n\t}\r\n}\r\n</style>\r\n","/**\r\n * Preview 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Preview from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nPreview.install = (app) => {\r\n app.component(Preview.name || 'VtkPreview', Preview)\r\n}\r\n\r\nexport default Preview\r\nexport { Preview }\r\n","/**\r\n * Vant-VTK 组件库全量导出入口\r\n * 支持全量引入和按需引入\r\n */\r\nimport Checkbox from '../packages/checkbox/index.js'\r\nimport Area from '../packages/Area/index.js'\r\nimport Radio from '../packages/radio/index.js'\r\nimport Uploader from '../packages/Uploader/index.js'\r\nimport Preview from '../packages/preview/index.js'\r\n\r\n\r\n\r\n// 所有组件列表\r\nconst components = [\r\n Checkbox,\r\n Area,\r\n Radio,\r\n Uploader,\r\n Preview\r\n]\r\n\r\n// 全量注册方法\r\nconst install = (app) => {\r\n components.forEach(component => {\r\n if (component.install) {\r\n app.use(component)\r\n } else if (component.name) {\r\n app.component(component.name, component)\r\n }\r\n })\r\n}\r\n\r\n// 默认导出 - 支持 app.use(VantVtk) 全量注册\r\nexport default {\r\n install,\r\n // 也导出所有组件,方便直接访问\r\n Checkbox,\r\n Area,\r\n Radio,\r\n Uploader,\r\n Preview\r\n}\r\n\r\n// 具名导出 - 支持按需引入\r\nexport {\r\n install,\r\n Checkbox,\r\n Area,\r\n Radio,\r\n Uploader,\r\n Preview\r\n}\r\n\r\n// 导出版本号\r\nexport const version = '1.0.0'\r\n"],"names":["props","__props","emit","__emit","parsedOptions","computed","item","value","text","internalValue","val","arr","newValues","emitValue","opt","_openBlock","_createBlock","_component_van_field","$attrs","_createVNode","_component_van_checkbox_group","$event","_createElementBlock","_Fragment","_renderList","_component_van_checkbox","_createTextVNode","_toDisplayString","Checkbox","app","show","ref","cascaderValue","options","displayValue","loading","selectedData","fieldNames","watch","handleClick","loadInitialArea","areaCode","res","rootArea","error","loadChildren","it","onChange","selectedOptions","tabIndex","currentItem","onFinish","_a","option","_b","_c","_d","_e","__expose","_mergeProps","_component_van_popup","_component_van_cascader","Area","newValue","_component_van_radio_group","_component_van_radio","Radio","fileList","parseModelValue","urls","url","getUploadedUrls","file","formatOutput","output","newVal","currentUrls","newUrls","beforeRead","files","maxSizeMB","showToast","uploadFile","formData","afterRead","showLoadingToast","successCount","failCount","i","fileItem","result","closeToast","onDelete","_component_van_uploader","Uploader","showPopup","currentIndex","currentPage","pdfSource","totalPages","normalizedFiles","index","isPdf","currentFile","currentType","updatePreview","handleClose","handlePdfLoaded","pdf","handlePdfRendered","prevFile","nextFile","_createElementVNode","_hoisted_1","_hoisted_2","_hoisted_3","_component_van_icon","_hoisted_4","_hoisted_5","_component_van_image","_hoisted_6","_component_van_button","_cache","_hoisted_7","_hoisted_8","_unref","VuePdfEmbed","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","Preview","components","install","component","version"],"mappings":"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"}
|
package/dist/vant-vtk.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(l,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(l=typeof globalThis<"u"?globalThis:l||self,e(l.VantVtk={},l.Vue))})(this,function(l,e){"use strict";const s=((a,i)=>{const t=a.__vccOpts||a;for(const[p,u]of i)t[p]=u;return t})(Object.assign({name:"VtkCheckboxField"},{__name:"index",props:{modelValue:{type:[String,Array,Object],default:()=>[]},options:{type:[Array,String],default:()=>[]},valueType:{type:String,default:"array",validator:a=>["string","array","object"].includes(a)},separator:{type:String,default:","}},emits:["update:modelValue","change"],setup(a,{emit:i}){const t=a,p=i,u=e.computed(()=>Array.isArray(t.options)?t.options:typeof t.options=="string"&&t.options?t.options.split("/").filter(Boolean).map(o=>{const[n,r]=o.split(":");return{text:r||n,value:n}}):[]),f=e.computed({get:()=>{const o=t.modelValue;if(!o)return[];let n=[];return t.valueType==="string"?n=typeof o=="string"?o.split(t.separator).filter(Boolean):[]:t.valueType==="object"?n=Array.isArray(o)?o.map(r=>(r==null?void 0:r.value)??r):[]:n=Array.isArray(o)?o:[],n.map(String)},set:o=>{let n;t.valueType==="string"?n=o.join(t.separator):t.valueType==="object"?n=u.value.filter(r=>o.includes(String(r.value))):n=o.map(r=>isNaN(Number(r))?r:Array.isArray(t.modelValue)&&typeof t.modelValue[0]=="number"?Number(r):r),p("update:modelValue",n),p("change",n)}});return(o,n)=>{const r=e.resolveComponent("van-checkbox"),g=e.resolveComponent("van-checkbox-group"),k=e.resolveComponent("van-field");return e.openBlock(),e.createBlock(k,e.normalizeProps(e.guardReactiveProps(o.$attrs)),{input:e.withCtx(()=>[e.createVNode(g,{modelValue:f.value,"onUpdate:modelValue":n[0]||(n[0]=c=>f.value=c),direction:"horizontal"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.value,c=>(e.openBlock(),e.createBlock(r,{key:String(c.value),name:String(c.value),shape:"square"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.text),1)]),_:2},1032,["name"]))),128))]),_:1},8,["modelValue"])]),_:1},16)}}}),[["__scopeId","data-v-54417869"]]);s.install=a=>{a.component(s.name||"VtkCheckboxField",s)};const m=[s],d=a=>{m.forEach(i=>{i.install?a.use(i):i.name&&a.component(i.name,i)})},y={install:d,CheckboxField:s},_="1.0.0";l.CheckboxField=s,l.default=y,l.install=d,l.version=_,Object.defineProperties(l,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
1
|
+
(function(k,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("vant"),require("vue-pdf-embed")):typeof define=="function"&&define.amd?define(["exports","vue","vant","vue-pdf-embed"],e):(k=typeof globalThis<"u"?globalThis:k||self,e(k.VantVtk={},k.Vue,k.vant,k.VuePdfEmbed))})(this,function(k,e,x,E){"use strict";const $=(n,_)=>{const s=n.__vccOpts||n;for(const[p,f]of _)s[p]=f;return s},w=$(Object.assign({name:"VtkCheckbox"},{__name:"index",props:{modelValue:{type:[String,Array,Object],default:()=>[]},options:{type:[Array,String],default:()=>[]},valueType:{type:String,default:"array",validator:n=>["string","array","object"].includes(n)},separator:{type:String,default:","}},emits:["update:modelValue","change"],setup(n,{emit:_}){const s=n,p=_,f=e.computed(()=>Array.isArray(s.options)?s.options:typeof s.options=="string"&&s.options?s.options.split("/").filter(Boolean).map(o=>{const[r,i]=o.split(":");return{text:i||r,value:r}}):[]),c=e.computed({get:()=>{const o=s.modelValue;if(!o)return[];let r=[];return s.valueType==="string"?r=typeof o=="string"?o.split(s.separator).filter(Boolean):[]:s.valueType==="object"?r=Array.isArray(o)?o.map(i=>(i==null?void 0:i.value)??i):[]:r=Array.isArray(o)?o:[],r.map(String)},set:o=>{let r;s.valueType==="string"?r=o.join(s.separator):s.valueType==="object"?r=f.value.filter(i=>o.includes(String(i.value))):r=o.map(i=>isNaN(Number(i))?i:Array.isArray(s.modelValue)&&typeof s.modelValue[0]=="number"?Number(i):i),p("update:modelValue",r),p("change",r)}});return(o,r)=>{const i=e.resolveComponent("van-checkbox"),V=e.resolveComponent("van-checkbox-group"),y=e.resolveComponent("van-field");return e.openBlock(),e.createBlock(y,e.normalizeProps(e.guardReactiveProps(o.$attrs)),{input:e.withCtx(()=>[e.createVNode(V,{modelValue:c.value,"onUpdate:modelValue":r[0]||(r[0]=h=>c.value=h),direction:"horizontal"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.value,h=>(e.openBlock(),e.createBlock(i,{key:String(h.value),name:String(h.value),shape:"square"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(h.text),1)]),_:2},1032,["name"]))),128))]),_:1},8,["modelValue"])]),_:1},16)}}}),[["__scopeId","data-v-eb64e8a9"]]);w.install=n=>{n.component(w.name||"VtkCheckbox",w)};const S=Object.assign({name:"VtkArea"},{__name:"index",props:{modelValue:{type:[String,Object,Array],default:""},defaultAreaCode:{type:String,default:"33"},valueType:{type:String,default:"code",validator:n=>["code","codes","object"].includes(n)},separator:{type:String,default:"/"},title:{type:String,default:"请选择所在地区"},placeholder:{type:String,default:"请选择所在地区"},maxLevel:{type:Number,default:12},displayMode:{type:String,default:"full",validator:n=>["full","last"].includes(n)}},emits:["update:modelValue","change","finish"],setup(n,{expose:_,emit:s}){const p=n,f=s,c=e.ref(!1),o=e.ref(""),r=e.ref([]),i=e.ref(""),V=e.ref(!1),y=e.ref([]),h={text:"areaName",value:"areaCode",children:"children"};e.watch(()=>p.modelValue,t=>{t||(i.value="",o.value="",y.value=[])},{immediate:!0});const b=()=>{c.value=!0,r.value.length===0&&j()},j=async()=>{if(!V.value){V.value=!0;try{const t=p.defaultAreaCode,a=await Request.getForm(`dict/area/show/${t}`);if(a.data){const l={areaCode:a.data.areaCode,areaName:a.data.areaName,areaLeve:a.data.areaLeve,children:a.data.areaLeve<p.maxLevel?[]:void 0};r.value=[l]}}catch(t){console.error("加载初始地区失败:",t)}finally{V.value=!1}}},d=async t=>{if(!t._loading){t._loading=!0;try{const a=await Request.getForm(`dict/area/next/${t.areaCode}`);a.data&&a.data.length>0?(a.data.forEach(l=>{l.areaLeve<p.maxLevel&&(l.children=[])}),t.children=a.data):delete t.children}catch(a){console.error("加载下级地区失败:",a)}finally{t._loading=!1}}},u=({value:t,selectedOptions:a,tabIndex:l})=>{const m=a[l];m&&m.areaLeve<p.maxLevel&&Array.isArray(m.children)&&m.children.length===0&&d(m),f("change",{value:t,selectedOptions:a,tabIndex:l})},g=({selectedOptions:t})=>{var l,m,N,C,L;p.displayMode==="last"?i.value=((l=t[t.length-1])==null?void 0:l.areaName)||"":i.value=t.map(v=>v.areaName).join(p.separator),y.value=t.map(v=>({areaCode:v.areaCode,areaName:v.areaName,areaLeve:v.areaLeve}));let a;switch(p.valueType){case"code":a=((m=t[t.length-1])==null?void 0:m.areaCode)||"";break;case"codes":a=t.map(v=>v.areaCode);break;case"object":a={codes:t.map(v=>v.areaCode),names:t.map(v=>v.areaName),fullName:t.map(v=>v.areaName).join(p.separator),lastCode:((N=t[t.length-1])==null?void 0:N.areaCode)||"",lastLevel:(C=t[t.length-1])==null?void 0:C.areaLeve,options:y.value};break;default:a=((L=t[t.length-1])==null?void 0:L.areaCode)||""}f("update:modelValue",a),f("finish",{selectedOptions:t,value:a}),c.value=!1};return _({getSelectedData:()=>y.value,getDisplayValue:()=>i.value,reset:()=>{i.value="",o.value="",y.value=[],f("update:modelValue",p.valueType==="codes"?[]:p.valueType==="object"?null:"")},open:()=>{b()},close:()=>{c.value=!1}}),(t,a)=>{const l=e.resolveComponent("van-field"),m=e.resolveComponent("van-cascader"),N=e.resolveComponent("van-popup");return e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createVNode(l,e.mergeProps({modelValue:i.value,"onUpdate:modelValue":a[0]||(a[0]=C=>i.value=C),"is-link":"",readonly:""},t.$attrs,{placeholder:n.placeholder,onClick:b}),null,16,["modelValue","placeholder"]),e.createVNode(N,{show:c.value,"onUpdate:show":a[3]||(a[3]=C=>c.value=C),round:"",position:"bottom"},{default:e.withCtx(()=>[e.createVNode(m,{modelValue:o.value,"onUpdate:modelValue":a[1]||(a[1]=C=>o.value=C),title:n.title,options:r.value,"field-names":h,onClose:a[2]||(a[2]=C=>c.value=!1),onFinish:g,onChange:u},null,8,["modelValue","title","options"])]),_:1},8,["show"])],64)}}});S.install=n=>{n.component(S.name||"VtkArea",S)};const A=$(Object.assign({name:"VtkRadio"},{__name:"index",props:{modelValue:{type:[String,Number,Object],default:""},options:{type:[Array,String],default:()=>[]},valueType:{type:String,default:"string",validator:n=>["string","object"].includes(n)}},emits:["update:modelValue","change"],setup(n,{emit:_}){const s=n,p=_,f=e.computed(()=>Array.isArray(s.options)?s.options:typeof s.options=="string"&&s.options?s.options.split("/").filter(Boolean).map(o=>{const[r,i]=o.split(":");return{text:i||r,value:r}}):[]),c=e.computed({get:()=>{const o=s.modelValue;return o==null?"":s.valueType==="object"&&o&&typeof o=="object"?String(o.value??""):String(o)},set:o=>{var V;let r=o;typeof(s.valueType==="object"?(V=s.modelValue)==null?void 0:V.value:s.modelValue)=="number"&&!isNaN(Number(o))&&(r=Number(o)),s.valueType==="object"&&(r=f.value.find(y=>String(y.value)===String(o))||null),p("update:modelValue",r),p("change",r)}});return(o,r)=>{const i=e.resolveComponent("van-radio"),V=e.resolveComponent("van-radio-group"),y=e.resolveComponent("van-field");return e.openBlock(),e.createBlock(y,e.normalizeProps(e.guardReactiveProps(o.$attrs)),{input:e.withCtx(()=>[e.createVNode(V,{modelValue:c.value,"onUpdate:modelValue":r[0]||(r[0]=h=>c.value=h),direction:"horizontal"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.value,h=>(e.openBlock(),e.createBlock(i,{key:String(h.value),name:String(h.value)},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(h.text),1)]),_:2},1032,["name"]))),128))]),_:1},8,["modelValue"])]),_:1},16)}}}),[["__scopeId","data-v-3482e335"]]);A.install=n=>{n.component(A.name||"VtkRadio",A)};const U=Object.assign({name:"VtkUploader",inheritAttrs:!1},{__name:"index",props:{modelValue:{type:[String,Array],default:()=>[]},valueType:{type:String,default:"array",validator:n=>["string","array"].includes(n)},maxSize:{type:Number,default:10*1024*1024},accept:{type:String,default:"image/*"},uploadUrl:{type:String,default:"/bizp/admin/upload"},fieldName:{type:String,default:"file"}},emits:["update:modelValue","change","success","error"],setup(n,{expose:_,emit:s}){const p=n,f=s,c=e.ref([]),o=d=>{if(!d)return[];let u=[];return typeof d=="string"?u=d.split(",").filter(g=>g.trim()):Array.isArray(d)&&(u=d.filter(g=>g)),u.map(g=>({url:g,status:"done",message:""}))},r=()=>c.value.filter(d=>d.status==="done"&&d.url).map(d=>d.url),i=d=>p.valueType==="string"?d.join(","):d,V=()=>{const d=r(),u=i(d);f("update:modelValue",u),f("change",u)};e.watch(()=>p.modelValue,d=>{const u=r().join(","),g=Array.isArray(d)?d.join(","):d||"";u!==g&&(c.value=o(d))},{immediate:!0});const y=d=>{const u=Array.isArray(d)?d:[d];for(const g of u)if(g.size>p.maxSize){const t=(p.maxSize/1024/1024).toFixed(1);return x.showToast(`文件大小不能超过${t}MB`),!1}return!0},h=async d=>{var g,t,a,l;const u=new FormData;u.append(p.fieldName,d.file);try{const m=await Request.imp(p.uploadUrl,u);return(g=m.meta)!=null&&g.success?{success:!0,url:((t=m.data)==null?void 0:t.url)||((a=m.data)==null?void 0:a.path)||m.data}:{success:!1,message:((l=m.meta)==null?void 0:l.message)||"上传失败"}}catch(m){return{success:!1,message:m.message||"上传失败"}}},b=async d=>{const u=Array.isArray(d)?d:[d];u.length>1&&x.showLoadingToast({message:`正在上传 0/${u.length}`,forbidClick:!0,duration:0});let g=0,t=0;for(let a=0;a<u.length;a++){const l=u[a];l.status="uploading",l.message="上传中...",u.length>1&&x.showLoadingToast({message:`正在上传 ${a+1}/${u.length}`,forbidClick:!0,duration:0});const m=await h(l);m.success?(l.status="done",l.message="",l.url=m.url,g++,f("success",{file:l,url:m.url})):(l.status="failed",l.message=m.message,t++,f("error",{file:l,message:m.message}))}x.closeToast(),u.length>1?t===0?x.showToast(`${g}个文件上传成功`):x.showToast(`${g}个成功,${t}个失败`):t>0&&x.showToast(u[0].message||"上传失败"),V()},j=()=>{setTimeout(()=>{V()},0)};return _({getUrls:r,clear:()=>{c.value=[],V()},getFileList:()=>c.value}),(d,u)=>{const g=e.resolveComponent("van-uploader");return e.openBlock(),e.createBlock(g,e.mergeProps({modelValue:c.value,"onUpdate:modelValue":u[0]||(u[0]=t=>c.value=t)},d.$attrs,{"max-size":n.maxSize,accept:n.accept,"before-read":y,"after-read":b,onDelete:j}),null,16,["modelValue","max-size","accept"])}}}),T=$(U,[["__scopeId","data-v-2ccc0da3"]]);T.install=n=>{n.component(T.name||"VtkUploader",T)};const F={class:"file-preview-container"},D={class:"file-header"},R={class:"file-title"},I={class:"file-content"},q={key:0,class:"image-preview"},M={class:"image-footer"},W={class:"file-info"},G={key:1,class:"pdf-preview"},H={key:1,class:"pdf-placeholder"},J={class:"pdf-footer"},K={class:"page-info"},Q={class:"footer"},B=$(Object.assign({name:"VtkPreview"},{__name:"index",props:{modelValue:{type:Boolean,default:!1},files:{type:Array,default:()=>[]},startIndex:{type:Number,default:0}},emits:["update:modelValue","close"],setup(n,{emit:_}){const s=n,p=_,f=e.ref(s.modelValue),c=e.ref(s.startIndex),o=e.ref(1),r=e.ref(null),i=e.ref(0),V=e.computed(()=>s.files.map((a,l)=>{if(typeof a=="string"){const m=a.toLowerCase().endsWith(".pdf");return{name:m?`文档${l+1}.pdf`:`图片${l+1}`,url:a,type:m?"pdf":"image"}}return a})),y=e.computed(()=>V.value[c.value]||null),h=e.computed(()=>{if(!y.value)return null;const a=y.value.url||y.value;return typeof a=="string"?a.toLowerCase().endsWith(".pdf")?"pdf":"image":y.value.type||"image"});e.watch(()=>s.modelValue,a=>{f.value=a,a&&V.value.length>0&&(c.value=s.startIndex,b())}),e.watch(()=>s.startIndex,a=>{c.value=a,b()}),e.watch(f,a=>{p("update:modelValue",a),a||t()}),e.watch(c,()=>{o.value=1,i.value=0,b()});const b=()=>{const a=y.value;a&&(h.value==="pdf"?r.value=a.url||a:r.value=null)},j=a=>{i.value=a.numPages||0},d=()=>{console.log("PDF rendered successfully")},u=()=>{c.value>0&&c.value--},g=()=>{c.value<V.value.length-1&&c.value++},t=()=>{f.value=!1,r.value=null,o.value=1,i.value=0,p("close")};return(a,l)=>{const m=e.resolveComponent("van-icon"),N=e.resolveComponent("van-image"),C=e.resolveComponent("van-button"),L=e.resolveComponent("van-popup");return e.openBlock(),e.createBlock(L,{show:f.value,"onUpdate:show":l[2]||(l[2]=v=>f.value=v),position:"bottom",style:{height:"100vh"}},{default:e.withCtx(()=>{var v,z;return[e.createElementVNode("div",F,[e.createElementVNode("div",D,[e.createElementVNode("div",R,e.toDisplayString(((v=y.value)==null?void 0:v.name)||"文件预览"),1),e.createVNode(m,{name:"cross",size:"20",onClick:t})]),e.createElementVNode("div",I,[h.value==="image"?(e.openBlock(),e.createElementBlock("div",q,[e.createVNode(N,{src:(z=y.value)==null?void 0:z.url,fit:"contain",class:"preview-image"},null,8,["src"]),e.createElementVNode("div",M,[e.createVNode(C,{size:"small",disabled:c.value<=0,onClick:u},{default:e.withCtx(()=>[...l[3]||(l[3]=[e.createTextVNode("上一个",-1)])]),_:1},8,["disabled"]),e.createElementVNode("span",W,e.toDisplayString(c.value+1)+" / "+e.toDisplayString(n.files.length),1),e.createVNode(C,{size:"small",disabled:c.value>=n.files.length-1,onClick:g},{default:e.withCtx(()=>[...l[4]||(l[4]=[e.createTextVNode("下一个",-1)])]),_:1},8,["disabled"])])])):h.value==="pdf"?(e.openBlock(),e.createElementBlock("div",G,[r.value?(e.openBlock(),e.createBlock(e.unref(E),{key:0,source:r.value,page:o.value,class:"pdf-embed-preview",onRendered:d,onLoaded:j},null,8,["source","page"])):(e.openBlock(),e.createElementBlock("div",H,"请选择PDF文件")),e.createElementVNode("div",J,[e.createVNode(C,{size:"small",disabled:o.value<=1,onClick:l[0]||(l[0]=O=>o.value--)},{default:e.withCtx(()=>[...l[5]||(l[5]=[e.createTextVNode("上一页",-1)])]),_:1},8,["disabled"]),e.createElementVNode("span",K,"第 "+e.toDisplayString(o.value)+" / "+e.toDisplayString(i.value||"?")+" 页",1),e.createVNode(C,{size:"small",disabled:!r.value||o.value>=i.value,onClick:l[1]||(l[1]=O=>o.value++)},{default:e.withCtx(()=>[...l[6]||(l[6]=[e.createTextVNode("下一页",-1)])]),_:1},8,["disabled"])])])):e.createCommentVNode("",!0),e.createElementVNode("div",Q,[e.createVNode(C,{disabled:c.value<=0,onClick:u,icon:"arrow-left",type:"primary",round:""},null,8,["disabled"]),e.createVNode(C,{disabled:c.value>=n.files.length-1,onClick:g,icon:"arrow",type:"primary",round:""},null,8,["disabled"])])])])]}),_:1},8,["show"])}}}),[["__scopeId","data-v-1ad2c749"]]);B.install=n=>{n.component(B.name||"VtkPreview",B)};const X=[w,S,A,T,B],P=n=>{X.forEach(_=>{_.install?n.use(_):_.name&&n.component(_.name,_)})},Y={install:P,Checkbox:w,Area:S,Radio:A,Uploader:T,Preview:B},Z="1.0.0";k.Area=S,k.Checkbox=w,k.Preview=B,k.Radio=A,k.Uploader=T,k.default=Y,k.install=P,k.version=Z,Object.defineProperties(k,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
2
2
|
//# sourceMappingURL=vant-vtk.umd.js.map
|
package/dist/vant-vtk.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vant-vtk.umd.js","sources":["../packages/checkbox-field/index.vue","../packages/checkbox-field/index.js","../src/index.js"],"sourcesContent":["<template>\r\n <van-field v-bind=\"$attrs\">\r\n <template #input>\r\n <van-checkbox-group v-model=\"internalValue\" direction=\"horizontal\">\r\n <van-checkbox v-for=\"item in parsedOptions\" :key=\"String(item.value)\" :name=\"String(item.value)\" shape=\"square\">\r\n {{ item.text }}\r\n </van-checkbox>\r\n </van-checkbox-group>\r\n </template>\r\n </van-field>\r\n</template>\r\n\r\n<script setup>\r\n import { computed } from 'vue'\r\n\r\n defineOptions({\r\n name: 'VtkCheckboxField'\r\n })\r\n\r\n const props = defineProps({\r\n // 绑定值\r\n modelValue: {\r\n type: [String, Array, Object],\r\n default: () => [],\r\n },\r\n // 选项数据:支持数组 [{value, text}] 或 字符串 '1:选项1/2:选项2'\r\n options: {\r\n type: [Array, String],\r\n default: () => [],\r\n },\r\n // 返回值类型: 'string' (逗号分隔), 'array' (值数组), 'object' (对象数组)\r\n valueType: {\r\n type: String,\r\n default: 'array',\r\n validator: (val) => ['string', 'array', 'object'].includes(val),\r\n },\r\n // 当 valueType 为 string 时的分隔符\r\n separator: {\r\n type: String,\r\n default: ',',\r\n },\r\n })\r\n\r\n const emit = defineEmits(['update:modelValue', 'change'])\r\n\r\n // 解析选项\r\n const parsedOptions = computed(() => {\r\n if (Array.isArray(props.options)) {\r\n return props.options\r\n }\r\n if (typeof props.options === 'string' && props.options) {\r\n return props.options\r\n .split('/')\r\n .filter(Boolean)\r\n .map((item) => {\r\n const [value, text] = item.split(':')\r\n return {\r\n text: text || value,\r\n value: value,\r\n }\r\n })\r\n }\r\n return []\r\n })\r\n\r\n // 使用可写计算属性处理 v-model 绑定\r\n const internalValue = computed({\r\n get: () => {\r\n const val = props.modelValue\r\n if (!val) return []\r\n\r\n let arr = []\r\n if (props.valueType === 'string') {\r\n arr = typeof val === 'string' ? val.split(props.separator).filter(Boolean) : []\r\n } else if (props.valueType === 'object') {\r\n arr = Array.isArray(val) ? val.map((item) => item?.value ?? item) : []\r\n } else {\r\n arr = Array.isArray(val) ? val : []\r\n }\r\n // 统一转为字符串,确保与 van-checkbox 的 name 匹配\r\n return arr.map(String)\r\n },\r\n set: (newValues) => {\r\n let emitValue\r\n if (props.valueType === 'string') {\r\n emitValue = newValues.join(props.separator)\r\n } else if (props.valueType === 'object') {\r\n // 从解析后的选项中过滤出完整的对象\r\n emitValue = parsedOptions.value.filter((opt) => newValues.includes(String(opt.value)))\r\n } else {\r\n // 如果原始数据是数字,则尝试转回数字,否则保持字符串\r\n emitValue = newValues.map((val) => {\r\n return isNaN(Number(val)) ? val : Array.isArray(props.modelValue) && typeof props.modelValue[0] === 'number' ? Number(val) : val\r\n })\r\n }\r\n\r\n emit('update:modelValue', emitValue)\r\n emit('change', emitValue)\r\n },\r\n })\r\n</script>\r\n\r\n<style scoped>\r\n :deep(.van-checkbox) {\r\n margin-bottom: 8px;\r\n margin-right: 12px;\r\n }\r\n</style>\r\n","/**\r\n * CheckboxField 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport CheckboxField from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nCheckboxField.install = (app) => {\r\n app.component(CheckboxField.name || 'VtkCheckboxField', CheckboxField)\r\n}\r\n\r\nexport default CheckboxField\r\nexport { CheckboxField }\r\n","/**\r\n * Vant-VTK 组件库全量导出入口\r\n * 支持全量引入和按需引入\r\n */\r\nimport CheckboxField from '../packages/checkbox-field/index.js'\r\n\r\n// 所有组件列表\r\nconst components = [\r\n CheckboxField\r\n]\r\n\r\n// 全量注册方法\r\nconst install = (app) => {\r\n components.forEach(component => {\r\n if (component.install) {\r\n app.use(component)\r\n } else if (component.name) {\r\n app.component(component.name, component)\r\n }\r\n })\r\n}\r\n\r\n// 默认导出 - 支持 app.use(VantVtk) 全量注册\r\nexport default {\r\n install,\r\n // 也导出所有组件,方便直接访问\r\n CheckboxField\r\n}\r\n\r\n// 具名导出 - 支持按需引入\r\nexport {\r\n install,\r\n CheckboxField\r\n}\r\n\r\n// 导出版本号\r\nexport const version = '1.0.0'\r\n"],"names":["props","__props","emit","__emit","parsedOptions","computed","item","value","text","internalValue","val","arr","newValues","emitValue","opt","_openBlock","_createBlock","_component_van_field","$attrs","_createVNode","_component_van_checkbox_group","$event","_createElementBlock","_Fragment","_renderList","_component_van_checkbox","_createTextVNode","_toDisplayString","CheckboxField","app","components","install","component","index","version"],"mappings":"qqBAmBE,MAAMA,EAAQC,EAwBRC,EAAOC,EAGPC,EAAgBC,EAAAA,SAAS,IACzB,MAAM,QAAQL,EAAM,OAAO,EACtBA,EAAM,QAEX,OAAOA,EAAM,SAAY,UAAYA,EAAM,QACtCA,EAAM,QACV,MAAM,GAAG,EACT,OAAO,OAAO,EACd,IAAKM,GAAS,CACb,KAAM,CAACC,EAAOC,CAAI,EAAIF,EAAK,MAAM,GAAG,EACpC,MAAO,CACL,KAAME,GAAQD,EACd,MAAOA,CACnB,CACQ,CAAC,EAEE,CAAA,CACR,EAGKE,EAAgBJ,EAAAA,SAAS,CAC7B,IAAK,IAAM,CACT,MAAMK,EAAMV,EAAM,WAClB,GAAI,CAACU,EAAK,MAAO,CAAA,EAEjB,IAAIC,EAAM,CAAA,EACV,OAAIX,EAAM,YAAc,SACtBW,EAAM,OAAOD,GAAQ,SAAWA,EAAI,MAAMV,EAAM,SAAS,EAAE,OAAO,OAAO,EAAI,CAAA,EACpEA,EAAM,YAAc,SAC7BW,EAAM,MAAM,QAAQD,CAAG,EAAIA,EAAI,IAAKJ,IAASA,GAAA,YAAAA,EAAM,QAASA,CAAI,EAAI,CAAA,EAEpEK,EAAM,MAAM,QAAQD,CAAG,EAAIA,EAAM,CAAA,EAG5BC,EAAI,IAAI,MAAM,CACvB,EACA,IAAMC,GAAc,CAClB,IAAIC,EACAb,EAAM,YAAc,SACtBa,EAAYD,EAAU,KAAKZ,EAAM,SAAS,EACjCA,EAAM,YAAc,SAE7Ba,EAAYT,EAAc,MAAM,OAAQU,GAAQF,EAAU,SAAS,OAAOE,EAAI,KAAK,CAAC,CAAC,EAGrFD,EAAYD,EAAU,IAAKF,GAClB,MAAM,OAAOA,CAAG,CAAC,EAAIA,EAAM,MAAM,QAAQV,EAAM,UAAU,GAAK,OAAOA,EAAM,WAAW,CAAC,GAAM,SAAW,OAAOU,CAAG,EAAIA,CAC9H,EAGHR,EAAK,oBAAqBW,CAAS,EACnCX,EAAK,SAAUW,CAAS,CAC1B,CACJ,CAAG,wIAlGD,OAAAE,EAAAA,UAAA,EAAAC,EAAAA,YAQYC,wCAROC,EAAAA,MAAM,CAAA,EAAA,CACZ,gBACT,IAIqB,CAJrBC,EAAAA,YAIqBC,EAAA,YAJQX,EAAA,2CAAAA,EAAa,MAAAY,GAAE,UAAU,iCACtC,IAA6B,kBAA3CC,EAAAA,mBAEeC,EAAAA,SAAA,KAAAC,EAAAA,WAFcpB,EAAA,MAARE,kBAArBU,EAAAA,YAEeS,EAAA,CAF8B,IAAK,OAAOnB,EAAK,KAAK,EAAI,KAAM,OAAOA,EAAK,KAAK,EAAG,MAAM,6BACrG,IAAe,CAAZoB,EAAAA,gBAAAC,EAAAA,gBAAArB,EAAK,IAAI,EAAA,CAAA,2GCEtBsB,EAAc,QAAWC,GAAQ,CAC/BA,EAAI,UAAUD,EAAc,MAAQ,mBAAoBA,CAAa,CACvE,ECFA,MAAME,EAAa,CACjBF,CACF,EAGMG,EAAWF,GAAQ,CACvBC,EAAW,QAAQE,GAAa,CAC1BA,EAAU,QACZH,EAAI,IAAIG,CAAS,EACRA,EAAU,MACnBH,EAAI,UAAUG,EAAU,KAAMA,CAAS,CAE3C,CAAC,CACH,EAGAC,EAAe,CACb,QAAAF,EAEA,cAAAH,CACF,EASaM,EAAU"}
|
|
1
|
+
{"version":3,"file":"vant-vtk.umd.js","sources":["../packages/checkbox/index.vue","../packages/checkbox/index.js","../packages/Area/index.vue","../packages/Area/index.js","../packages/Radio/index.vue","../packages/Radio/index.js","../packages/Uploader/index.vue","../packages/Uploader/index.js","../packages/preview/index.vue","../packages/preview/index.js","../src/index.js"],"sourcesContent":["<template>\r\n <van-field v-bind=\"$attrs\">\r\n <template #input>\r\n <van-checkbox-group v-model=\"internalValue\" direction=\"horizontal\">\r\n <van-checkbox v-for=\"item in parsedOptions\" :key=\"String(item.value)\" :name=\"String(item.value)\" shape=\"square\">\r\n {{ item.text }}\r\n </van-checkbox>\r\n </van-checkbox-group>\r\n </template>\r\n </van-field>\r\n</template>\r\n\r\n<script setup>\r\n import { computed } from 'vue'\r\n\r\n defineOptions({\r\n name: 'VtkCheckbox'\r\n })\r\n\r\n const props = defineProps({\r\n // 绑定值\r\n modelValue: {\r\n type: [String, Array, Object],\r\n default: () => [],\r\n },\r\n // 选项数据:支持数组 [{value, text}] 或 字符串 '1:选项1/2:选项2'\r\n options: {\r\n type: [Array, String],\r\n default: () => [],\r\n },\r\n // 返回值类型: 'string' (逗号分隔), 'array' (值数组), 'object' (对象数组)\r\n valueType: {\r\n type: String,\r\n default: 'array',\r\n validator: (val) => ['string', 'array', 'object'].includes(val),\r\n },\r\n // 当 valueType 为 string 时的分隔符\r\n separator: {\r\n type: String,\r\n default: ',',\r\n },\r\n })\r\n\r\n const emit = defineEmits(['update:modelValue', 'change'])\r\n\r\n // 解析选项\r\n const parsedOptions = computed(() => {\r\n if (Array.isArray(props.options)) {\r\n return props.options\r\n }\r\n if (typeof props.options === 'string' && props.options) {\r\n return props.options\r\n .split('/')\r\n .filter(Boolean)\r\n .map((item) => {\r\n const [value, text] = item.split(':')\r\n return {\r\n text: text || value,\r\n value: value,\r\n }\r\n })\r\n }\r\n return []\r\n })\r\n\r\n // 使用可写计算属性处理 v-model 绑定\r\n const internalValue = computed({\r\n get: () => {\r\n const val = props.modelValue\r\n if (!val) return []\r\n\r\n let arr = []\r\n if (props.valueType === 'string') {\r\n arr = typeof val === 'string' ? val.split(props.separator).filter(Boolean) : []\r\n } else if (props.valueType === 'object') {\r\n arr = Array.isArray(val) ? val.map((item) => item?.value ?? item) : []\r\n } else {\r\n arr = Array.isArray(val) ? val : []\r\n }\r\n // 统一转为字符串,确保与 van-checkbox 的 name 匹配\r\n return arr.map(String)\r\n },\r\n set: (newValues) => {\r\n let emitValue\r\n if (props.valueType === 'string') {\r\n emitValue = newValues.join(props.separator)\r\n } else if (props.valueType === 'object') {\r\n // 从解析后的选项中过滤出完整的对象\r\n emitValue = parsedOptions.value.filter((opt) => newValues.includes(String(opt.value)))\r\n } else {\r\n // 如果原始数据是数字,则尝试转回数字,否则保持字符串\r\n emitValue = newValues.map((val) => {\r\n return isNaN(Number(val)) ? val : Array.isArray(props.modelValue) && typeof props.modelValue[0] === 'number' ? Number(val) : val\r\n })\r\n }\r\n\r\n emit('update:modelValue', emitValue)\r\n emit('change', emitValue)\r\n },\r\n })\r\n</script>\r\n\r\n<style scoped>\r\n :deep(.van-checkbox) {\r\n margin-bottom: 8px;\r\n margin-right: 12px;\r\n }\r\n</style>\r\n","/**\r\n * Checkbox 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Checkbox from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nCheckbox.install = (app) => {\r\n app.component(Checkbox.name || 'VtkCheckbox', Checkbox)\r\n}\r\n\r\nexport default Checkbox\r\nexport { Checkbox }\r\n","<template>\r\n\t<van-field v-model=\"displayValue\" is-link readonly v-bind=\"$attrs\" :placeholder=\"placeholder\" @click=\"handleClick\" />\r\n\t<van-popup v-model:show=\"show\" round position=\"bottom\">\r\n\t\t<van-cascader v-model=\"cascaderValue\" :title=\"title\" :options=\"options\" :field-names=\"fieldNames\" @close=\"show = false\" @finish=\"onFinish\" @change=\"onChange\" />\r\n\t</van-popup>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n\tname: \"VtkArea\",\r\n});\r\nimport { ref, watch } from \"vue\";\r\n// import Request from \"@/utils/request\";\r\n\r\nconst props = defineProps({\r\n\t// 绑定值,根据 valueType 返回不同类型\r\n\tmodelValue: {\r\n\t\ttype: [String, Object, Array],\r\n\t\tdefault: \"\",\r\n\t},\r\n\t// 默认地区编码,用于初始化加载\r\n\tdefaultAreaCode: {\r\n\t\ttype: String,\r\n\t\tdefault: \"33\",\r\n\t},\r\n\t// 返回值类型: 'code' 返回最后一级areaCode, 'codes' 返回所有级别areaCode数组, 'object' 返回完整对象信息\r\n\tvalueType: {\r\n\t\ttype: String,\r\n\t\tdefault: \"code\",\r\n\t\tvalidator: (val) => [\"code\", \"codes\", \"object\"].includes(val),\r\n\t},\r\n\t// 显示分隔符\r\n\tseparator: {\r\n\t\ttype: String,\r\n\t\tdefault: \"/\",\r\n\t},\r\n\t// 弹窗标题\r\n\ttitle: {\r\n\t\ttype: String,\r\n\t\tdefault: \"请选择所在地区\",\r\n\t},\r\n\t// 占位文本\r\n\tplaceholder: {\r\n\t\ttype: String,\r\n\t\tdefault: \"请选择所在地区\",\r\n\t},\r\n\t// 最大层级限制,达到该层级后不再加载下级\r\n\tmaxLevel: {\r\n\t\ttype: Number,\r\n\t\tdefault: 12,\r\n\t},\r\n\t// 显示模式: 'full' 显示完整路径, 'last' 只显示最后一级\r\n\tdisplayMode: {\r\n\t\ttype: String,\r\n\t\tdefault: \"full\",\r\n\t\tvalidator: (val) => [\"full\", \"last\"].includes(val),\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"change\", \"finish\"]);\r\n\r\nconst show = ref(false); //弹窗显示隐藏\r\nconst cascaderValue = ref(\"\"); //级联选择器绑定值\r\nconst options = ref([]); //级联选择器选项\r\nconst displayValue = ref(\"\"); //显示值\r\nconst loading = ref(false); //加载状态\r\n// 存储完整的选中信息\r\nconst selectedData = ref([]);\r\n\r\nconst fieldNames = {\r\n\ttext: \"areaName\",\r\n\tvalue: \"areaCode\",\r\n\tchildren: \"children\",\r\n};\r\n\r\n// 监听 modelValue 变化,用于回显\r\nwatch(\r\n\t() => props.modelValue,\r\n\t(val) => {\r\n\t\tif (!val) {\r\n\t\t\tdisplayValue.value = \"\";\r\n\t\t\tcascaderValue.value = \"\";\r\n\t\t\tselectedData.value = [];\r\n\t\t}\r\n\t},\r\n\t{ immediate: true },\r\n);\r\n\r\nconst handleClick = () => {\r\n\tshow.value = true;\r\n\tif (options.value.length === 0) {\r\n\t\tloadInitialArea();\r\n\t}\r\n};\r\n\r\n// 加载初始地区\r\nconst loadInitialArea = async () => {\r\n\tif (loading.value) return;\r\n\tloading.value = true;\r\n\ttry {\r\n\t\tconst areaCode = props.defaultAreaCode;\r\n\t\tconst res = await Request.getForm(`dict/area/show/${areaCode}`);\r\n\t\tif (res.data) {\r\n\t\t\tconst rootArea = {\r\n\t\t\t\tareaCode: res.data.areaCode,\r\n\t\t\t\tareaName: res.data.areaName,\r\n\t\t\t\tareaLeve: res.data.areaLeve,\r\n\t\t\t\tchildren: res.data.areaLeve < props.maxLevel ? [] : undefined,\r\n\t\t\t};\r\n\t\t\toptions.value = [rootArea];\r\n\t\t}\r\n\t} catch (error) {\r\n\t\tconsole.error(\"加载初始地区失败:\", error);\r\n\t} finally {\r\n\t\tloading.value = false;\r\n\t}\r\n};\r\n\r\n// 加载下级地区\r\nconst loadChildren = async (item) => {\r\n\tif (item._loading) return;\r\n\titem._loading = true;\r\n\ttry {\r\n\t\tconst res = await Request.getForm(`dict/area/next/${item.areaCode}`);\r\n\t\tif (res.data && res.data.length > 0) {\r\n\t\t\tres.data.forEach((it) => {\r\n\t\t\t\t// 根据 maxLevel 判断是否还有下级\r\n\t\t\t\tif (it.areaLeve < props.maxLevel) {\r\n\t\t\t\t\tit.children = [];\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\titem.children = res.data;\r\n\t\t} else {\r\n\t\t\t// 没有下级数据,移除 children 属性使其成为叶子节点\r\n\t\t\tdelete item.children;\r\n\t\t}\r\n\t} catch (error) {\r\n\t\tconsole.error(\"加载下级地区失败:\", error);\r\n\t} finally {\r\n\t\titem._loading = false;\r\n\t}\r\n};\r\n\r\n// 选项变化时加载下级\r\nconst onChange = ({ value, selectedOptions, tabIndex }) => {\r\n\tconst currentItem = selectedOptions[tabIndex];\r\n\tif (currentItem && currentItem.areaLeve < props.maxLevel && Array.isArray(currentItem.children) && currentItem.children.length === 0) {\r\n\t\tloadChildren(currentItem);\r\n\t}\r\n\temit(\"change\", { value, selectedOptions, tabIndex });\r\n};\r\n\r\n// 完成选择\r\nconst onFinish = ({ selectedOptions }) => {\r\n\t// 根据 displayMode 决定显示值\r\n\tif (props.displayMode === \"last\") {\r\n\t\t// 只显示最后一级\r\n\t\tdisplayValue.value = selectedOptions[selectedOptions.length - 1]?.areaName || \"\";\r\n\t} else {\r\n\t\t// 显示完整路径(默认)\r\n\t\tdisplayValue.value = selectedOptions.map((option) => option.areaName).join(props.separator);\r\n\t}\r\n\r\n\t// 存储完整选中数据\r\n\tselectedData.value = selectedOptions.map((option) => ({\r\n\t\tareaCode: option.areaCode,\r\n\t\tareaName: option.areaName,\r\n\t\tareaLeve: option.areaLeve,\r\n\t}));\r\n\r\n\t// 根据 valueType 返回不同格式的值\r\n\tlet emitValue;\r\n\tswitch (props.valueType) {\r\n\t\tcase \"code\":\r\n\t\t\t// 返回最后一级的 areaCode\r\n\t\t\temitValue = selectedOptions[selectedOptions.length - 1]?.areaCode || \"\";\r\n\t\t\tbreak;\r\n\t\tcase \"codes\":\r\n\t\t\t// 返回所有级别的 areaCode 数组\r\n\t\t\temitValue = selectedOptions.map((option) => option.areaCode);\r\n\t\t\tbreak;\r\n\t\tcase \"object\":\r\n\t\t\t// 返回完整对象信息\r\n\t\t\temitValue = {\r\n\t\t\t\tcodes: selectedOptions.map((option) => option.areaCode),\r\n\t\t\t\tnames: selectedOptions.map((option) => option.areaName),\r\n\t\t\t\tfullName: selectedOptions.map((option) => option.areaName).join(props.separator),\r\n\t\t\t\tlastCode: selectedOptions[selectedOptions.length - 1]?.areaCode || \"\",\r\n\t\t\t\tlastLevel: selectedOptions[selectedOptions.length - 1]?.areaLeve,\r\n\t\t\t\toptions: selectedData.value,\r\n\t\t\t};\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\temitValue = selectedOptions[selectedOptions.length - 1]?.areaCode || \"\";\r\n\t}\r\n\r\n\temit(\"update:modelValue\", emitValue);\r\n\temit(\"finish\", { selectedOptions, value: emitValue });\r\n\tshow.value = false;\r\n};\r\n\r\n// 暴露方法供外部调用\r\ndefineExpose({\r\n\t// 获取当前选中的完整数据\r\n\tgetSelectedData: () => selectedData.value,\r\n\t// 获取显示值\r\n\tgetDisplayValue: () => displayValue.value,\r\n\t// 重置选择\r\n\treset: () => {\r\n\t\tdisplayValue.value = \"\";\r\n\t\tcascaderValue.value = \"\";\r\n\t\tselectedData.value = [];\r\n\t\temit(\"update:modelValue\", props.valueType === \"codes\" ? [] : props.valueType === \"object\" ? null : \"\");\r\n\t},\r\n\t// 打开选择器\r\n\topen: () => {\r\n\t\thandleClick();\r\n\t},\r\n\t// 关闭选择器\r\n\tclose: () => {\r\n\t\tshow.value = false;\r\n\t},\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped></style>\r\n","/**\r\n * Area 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Area from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nArea.install = (app) => {\r\n app.component(Area.name || 'VtkArea', Area)\r\n}\r\n\r\nexport default Area\r\nexport { Area }\r\n","<template>\r\n\t<van-field v-bind=\"$attrs\">\r\n\t\t<template #input>\r\n\t\t\t<van-radio-group v-model=\"internalValue\" direction=\"horizontal\">\r\n\t\t\t\t<van-radio v-for=\"item in parsedOptions\" :key=\"String(item.value)\" :name=\"String(item.value)\">\r\n\t\t\t\t\t{{ item.text }}\r\n\t\t\t\t</van-radio>\r\n\t\t\t</van-radio-group>\r\n\t\t</template>\r\n\t</van-field>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n\tname: \"VtkRadio\",\r\n});\r\nimport { computed } from \"vue\";\r\n\r\nconst props = defineProps({\r\n\t// 绑定值\r\n\tmodelValue: {\r\n\t\ttype: [String, Number, Object],\r\n\t\tdefault: \"\",\r\n\t},\r\n\t// 选项数据:支持数组 [{value, text}] 或 字符串 '1:选项1/2:选项2'\r\n\toptions: {\r\n\t\ttype: [Array, String],\r\n\t\tdefault: () => [],\r\n\t},\r\n\t// 返回值类型: 'string' (基本类型), 'object' (完整对象)\r\n\tvalueType: {\r\n\t\ttype: String,\r\n\t\tdefault: \"string\",\r\n\t\tvalidator: (val) => [\"string\", \"object\"].includes(val),\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"change\"]);\r\n\r\n// 解析选项\r\nconst parsedOptions = computed(() => {\r\n\tif (Array.isArray(props.options)) {\r\n\t\treturn props.options;\r\n\t}\r\n\tif (typeof props.options === \"string\" && props.options) {\r\n\t\treturn props.options\r\n\t\t\t.split(\"/\")\r\n\t\t\t.filter(Boolean)\r\n\t\t\t.map((item) => {\r\n\t\t\t\tconst [value, text] = item.split(\":\");\r\n\t\t\t\treturn {\r\n\t\t\t\t\ttext: text || value,\r\n\t\t\t\t\tvalue: value,\r\n\t\t\t\t};\r\n\t\t\t});\r\n\t}\r\n\treturn [];\r\n});\r\n\r\n// 使用可写计算属性处理 v-model 绑定\r\nconst internalValue = computed({\r\n\tget: () => {\r\n\t\tconst val = props.modelValue;\r\n\t\tif (val === undefined || val === null) return \"\";\r\n\r\n\t\t// 如果是对象类型,提取其中的 value\r\n\t\tif (props.valueType === \"object\" && val && typeof val === \"object\") {\r\n\t\t\treturn String(val.value ?? \"\");\r\n\t\t}\r\n\t\treturn String(val);\r\n\t},\r\n\tset: (newValue) => {\r\n\t\tlet emitValue = newValue;\r\n\r\n\t\t// 处理原始数据类型逻辑(如果父组件传入的是数字,尝试转回数字)\r\n\t\tconst originalValue = props.valueType === \"object\" ? props.modelValue?.value : props.modelValue;\r\n\t\tif (typeof originalValue === \"number\" && !isNaN(Number(newValue))) {\r\n\t\t\temitValue = Number(newValue);\r\n\t\t}\r\n\r\n\t\tif (props.valueType === \"object\") {\r\n\t\t\t// 找回完整对象\r\n\t\t\temitValue = parsedOptions.value.find((opt) => String(opt.value) === String(newValue)) || null;\r\n\t\t}\r\n\r\n\t\temit(\"update:modelValue\", emitValue);\r\n\t\temit(\"change\", emitValue);\r\n\t},\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n:deep(.van-radio) {\r\n\tmargin-right: 12px;\r\n}\r\n</style>\r\n","/**\r\n * Radio 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Radio from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nRadio.install = (app) => {\r\n app.component(Radio.name || 'VtkRadio', Radio)\r\n}\r\n\r\nexport default Radio\r\nexport { Radio }\r\n","<template>\r\n\t<van-uploader v-model=\"fileList\" v-bind=\"$attrs\" :max-size=\"maxSize\" :accept=\"accept\" :before-read=\"beforeRead\" :after-read=\"afterRead\" @delete=\"onDelete\" />\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n\tname: \"VtkUploader\",\r\n\tinheritAttrs: false,\r\n});\r\nimport { ref, watch } from \"vue\";\r\nimport { showToast, showLoadingToast, closeToast } from \"vant\";\r\n\r\nconst props = defineProps({\r\n\t/** 绑定值,支持字符串或数组 */\r\n\tmodelValue: {\r\n\t\ttype: [String, Array],\r\n\t\tdefault: () => [],\r\n\t},\r\n\t/** 返回值类型:'string' 返回逗号分隔的字符串,'array' 返回数组 */\r\n\tvalueType: {\r\n\t\ttype: String,\r\n\t\tdefault: \"array\",\r\n\t\tvalidator: (val) => [\"string\", \"array\"].includes(val),\r\n\t},\r\n\t/** 单个文件最大大小(字节),默认10MB */\r\n\tmaxSize: {\r\n\t\ttype: Number,\r\n\t\tdefault: 10 * 1024 * 1024,\r\n\t},\r\n\t/** 接受的文件类型 */\r\n\taccept: {\r\n\t\ttype: String,\r\n\t\tdefault: \"image/*\",\r\n\t},\r\n\t/** 上传接口地址 */\r\n\tuploadUrl: {\r\n\t\ttype: String,\r\n\t\tdefault: \"/bizp/admin/upload\",\r\n\t},\r\n\t/** 上传文件的字段名 */\r\n\tfieldName: {\r\n\t\ttype: String,\r\n\t\tdefault: \"file\",\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"change\", \"success\", \"error\"]);\r\n\r\n// 文件列表\r\nconst fileList = ref([]);\r\n\r\n// 解析初始值\r\nconst parseModelValue = (value) => {\r\n\tif (!value) return [];\r\n\r\n\tlet urls = [];\r\n\tif (typeof value === \"string\") {\r\n\t\turls = value.split(\",\").filter((url) => url.trim());\r\n\t} else if (Array.isArray(value)) {\r\n\t\turls = value.filter((url) => url);\r\n\t}\r\n\r\n\treturn urls.map((url) => ({\r\n\t\turl,\r\n\t\tstatus: \"done\",\r\n\t\tmessage: \"\",\r\n\t}));\r\n};\r\n\r\n// 获取已上传的URL列表\r\nconst getUploadedUrls = () => {\r\n\treturn fileList.value.filter((file) => file.status === \"done\" && file.url).map((file) => file.url);\r\n};\r\n\r\n// 格式化输出值\r\nconst formatOutput = (urls) => {\r\n\tif (props.valueType === \"string\") {\r\n\t\treturn urls.join(\",\");\r\n\t}\r\n\treturn urls;\r\n};\r\n\r\n// 触发更新\r\nconst emitValue = () => {\r\n\tconst urls = getUploadedUrls();\r\n\tconst output = formatOutput(urls);\r\n\temit(\"update:modelValue\", output);\r\n\temit(\"change\", output);\r\n};\r\n\r\n// 监听外部值变化\r\nwatch(\r\n\t() => props.modelValue,\r\n\t(newVal) => {\r\n\t\tconst currentUrls = getUploadedUrls().join(\",\");\r\n\t\tconst newUrls = Array.isArray(newVal) ? newVal.join(\",\") : newVal || \"\";\r\n\r\n\t\t// 只有外部值确实改变时才更新\r\n\t\tif (currentUrls !== newUrls) {\r\n\t\t\tfileList.value = parseModelValue(newVal);\r\n\t\t}\r\n\t},\r\n\t{ immediate: true },\r\n);\r\n\r\n// 上传前校验\r\nconst beforeRead = (file) => {\r\n\tconst files = Array.isArray(file) ? file : [file];\r\n\r\n\tfor (const f of files) {\r\n\t\t// 文件大小校验\r\n\t\tif (f.size > props.maxSize) {\r\n\t\t\tconst maxSizeMB = (props.maxSize / 1024 / 1024).toFixed(1);\r\n\t\t\tshowToast(`文件大小不能超过${maxSizeMB}MB`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\treturn true;\r\n};\r\n\r\n// 上传文件\r\nconst uploadFile = async (file) => {\r\n\tconst formData = new FormData();\r\n\tformData.append(props.fieldName, file.file);\r\n\r\n\ttry {\r\n\t\tconst res = await Request.imp(props.uploadUrl, formData);\r\n\r\n\t\tif (res.meta?.success) {\r\n\t\t\t// 根据实际接口返回格式获取URL\r\n\t\t\tconst url = res.data?.url || res.data?.path || res.data;\r\n\t\t\treturn { success: true, url };\r\n\t\t} else {\r\n\t\t\treturn { success: false, message: res.meta?.message || \"上传失败\" };\r\n\t\t}\r\n\t} catch (error) {\r\n\t\treturn { success: false, message: error.message || \"上传失败\" };\r\n\t}\r\n};\r\n\r\n// 文件读取完成后处理\r\nconst afterRead = async (file) => {\r\n\tconst files = Array.isArray(file) ? file : [file];\r\n\r\n\t// 显示上传中提示\r\n\tif (files.length > 1) {\r\n\t\tshowLoadingToast({\r\n\t\t\tmessage: `正在上传 0/${files.length}`,\r\n\t\t\tforbidClick: true,\r\n\t\t\tduration: 0,\r\n\t\t});\r\n\t}\r\n\r\n\tlet successCount = 0;\r\n\tlet failCount = 0;\r\n\r\n\t// 逐个上传\r\n\tfor (let i = 0; i < files.length; i++) {\r\n\t\tconst fileItem = files[i];\r\n\t\tfileItem.status = \"uploading\";\r\n\t\tfileItem.message = \"上传中...\";\r\n\r\n\t\t// 更新进度提示\r\n\t\tif (files.length > 1) {\r\n\t\t\tshowLoadingToast({\r\n\t\t\t\tmessage: `正在上传 ${i + 1}/${files.length}`,\r\n\t\t\t\tforbidClick: true,\r\n\t\t\t\tduration: 0,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst result = await uploadFile(fileItem);\r\n\r\n\t\tif (result.success) {\r\n\t\t\tfileItem.status = \"done\";\r\n\t\t\tfileItem.message = \"\";\r\n\t\t\tfileItem.url = result.url;\r\n\t\t\tsuccessCount++;\r\n\t\t\temit(\"success\", { file: fileItem, url: result.url });\r\n\t\t} else {\r\n\t\t\tfileItem.status = \"failed\";\r\n\t\t\tfileItem.message = result.message;\r\n\t\t\tfailCount++;\r\n\t\t\temit(\"error\", { file: fileItem, message: result.message });\r\n\t\t}\r\n\t}\r\n\r\n\tcloseToast();\r\n\r\n\t// 显示上传结果\r\n\tif (files.length > 1) {\r\n\t\tif (failCount === 0) {\r\n\t\t\tshowToast(`${successCount}个文件上传成功`);\r\n\t\t} else {\r\n\t\t\tshowToast(`${successCount}个成功,${failCount}个失败`);\r\n\t\t}\r\n\t} else if (failCount > 0) {\r\n\t\tshowToast(files[0].message || \"上传失败\");\r\n\t}\r\n\r\n\t// 触发值更新\r\n\temitValue();\r\n};\r\n\r\n// 删除文件\r\nconst onDelete = () => {\r\n\t// 下一个tick再触发,确保fileList已更新\r\n\tsetTimeout(() => {\r\n\t\temitValue();\r\n\t}, 0);\r\n};\r\n\r\n// 暴露方法给父组件\r\ndefineExpose({\r\n\t/** 获取已上传的URL列表 */\r\n\tgetUrls: getUploadedUrls,\r\n\t/** 清空文件列表 */\r\n\tclear: () => {\r\n\t\tfileList.value = [];\r\n\t\temitValue();\r\n\t},\r\n\t/** 获取文件列表 */\r\n\tgetFileList: () => fileList.value,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n:deep(.van-uploader__preview-image) {\r\n\tborder-radius: 4px;\r\n}\r\n\r\n:deep(.van-uploader__upload) {\r\n\tborder-radius: 4px;\r\n}\r\n</style>\r\n","/**\r\n * Uploader 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Uploader from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nUploader.install = (app) => {\r\n app.component(Uploader.name || 'VtkUploader', Uploader)\r\n}\r\n\r\nexport default Uploader\r\nexport { Uploader }\r\n","<template>\r\n\t<van-popup v-model:show=\"showPopup\" position=\"bottom\" :style=\"{ height: '100vh' }\">\r\n\t\t<div class=\"file-preview-container\">\r\n\t\t\t<div class=\"file-header\">\r\n\t\t\t\t<div class=\"file-title\">{{ currentFile?.name || \"文件预览\" }}</div>\r\n\t\t\t\t<van-icon name=\"cross\" size=\"20\" @click=\"handleClose\" />\r\n\t\t\t</div>\r\n\r\n\t\t\t<div class=\"file-content\">\r\n\t\t\t\t<div v-if=\"currentType === 'image'\" class=\"image-preview\">\r\n\t\t\t\t\t<van-image :src=\"currentFile?.url\" fit=\"contain\" class=\"preview-image\" />\r\n\t\t\t\t\t<div class=\"image-footer\">\r\n\t\t\t\t\t\t<van-button size=\"small\" :disabled=\"currentIndex <= 0\" @click=\"prevFile\">上一个</van-button>\r\n\t\t\t\t\t\t<span class=\"file-info\">{{ currentIndex + 1 }} / {{ files.length }}</span>\r\n\t\t\t\t\t\t<van-button size=\"small\" :disabled=\"currentIndex >= files.length - 1\" @click=\"nextFile\">下一个</van-button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<div v-else-if=\"currentType === 'pdf'\" class=\"pdf-preview\">\r\n\t\t\t\t\t<VuePdfEmbed v-if=\"pdfSource\" :source=\"pdfSource\" :page=\"currentPage\" class=\"pdf-embed-preview\" @rendered=\"handlePdfRendered\" @loaded=\"handlePdfLoaded\" />\r\n\t\t\t\t\t<div v-else class=\"pdf-placeholder\">请选择PDF文件</div>\r\n\t\t\t\t\t<div class=\"pdf-footer\">\r\n\t\t\t\t\t\t<van-button size=\"small\" :disabled=\"currentPage <= 1\" @click=\"currentPage--\">上一页</van-button>\r\n\t\t\t\t\t\t<span class=\"page-info\">第 {{ currentPage }} / {{ totalPages || \"?\" }} 页</span>\r\n\t\t\t\t\t\t<van-button size=\"small\" :disabled=\"!pdfSource || currentPage >= totalPages\" @click=\"currentPage++\">下一页</van-button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<div class=\"footer\">\r\n\t\t\t\t\t<van-button :disabled=\"currentIndex <= 0\" @click=\"prevFile\" icon=\"arrow-left\" type=\"primary\" round />\r\n\t\t\t\t\t<van-button :disabled=\"currentIndex >= files.length - 1\" @click=\"nextFile\" icon=\"arrow\" type=\"primary\" round />\r\n\t\t\t\t\t<!-- <van-button size=\"small\" :disabled=\"currentIndex <= 0\" @click=\"prevFile\">上一个</van-button>\r\n <span class=\"file-info\">{{ currentIndex + 1 }} / {{ files.length }}</span>\r\n <van-button size=\"small\" :disabled=\"currentIndex >= files.length - 1\" @click=\"nextFile\">下一个</van-button> -->\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</van-popup>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n\tname: \"VtkPreview\",\r\n});\r\nimport { ref, watch, computed } from \"vue\";\r\nimport VuePdfEmbed from \"vue-pdf-embed\";\r\n\r\nconst props = defineProps({\r\n\tmodelValue: {\r\n\t\ttype: Boolean,\r\n\t\tdefault: false,\r\n\t},\r\n\tfiles: {\r\n\t\ttype: Array,\r\n\t\tdefault: () => [],\r\n\t},\r\n\tstartIndex: {\r\n\t\ttype: Number,\r\n\t\tdefault: 0,\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"close\"]);\r\n\r\nconst showPopup = ref(props.modelValue);\r\nconst currentIndex = ref(props.startIndex);\r\nconst currentPage = ref(1);\r\nconst pdfSource = ref(null);\r\nconst totalPages = ref(0);\r\n\r\nconst normalizedFiles = computed(() => {\r\n\treturn props.files.map((file, index) => {\r\n\t\tif (typeof file === \"string\") {\r\n\t\t\tconst isPdf = file.toLowerCase().endsWith(\".pdf\");\r\n\t\t\treturn {\r\n\t\t\t\tname: isPdf ? `文档${index + 1}.pdf` : `图片${index + 1}`,\r\n\t\t\t\turl: file,\r\n\t\t\t\ttype: isPdf ? \"pdf\" : \"image\",\r\n\t\t\t};\r\n\t\t}\r\n\t\treturn file;\r\n\t});\r\n});\r\n\r\nconst currentFile = computed(() => {\r\n\treturn normalizedFiles.value[currentIndex.value] || null;\r\n});\r\n\r\nconst currentType = computed(() => {\r\n\tif (!currentFile.value) return null;\r\n\tconst url = currentFile.value.url || currentFile.value;\r\n\tif (typeof url === \"string\") {\r\n\t\treturn url.toLowerCase().endsWith(\".pdf\") ? \"pdf\" : \"image\";\r\n\t}\r\n\treturn currentFile.value.type || \"image\";\r\n});\r\n\r\nwatch(\r\n\t() => props.modelValue,\r\n\t(val) => {\r\n\t\tshowPopup.value = val;\r\n\t\tif (val && normalizedFiles.value.length > 0) {\r\n\t\t\tcurrentIndex.value = props.startIndex;\r\n\t\t\tupdatePreview();\r\n\t\t}\r\n\t},\r\n);\r\n\r\nwatch(\r\n\t() => props.startIndex,\r\n\t(val) => {\r\n\t\tcurrentIndex.value = val;\r\n\t\tupdatePreview();\r\n\t},\r\n);\r\n\r\nwatch(showPopup, (val) => {\r\n\temit(\"update:modelValue\", val);\r\n\tif (!val) {\r\n\t\thandleClose();\r\n\t}\r\n});\r\n\r\nwatch(currentIndex, () => {\r\n\tcurrentPage.value = 1;\r\n\ttotalPages.value = 0;\r\n\tupdatePreview();\r\n});\r\n\r\nconst updatePreview = () => {\r\n\tconst file = currentFile.value;\r\n\tif (!file) return;\r\n\r\n\tif (currentType.value === \"pdf\") {\r\n\t\tpdfSource.value = file.url || file;\r\n\t} else {\r\n\t\tpdfSource.value = null;\r\n\t}\r\n};\r\n\r\nconst handlePdfLoaded = (pdf) => {\r\n\ttotalPages.value = pdf.numPages || 0;\r\n};\r\n\r\nconst handlePdfRendered = () => {\r\n\tconsole.log(\"PDF rendered successfully\");\r\n};\r\n\r\nconst prevFile = () => {\r\n\tif (currentIndex.value > 0) {\r\n\t\tcurrentIndex.value--;\r\n\t}\r\n};\r\n\r\nconst nextFile = () => {\r\n\tif (currentIndex.value < normalizedFiles.value.length - 1) {\r\n\t\tcurrentIndex.value++;\r\n\t}\r\n};\r\n\r\nconst handleClose = () => {\r\n\tshowPopup.value = false;\r\n\tpdfSource.value = null;\r\n\tcurrentPage.value = 1;\r\n\ttotalPages.value = 0;\r\n\temit(\"close\");\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.file-preview-container {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\theight: 100%;\r\n\tbackground-color: #fff;\r\n\tborder-radius: 8px;\r\n\toverflow: hidden;\r\n}\r\n\r\n.file-header {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: space-between;\r\n\tpadding: 12px 16px;\r\n\tborder-bottom: 1px solid #ebedf0;\r\n\tbackground-color: #f7f8fa;\r\n}\r\n\r\n.file-title {\r\n\tfont-size: 16px;\r\n\tfont-weight: 600;\r\n\tcolor: #323233;\r\n}\r\n\r\n.file-content {\r\n\tflex: 1;\r\n\toverflow: hidden;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n}\r\n\r\n.image-preview {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\toverflow: hidden;\r\n}\r\n\r\n.preview-image {\r\n\tflex: 1;\r\n\twidth: 100%;\r\n\theight: 100%;\r\n}\r\n\r\n.image-footer {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tgap: 16px;\r\n\tpadding: 12px 16px;\r\n\tborder-top: 1px solid #ebedf0;\r\n\tbackground-color: #fff;\r\n}\r\n\r\n.file-info {\r\n\tfont-size: 14px;\r\n\tcolor: #646566;\r\n\tmin-width: 80px;\r\n\ttext-align: center;\r\n}\r\n\r\n.pdf-preview {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\toverflow: hidden;\r\n}\r\n\r\n.pdf-embed-preview {\r\n\tflex: 1;\r\n\tmax-width: 100%;\r\n\toverflow-y: auto;\r\n\tpadding: 16px;\r\n\tdisplay: flex;\r\n\tjustify-content: center;\r\n\talign-items: flex-start;\r\n\tbackground-color: #f5f5f5;\r\n\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.pdf-placeholder {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tcolor: #969799;\r\n\tfont-size: 14px;\r\n}\r\n\r\n.pdf-footer {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tgap: 16px;\r\n\tpadding: 12px 16px;\r\n\tborder-top: 1px solid #ebedf0;\r\n\tbackground-color: #fff;\r\n}\r\n\r\n.page-info {\r\n\tfont-size: 14px;\r\n\tcolor: #646566;\r\n\tmin-width: 80px;\r\n\ttext-align: center;\r\n}\r\n.footer {\r\n\tposition: fixed;\r\n\ttop: 40%;\r\n\twidth: 100%;\r\n\t.van-button {\r\n\t}\r\n\t.van-button:nth-child(2) {\r\n\t\tfloat: right;\r\n\t}\r\n}\r\n</style>\r\n","/**\r\n * Preview 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Preview from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nPreview.install = (app) => {\r\n app.component(Preview.name || 'VtkPreview', Preview)\r\n}\r\n\r\nexport default Preview\r\nexport { Preview }\r\n","/**\r\n * Vant-VTK 组件库全量导出入口\r\n * 支持全量引入和按需引入\r\n */\r\nimport Checkbox from '../packages/checkbox/index.js'\r\nimport Area from '../packages/Area/index.js'\r\nimport Radio from '../packages/radio/index.js'\r\nimport Uploader from '../packages/Uploader/index.js'\r\nimport Preview from '../packages/preview/index.js'\r\n\r\n\r\n\r\n// 所有组件列表\r\nconst components = [\r\n Checkbox,\r\n Area,\r\n Radio,\r\n Uploader,\r\n Preview\r\n]\r\n\r\n// 全量注册方法\r\nconst install = (app) => {\r\n components.forEach(component => {\r\n if (component.install) {\r\n app.use(component)\r\n } else if (component.name) {\r\n app.component(component.name, component)\r\n }\r\n })\r\n}\r\n\r\n// 默认导出 - 支持 app.use(VantVtk) 全量注册\r\nexport default {\r\n install,\r\n // 也导出所有组件,方便直接访问\r\n Checkbox,\r\n Area,\r\n Radio,\r\n Uploader,\r\n Preview\r\n}\r\n\r\n// 具名导出 - 支持按需引入\r\nexport {\r\n install,\r\n Checkbox,\r\n Area,\r\n Radio,\r\n Uploader,\r\n Preview\r\n}\r\n\r\n// 导出版本号\r\nexport const version = '1.0.0'\r\n"],"names":["props","__props","emit","__emit","parsedOptions","computed","item","value","text","internalValue","val","arr","newValues","emitValue","opt","_openBlock","_createBlock","_component_van_field","$attrs","_createVNode","_component_van_checkbox_group","$event","_createElementBlock","_Fragment","_renderList","_component_van_checkbox","_createTextVNode","_toDisplayString","Checkbox","app","show","ref","cascaderValue","options","displayValue","loading","selectedData","fieldNames","watch","handleClick","loadInitialArea","areaCode","res","rootArea","error","loadChildren","it","onChange","selectedOptions","tabIndex","currentItem","onFinish","_a","option","_b","_c","_d","_e","__expose","_mergeProps","_component_van_popup","_component_van_cascader","Area","newValue","_component_van_radio_group","_component_van_radio","Radio","fileList","parseModelValue","urls","url","getUploadedUrls","file","formatOutput","output","newVal","currentUrls","newUrls","beforeRead","files","f","maxSizeMB","showToast","uploadFile","formData","afterRead","showLoadingToast","successCount","failCount","i","fileItem","result","closeToast","onDelete","_component_van_uploader","Uploader","showPopup","currentIndex","currentPage","pdfSource","totalPages","normalizedFiles","index","isPdf","currentFile","currentType","updatePreview","handleClose","handlePdfLoaded","pdf","handlePdfRendered","prevFile","nextFile","_createElementVNode","_hoisted_1","_hoisted_2","_hoisted_3","_component_van_icon","_hoisted_4","_hoisted_5","_component_van_image","_hoisted_6","_component_van_button","_cache","_hoisted_7","_hoisted_8","_unref","VuePdfEmbed","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","Preview","components","install","component","version"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vant-vtk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Vue3 + Vant4 扩展组件库",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/vant-vtk.umd.js",
|
|
@@ -9,13 +9,25 @@
|
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
11
|
"import": "./dist/vant-vtk.es.js",
|
|
12
|
-
"require": "./dist/vant-vtk.umd.js"
|
|
12
|
+
"require": "./dist/vant-vtk.umd.js",
|
|
13
|
+
"types": "./types/index.d.ts"
|
|
13
14
|
},
|
|
14
|
-
"./es":
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
"./
|
|
15
|
+
"./es": {
|
|
16
|
+
"import": "./dist/es/index.js",
|
|
17
|
+
"types": "./types/index.d.ts"
|
|
18
|
+
},
|
|
19
|
+
"./lib": {
|
|
20
|
+
"require": "./dist/lib/index.js",
|
|
21
|
+
"types": "./types/index.d.ts"
|
|
22
|
+
},
|
|
23
|
+
"./es/*": {
|
|
24
|
+
"import": "./dist/es/*.js",
|
|
25
|
+
"types": "./types/index.d.ts"
|
|
26
|
+
},
|
|
27
|
+
"./lib/*": {
|
|
28
|
+
"require": "./dist/lib/*.js",
|
|
29
|
+
"types": "./types/index.d.ts"
|
|
30
|
+
}
|
|
19
31
|
},
|
|
20
32
|
"files": [
|
|
21
33
|
"dist",
|
|
@@ -28,7 +40,7 @@
|
|
|
28
40
|
"scripts": {
|
|
29
41
|
"dev": "vite",
|
|
30
42
|
"build": "vite build",
|
|
31
|
-
"build:lib": "vite build
|
|
43
|
+
"build:lib": "vite build -c vite.config.lib.js",
|
|
32
44
|
"preview": "vite preview"
|
|
33
45
|
},
|
|
34
46
|
"keywords": [
|
|
@@ -41,18 +53,23 @@
|
|
|
41
53
|
"author": "",
|
|
42
54
|
"license": "MIT",
|
|
43
55
|
"peerDependencies": {
|
|
44
|
-
"
|
|
45
|
-
"
|
|
56
|
+
"vant": "^4.0.0",
|
|
57
|
+
"vue": "^3.2.0"
|
|
46
58
|
},
|
|
47
59
|
"devDependencies": {
|
|
48
60
|
"@vitejs/plugin-vue": "^5.0.0",
|
|
61
|
+
"sass-embedded": "^1.97.3",
|
|
62
|
+
"vant": "^4.8.0",
|
|
49
63
|
"vite": "^5.0.0",
|
|
50
|
-
"
|
|
51
|
-
"
|
|
64
|
+
"vite-plugin-css-injected-by-js": "^3.5.2",
|
|
65
|
+
"vue": "^3.4.0"
|
|
52
66
|
},
|
|
53
67
|
"repository": {
|
|
54
68
|
"type": "git",
|
|
55
69
|
"url": ""
|
|
56
70
|
},
|
|
57
|
-
"homepage": ""
|
|
71
|
+
"homepage": "",
|
|
72
|
+
"dependencies": {
|
|
73
|
+
"vue-pdf-embed": "^2.1.4"
|
|
74
|
+
}
|
|
58
75
|
}
|
package/types/index.d.ts
CHANGED
|
@@ -5,22 +5,81 @@ export interface OptionItem {
|
|
|
5
5
|
text: string
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
export interface
|
|
8
|
+
export interface CheckboxProps {
|
|
9
9
|
modelValue?: string | any[] | object
|
|
10
10
|
options?: OptionItem[] | string
|
|
11
11
|
valueType?: 'string' | 'array' | 'object'
|
|
12
12
|
separator?: string
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
export
|
|
15
|
+
export interface AreaProps {
|
|
16
|
+
modelValue?: string | number
|
|
17
|
+
options?: OptionItem[] | string
|
|
18
|
+
title?: string
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface RadioProps {
|
|
22
|
+
modelValue?: string | number | object
|
|
23
|
+
options?: OptionItem[] | string
|
|
24
|
+
valueType?: 'string' | 'object'
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface UploaderProps {
|
|
28
|
+
modelValue?: string | any[]
|
|
29
|
+
valueType?: 'string' | 'array'
|
|
30
|
+
maxSize?: number
|
|
31
|
+
accept?: string
|
|
32
|
+
uploadUrl?: string
|
|
33
|
+
fieldName?: string
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface PreviewProps {
|
|
37
|
+
modelValue?: boolean
|
|
38
|
+
pdfFile?: {
|
|
39
|
+
name?: string
|
|
40
|
+
url: string
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface UploaderInstance {
|
|
45
|
+
getUrls: () => string[]
|
|
46
|
+
clear: () => void
|
|
47
|
+
getFileList: () => any[]
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export type CheckboxInstance = DefineComponent<CheckboxProps>
|
|
51
|
+
export type AreaInstance = DefineComponent<AreaProps>
|
|
52
|
+
export type RadioInstance = DefineComponent<RadioProps>
|
|
53
|
+
export type UploaderInstanceComponent = DefineComponent<UploaderProps> & UploaderInstance
|
|
54
|
+
export type PreviewInstance = DefineComponent<PreviewProps>
|
|
55
|
+
|
|
56
|
+
export declare const Checkbox: CheckboxInstance & {
|
|
57
|
+
install: (app: App) => void
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export declare const Area: AreaInstance & {
|
|
61
|
+
install: (app: App) => void
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export declare const Radio: RadioInstance & {
|
|
65
|
+
install: (app: App) => void
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export declare const Uploader: UploaderInstanceComponent & {
|
|
69
|
+
install: (app: App) => void
|
|
70
|
+
}
|
|
16
71
|
|
|
17
|
-
export declare const
|
|
72
|
+
export declare const Preview: PreviewInstance & {
|
|
18
73
|
install: (app: App) => void
|
|
19
74
|
}
|
|
20
75
|
|
|
21
76
|
declare const VantVtk: {
|
|
22
77
|
install: (app: App) => void
|
|
23
|
-
|
|
78
|
+
Checkbox: typeof Checkbox
|
|
79
|
+
Area: typeof Area
|
|
80
|
+
Radio: typeof Radio
|
|
81
|
+
Uploader: typeof Uploader
|
|
82
|
+
Preview: typeof Preview
|
|
24
83
|
}
|
|
25
84
|
|
|
26
85
|
export default VantVtk
|