@pointcloud/pcloud-components 0.1.3 → 0.1.5
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 +301 -23
- package/dist/esm/AdvancedFilter/FormFilter.d.ts +2 -2
- package/dist/esm/AdvancedFilter/FormFilter.js +43 -45
- package/dist/esm/AdvancedFilter/index.js +66 -75
- package/dist/esm/AdvancedFilter/interface.d.ts +1 -1
- package/dist/esm/AdvancedFilter/styles/index.less +146 -116
- package/dist/esm/ConfigProvider/index.d.ts +1 -1
- package/dist/esm/ConfigProvider/index.js +5 -3
- package/dist/esm/DCascader/index.d.ts +4 -8
- package/dist/esm/DCascader/index.js +59 -56
- package/dist/esm/DCascader/index.less +5 -1
- package/dist/esm/DForm/DItem/index.d.ts +5 -0
- package/dist/esm/DForm/DItem/index.js +33 -0
- package/dist/esm/DForm/DItem/itemType.d.ts +106 -0
- package/dist/esm/DForm/DItem/itemType.js +1 -0
- package/dist/esm/DForm/DItem/itemsRender.d.ts +39 -0
- package/dist/esm/DForm/DItem/itemsRender.js +193 -0
- package/dist/esm/DForm/helper.js +7 -7
- package/dist/esm/DForm/index.d.ts +1 -1
- package/dist/esm/DForm/index.js +18 -18
- package/dist/esm/DForm/index.less +32 -31
- package/dist/esm/DInput/index.js +6 -11
- package/dist/esm/DSelect/index.js +7 -18
- package/dist/esm/DTable/index.js +58 -64
- package/dist/esm/DTable/index.less +8 -0
- package/dist/esm/DTreeSelect/index.js +74 -67
- package/dist/esm/DTreeSelect/index.less +2 -0
- package/dist/esm/DUpload/helper.d.ts +105 -0
- package/dist/esm/DUpload/helper.js +261 -0
- package/dist/esm/DUpload/index.d.ts +55 -0
- package/dist/esm/DUpload/index.js +372 -0
- package/dist/esm/DUpload/index.less +19 -0
- package/dist/esm/ErrorBoundary/index.d.ts +2 -2
- package/dist/esm/ErrorBoundary/index.js +16 -12
- package/dist/esm/ErrorBoundary/index.less +1 -0
- package/dist/esm/LModal/index.d.ts +2 -2
- package/dist/esm/LModal/index.js +11 -13
- package/dist/esm/LModal/interface.d.ts +1 -1
- package/dist/esm/LModal/styles/index.less +27 -25
- package/dist/esm/LabelValue/index.d.ts +1 -1
- package/dist/esm/LabelValue/index.js +14 -12
- package/dist/esm/LabelValue/styles/index.less +4 -0
- package/dist/esm/Loading/interface.d.ts +4 -4
- package/dist/esm/Loading/loading.d.ts +2 -2
- package/dist/esm/Loading/loading.js +18 -16
- package/dist/esm/Loading/styles/index.less +3 -1
- package/dist/esm/NoData/index.d.ts +2 -2
- package/dist/esm/NoData/index.js +14 -13
- package/dist/esm/NoData/styles/index.less +4 -1
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +1 -0
- package/dist/umd/images/favicon.png +0 -0
- package/dist/umd/mock/dcascader/china_region_city.json +2962 -0
- package/dist/umd/mock/dcascader/china_region_county.json +9991 -0
- package/dist/umd/mock/dcascader/china_region_province.json +36 -0
- package/dist/umd/mock/dupload/other/ZJ-TZ-001_/346/212/244/345/233/275/345/272/231/346/210/217/345/217/260/345/216/206/345/217/262/345/273/272/347/255/221/346/241/243/346/241/210/350/241/250.pdf +0 -0
- package/dist/umd/mock/dupload/other//346/234/210/347/211/231/346/271/276 - /351/243/236/345/204/277/344/271/220/345/233/242.mp3 +0 -0
- package/dist/umd/mock/dupload/picture/110500-thumb.jpg +0 -0
- package/dist/umd/mock/dupload/picture/110500.jpg +0 -0
- package/dist/umd/mock/dupload/picture/110502-thumb.jpg +0 -0
- package/dist/umd/mock/dupload/picture/110502.jpg +0 -0
- package/dist/umd/mock/dupload/picture/110504.png +0 -0
- package/dist/umd/mock/dupload/picture/default.png +0 -0
- package/dist/umd/mock/dupload/picture//346/255/243/351/227/250/345/205/250/346/231/257.jpg +0 -0
- package/dist/umd/pcloud-components.min.css +1 -1
- package/dist/umd/pcloud-components.min.js +1 -1
- package/package.json +91 -73
- package/dist/esm/DForm/DItem.d.ts +0 -26
- package/dist/esm/DForm/DItem.js +0 -31
- package/dist/esm/DForm/DItemsMap.d.ts +0 -32
- package/dist/esm/DForm/DItemsMap.js +0 -144
|
@@ -1,47 +1,56 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
13
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
14
|
-
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
15
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
16
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
17
|
-
function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
|
|
18
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
19
|
-
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
20
|
-
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
21
|
-
/*
|
|
22
|
-
* @Author : wangfeihu
|
|
23
|
-
* @Date : 2023-05-22 10:38:17
|
|
24
|
-
* @LastEditors : wangfeihu
|
|
25
|
-
* @LastEditTime : 2023-06-13 15:39:42
|
|
26
|
-
* @Description : 基于antd的TreeSelect组件
|
|
1
|
+
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
2
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
3
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
4
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
|
|
5
|
+
var _excluded = ["className", "popupClassName", "treeData", "fieldNames", "loadData", "onLoadData", "loading"];
|
|
6
|
+
/*
|
|
7
|
+
* @Author : wangfeihu
|
|
8
|
+
* @Date : 2023-05-22 10:38:17
|
|
9
|
+
* @LastEditors : wangfeihu
|
|
10
|
+
* @LastEditTime : 2023-06-30 16:24:47
|
|
11
|
+
* @Description : 基于antd的TreeSelect组件
|
|
27
12
|
*/
|
|
28
13
|
|
|
29
14
|
import React, { useRef, forwardRef, useState, useEffect, useMemo, useContext } from 'react';
|
|
30
15
|
import { TreeSelect } from 'antd';
|
|
31
16
|
import { ConfigContext } from "../ConfigProvider";
|
|
32
17
|
import "./index.less";
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
18
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
19
|
+
// eslint-disable-next-line no-unused-vars
|
|
20
|
+
function deepFind(node, fn) {
|
|
21
|
+
var childrenName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'children';
|
|
22
|
+
if (fn instanceof Function) {
|
|
23
|
+
var treelist = node instanceof Array ? node : [node];
|
|
24
|
+
for (var i = 0; i < treelist.length; i++) {
|
|
25
|
+
if (fn(treelist[i], i)) {
|
|
26
|
+
return treelist[i];
|
|
27
|
+
} else {
|
|
28
|
+
var target = deepFind(treelist[i][childrenName] || [], fn, childrenName);
|
|
29
|
+
if (target) return target;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
} else {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
37
36
|
|
|
37
|
+
// 获取延时时间,默认800ms,true代表默认时间,false代表0
|
|
38
|
+
function getDelayTime(value) {
|
|
39
|
+
var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 800;
|
|
40
|
+
if (value === true) {
|
|
41
|
+
return defaultValue;
|
|
42
|
+
} else if (value === false) {
|
|
43
|
+
return 0;
|
|
44
|
+
} else {
|
|
45
|
+
return typeof value === 'number' ? Number(value) || 0 : defaultValue;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
38
48
|
function InternalTreeSelect(props, ref) {
|
|
39
49
|
var _props$className = props.className,
|
|
40
50
|
className = _props$className === void 0 ? '' : _props$className,
|
|
41
51
|
popupClassName = props.popupClassName,
|
|
42
52
|
initOptions = props.treeData,
|
|
43
53
|
fieldNames = props.fieldNames,
|
|
44
|
-
treeNodeFilterProp = props.treeNodeFilterProp,
|
|
45
54
|
loadData = props.loadData,
|
|
46
55
|
onLoadData = props.onLoadData,
|
|
47
56
|
initLoading = props.loading,
|
|
@@ -70,27 +79,31 @@ function InternalTreeSelect(props, ref) {
|
|
|
70
79
|
children: 'children'
|
|
71
80
|
}, fieldNames);
|
|
72
81
|
var _treeNodeFilterProp = _fieldNames.label;
|
|
73
|
-
var _loadingState = getDelayTime(
|
|
82
|
+
var _loadingState = getDelayTime(initLoading, 600); // loading: 默认600ms,false或0表示不开启
|
|
74
83
|
|
|
75
84
|
var _loading = typeof initLoading === 'boolean' ? initLoading : loading;
|
|
76
85
|
|
|
77
86
|
// 将外部传入的options转化为统一的异步请求方法
|
|
78
|
-
var getOptionsFun = useMemo(
|
|
87
|
+
var getOptionsFun = useMemo(
|
|
88
|
+
// eslint-disable-next-line no-unused-vars,@typescript-eslint/no-unused-vars
|
|
89
|
+
function () {
|
|
79
90
|
return typeof initOptions === 'function' ? initOptions : function (params) {
|
|
80
91
|
return Promise.resolve(initOptions || []);
|
|
81
92
|
};
|
|
82
93
|
}, [initOptions]);
|
|
94
|
+
|
|
95
|
+
// eslint-disable-next-line no-unused-vars,@typescript-eslint/no-unused-vars
|
|
83
96
|
var updateOptions = function updateOptions(fun, value) {
|
|
84
97
|
// 设置加载中状态
|
|
85
98
|
if (_loadingState > 0) {
|
|
86
99
|
loadingRef.current.status = 'loading';
|
|
100
|
+
loadingParamsRef.current = value;
|
|
87
101
|
clearTimeout(loadingRef.current.timer);
|
|
88
102
|
loadingRef.current.timer = setTimeout(function () {
|
|
89
|
-
loadingRef.current.status === 'loading'
|
|
103
|
+
if (loadingRef.current.status === 'loading') setLoading(true);
|
|
90
104
|
}, _loadingState);
|
|
91
105
|
}
|
|
92
106
|
// 发起请求
|
|
93
|
-
loadingParamsRef.current = value;
|
|
94
107
|
fun === null || fun === void 0 ? void 0 : fun(value).then(function (response) {
|
|
95
108
|
if (loadingParamsRef.current === value) {
|
|
96
109
|
setTreeData(response);
|
|
@@ -105,19 +118,41 @@ function InternalTreeSelect(props, ref) {
|
|
|
105
118
|
});
|
|
106
119
|
};
|
|
107
120
|
var _loadData = function _loadData(selectedOption) {
|
|
108
|
-
onLoadData
|
|
121
|
+
if (onLoadData) onLoadData(selectedOption);
|
|
109
122
|
var _getOptions = typeof initOptions === 'function' ? initOptions : null;
|
|
110
123
|
var loadFn = loadData === null ? loadData : loadData || _getOptions;
|
|
111
124
|
if (typeof loadFn === 'function') {
|
|
112
|
-
|
|
125
|
+
// 设置加载中状态
|
|
126
|
+
if (_loadingState > 0) {
|
|
127
|
+
loadingRef.current.status = 'loading';
|
|
128
|
+
loadingParamsRef.current = loadingParamsRef.current ? loadingParamsRef.current + 1 : 1;
|
|
129
|
+
clearTimeout(loadingRef.current.timer);
|
|
130
|
+
loadingRef.current.timer = setTimeout(function () {
|
|
131
|
+
if (loadingRef.current.status === 'loading') {
|
|
132
|
+
setLoading(true);
|
|
133
|
+
}
|
|
134
|
+
}, _loadingState);
|
|
135
|
+
}
|
|
136
|
+
var loadFnPromise = loadFn(selectedOption);
|
|
113
137
|
if (typeof loadFnPromise['then'] === 'function') {
|
|
114
138
|
loadFnPromise.then(function (response) {
|
|
139
|
+
loadingParamsRef.current = loadingParamsRef.current ? loadingParamsRef.current - 1 : null;
|
|
140
|
+
if (!loadingParamsRef.current) {
|
|
141
|
+
setLoading(false);
|
|
142
|
+
loadingRef.current.status = 'done';
|
|
143
|
+
}
|
|
115
144
|
var list = treeData || [];
|
|
116
145
|
var node = deepFind(list, function (item) {
|
|
117
146
|
return item[_fieldNames.value] === selectedOption[_fieldNames.value];
|
|
118
147
|
}, _fieldNames.children);
|
|
119
|
-
|
|
148
|
+
if (node) node[_fieldNames.children] = response;
|
|
120
149
|
setTreeData(_toConsumableArray(list));
|
|
150
|
+
}).catch(function () {
|
|
151
|
+
loadingParamsRef.current = loadingParamsRef.current ? loadingParamsRef.current - 1 : null;
|
|
152
|
+
if (!loadingParamsRef.current) {
|
|
153
|
+
setLoading(false);
|
|
154
|
+
loadingRef.current.status = 'done';
|
|
155
|
+
}
|
|
121
156
|
});
|
|
122
157
|
}
|
|
123
158
|
return loadFnPromise;
|
|
@@ -131,7 +166,7 @@ function InternalTreeSelect(props, ref) {
|
|
|
131
166
|
useEffect(function () {
|
|
132
167
|
return updateOptions(getOptionsFun);
|
|
133
168
|
}, [getOptionsFun]);
|
|
134
|
-
return /*#__PURE__*/
|
|
169
|
+
return /*#__PURE__*/_jsx(TreeSelect, _objectSpread(_objectSpread({}, otherProps), {}, {
|
|
135
170
|
ref: ref,
|
|
136
171
|
className: _className,
|
|
137
172
|
popupClassName: _popupClassName,
|
|
@@ -142,33 +177,5 @@ function InternalTreeSelect(props, ref) {
|
|
|
142
177
|
loading: _loading
|
|
143
178
|
}));
|
|
144
179
|
}
|
|
145
|
-
|
|
146
|
-
// 获取延时时间,默认800ms,true代表默认时间,false代表0
|
|
147
|
-
function getDelayTime(value) {
|
|
148
|
-
var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 800;
|
|
149
|
-
if (value === true) {
|
|
150
|
-
return defaultValue;
|
|
151
|
-
} else if (value === false) {
|
|
152
|
-
return 0;
|
|
153
|
-
} else {
|
|
154
|
-
return typeof value === 'number' ? Number(value) || 0 : defaultValue;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
function deepFind(node, fn) {
|
|
158
|
-
var childrenName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'children';
|
|
159
|
-
if (fn instanceof Function) {
|
|
160
|
-
var treelist = node instanceof Array ? node : [node];
|
|
161
|
-
for (var i = 0; i < treelist.length; i++) {
|
|
162
|
-
if (fn(treelist[i], i)) {
|
|
163
|
-
return treelist[i];
|
|
164
|
-
} else {
|
|
165
|
-
var target = deepFind(treelist[i][childrenName] || [], fn, childrenName);
|
|
166
|
-
if (target) return target;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
} else {
|
|
170
|
-
return undefined;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
180
|
var DTreeSelect = /*#__PURE__*/forwardRef(InternalTreeSelect);
|
|
174
181
|
export default DTreeSelect;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
@import '../commonStyle/index.less';
|
|
2
|
+
|
|
2
3
|
.@{prefix}-tree-select-dropdown .ant-select-tree-node-content-wrapper {
|
|
3
4
|
overflow: hidden;
|
|
4
5
|
white-space: nowrap;
|
|
5
6
|
text-overflow: ellipsis;
|
|
6
7
|
}
|
|
8
|
+
|
|
7
9
|
.@{prefix}-tree-select-dropdown .ant-select-tree-node-content-wrapper .ant-select-tree-title {
|
|
8
10
|
overflow: hidden;
|
|
9
11
|
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { UploadFile } from 'antd';
|
|
2
|
+
declare type DUploadFile = Omit<UploadFile, 'uid'> & {
|
|
3
|
+
/** 文件id */
|
|
4
|
+
id?: string | number;
|
|
5
|
+
/** 文件uid,系统自动生成 */
|
|
6
|
+
uid?: string | number;
|
|
7
|
+
/** 文件来源 upload:文件对话框,remote:已上传的文件对象 */
|
|
8
|
+
source?: 'upload' | 'remote';
|
|
9
|
+
};
|
|
10
|
+
/** 转换base64时的参数 */
|
|
11
|
+
declare type CompressProps = {
|
|
12
|
+
width?: number;
|
|
13
|
+
/** 图像高度 */
|
|
14
|
+
height?: number;
|
|
15
|
+
/** 图像质量 */
|
|
16
|
+
quality?: number;
|
|
17
|
+
};
|
|
18
|
+
declare type ThumbOptionProps = {
|
|
19
|
+
/** 对目标文件进行过滤,默认只对图片格式生成缩略图 */
|
|
20
|
+
filter?: ((file: DUploadFile) => boolean) | Array<string>;
|
|
21
|
+
/** 文件大小,当上传文件大于指定值时会对缩略图进行压缩,单位为字节,默认2MB */
|
|
22
|
+
size?: number;
|
|
23
|
+
/** 缩略图压缩参数,默认为 {width:300,height:200,quality:0.7} */
|
|
24
|
+
compress?: CompressProps | null;
|
|
25
|
+
/** 缩略图生成失败时的回调函数 */
|
|
26
|
+
onError?: (err: Error) => void;
|
|
27
|
+
/** 自定义生成base64缩略图的方法 */
|
|
28
|
+
getThumbUrl?: (file: DUploadFile, option: ThumbOptionProps) => Promise<string>;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* @description : 将图像文件转换为Base64格式
|
|
32
|
+
* @param {Blob} blob 图像文件
|
|
33
|
+
* @param {CompressProps} options 指定图像压缩参数,其格式为: {width:300,height:200,quality:0.7}
|
|
34
|
+
* @return {Promise<string>} 包含Base64字符串的Promise对象
|
|
35
|
+
* @example : imageToBase64(file,{ width: 300, height: 200, quality: 0.7 }).then( url => console.log( url ) )
|
|
36
|
+
*/
|
|
37
|
+
declare function imageToBase64(blob: Blob, options?: CompressProps | null): Promise<string>;
|
|
38
|
+
/**
|
|
39
|
+
* @description : 将传入的文件转换为UploadFile数组
|
|
40
|
+
* @param {any} files 目标文件对象
|
|
41
|
+
* @return {UploadFile[]} UploadFile数组
|
|
42
|
+
* @example :
|
|
43
|
+
*/
|
|
44
|
+
declare function getUploadFile(files: any, maxCount?: number): any[];
|
|
45
|
+
/**
|
|
46
|
+
* @description : 根据传入的option对象获取缩略图参数
|
|
47
|
+
* @param {ThumbOptionProps} option 缩略图参数对象
|
|
48
|
+
* @return {ThumbOptionProps} ThumbOption对象
|
|
49
|
+
* @example :
|
|
50
|
+
*/
|
|
51
|
+
declare function getThumbOption(option?: ThumbOptionProps | null): {
|
|
52
|
+
size: number;
|
|
53
|
+
filter: (file: DUploadFile) => boolean;
|
|
54
|
+
compress: {
|
|
55
|
+
width: number;
|
|
56
|
+
height: number;
|
|
57
|
+
quality: number;
|
|
58
|
+
} | null;
|
|
59
|
+
onError: ((err: Error) => void) | undefined;
|
|
60
|
+
getThumbUrl: ((file: DUploadFile, option: ThumbOptionProps) => Promise<string>) | undefined;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* @description : a标签下载文件
|
|
64
|
+
* @param {Blob | string} url a标签的下载url或文件流
|
|
65
|
+
* @param {string} fileName 下载文件的名称,如果缺省则尝试从url中获取,默认为: "新建文件"
|
|
66
|
+
* @return {*}
|
|
67
|
+
* @example :
|
|
68
|
+
*/
|
|
69
|
+
declare function downloadFile(url: Blob | string, fileName?: string): void;
|
|
70
|
+
/**
|
|
71
|
+
* @description : a标签预览文件
|
|
72
|
+
* @param {Blob | string} url a标签的预览url或文件流
|
|
73
|
+
* @return {*}
|
|
74
|
+
* @example :
|
|
75
|
+
*/
|
|
76
|
+
declare function previewFile(url: Blob | string): void;
|
|
77
|
+
/**
|
|
78
|
+
* @description : 以递归方式深度查找一个对象
|
|
79
|
+
* @param {Record} object 待查找的对象
|
|
80
|
+
* @param {function} fn 查找函数,每次递归时执行,如果执行结果为true,则递归过程并返回当前对象
|
|
81
|
+
* @param {number} maxDepth 递归的最大深度,默认10
|
|
82
|
+
* @return {*} 查找到的对象,未查找到则返回undefined
|
|
83
|
+
* @example :
|
|
84
|
+
*/
|
|
85
|
+
declare function deepFindObject(object: Record<string, any>, fn: (item: any, parent: any, fieldMap: any) => boolean, maxDepth?: number): any;
|
|
86
|
+
/**
|
|
87
|
+
* @description : 以递归方式深度查找一个Jsx对象
|
|
88
|
+
* @param {Record} object 待查找的Jsx对象
|
|
89
|
+
* @param {function} fn 查找函数,每次递归时执行,如果执行结果为true,则停止递归过程并返回当前对象
|
|
90
|
+
* @param {number} maxDepth 递归的最大深度,默认10
|
|
91
|
+
* @return {*} 查找到的对象,未查找到则返回undefined
|
|
92
|
+
* @example :
|
|
93
|
+
*/
|
|
94
|
+
declare function deepFindJsx(object: Record<string, any>, fn: (item: any, parent: any) => boolean, maxDepth?: number): any;
|
|
95
|
+
declare const _default: {
|
|
96
|
+
imageToBase64: typeof imageToBase64;
|
|
97
|
+
getUploadFile: typeof getUploadFile;
|
|
98
|
+
getThumbOption: typeof getThumbOption;
|
|
99
|
+
downloadFile: typeof downloadFile;
|
|
100
|
+
previewFile: typeof previewFile;
|
|
101
|
+
deepFindObject: typeof deepFindObject;
|
|
102
|
+
deepFindJsx: typeof deepFindJsx;
|
|
103
|
+
};
|
|
104
|
+
export default _default;
|
|
105
|
+
export type { DUploadFile, ThumbOptionProps };
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
|
+
import _typeof from "@babel/runtime/helpers/esm/typeof";
|
|
3
|
+
/*
|
|
4
|
+
* @Author : wangfeihu
|
|
5
|
+
* @Date : 2023-06-16 11:25:57
|
|
6
|
+
* @LastEditors : wangfeihu
|
|
7
|
+
* @LastEditTime : 2023-06-29 18:10:04
|
|
8
|
+
* @Description : 辅助方法集合
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** 转换base64时的参数 */
|
|
12
|
+
|
|
13
|
+
var TYPES = {
|
|
14
|
+
OPTION_TYPE_PRIMARY: 'primary',
|
|
15
|
+
OPTION_TYPE_OBJECT: 'object',
|
|
16
|
+
OPTION_TYPE_ARRAY: 'array'
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
// 获取某个字段的类型
|
|
20
|
+
function getType(value) {
|
|
21
|
+
if (typeof value === 'string') {
|
|
22
|
+
return TYPES.OPTION_TYPE_PRIMARY;
|
|
23
|
+
} else if (typeof value === 'number') {
|
|
24
|
+
return TYPES.OPTION_TYPE_PRIMARY;
|
|
25
|
+
} else if (typeof value === 'boolean') {
|
|
26
|
+
return TYPES.OPTION_TYPE_PRIMARY;
|
|
27
|
+
} else if (typeof value === 'undefined') {
|
|
28
|
+
return TYPES.OPTION_TYPE_PRIMARY;
|
|
29
|
+
} else if (_typeof(value) === 'symbol') {
|
|
30
|
+
return TYPES.OPTION_TYPE_PRIMARY;
|
|
31
|
+
} else if (value === null) {
|
|
32
|
+
return TYPES.OPTION_TYPE_PRIMARY;
|
|
33
|
+
} else if (typeof value === 'function') {
|
|
34
|
+
return TYPES.OPTION_TYPE_PRIMARY;
|
|
35
|
+
} else if (value instanceof Array) {
|
|
36
|
+
return TYPES.OPTION_TYPE_ARRAY;
|
|
37
|
+
} else if (Object.keys(value).length > 0) {
|
|
38
|
+
return TYPES.OPTION_TYPE_OBJECT;
|
|
39
|
+
} else {
|
|
40
|
+
return TYPES.OPTION_TYPE_PRIMARY;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @description : 将图像文件转换为Base64格式
|
|
46
|
+
* @param {Blob} blob 图像文件
|
|
47
|
+
* @param {CompressProps} options 指定图像压缩参数,其格式为: {width:300,height:200,quality:0.7}
|
|
48
|
+
* @return {Promise<string>} 包含Base64字符串的Promise对象
|
|
49
|
+
* @example : imageToBase64(file,{ width: 300, height: 200, quality: 0.7 }).then( url => console.log( url ) )
|
|
50
|
+
*/
|
|
51
|
+
function imageToBase64(blob, options) {
|
|
52
|
+
return new Promise(function (resolve, reject) {
|
|
53
|
+
var reader = new FileReader();
|
|
54
|
+
try {
|
|
55
|
+
reader.readAsDataURL(blob);
|
|
56
|
+
} catch (err) {
|
|
57
|
+
reject(err);
|
|
58
|
+
}
|
|
59
|
+
reader.onload = function () {
|
|
60
|
+
if (typeof reader.result === 'string') {
|
|
61
|
+
if (options === null) {
|
|
62
|
+
resolve(reader.result);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
var img = new Image();
|
|
66
|
+
img.src = reader.result;
|
|
67
|
+
img.onload = function () {
|
|
68
|
+
var _ref = options || {},
|
|
69
|
+
_ref$width = _ref.width,
|
|
70
|
+
width = _ref$width === void 0 ? img.naturalWidth : _ref$width,
|
|
71
|
+
_ref$height = _ref.height,
|
|
72
|
+
height = _ref$height === void 0 ? img.naturalHeight : _ref$height,
|
|
73
|
+
_ref$quality = _ref.quality,
|
|
74
|
+
quality = _ref$quality === void 0 ? 0.7 : _ref$quality;
|
|
75
|
+
var canvas = document.createElement('canvas');
|
|
76
|
+
var ctx = canvas.getContext('2d');
|
|
77
|
+
canvas.width = width;
|
|
78
|
+
canvas.height = height;
|
|
79
|
+
if (ctx) {
|
|
80
|
+
ctx.drawImage(img, 0, 0, width, height);
|
|
81
|
+
var base64 = canvas.toDataURL(undefined, quality);
|
|
82
|
+
resolve(base64);
|
|
83
|
+
} else {
|
|
84
|
+
reject(new Error("\u8F6C\u6362\u7F29\u7565\u56FE\u5931\u8D25: ".concat(reader.result)));
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
img.onerror = function (err) {
|
|
88
|
+
return reject(err);
|
|
89
|
+
};
|
|
90
|
+
} else {
|
|
91
|
+
reject(new Error("\u8F6C\u6362\u7F29\u7565\u56FE\u5931\u8D25: ".concat(reader.result)));
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
reader.onerror = function () {
|
|
95
|
+
return reject(reader.error);
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* @description : 将传入的文件转换为UploadFile数组
|
|
102
|
+
* @param {any} files 目标文件对象
|
|
103
|
+
* @return {UploadFile[]} UploadFile数组
|
|
104
|
+
* @example :
|
|
105
|
+
*/
|
|
106
|
+
function getUploadFile(files, maxCount) {
|
|
107
|
+
if (files) {
|
|
108
|
+
var list = files instanceof Array ? files : [files];
|
|
109
|
+
return maxCount && maxCount > 0 ? list.slice(0, maxCount) : list;
|
|
110
|
+
}
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* @description : 根据传入的option对象获取缩略图参数
|
|
116
|
+
* @param {ThumbOptionProps} option 缩略图参数对象
|
|
117
|
+
* @return {ThumbOptionProps} ThumbOption对象
|
|
118
|
+
* @example :
|
|
119
|
+
*/
|
|
120
|
+
function getThumbOption(option) {
|
|
121
|
+
var _ref2 = option || {},
|
|
122
|
+
_ref2$size = _ref2.size,
|
|
123
|
+
size = _ref2$size === void 0 ? 2097152 : _ref2$size,
|
|
124
|
+
_ref2$filter = _ref2.filter,
|
|
125
|
+
filter = _ref2$filter === void 0 ? ['image/gif', 'image/jpeg', 'image/png', 'image/svg+xml'] : _ref2$filter,
|
|
126
|
+
compress = _ref2.compress,
|
|
127
|
+
onError = _ref2.onError,
|
|
128
|
+
getThumbUrl = _ref2.getThumbUrl;
|
|
129
|
+
var _filter = filter instanceof Array ? function (file) {
|
|
130
|
+
return filter.includes(file.type || '');
|
|
131
|
+
} : filter;
|
|
132
|
+
var _compress = compress === null ? compress : _objectSpread({
|
|
133
|
+
width: 300,
|
|
134
|
+
height: 200,
|
|
135
|
+
quality: 0.7
|
|
136
|
+
}, compress);
|
|
137
|
+
var defaultOption = {
|
|
138
|
+
size: size,
|
|
139
|
+
filter: _filter,
|
|
140
|
+
compress: _compress,
|
|
141
|
+
onError: onError,
|
|
142
|
+
getThumbUrl: getThumbUrl
|
|
143
|
+
};
|
|
144
|
+
var _option = option === null ? _objectSpread(_objectSpread({}, defaultOption), {}, {
|
|
145
|
+
filter: function filter() {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
}) : defaultOption;
|
|
149
|
+
return _option;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* @description : a标签下载文件
|
|
154
|
+
* @param {Blob | string} url a标签的下载url或文件流
|
|
155
|
+
* @param {string} fileName 下载文件的名称,如果缺省则尝试从url中获取,默认为: "新建文件"
|
|
156
|
+
* @return {*}
|
|
157
|
+
* @example :
|
|
158
|
+
*/
|
|
159
|
+
function downloadFile(url, fileName) {
|
|
160
|
+
var eLink = document.createElement('a');
|
|
161
|
+
eLink.download = fileName || (typeof url === 'string' ? '新建文件' : (url === null || url === void 0 ? void 0 : url.name) || '新建文件');
|
|
162
|
+
eLink.style.display = 'none';
|
|
163
|
+
eLink.href = typeof url === 'string' ? url : URL.createObjectURL(url);
|
|
164
|
+
document.body.appendChild(eLink);
|
|
165
|
+
eLink.click();
|
|
166
|
+
URL.revokeObjectURL(eLink.href);
|
|
167
|
+
document.body.removeChild(eLink);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* @description : a标签预览文件
|
|
172
|
+
* @param {Blob | string} url a标签的预览url或文件流
|
|
173
|
+
* @return {*}
|
|
174
|
+
* @example :
|
|
175
|
+
*/
|
|
176
|
+
function previewFile(url) {
|
|
177
|
+
var eLink = document.createElement('a');
|
|
178
|
+
eLink.target = '_blank';
|
|
179
|
+
eLink.style.display = 'none';
|
|
180
|
+
eLink.href = typeof url === 'string' ? url : URL.createObjectURL(url);
|
|
181
|
+
document.body.appendChild(eLink);
|
|
182
|
+
eLink.click();
|
|
183
|
+
URL.revokeObjectURL(eLink.href);
|
|
184
|
+
document.body.removeChild(eLink);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* @description : 以递归方式深度查找一个对象
|
|
189
|
+
* @param {Record} object 待查找的对象
|
|
190
|
+
* @param {function} fn 查找函数,每次递归时执行,如果执行结果为true,则递归过程并返回当前对象
|
|
191
|
+
* @param {number} maxDepth 递归的最大深度,默认10
|
|
192
|
+
* @return {*} 查找到的对象,未查找到则返回undefined
|
|
193
|
+
* @example :
|
|
194
|
+
*/
|
|
195
|
+
// eslint-disable-next-line no-unused-vars
|
|
196
|
+
function deepFindObject(object, fn) {
|
|
197
|
+
var maxDepth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;
|
|
198
|
+
function recursive(obj, parent, parentPath, fn, result) {
|
|
199
|
+
if (fn(obj, parent, result)) return obj;
|
|
200
|
+
if (parentPath.split(/\[|\./).length >= maxDepth) return;
|
|
201
|
+
var type = getType(obj);
|
|
202
|
+
if (type === 'object') {
|
|
203
|
+
for (var key in obj) {
|
|
204
|
+
if (key) {
|
|
205
|
+
var pathString = parentPath ? "".concat(parentPath, ".").concat(key) : key;
|
|
206
|
+
var target = recursive(obj[key], obj, pathString, fn, result);
|
|
207
|
+
if (target) return target;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
} else if (type === 'array') {
|
|
211
|
+
for (var index = 0; index < obj.length; index++) {
|
|
212
|
+
var _pathString = parentPath ? "".concat(parentPath, "[").concat(index, "]") : index;
|
|
213
|
+
var _target = recursive(obj[index], obj, _pathString, fn, result);
|
|
214
|
+
if (_target) return _target;
|
|
215
|
+
}
|
|
216
|
+
} else {
|
|
217
|
+
result[parentPath] = obj;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return recursive(object, undefined, '', fn, {});
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* @description : 以递归方式深度查找一个Jsx对象
|
|
225
|
+
* @param {Record} object 待查找的Jsx对象
|
|
226
|
+
* @param {function} fn 查找函数,每次递归时执行,如果执行结果为true,则停止递归过程并返回当前对象
|
|
227
|
+
* @param {number} maxDepth 递归的最大深度,默认10
|
|
228
|
+
* @return {*} 查找到的对象,未查找到则返回undefined
|
|
229
|
+
* @example :
|
|
230
|
+
*/
|
|
231
|
+
// eslint-disable-next-line no-unused-vars
|
|
232
|
+
function deepFindJsx(object, fn) {
|
|
233
|
+
var maxDepth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;
|
|
234
|
+
function recursive(obj, parent, parentPath, fn) {
|
|
235
|
+
var _obj$props;
|
|
236
|
+
if (fn(obj, parent)) return obj;
|
|
237
|
+
if (parentPath.split(/\./).length >= maxDepth) return;
|
|
238
|
+
var children = obj === null || obj === void 0 ? void 0 : (_obj$props = obj.props) === null || _obj$props === void 0 ? void 0 : _obj$props.children;
|
|
239
|
+
if (children instanceof Array) {
|
|
240
|
+
for (var index = 0; index < children.length; index++) {
|
|
241
|
+
var pathString = parentPath ? "".concat(parentPath, ".children[").concat(index, "]") : ".children[".concat(index, "]");
|
|
242
|
+
var target = recursive(children[index], obj, pathString, fn);
|
|
243
|
+
if (target) return target;
|
|
244
|
+
}
|
|
245
|
+
} else if (children) {
|
|
246
|
+
var _pathString2 = parentPath ? "".concat(parentPath, ".children") : 'children';
|
|
247
|
+
var _target2 = recursive(children, obj, _pathString2, fn);
|
|
248
|
+
if (_target2) return _target2;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return recursive(object, undefined, '', fn);
|
|
252
|
+
}
|
|
253
|
+
export default {
|
|
254
|
+
imageToBase64: imageToBase64,
|
|
255
|
+
getUploadFile: getUploadFile,
|
|
256
|
+
getThumbOption: getThumbOption,
|
|
257
|
+
downloadFile: downloadFile,
|
|
258
|
+
previewFile: previewFile,
|
|
259
|
+
deepFindObject: deepFindObject,
|
|
260
|
+
deepFindJsx: deepFindJsx
|
|
261
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import React, { ReactNode } from 'react';
|
|
2
|
+
import { UploadProps } from 'antd';
|
|
3
|
+
import { UploadChangeParam } from 'antd/lib/upload';
|
|
4
|
+
import helper, { DUploadFile, ThumbOptionProps } from './helper';
|
|
5
|
+
import './index.less';
|
|
6
|
+
declare type DUploadProps = Omit<UploadProps, 'fileList' | 'onChange' | 'customRequest' | 'onRemove' | 'onDownload' | 'onPreview'> & {
|
|
7
|
+
/** 初始文件列表(相当于defaultFileList,但优先级高于defaultFileList) */
|
|
8
|
+
value?: DUploadFile | DUploadFile[];
|
|
9
|
+
/** 文件列表(在Form组件中表现为受控列表,在一般情况下相当于初始文件列表,其优先级高于value属性) */
|
|
10
|
+
fileList?: DUploadFile | DUploadFile[];
|
|
11
|
+
/** 文件列表变化时的回调函数 */
|
|
12
|
+
onChange?: (list: DUploadFile[], info: UploadChangeParam<DUploadFile>) => void;
|
|
13
|
+
/** 文件上传时的回调函数,支持Promise */
|
|
14
|
+
customRequest?: (file: DUploadFile, list: DUploadFile[], requestOption: any) => DUploadFile[] | Promise<DUploadFile[] | void> | void;
|
|
15
|
+
/** 点击删除按钮时的回调,支持Promise */
|
|
16
|
+
onRemove?: (file: DUploadFile, list: DUploadFile[]) => DUploadFile[] | Promise<DUploadFile[] | void> | void;
|
|
17
|
+
/** 点击下载按钮时的回调,支持Promise */
|
|
18
|
+
onDownload?: (file: DUploadFile) => DUploadFile | Blob | Promise<DUploadFile | Blob> | void;
|
|
19
|
+
/** 点击预览按钮时的回调,支持Promise */
|
|
20
|
+
onPreview?: (file: DUploadFile) => DUploadFile | Blob | Promise<DUploadFile | Blob> | void;
|
|
21
|
+
/** 上传按钮,等同于children但优先于children */
|
|
22
|
+
uploadButton?: ReactNode;
|
|
23
|
+
/** 上传文件时的缩略图选项,null表示不生成缩略图 */
|
|
24
|
+
thumbOption?: ThumbOptionProps | null;
|
|
25
|
+
/** 列表项样式类名 */
|
|
26
|
+
itemClassName?: string;
|
|
27
|
+
enablePreview?: boolean | ((file: DUploadFile) => boolean);
|
|
28
|
+
};
|
|
29
|
+
declare const DUpload: React.ForwardRefExoticComponent<Omit<UploadProps<any>, "onChange" | "fileList" | "customRequest" | "onRemove" | "onDownload" | "onPreview"> & {
|
|
30
|
+
/** 初始文件列表(相当于defaultFileList,但优先级高于defaultFileList) */
|
|
31
|
+
value?: DUploadFile | DUploadFile[] | undefined;
|
|
32
|
+
/** 文件列表(在Form组件中表现为受控列表,在一般情况下相当于初始文件列表,其优先级高于value属性) */
|
|
33
|
+
fileList?: DUploadFile | DUploadFile[] | undefined;
|
|
34
|
+
/** 文件列表变化时的回调函数 */
|
|
35
|
+
onChange?: ((list: DUploadFile[], info: UploadChangeParam<DUploadFile>) => void) | undefined;
|
|
36
|
+
/** 文件上传时的回调函数,支持Promise */
|
|
37
|
+
customRequest?: ((file: DUploadFile, list: DUploadFile[], requestOption: any) => DUploadFile[] | Promise<DUploadFile[] | void> | void) | undefined;
|
|
38
|
+
/** 点击删除按钮时的回调,支持Promise */
|
|
39
|
+
onRemove?: ((file: DUploadFile, list: DUploadFile[]) => DUploadFile[] | Promise<DUploadFile[] | void> | void) | undefined;
|
|
40
|
+
/** 点击下载按钮时的回调,支持Promise */
|
|
41
|
+
onDownload?: ((file: DUploadFile) => DUploadFile | Blob | Promise<DUploadFile | Blob> | void) | undefined;
|
|
42
|
+
/** 点击预览按钮时的回调,支持Promise */
|
|
43
|
+
onPreview?: ((file: DUploadFile) => DUploadFile | Blob | Promise<DUploadFile | Blob> | void) | undefined;
|
|
44
|
+
/** 上传按钮,等同于children但优先于children */
|
|
45
|
+
uploadButton?: ReactNode;
|
|
46
|
+
/** 上传文件时的缩略图选项,null表示不生成缩略图 */
|
|
47
|
+
thumbOption?: ThumbOptionProps | null | undefined;
|
|
48
|
+
/** 列表项样式类名 */
|
|
49
|
+
itemClassName?: string | undefined;
|
|
50
|
+
enablePreview?: boolean | ((file: DUploadFile) => boolean) | undefined;
|
|
51
|
+
} & React.RefAttributes<unknown>> & {
|
|
52
|
+
imageToBase64: typeof helper.imageToBase64;
|
|
53
|
+
};
|
|
54
|
+
export type { DUploadProps, DUploadFile };
|
|
55
|
+
export default DUpload;
|